Hi all,

Just a small patch that might make life easier for
LaTeX (and esp. tikz) users.  It enables the output of graphics in a
lot of formats using imagemagick.  See below for an example.

This is my first patch, I have never programmed emacs lisp before, and
my common lisp experiences have been short and a while ago.  So please
excuse a (possibly) bad patch.

Details:
LaTeX source blocks now have three new options:
- :imagemagick
  When not nil the source block is processed to pdf and the pdf is
  converted with imagemagick to whatever is given as :file
  Thus, the format is not limited to png.
- :iminoptions
  This is passed to imagemagick before the pdf file
- :imoutoptions
  This is passed to imagemagick before the output file

Small Example:
#+begin_src latex ... :file test.jpg :imagemagick yes :iminoptions
-density 300 :imoutoptions -geometry 400 ...
will use this command for conversion:
convert -density 300 <tmp-pdf> -geometry 400 test.jpg

Full example:
Export this to pdf and to html to see the effect.
=======================================
* Test
  #+begin_src R :session :exports both :results silent
    library("tikzDevice")
  #+end_src

  #+srcname: test_plot
  #+begin_src R :session :exports code :results output latex
    tikz(console=TRUE, width=4, height=4)
    plot(rnorm(100), rnorm(100))
    dummy <- dev.off()
  #+end_src

  #+srcname: test_plot_png
  #+begin_src latex :exports (if (and (boundp 'backend) (eq backend
'latex)) "none" "results") :file test.png :imagemagick yes :iminoptions
-density 600 :imoutoptions -geometry 400 :fit yes :noweb yes :headers
'("\\usepackage{tikz}")
    <<test_plot()>>
  #+end_src

  #+srcname: test_plot_tikz
  #+begin_src latex :noweb yes
    <<test_plot()>>
  #+end_src

* Latex Options                               :noexport:
#+LATEX_HEADER: \usepackage{tikz}
=======================================

Regards,
Andreas
diff --git a/lisp/ob-latex.el b/lisp/ob-latex.el
index 8943ded..6152ad3 100644
--- a/lisp/ob-latex.el
+++ b/lisp/ob-latex.el
@@ -72,6 +72,10 @@ This function is called by `org-babel-execute-src-block'."
       (let* ((out-file (cdr (assoc :file params)))
 	     (tex-file (org-babel-temp-file "latex-" ".tex"))
 	     (border (cdr (assoc :border params)))
+	     (imagemagick (cdr (assoc :imagemagick params)))
+	     (im-in-options (cdr (assoc :iminoptions params)))
+	     (im-out-options (cdr (assoc :imoutoptions params)))
+	     (pdfpng (cdr (assoc :pdfpng params)))
 	     (fit (or (cdr (assoc :fit params)) border))
 	     (height (and fit (cdr (assoc :pdfheight params))))
 	     (width (and fit (cdr (assoc :pdfwidth params))))
@@ -81,10 +85,10 @@ This function is called by `org-babel-execute-src-block'."
 	      (append (cdr (assoc :packages params))
 		      org-export-latex-packages-alist)))
         (cond
-         ((string-match "\\.png$" out-file)
+         ((and (string-match "\\.png$" out-file) (not imagemagick))
           (org-create-formula-image
            body out-file org-format-latex-options in-buffer))
-         ((string-match "\\.pdf$" out-file)
+         ((or (string-match "\\.pdf$" out-file) imagemagick)
 	  (require 'org-latex)
 	  (with-temp-file tex-file
 	    (insert
@@ -118,13 +122,26 @@ This function is called by `org-babel-execute-src-block'."
 	       (concat "\n\\begin{document}\n" body "\n\\end{document}\n")))
 	    (org-export-latex-fix-inputenc))
           (when (file-exists-p out-file) (delete-file out-file))
-          (rename-file (org-babel-latex-tex-to-pdf tex-file) out-file))
+	  (let* ((transient-pdf-file (org-babel-latex-tex-to-pdf tex-file)))
+	    (cond
+	     ((string-match "\\.pdf$" out-file)
+	      (rename-file transient-pdf-file out-file))
+	     (imagemagick
+	      (convert-pdf transient-pdf-file out-file im-in-options im-out-options)
+	      (when (file-exists-p transient-pdf-file) (delete-file transient-pdf-file))))))
          ((string-match "\\.\\([^\\.]+\\)$" out-file)
-          (error "can not create %s files, please specify a .png or .pdf file"
+          (error "can not create %s files, please specify a .png or .pdf file or try the :imagemagick header arguement"
 		 (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  "..."))
+    (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."

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

Reply via email to