TeX - LaTeX Asked by Henrik Hansen on August 27, 2021
I would like to use TikZ in other settings than TeX and I’d especially like to use the drawings on websites where the text should be searchable and selectable. However, I’m unsure of the best way to convert my drawings to SVG.
How do I best take some TikZ code, render the drawing and turn the output into SVG?
You can use the standalone
class to produce tight PDF files for one or multiple TikZ pictures. I originally wrote it to simplify the creation of the many pictures of my thesis. Since v1.0 it includes a convert
option which can convert the produced PDF into a graphics file automatically (using external software, which requires the -shell-escape
compiler option).
This is very similar to Compile a LaTeX document into a PNG image that's as short as possible, but SVG needs some extra care.
You can write your TikZ pictures the following way:
documentclass[tikz,convert={outfile=jobname.svg}]{standalone}
%usetikzlibrary{...}% tikz package already loaded by 'tikz' option
begin{document}
begin{tikzpicture}% Example:
draw (0,0) -- (10,10); % ...
draw (10,0) -- (0,10); % ...
node at (5,5) {Lorem ipsum at domine standalonus};
end{tikzpicture}
end{document}
Then either you compile the file as usual with pdflatex
or another latex
and convert the PDF to a SVG manually or compile it with the -shell-escape
option and let standalone
convert it for you.
Manual conversion can be done with a number of tools. It is simpler under Linux, because these tools are easily available there, but should be possible under Windows as well. (The convert
options isn't really tested under Windows, btw.)
By default standalone
uses Image Magick's convert
, which can do PDF to SVG but will not always give you good results.
The pdf2svg
tool seems to be better suited, but isn't supported out-of-the-box by standalone
yet. It can of course be used manually as shown in Exporting all equations from a document as individual svg files.
You can configure standalone
to use pdf2svg
directly by using the command
key of the convert
option. Unfortunately, there is a small bug in standalone
preventing it. I just fixed that and will upload the new version today.
With this you can write:
documentclass[crop,tikz,convert={outext=.svg,command=unexpanded{pdf2svg infilespaceoutfile}},multi=false]{standalone}[2012/04/13]
%usetikzlibrary{...}% tikz package already loaded by 'tikz' option
makeatletter
begin{document}
begin{tikzpicture}
draw (0,0) -- (10,10); % ...
draw (10,0) -- (0,10); % ...
draw (5,0) -- (0,10); % ...
node at (5,5) {Lorem ipsum at domine standalonus};
end{tikzpicture}
end{document}
The unexpanded
is required because LaTeX expands class options. You can also add noexpand
before every macro instead.
If you need this more often you can also use a standalone.cfg
file which enables this for all (local) standalone
files. Simply create this file as follows in the same directory:
% Local standalone.cfg file
input{standalone/standalone.cfg}% Load main standalone.cfg file
standaloneconfig{convert={command={pdf2svg infilespaceoutfile}}}
I might add a special pdf2svg
key in the next version as well, so you only need to write the following then:
documentclass[crop,tikz,convert=pdf2svg]{standalone}[2012/04/13]
% ...
Correct answer by Martin Scharrer on August 27, 2021
On linux, you can use pdf2svg
(an opensource tool). All glyphs are converted to paths, thus you can't edit your text. But it is the only tool that seems to give good results for images mixing drawings and texts.
In your MWE, to get smooth result, I add the smooth
option to plot
.
Here is a snapshot of the svg file rendered by Firefox (click on the image to download the SVG file):
Here the two commands used to convert TEX to SVG:
pdflatex file.tex pdf2svg file.pdf file.svg
Your MWE with my changes:
documentclass{standalone}
usepackage{tikz}
usepackage{lmodern}
usepackage[T1]{fontenc}
begin{document}
begin{tikzpicture}[domain=-2:2,samples=100,scale=1.0,>=latex]
tikzset{bgrid/.style={help lines,color=blue!10,very thin}}
draw[bgrid] (-1.5,-3.5) grid (7.5,3.5);
draw[<->, color=black] (-1.5,0) -- (7.5,0) node[right] {$x$};
draw[<->, color=black] (0,-3.5) -- (0,3.5) node[above] {$y$};
foreach x/xtext in {-1,1,2,3,4,5,6,7}
draw (x cm,1pt) -- (x cm,-1pt) node[anchor=north] {$xtext$};
foreach y/ytext in {-3,-2,-1,1,2,3}
draw (1pt,y cm) -- (-1pt,y cm) node[anchor=east] {$ytext$};
draw[thick,color=black,domain=0:7.5,smooth]
plot (x,{sqrt(x)}) node[anchor=south] {$y = sqrt{x}$};
draw[dashed,color=black,domain=0:7.5,smooth]
plot (x,{(-1)*(sqrt(x))}) node[anchor=north] {$y = -sqrt{x}$};
draw[thick,color=black,domain=-1.5:5.5,samples=3]
plot (x,{(x)-2}) node[anchor=south] {$y = x - 2$};
filldraw[black] (4,2) circle(2pt) node[anchor=south east] {$(4, 2)$};
filldraw[red] (1,-1) circle(2pt);
draw[red] (1.5,-1) node[anchor=west] {$(1, -1)$};
end{tikzpicture}
end{document}
Answered by Paul Gaborit on August 27, 2021
If I run dvisvgm with option -n
and the evaluation of PostScript specials is enabled, I get the expected result:
Since MiKTeX doesn't provide a dvisvgm binary through its repositories, you have to install it manually. Recent builds for MiKTeX are available from the dvisvgm website. Simply extract dvisvgm.exe
to the MiKTeX subfolder miktexbin
, or even better, install it in a local texmf tree.
Answered by Martin on August 27, 2021
I use tex4ht and set the PGF output format to SVG. This solution comes from page 110 of the pgfmanual http://mirrors.ctan.org/graphics/pgf/base/doc/generic/pgf/pgfmanual.pdf.
I've only used it to create SVG of a TikZ picture in an otherwise empty documentclass{article} but it looks like you could use this to make html with SVG graphics of a large document.
The advantage of this approach is that the SVG is produced by PGF and you know you're getting vector graphics. Also you get the result in a single step. It won't do functional shading or matricies and text in the pictures can be a problem but there's more on fixing that in the pgfmanual.
In the TeX or LaTeX document preamble before you load the TikZ package, e.g. with usepackage{tikz} in LaTeX type:
defpgfsysdriver{pgfsys-tex4ht.def}
Then process the TeX or LaTeX with httex or htlatex as appropriate. You may need to add tex4ht to your tex installation; it's at http://www.tug.org/applications/tex4ht/. For example to process my file called logoname.tex I do
htlatex logoname.tex
The following output files are created in the current directory
logoname.html
logoname.css
logoname-1.svg
If you have more TikZ pictures in the document I assume they would become logoname-2.svg and so on.
I'm able to look at the SVG output in firefox and inkscape so it seems to produce good results.
Answered by jherbold on August 27, 2021
You might want to check out a tool I just wrote: tikz2svg.
Given in.tikz
(or stdin):
> cat in.tikz
begin{tikzpicture}
fill[red!90!black] ( 90:.6) circle (1);
fill[green!80!black] (210:.6) circle (1);
fill[blue!90!black] (330:.6) circle (1);
end{tikzpicture}
It outputs:
> cat tikz2svg < in.tikz
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="93.472pt" height="86.205pt" viewBox="0 0 93.472 86.205" version="1.1">
<g id="surface1">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(89.99939%,0%,0%);fill-opacity:1;" d="M 76.742188 30.347656 C 76.742188 14.691406 64.050781 2 48.394531 2 C 32.742188 2 20.050781 14.691406 20.050781 30.347656 C 20.050781 46.003906 32.742188 58.695312 48.394531 58.695312 C 64.050781 58.695312 76.742188 46.003906 76.742188 30.347656 Z "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,79.998779%,0%);fill-opacity:1;" d="M 62.011719 55.859375 C 62.011719 40.203125 49.324219 27.511719 33.667969 27.511719 C 18.011719 27.511719 5.320312 40.203125 5.320312 55.859375 C 5.320312 71.515625 18.011719 84.207031 33.667969 84.207031 C 49.324219 84.207031 62.011719 71.515625 62.011719 55.859375 Z "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,89.99939%);fill-opacity:1;" d="M 91.472656 55.859375 C 91.472656 40.203125 78.78125 27.511719 63.125 27.511719 C 47.46875 27.511719 34.777344 40.203125 34.777344 55.859375 C 34.777344 71.515625 47.46875 84.207031 63.125 84.207031 C 78.78125 84.207031 91.472656 71.515625 91.472656 55.859375 Z "/>
</g>
</svg>
Answered by Juan Batiz-Benet on August 27, 2021
You can use dvisvgm, which is a built-in tool of some TeX distributions (e.g. MiKTeX).
The basic usage:
latex testsvg.tex
dvisvgm testsvg.dvi
Then the SVG file will be saved in the current directory.
If you converted a simple math formula but get garbage when displaying the SVG, you can run dvisvgm
with option --no-fonts
to replace the fonts with path elements.
dvisvgm --no-fonts testsvg.dvi
As of version 2.0, you can call dvisvgm
with option --font-format=woff
, you should get SVG files that render correctly in almost all recent web browsers.
dvisvgm --font-format=woff testsvg.dvi
If you use TeXstudio, you can edit the texstudio.ini
file (located in AppDataRoamingTeXstudio
for Windows) and add the following line below [texmaker]
.
ToolsCommandsdvi2svg="txs:///latex | dvisvgm --font-format=woff %.dvi"
Restart TeXstudio and you can find your custom command at Tools->User->dvi2svg.
Answered by gerhard on August 27, 2021
I've written a command line utility that automates the process described in the accepted answer.
It's called tikztosvg and it is distributed under the GPL-3 license at it's official GitHub repository. Let's say you want to convert the file example.tikz
to SVG:
begin{tikzcd}
G arrow[r, "varphi"] arrow[d, "psi"', two heads] & H
sfrac{G}{ker varphi} arrow[ru, dotted] &
end{tikzcd}
You could achieve that by running the following command:
$ tikztosvg -p tikz-cd -p xfrac example.tikz
The results will be stored in the file example.svg
:
I'd love to have some feedback on it. Issues and PRs are very much welcomed!
Answered by Gark Garcia on August 27, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP