]> code.delx.au - gnu-emacs/blobdiff - lisp/org/ob-latex.el
* lisp/simple.el (save-mark-and-excursion): Add declare forms.
[gnu-emacs] / lisp / org / ob-latex.el
index 0db71992826f24524eb5d4049baca524426a7454..c08717d7c7bc66f8c10f7e6b349412cdf96af692 100644 (file)
@@ -1,6 +1,6 @@
 ;;; ob-latex.el --- org-babel functions for latex "evaluation"
 
-;; Copyright (C) 2009-201 Free Software Foundation, Inc.
+;; Copyright (C) 2009-2016 Free Software Foundation, Inc.
 
 ;; Author: Eric Schulte
 ;; Keywords: literate programming, reproducible research
 ;;; Code:
 (require 'ob)
 
-(declare-function org-create-formula-image "org" (string tofile options buffer))
+(declare-function org-create-formula-image "org"
+                  (string tofile options buffer &optional type))
 (declare-function org-splice-latex-header "org"
                  (tpl def-pkg pkg snippets-p &optional extra))
-(declare-function org-export-latex-fix-inputenc "org-latex" ())
+(declare-function org-latex-guess-inputenc "ox-latex" (header))
+(declare-function org-latex-compile "ox-latex" (texfile &optional snippet))
+
 (defvar org-babel-tangle-lang-exts)
 (add-to-list 'org-babel-tangle-lang-exts '("latex" . "tex"))
 
-(defvar org-format-latex-header)
-(defvar org-format-latex-header-extra)
-(defvar org-export-latex-packages-alist)
-(defvar org-export-latex-default-packages-alist)
-(defvar org-export-pdf-logfiles)
-(defvar org-latex-to-pdf-process)
-(defvar org-export-pdf-remove-logfiles)
-(defvar org-format-latex-options)
-(defvar org-export-latex-packages-alist)
+(defvar org-format-latex-header)         ; From org.el
+(defvar org-format-latex-options)        ; From org.el
+(defvar org-latex-default-packages-alist) ; From org.el
+(defvar org-latex-packages-alist)        ; From org.el
 
 (defvar org-babel-default-header-args:latex
   '((:results . "latex") (:exports . "results"))
   "Default arguments to use when evaluating a LaTeX source block.")
 
+(defcustom org-babel-latex-htlatex ""
+  "The htlatex command to enable conversion of latex to SVG or HTML."
+  :group 'org-babel
+  :type 'string)
+
+(defcustom org-babel-latex-htlatex-packages
+  '("[usenames]{color}" "{tikz}" "{color}" "{listings}" "{amsmath}")
+  "Packages to use for htlatex export."
+  :group 'org-babel
+  :type '(repeat (string)))
+
 (defun org-babel-expand-body:latex (body params)
   "Expand BODY according to PARAMS, return the expanded body."
   (mapc (lambda (pair) ;; replace variables
@@ -81,28 +90,32 @@ This function is called by `org-babel-execute-src-block'."
             (width (and fit (cdr (assoc :pdfwidth params))))
             (headers (cdr (assoc :headers params)))
             (in-buffer (not (string= "no" (cdr (assoc :buffer params)))))
-            (org-export-latex-packages-alist
-             (append (cdr (assoc :packages params))
-                     org-export-latex-packages-alist)))
+            (org-latex-packages-alist
+             (append (cdr (assoc :packages params)) org-latex-packages-alist)))
         (cond
          ((and (string-match "\\.png$" out-file) (not imagemagick))
           (org-create-formula-image
            body out-file org-format-latex-options in-buffer))
-         ((or (string-match "\\.pdf$" out-file) imagemagick)
-         (require 'org-latex)
+         ((string-match "\\.tikz$" out-file)
+         (when (file-exists-p out-file) (delete-file out-file))
+         (with-temp-file out-file
+           (insert body)))
+        ((or (string-match "\\.pdf$" out-file) imagemagick)
          (with-temp-file tex-file
+           (require 'ox-latex)
            (insert
-            (org-splice-latex-header
-             org-format-latex-header
-             (delq
-              nil
-              (mapcar
-               (lambda (el)
-                 (unless (and (listp el) (string= "hyperref" (cadr el)))
-                   el))
-               org-export-latex-default-packages-alist))
-             org-export-latex-packages-alist
-             org-format-latex-header-extra)
+            (org-latex-guess-inputenc
+             (org-splice-latex-header
+              org-format-latex-header
+              (delq
+               nil
+               (mapcar
+                (lambda (el)
+                  (unless (and (listp el) (string= "hyperref" (cadr el)))
+                    el))
+                org-latex-default-packages-alist))
+              org-latex-packages-alist
+              nil))
             (if fit "\n\\usepackage[active, tightpage]{preview}\n" "")
             (if border (format "\\setlength{\\PreviewBorder}{%s}" border) "")
             (if height (concat "\n" (format "\\pdfpageheight %s" height)) "")
@@ -113,14 +126,10 @@ This function is called by `org-babel-execute-src-block'."
                             (mapconcat #'identity headers "\n")
                           headers) "\n")
               "")
-            (if org-format-latex-header-extra
-                (concat "\n" org-format-latex-header-extra)
-              "")
             (if fit
                 (concat "\n\\begin{document}\n\\begin{preview}\n" body
                         "\n\\end{preview}\n\\end{document}\n")
-              (concat "\n\\begin{document}\n" body "\n\\end{document}\n")))
-           (org-export-latex-fix-inputenc))
+              (concat "\n\\begin{document}\n" body "\n\\end{document}\n"))))
           (when (file-exists-p out-file) (delete-file out-file))
          (let ((transient-pdf-file (org-babel-latex-tex-to-pdf tex-file)))
            (cond
@@ -131,70 +140,62 @@ This function is called by `org-babel-execute-src-block'."
               transient-pdf-file out-file im-in-options im-out-options)
              (when (file-exists-p transient-pdf-file)
                (delete-file transient-pdf-file))))))
+        ((and (or (string-match "\\.svg$" out-file)
+                  (string-match "\\.html$" out-file))
+              (not (string= "" org-babel-latex-htlatex)))
+         (with-temp-file tex-file
+           (insert (concat
+                    "\\documentclass[preview]{standalone}
+\\def\\pgfsysdriver{pgfsys-tex4ht.def}
+"
+                    (mapconcat (lambda (pkg)
+                                 (concat "\\usepackage" pkg))
+                               org-babel-latex-htlatex-packages
+                               "\n")
+                    "\\begin{document}"
+                    body
+                    "\\end{document}")))
+         (when (file-exists-p out-file) (delete-file out-file))
+         (let ((default-directory (file-name-directory tex-file)))
+           (shell-command (format "%s %s" org-babel-latex-htlatex tex-file)))
+         (cond
+          ((file-exists-p (concat (file-name-sans-extension tex-file) "-1.svg"))
+           (if (string-match "\\.svg$" out-file)
+               (progn
+                 (shell-command "pwd")
+                 (shell-command (format "mv %s %s"
+                                        (concat (file-name-sans-extension tex-file) "-1.svg")
+                                        out-file)))
+             (error "SVG file produced but HTML file requested.")))
+          ((file-exists-p (concat (file-name-sans-extension tex-file) ".html"))
+           (if (string-match "\\.html$" out-file)
+               (shell-command "mv %s %s"
+                              (concat (file-name-sans-extension tex-file)
+                                      ".html")
+                              out-file)
+             (error "HTML file produced but SVG file requested.")))))
          ((string-match "\\.\\([^\\.]+\\)$" out-file)
-          (error "can not create %s files, please specify a .png or .pdf file or try the :imagemagick header arguement"
+          (error "Can not create %s files, please specify a .png or .pdf file or try the :imagemagick header argument"
                 (match-string 1 out-file))))
         nil) ;; signal that output has already been written to file
     body))
 
-
 (defun convert-pdf (pdffile out-file im-in-options im-out-options)
   "Generate a file from a pdf file using imagemagick."
   (let ((cmd (concat "convert " im-in-options " " pdffile " "
                     im-out-options " " out-file)))
-    (message (concat "Converting pdffile file " cmd  "..."))
+    (message "Converting pdffile file %s..." cmd)
     (shell-command cmd)))
 
 (defun org-babel-latex-tex-to-pdf (file)
-  "Generate a pdf file according to the contents FILE.
-Extracted from `org-export-as-pdf' in org-latex.el."
-  (let* ((wconfig (current-window-configuration))
-         (default-directory (file-name-directory file))
-         (base (file-name-sans-extension file))
-         (pdffile (concat base ".pdf"))
-         (cmds org-latex-to-pdf-process)
-         (outbuf (get-buffer-create "*Org PDF LaTeX Output*"))
-         output-dir cmd)
-    (with-current-buffer outbuf (erase-buffer))
-    (message (concat "Processing LaTeX file " file "..."))
-    (setq output-dir (file-name-directory file))
-    (if (and cmds (symbolp cmds))
-       (funcall cmds (shell-quote-argument file))
-      (while cmds
-       (setq cmd (pop cmds))
-       (while (string-match "%b" cmd)
-         (setq cmd (replace-match
-                    (save-match-data
-                      (shell-quote-argument base))
-                    t t cmd)))
-       (while (string-match "%f" cmd)
-         (setq cmd (replace-match
-                    (save-match-data
-                      (shell-quote-argument file))
-                    t t cmd)))
-       (while (string-match "%o" cmd)
-         (setq cmd (replace-match
-                    (save-match-data
-                      (shell-quote-argument output-dir))
-                    t t cmd)))
-       (shell-command cmd outbuf)))
-    (message (concat "Processing LaTeX file " file "...done"))
-    (if (not (file-exists-p pdffile))
-       (error (concat "PDF file " pdffile " was not produced"))
-      (set-window-configuration wconfig)
-      (when org-export-pdf-remove-logfiles
-       (dolist (ext org-export-pdf-logfiles)
-         (setq file (concat base "." ext))
-         (and (file-exists-p file) (delete-file file))))
-      (message "Exporting to PDF...done")
-      pdffile)))
+  "Generate a pdf file according to the contents FILE."
+  (require 'ox-latex)
+  (org-latex-compile file))
 
 (defun org-babel-prep-session:latex (session params)
   "Return an error because LaTeX doesn't support sessions."
   (error "LaTeX does not support sessions"))
 
-(provide 'ob-latex)
-
-
 
+(provide 'ob-latex)
 ;;; ob-latex.el ends here