2013-03-14 7 views
14

In emacs + org-mode können Sie beim Anzeigen eines Organisationsmoduspuffers verknüpfte Bilder mit dem Befehl org-toggle-inline-images verknüpfen. Diese enthält verschiedene Formate out of the box, aber anscheinend PDF-Bilder sind noch nicht enthalten.Inline-PDF-Bilder im Organisationsmodus

Da Emacs zum Rendern von PDF-Dateien durchaus in der Lage ist, ist es möglich, org-Modus Inline-PDF-Dateien zu machen, wie es mit Bildern tut (PNG, JPEG, usw.)?

Einige Hintergrundinformationen: von kleinen Papieren zu großen Plakaten PDF-Bilder für mich bequemer sind mehrere Gründe, die größte ist, dass sie mit Latex gut und arbeiten gut skalieren.

+1

Korrektur: Emacs ist nicht in der Lage, PDF-Dateien zu rendern (Ich denke, Sie könnten so etwas in Elisp schreiben, aber es wäre eine Menge Arbeit, für ein sehr enttäuschendes Ergebnis, da es langsam wäre). Es kann PDF-Dateien mit Hilfe von externen Tools anzeigen, so dass es in der Tat möglich sein sollte, dass Org solche verlinkten Dokumente inline anzeigt. – Stefan

+0

@Stefan Sie haben Recht. Ein externes Tool führt das eigentliche Rendern durch. Ich wollte damit sagen, dass es PDF-Dateien out-of-the-box (zumindest unter Linux) anzeigt. – Malabarba

Antwort

2

Kurze Antwort: keine Unterstützung für PDF-Inline-Bilder.

Die Funktion org-image-file-name-regexp hat die Bilddateierweiterungen fest codiert (und enthält keine PDF). Diese Funktion wird von org-display-inline-images verwendet, die wiederum create-image aufruft.

Ich habe versucht, PDF zu org-image-file-name-regexp hinzufügen, und Löschen von PDF aus imagemagik-types-inhibit ohne Glück.

können Sie versuchen, weiter zu graben, oder fordern Sie die Feature-Mailingliste org-Modus.

7

Lassen Sie mich diese Frage beenden.

Zum einen Org-Modus unterstützt keine Funktion Inline-Anzeige pdf mit sich. Es ist jedoch möglich, org-display-inline-images zu ändern, um zu erreichen, was Sie wollen. Zuerst müssen Sie sich auf diese Antwort beziehen: Configuring emacs for showing fixed width inline images, die mich sehr inspiriert hat. Dann habe ich die Funktion leicht modifiziert, so dass sie PDF, BMP-Anzeige im Org-Modus unterstützt. Meine Funktion ist unten aktiviert.

(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)))))))))) 

Die Funktion verwendet convert file.pdf -thumbnail "400x400>" file_thumb.png ein file_thumb namens Thumbnail in Ihrem Ordner zu erzeugen Overlay von pdf zu ersetzen, und zwingt org-Modus mit file_thumb auf die org-Datei ohne Änderung pdf angezeigt werden soll.

Darüber hinaus, weil ich babel verwenden Bild mit Python zu generieren. Ich muss immer die _thumb-Datei aktualisieren, also füge ich eine if-Bedingung hinzu, um zu sagen, ob diese Datei existiert oder nicht, und wenn die PDF-Datei geändert wird, muss ich gleichzeitig die Daumendatei ändern ... und so weiter!

Ich hoffe, es kann Ihnen helfen.

+0

großartige Lösung! Dies sollte das Standardverhalten sein. – TNT

2

ich in das gleiche Problem lief und nach ein wenig herum Stossen, wurde es durch Zugabe der folgenden meiner .emacs-Datei zu arbeiten:

(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) 

Noch nicht sicher, ob es irgendwelche Probleme für andere Modi sind durch diese Änderungen. Meine pdfs im Organisationsmodus werden von Python src Codeblöcken erstellt und die oben genannten funktionieren, aber die Bilder werden nicht aktualisiert, wenn ich etwas im Python-Modus ändere und ich muss org-display-inline-images manuell ausführen.

Dies setzt voraus, dass Sie eine Emacs mit ImageMagick Unterstützung haben, etwas ähnliches sollte auch für die Verwendung von Ghostscript funktionieren (mit einigen weiteren Bearbeitungen in org.el).