23

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

鉴于 emacs 完全能够渲染 PDF 文件,是否可以像处理图像(png、jpeg 等)一样制作 org-mode 内联 PDF 文件?

一些背景:PDF图像对我来说更方便有几个原因,最大的原因是它们可以很好地缩放并且可以很好地与乳胶一起使用,从小纸到大海报。

4

3 回答 3

12

让我完成这个问题。

首先,Org-mode 本身不支持任何 pdf 内联显示功能。但是,可以进行修改org-display-inline-images以实现您想要的。首先你需要参考这个答案:Configuring emacs for show fixed width inline images,这给了我很多启发。然后我稍微修改了函数,使其支持在org-mode下显示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 的 file_thumb 以替换 pdf 的覆盖,并强制 org-mode 显示带有 file_thumb 的 pdf,而不对 org 文件进行任何修改。

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

希望它可以帮助你。

于 2014-12-26T03:34:35.023 回答
3

简短回答:不支持 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 邮件列表请求该功能。

于 2013-04-19T13:57:31.630 回答
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 中进行更多编辑)。

于 2016-02-08T02:24:37.513 回答