org-mode中的内联PDF图像

时间:2013-03-14 11:06:08

标签: emacs org-mode

emacs + org-mode中,查看组织模式缓冲区时,您可以内联 使用org-toggle-inline-images命令链接图像。这个 包括开箱即用的各种格式,但显然是PDF图像 尚不包括在内。

鉴于emacs完全能够呈现PDF文件,是吗? 可以制作组织模式的内嵌PDF文件,就像它对图像一样 (PNG,JPEG等)?

一些背景:对于我来说,PDF图像对我来说更方便 原因,最重要的是它们能够很好地扩展并且能够很好地工作 乳胶,从小型报纸到大型海报。

3 个答案:

答案 0 :(得分:10)

让我完成这个问题。

首先,Org-mode不支持任何pdf内联显示功能。但是,可以修改org-display-inline-images以实现您想要的效果。首先,您需要参考这个答案:Configuring emacs for showing fixed width inline images,这给了我很多启发。然后我稍微修改了这个功能,使其支持pdf,在org-mode中显示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在文件夹中生成一个名为缩略图的file_thumb来替换pdf的叠加,并强制组织模式使用file_thumb显示pdf而不对组织文件进行任何修改。

而且,因为我用babel用python生成图像。它总是需要我更新_thumb文件,所以我添加一个if条件来说明这个拇指文件是否存在,如果pdf文件改变了我需要同时更改拇指文件......等等! / p>

希望它可以帮到你。

答案 1 :(得分: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)

尚不确定,如果这些更改对其他模式有任何问题。 我在org模式下的pdf是由python src代码块和上面的工作创建的,但是当我在python模式下更改某些内容并且我需要手动运行org-display-inline-images时,图像不会更新。

这假设你有一个带有imagemagick支持的emacs,类似的东西也适用于使用ghostscript(在org.el中可能还有一些编辑)。

答案 2 :(得分:2)

简答:不支持PDF内嵌图像。

函数org-image-file-name-regexp具有硬编码的图像文件扩展名(并且不包括PDF)。 org-display-inline-images使用此功能,后者又调用create-image

我已尝试将PDF添加到org-image-file-name-regexp,并从imagemagik-types-inhibit删除PDF而没有运气。

您可以尝试进一步挖掘,或向org-mode邮件列表请求该功能。