From 52fa7f817bc2035ba40c80bdeb7e73a0ec9cd32f Mon Sep 17 00:00:00 2001 From: Carsten Dominik Date: Wed, 15 Oct 2008 17:21:52 +0200 Subject: [PATCH] Add commands to export to PDF. This works by creating LaTeX first, and then processing it. --- doc/org.texi | 52 ++++++++++++++++++++++++---------------- lisp/ChangeLog | 7 ++++++ lisp/org-exp.el | 7 ++++++ lisp/org-export-latex.el | 47 ++++++++++++++++++++++++++++++++++++ lisp/org-publish.el | 20 ++++++++++------ lisp/org.el | 1 + 6 files changed, 106 insertions(+), 28 deletions(-) diff --git a/doc/org.texi b/doc/org.texi index 3a2a57e66..ca9becfcd 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -291,7 +291,7 @@ Exporting * The export dispatcher:: How to access exporter commands * ASCII export:: Exporting to plain ASCII * HTML export:: Exporting to HTML -* LaTeX export:: Exporting to LaTeX +* LaTeX and PDF export:: Exporting to LaTeX, and processing to PDF * XOXO export:: Exporting to XOXO * iCalendar export:: Exporting in iCalendar format @@ -321,9 +321,9 @@ HTML export * CSS support:: Changing the appearance of the output * Javascript support:: Info and Folding in a web browser -LaTeX export +LaTeX and PDF export -* LaTeX export commands:: How to invoke LaTeX export +* LaTeX/PDF export commands:: * Quoting LaTeX code:: Incorporating literal LaTeX code * Sectioning structure:: Changing sectioning in LaTeX output @@ -6930,7 +6930,7 @@ Org mode only supports export, not import of these different formats. * The export dispatcher:: How to access exporter commands * ASCII export:: Exporting to plain ASCII * HTML export:: Exporting to HTML -* LaTeX export:: Exporting to LaTeX +* LaTeX and PDF export:: Exporting to LaTeX, and processing to PDF * XOXO export:: Exporting to XOXO * iCalendar export:: Exporting in iCalendar format @end menu @@ -7454,7 +7454,7 @@ the body text. Any indentation larger than this is adjusted to preserve the layout relative to the first line. Should there be lines with less indentation than the first, these are left alone. -@node HTML export, LaTeX export, ASCII export, Exporting +@node HTML export, LaTeX and PDF export, ASCII export, Exporting @section HTML export @cindex HTML export @@ -7698,19 +7698,23 @@ You can choose default values for these options by customizing the variable @code{org-infojs-options}. If you always want to apply the script to your pages, configure the variable @code{org-export-html-use-infojs}. -@node LaTeX export, XOXO export, HTML export, Exporting -@section LaTeX export +@node LaTeX and PDF export, XOXO export, HTML export, Exporting +@section LaTeX and PDF export @cindex LaTeX export +@cindex PDF export -Org mode contains a La@TeX{} exporter written by Bastien Guerry. +Org mode contains a La@TeX{} exporter written by Bastien Guerry. With +further processing, this backend is also used to produce PDF output. Since +the LaTeX output uses @file{hyperref} to implement links and cross +references, the PDF output file will be fully linked. @menu -* LaTeX export commands:: How to invoke LaTeX export +* LaTeX/PDF export commands:: * Quoting LaTeX code:: Incorporating literal LaTeX code * Sectioning structure:: Changing sectioning in LaTeX output @end menu -@node LaTeX export commands, Quoting LaTeX code, LaTeX export, LaTeX export +@node LaTeX/PDF export commands, Quoting LaTeX code, LaTeX and PDF export, LaTeX and PDF export @subsection LaTeX export commands @table @kbd @@ -7738,6 +7742,12 @@ buffer. @item M-x org-replace-region-by-latex Replace the active region (assumed to be in Org mode syntax) by La@TeX{} code. +@kindex C-c C-e p +@item C-c C-e p +Export as LaTeX and then process to PDF. +@kindex C-c C-e d +@item C-c C-e d +Export as LaTeX and then process to PDF, then open the resulting PDF file. @end table @cindex headline levels, for exporting @@ -7757,7 +7767,7 @@ with a numeric prefix argument. For example, @noindent creates two levels of headings and does the rest as items. -@node Quoting LaTeX code, Sectioning structure, LaTeX export commands, LaTeX export +@node Quoting LaTeX code, Sectioning structure, LaTeX/PDF export commands, LaTeX and PDF export @subsection Quoting LaTeX code Embedded La@TeX{} as described in @ref{Embedded LaTeX} will be correctly @@ -7778,7 +7788,7 @@ All lines between these markers are exported literally #+END_LaTeX @end example -@node Sectioning structure, , Quoting LaTeX code, LaTeX export +@node Sectioning structure, , Quoting LaTeX code, LaTeX and PDF export @subsection Sectioning structure @cindex LaTeX class @cindex LaTeX sectioning structure @@ -7792,7 +7802,7 @@ You can change this globally by setting a different value for structure for each class, as well as defining additonal classes. -@node XOXO export, iCalendar export, LaTeX export, Exporting +@node XOXO export, iCalendar export, LaTeX and PDF export, Exporting @section XOXO export @cindex XOXO export @@ -7984,14 +7994,14 @@ and @code{:exclude}. @cindex action, for publishing Publishing means that a file is copied to the destination directory and -possibly transformed in the process. The default transformation is to -export Org files as HTML files, and this is done by the function -@code{org-publish-org-to-html} which calls the HTML exporter -(@pxref{HTML export}). But you also can publish your files in La@TeX{} by -using the function @code{org-publish-org-to-latex} instead. Other files -like images only need to be copied to the publishing destination. For -non-Org files, you need to specify the publishing function. - +possibly transformed in the process. The default transformation is to export +Org files as HTML files, and this is done by the function +@code{org-publish-org-to-html} which calls the HTML exporter (@pxref{HTML +export}). But you also can publish your files in La@TeX{} by using the +function @code{org-publish-org-to-latex} instead, or as PDF files using +@code{org-publish-org-to-pdf}. Other files like images only need to be +copied to the publishing destination. For non-Org files, you need to provide +your own publishing function: @multitable @columnfractions 0.3 0.7 @item @code{:publishing-function} diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cedbc1fe1..103a4b9fa 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,12 @@ 2008-10-15 Carsten Dominik + * org-publish.el (org-publish-org-to): Handle case when + org-export-to-pdf does return a file name, not a buffer. + (org-publish-org-to-pdf): New function. + + * org-export-latex.el (org-export-as-pdf) + (org-export-as-pdf-and-open): New commands. + * org-table.el (org-table-eval-formula): Avoid parsing Calc's HMS forms as ranges. diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 677130846..2544cec65 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -1009,6 +1009,8 @@ value of `org-export-run-in-background'." \[x] export as XOXO \[l] export as LaTeX +\[p] export as LaTeX and process to PDF +\[d] export as LaTeX, process to PDF, and open the resulting PDF document \[L] export as LaTeX to temporary buffer \[i] export current file as iCalendar file @@ -1029,6 +1031,8 @@ value of `org-export-run-in-background'." (?R org-export-region-as-html nil) (?x org-export-as-xoxo t) (?l org-export-as-latex t) + (?p org-export-as-pdf t) + (?d org-export-as-pdf-and-open t) (?L org-export-as-latex-to-buffer nil) (?i org-export-icalendar-this-file t) (?I org-export-icalendar-all-agenda-files t) @@ -1042,6 +1046,9 @@ value of `org-export-run-in-background'." (delete-other-windows) (with-output-to-temp-buffer "*Org Export/Publishing Help*" (princ help)) + (if (fboundp 'fit-window-to-buffer) + (fit-window-to-buffer (get-buffer-window + "*Org Export/Publishing Help*"))) (message "Select command: ") (setq r1 (read-char-exclusive))) (setq r2 (if (< r1 27) (+ r1 96) r1)) diff --git a/lisp/org-export-latex.el b/lisp/org-export-latex.el index 8e94b1ad9..b062130e6 100644 --- a/lisp/org-export-latex.el +++ b/lisp/org-export-latex.el @@ -36,6 +36,8 @@ ;; The interactive functions are similar to those of the HTML exporter: ;; ;; M-x `org-export-as-latex' +;; M-x `org-export-as-pdf' +;; M-x `org-export-as-pdf-and-open' ;; M-x `org-export-as-latex-batch' ;; M-x `org-export-as-latex-to-buffer' ;; M-x `org-export-region-as-latex' @@ -232,6 +234,18 @@ Don't remove the keys, just change their values." :group 'org-export-latex :type 'coding-system) +(defgroup org-export-pdf nil + "Options for exporting Org-mode files to PDF, via LaTeX." + :tag "Org Export LaTeX" + :group 'org-export-latex + :group 'org-export) + +(defcustom org-export-pdf-remove-logfiles t + "Non-nil means, remove the logfiles produced by PDF production. +These are the .aux, .log, .out, and .toc files." + :group 'org-export-latex + :type 'boolean) + ;;; Autoload functions: ;;;###autoload @@ -462,6 +476,39 @@ when PUB-DIR is set, use this as the publishing directory." (current-buffer)) (set-window-configuration wcf)))) +(defun org-export-as-pdf (arg &optional hidden ext-plist + to-buffer body-only pub-dir) + "Export as LaTeX, then process through to PDF." + (interactive "P") + (message "Exporting to PDF...") + (let* ((wconfig (current-window-configuration)) + (lbuf (org-export-as-latex arg hidden ext-plist + to-buffer body-only pub-dir)) + (file (buffer-file-name lbuf)) + (base (file-name-sans-extension (buffer-file-name lbuf))) + (pdffile (concat base ".pdf"))) + (and (file-exists-p pdffile) (delete-file pdffile)) + (message "Processing LaTeX file...") + (shell-command (format "pdflatex -interaction nonstopmode %s;pdflatex -interaction nonstopmode %s" file file)) + (message "Processing LaTeX file...done") + (if (not (file-exists-p pdffile)) + (error "PDF file was not produced") + (set-window-configuration wconfig) + (when org-export-pdf-remove-logfiles + (dolist (ext '("aux" "log" "out" "toc")) + (setq file (concat base "." ext)) + (and (file-exists-p file) (delete-file file)))) + (message "Exporting to PDF...done") + pdffile))) + +(defun org-export-as-pdf-and-open (arg) + "Export as LaTeX, then process through to PDF, and open." + (interactive "P") + (let ((pdffile (org-export-as-pdf arg))) + (if pdffile + (org-open-file pdffile) + (error "PDF file was not produced")))) + ;;; Parsing functions: (defun org-export-latex-parse-global (level odd) diff --git a/lisp/org-publish.el b/lisp/org-publish.el index a8279e3e1..ab18e5c8e 100644 --- a/lisp/org-publish.el +++ b/lisp/org-publish.el @@ -482,19 +482,20 @@ PUB-DIR is the publishing directory." (plist (cons :buffer-will-be-killed (cons t plist))) (init-buf (or visiting (find-file filename))) (init-point (point)) - (init-buf-string (buffer-string)) export-buf) + (init-buf-string (buffer-string)) export-buf-or-file) ;; run hooks before exporting (run-hooks 'org-publish-before-export-hook) ;; export the possibly modified buffer - (setq export-buf + (setq export-buf-or-file (funcall (intern (concat "org-export-as-" format)) (plist-get plist :headline-levels) nil plist nil nil pub-dir)) - (set-buffer export-buf) - ;; run hooks after export and save export - (and (run-hooks 'org-publish-after-export-hook) - (if (buffer-modified-p) (save-buffer))) - (kill-buffer export-buf) + (when (and (bufferp export-buf-or-file) (buffer-live-p export-buf-or-file)) + (set-buffer export-buf-or-file) + ;; run hooks after export and save export + (and (run-hooks 'org-publish-after-export-hook) + (if (buffer-modified-p) (save-buffer))) + (kill-buffer export-buf-or-file)) ;; maybe restore buffer's content (set-buffer init-buf) (when (buffer-modified-p init-buf) @@ -510,6 +511,11 @@ PUB-DIR is the publishing directory." See `org-publish-org-to' to the list of arguments." (org-publish-org-to "latex" plist filename pub-dir)) +(defun org-publish-org-to-pdf (plist filename pub-dir) + "Publish an org file to PDF (via LaTeX). +See `org-publish-org-to' to the list of arguments." + (org-publish-org-to "pdf" plist filename pub-dir)) + (defun org-publish-org-to-html (plist filename pub-dir) "Publish an org file to HTML. See `org-publish-org-to' to the list of arguments." diff --git a/lisp/org.el b/lisp/org.el index 497a6df07..9f22e1c21 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1140,6 +1140,7 @@ See `org-file-apps'.") '( (auto-mode . emacs) ("\\.x?html?\\'" . default) + ("\\.pdf\\'" . default) ) "External applications for opening `file:path' items in a document. Org-mode uses system defaults for different file types, but