Встроенные PDF-изображения в режиме org-mode - программирование
Подтвердить что ты не робот

Встроенные PDF-изображения в режиме org-mode

В emacs + org-mode при просмотре буфера org-mode вы можете встроить связанных с помощью команды org-toggle-inline-images. Эта включает в себя различные форматы из коробки, но, по-видимому, PDF-изображения еще не включены.

Учитывая, что emacs отлично способен передавать файлы PDF, это возможно сделать встроенные PDF файлы в виде org-mode, как с изображениями (PNG, JPEG и т.д.)?

Некоторые предпосылки: изображения PDF более удобны для меня для нескольких причины, самое большое, что они хорошо масштабируются и хорошо работают с латекс, от мелких бумаг до больших плакатов.

4b9b3361

Ответ 1

Позвольте мне закончить этот вопрос.

Во-первых, Org-mode не поддерживает какую-либо встроенную функцию отображения PDF. Тем не менее, можно изменить org-display-inline-images, чтобы достичь желаемого. Сначала вам нужно обратиться к этому ответу: Настройка emacs для отображения встроенных изображений фиксированной ширины, что очень вдохновило меня. Затем я слегка изменил функцию, сделав ее поддержкой pdf, BMP-дисплей в орг-режиме. Моя функция ниже.

(setq image-file-name-extensions
   (quote
    ("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg" "pdf" "bmp")))

(setq org-image-actual-width 600)

(setq org-imagemagick-display-command "convert -density 600 \"%s\" -thumbnail \"%sx%s>\" \"%s\"")
(defun org-display-inline-images (&optional include-linked refresh beg end)
  "Display inline images.
Normally only links without a description part are inlined, because this
is how it will work for export.  When INCLUDE-LINKED is set, also links
with a description part will be inlined.  This
can be nice for a quick
look at those images, but it does not reflect what exported files will look
like.
When REFRESH is set, refresh existing images between BEG and END.
This will create new image displays only if necessary.
BEG and END default to the buffer boundaries."
  (interactive "P")
  (unless refresh
    (org-remove-inline-images)
    (if (fboundp 'clear-image-cache) (clear-image-cache)))
  (save-excursion
    (save-restriction
      (widen)
      (setq beg (or beg (point-min)) end (or end (point-max)))
      (goto-char beg)
      (let ((re (concat "\\[\\[\\(\\(file:\\)\\|\\([./~]\\)\\)\\([^]\n]+?"
                        (substring (org-image-file-name-regexp) 0 -2)
                        "\\)\\]" (if include-linked "" "\\]")))
            old file ov img)
        (while (re-search-forward re end t)
          (setq old (get-char-property-and-overlay (match-beginning 1)
                                                   'org-image-overlay)
        file (expand-file-name
                      (concat (or (match-string 3) "") (match-string 4))))
          (when (file-exists-p file)
            (let ((file-thumb (format "%s%s_thumb.png" (file-name-directory file) (file-name-base file))))
              (if (file-exists-p file-thumb)
                  (let ((thumb-time (nth 5 (file-attributes file-thumb 'string)))
                        (file-time (nth 5 (file-attributes file 'string))))
                    (if (time-less-p thumb-time file-time)
            (shell-command (format org-imagemagick-display-command
                           file org-image-actual-width org-image-actual-width file-thumb) nil nil)))
                (shell-command (format org-imagemagick-display-command
                                         file org-image-actual-width org-image-actual-width file-thumb) nil nil))
              (if (and (car-safe old) refresh)
                  (image-refresh (overlay-get (cdr old) 'display))
                (setq img (save-match-data (create-image file-thumb)))
                (when img
                  (setq ov (make-overlay (match-beginning 0) (match-end 0)))
                  (overlay-put ov 'display img)
                  (overlay-put ov 'face 'default)
                  (overlay-put ov 'org-image-overlay t)
                  (overlay-put ov 'modification-hooks
                               (list 'org-display-inline-remove-overlay))
                  (push ov org-inline-image-overlays))))))))))

Функция использует convert file.pdf -thumbnail "400x400>" file_thumb.png для генерации имени файла с именем thumbnail в вашей папке, чтобы заменить наложение PDF, и заставить org-mode отображать pdf с файловой системой без каких-либо изменений в файле org.

Кроме того, потому что я использую babel для создания изображения с помощью python. Мне всегда нужно обновлять файл _thumb, поэтому я добавляю условие if, чтобы сказать, существует ли этот файл большого пальца или нет, и если файл PDF изменился, мне нужно изменить файл большого пальца в одно и то же время... и так далее!

Надеюсь, это поможет вам.

Ответ 2

Короткий ответ: нет поддержки встроенных изображений PDF.

Функция org-image-file-name-regexp имеет жесткие кодировки файлов изображений (и не включает PDF). Эта функция используется org-display-inline-images, которая, в свою очередь, вызывает create-image.

Я пробовал добавлять PDF в org-image-file-name-regexp и удалять PDF из imagemagik-types-inhibit без везения.

Вы можете попытаться копать дальше или запросить функцию в списке рассылки org-mode.

Ответ 3

Я столкнулся с одной и той же проблемой и немного потрудился, запустил ее, добавив следующее в мой файл .emacs:

(add-to-list 'image-type-file-name-regexps '("\\.pdf\\'" . imagemagick))
(add-to-list 'image-file-name-extensions "pdf")
(setq imagemagick-types-inhibit (remove 'PDF imagemagick-types-inhibit))
(setq org-image-actual-width 600)

Пока не уверены, есть ли какие-либо проблемы для других режимов. Мои pdf файлы в режиме org создаются блоками кода python src, и вышеприведенные работы, но изображения не обновляются, когда я что-то меняю в режиме python, и мне нужно вручную запускать org-display-inline-images.

Это предполагает, что у вас есть emacs с поддержкой imagemagick, что-то подобное должно также работать для использования ghostscript (возможно, с некоторыми изменениями в org.el).