emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Edouard Debry <edouard.debry@gmail.com>
To: reza <reza@housseini.me>
Cc: "emacs-orgmode@gnu.org" <emacs-orgmode@gnu.org>
Subject: Re: svg file from tikz picture
Date: Tue, 20 Sep 2022 22:53:34 +0200	[thread overview]
Message-ID: <8635clydgx.fsf@gmail.com> (raw)
In-Reply-To: <010201835a532739-08121085-5b99-4410-8f53-11b74f8d7dcc-000000@eu-west-1.amazonses.com> (reza@housseini.me's message of "Tue, 20 Sep 2022 09:55:42 +0000")


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 <reza@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


  reply	other threads:[~2022-09-20 23:51 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <3bc47afb-0bac-f6e8-1097-13dcb6f2be1f@housseini.me>
2022-08-15 18:50 ` svg file from tikz picture reza
2022-08-16  9:42   ` Ihor Radchenko
     [not found]     ` <964a4117-ef6c-8d41-a25d-00e61c0c93d8@housseini.me>
2022-08-16 10:00       ` reza
2022-08-16 10:13         ` Ihor Radchenko
     [not found]           ` <0931497c-9075-c214-c7f2-6507340a6d74@housseini.me>
2022-08-16 10:19             ` reza
2022-08-16 10:31               ` Ihor Radchenko
     [not found]                 ` <6daeb56b-163c-f862-5866-da624b43edd9@housseini.me>
2022-08-16 11:06                   ` reza
2022-08-16 11:22                     ` Ihor Radchenko
     [not found]                       ` <7dcd1348-6faf-8464-38b5-8efac7c69250@housseini.me>
2022-08-16 11:25                         ` reza
     [not found]                           ` <be3e5412-37ff-c1c7-7a27-3793d72842d4@housseini.me>
2022-09-20  9:55                             ` reza
2022-09-20 20:53                               ` Edouard Debry [this message]
2022-09-21  9:32                               ` Ihor Radchenko
2022-09-23  2:28                                 ` Akira Kyle
2022-09-25  7:52                                   ` Ihor Radchenko
2022-11-14  5:52                                     ` Ihor Radchenko
2023-03-24 23:22                                       ` Akira Kyle
2023-03-25 18:13                                         ` Ihor Radchenko
2023-03-25 18:14                                           ` Akira Kyle
2023-03-25 18:25                                             ` Ihor Radchenko
2023-04-19  9:57                                               ` Bastien Guerry
2023-08-05  9:34                                                 ` Ihor Radchenko
2023-08-05 17:29                                                   ` Bastien Guerry
2023-08-05 18:38                                                     ` Akira Kyle
2023-08-06  5:37                                                       ` Bastien Guerry
2023-08-06  5:40                                                       ` Bastien Guerry
2023-10-19  9:51                                                       ` Ihor Radchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8635clydgx.fsf@gmail.com \
    --to=edouard.debry@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=reza@housseini.me \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).