23

emacs+ではorg-mode、org-mode バッファーを表示するときに、org-toggle-inline-imagesコマンドでリンクされた画像をインライン化できます。これにはすぐに使用できるさまざまな形式が含まれていますが、明らかに PDF 画像はまだ含まれていません。

emacs が PDF ファイルを完全にレンダリングできることを考えると、画像 (png、jpeg など) と同じように組織モードのインライン PDF ファイルを作成することは可能ですか?

いくつかの背景: PDF 画像は、いくつかの理由で私にとってより便利です。最大の理由は、小さな紙から大きなポスターまで、サイズが大きく、ラテックスでうまく機能することです。

4

3 に答える 3

12

この質問を終わらせてください。

まず、Org-mode 自体は PDF インライン表示機能をサポートしていません。ただし、目的を達成するために変更することは可能org-display-inline-imagesです。最初に、この回答を参照する必要があります:固定幅のインライン イメージを表示するための emacs の構成。次に、関数をわずかに変更して、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、フォルダー内にサムネイルという名前の file_thumb を生成して pdf のオーバーレイを置き換え、org-mode で org ファイルを変更せずに file_thumb を使用して pdf を強制的に表示するために使用します。

また、babel を使用して Python で画像を生成しているためです。常に _thumb ファイルを更新する必要があるため、このサム ファイルが存在するかどうかを示す if 条件を追加し、pdf ファイルが変更された場合は同時にサム ファイルを変更する必要があります... などなど!

それがあなたを助けることを願っています。

于 2014-12-26T03:34:35.023 に答える