Hi, I had this very same question to produce svg from latex src blocks.
First, consider this example : #+HEADER: :file test1.png #+HEADER: :exports results #+HEADER: :results output silent graphics file #+HEADER: :fit yes :noweb yes :headers '("\\usepackage{tikz}" "\\usetikzlibrary{backgrounds}") #+begin_src latex \begin{tikzpicture}[background rectangle/.style={fill=olive!30}, show background rectangle] \draw[->] (-3,0) -- (-2,0) arc[radius=0.5cm,start angle=-180,end angle=0] (-1,0) -- (1,0) arc[radius=0.5cm,start angle=180,end angle=0] (2,0) -- (3,0); \filldraw (-1.5,0) circle[radius=1mm]; \filldraw (1.5,0) circle[radius=3mm]; \end{tikzpicture} #+end_src When I run it, it does create a test1.png but, it is in fact a svg file !! This is because, as you noticed, the `org-create-formula-image` relies on `org-preview-latex-default-process` which is set to 'dvisvgm. If you set it to 'dvipng, it creates again a regular png file. Then, I changed the line : ((and (string-suffix-p ".png" out-file) (not imagemagick)) into ((and (or (string-suffix-p ".png" out-file) (string-suffix-p ".svg" out-file)) (not imagemagick)) so that I can correctly create a svg file when I want to and, to create a real png file (or jpg one), I add the following line to the header : #+HEADER: :imagemagick yes :iminoptions -density 600 There is also another way to create a svg file with `htlatex` with : ((and (string= "svg" extension) (executable-find org-babel-latex-htlatex)) ;; TODO: this is a very different way of generating the ;; frame latex document than in the pdf case. Ideally, both ;; would be unified. This would prevent bugs creeping in ;; such as the one fixed on Aug 16 2014 whereby :headers was ;; not included in the SVG/HTML case. (with-temp-file tex-file (insert (concat "\\documentclass[preview]{standalone} \\def\\pgfsysdriver{pgfsys-dvisvgm4ht.def} " (mapconcat (lambda (pkg) (concat "\\usepackage" pkg)) org-babel-latex-htlatex-packages "\n") (if headers (concat "\n" (if (listp headers) (mapconcat #'identity headers "\n") headers) "\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) "0x.svg")) (if (string-suffix-p ".svg" out-file) (progn (shell-command "pwd") (shell-command (format "mv %s %s" (concat (file-name-sans-extension tex-file) "0x.svg") out-file))) (error "SVG file produced but HTML file requested"))) ((file-exists-p (concat (file-name-sans-extension tex-file) ".html")) (if (string-suffix-p ".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"))))) you will notice that this is a copy-paste from the html generation with two major differences : - for svg generation, do not use the driver \\def\\pgfsysdriver{pgfsys-tex4ht.def} but rather \\def\\pgfsysdriver{pgfsys-dvisvgm4ht.def} which handles better fonts and probably many other things - the svg file produced to not have the same format with this driver ("0x.svg") That would be great to reimplement ob-latex.el, at least correct the first curious behavior when you end up with a svg file although you wanted a png one. Hope this helps. Regards reza <r...@housseini.me> writes: > By setting > > (setq org-babel-latex-preamble (lambda (_) > "\\documentclass[preview]{standalone}\n") > > the tikz file svg generation does run fine. Obviously the part > > \\def\\pgfsysdriver{pgfsys-tex4ht.def} > > inside `org-babel-latex-preamble` does not play well with the svg > generation. > > > When having a look at the code inside ob-latex.el I also encountered a > few stuff which made me wondering: > > 1. png generation is done with the preview code inside org.el > (org-create-formula-image), there is also a perfectly fine svg preview > function but this does not get used for the svg extension which does the > svg conversion without any external tools like inkscape (see > https://github.com/bzg/org-mode/blob/main/lisp/ob-latex.el#L156 and > https://github.com/bzg/org-mode/blob/main/lisp/org.el#L3181) > > 2. there is a tikz extension switch which does insert the code verbatim, > which in my opinion does create a whole bunch of problems (backend > dependency issues). Not to mention that it also mimics behaviour which > is reserved for the header :results (see > https://github.com/bzg/org-mode/blob/main/lisp/ob-latex.el#L177). > > 3. there is a html extension switch with an unclear purpose to me (in > what scenario would you want to produce an html file?). It also has some > strange (and contradicting) checking if an svg or an html file got > produced. As far as I can tell this code never gets executed and is > therefore pointless (see > https://github.com/bzg/org-mode/blob/main/lisp/ob-latex.el#L181). > > 4. the whole pdf generation looks like duplicate code which is already > done in other parts of the code base (ox-latex.el and for the svg > extension) it ais also not using the variable org-babel-latex-begin-env > and org-babel-latex-end-env (see > https://github.com/bzg/org-mode/blob/main/lisp/ob-latex.el#L225). > > I don't want to criticize anyone, I just want to find answers for in my > opinion some strange decisions. > > My propositions for refactoring is: > > 1. use the svg preview code for svg generation (and therefore ditching > the whole imagemagick headers) > > 2. remove the whole tikz generation completely > > 3. remove the whole html generation completely > > 4. try to merge pdf generation with org.el and ox-latex.el or > incorporating it into he preview code and > org-preview-latex-process-alist (this is probably a whole project of it own) > > WDYT? > > Best, > Reza