Existe-t-il une méthode pour traduire un graphique TikZ en Scalable Vector Graphics, autrement dit .svg ?

Posée 26 Nov '15, 10:13

Pathe's gravatar image

Pathe ♦♦
5.4k158152
Taux d'acceptation : 59%

1

La bonne méthode passerait par l'appel à dvisvgm... mais il y a quelques bugs lors de la compilation.

(11 Déc '15, 02:58) Paul Gaborit Paul%20Gaborit's gravatar image

Il existe un convertisseur de DVI en SVG. Il s'appelle dvisvgm. Pour l'utiliser, il faut utiliser la chaîne de compilation latex->dvisvgm. Ci-dessous un exemple de code (example.tex) à compiler par les commandes suivantes :

  • latex exemple.tex
  • dvisvgm exemple.dvi

Le code:

Ouvrir dans l'éditeur
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds,fit}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\begin{document}
\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
  \def\A{\textcolor{input}{$A$}}      \def\B{\textcolor{input}{$B$}}
  \def\C{\textcolor{output}{$C$}}     \def\D{$D$}
  \def\E{$E$}
  \colorlet{input}{blue!80!black}     \colorlet{output}{red!70!black}
  \colorlet{triangle}{orange}
  \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
  \coordinate [label=right:\B] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
  \draw [input] (A) -- (B);
  \node [name path=D,help lines,draw,label=left:\D]    (D) at (A) [circle through=(B)] {};
  \node [name path=E,help lines,draw,label=right:\E]   (E) at (B) [circle through=(A)] {};
  \path [name intersections={of=D and E,by={[label=above:\C]C}}];
  \draw [output] (A) -- (C) -- (B);
  \foreach \point in {A,B,C}
     \fill [black,opacity=.5] (\point) circle (2pt);
  \begin{pgfonlayer}{background}
     \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
  \end{pgfonlayer}
  \node[fit=(current bounding box),inner sep=1mm,draw=lime]{};
\end{tikzpicture}
\end{document}

Et voici le résultat (converti en PNG par inkscape puisqu'on ne peut pas insérer de SVG sur ce site):

alt text

Malheureusement, cette méthode souffre de plusieurs défauts. En particulier concernant l'encodage des textes. Tant que les textes utilisent les caractères de base, tout se passe presque bien (sauf le calcul de la bounding box autour des textes). Mais si il y a une ligature ou des éléments mathématiques, l'encodage ne suit plus (je soupçonne que cela provient du fait que la police utilisée n'est pas intégrée au document SVG).

La documentation de TikZ/PGF suggère d'utiliser le driver pgfsys-dvisvgm (via \def\pgfsysdriver{pgfsys-dvisvgm.def}) mais ça marche encore moins.

Lien permanent

Publiée 12 Déc '15, 13:28

Paul%20Gaborit's gravatar image

Paul Gaborit
58216
Taux d'acceptation : 50%

Modifiée 12 Déc '15, 13:29

Sous linux, j'utilise l'outil pdf2svg.

Sinon, il y a l'option convert de la classe standalone à compiler avec pdflatex -shell-escape en donnant la commande à exécuter (l'option convert={outfile=\jobname.svg} ne fonctionne pas pour moi).

Ouvrir dans l'éditeur
\documentclass[tikz,convert={outext=.svg,command=\unexpanded{pdf2svg \infile\space\outfile}},multi=false]{standalone}

\begin{document}
\begin{tikzpicture}% Example:
  \draw (0,0) -- (10,10); % ...
  \draw (10,0) -- (0,10); % ...
  \node at (5,5) {Coucou};
\end{tikzpicture}
\end{document}
Lien permanent

Publiée 26 Nov '15, 10:35

Maxime's gravatar image

Maxime ♦
681519
Taux d'acceptation : 70%

Oui, mais passer par un fichier .pdf pour générer un fichier .svg oblige à créer un document initial ne contenant que le graphique TikZ, et aux dimensions de celui-ci.

Car si l'on présente un graphique de 5 X 5 cm au centre d'une feuille A4 vide, le .svg correspondant montrera aussi le vide autour du graphique, non ? Il faut donc créer en document à la taille du graphique.

(26 Nov '15, 10:58) Pathe ♦♦ Pathe's gravatar image
1

C'est l'avantage d'utiliser la classe standalone qui produit un document pdf à la taille du graphique.

Par ailleurs, sur le doc suivant

Ouvrir dans l'éditeur
\documentclass{article}

\begin{document}

\thispagestyle{empty}
\begin{tikzpicture}% Example:
\draw (0,0) -- (10,10); % ...
\draw (10,0) -- (0,10); % ...
\node at (5,5) {Coucou};
\end{tikzpicture}
\end{document}

on peut passer par la chaîne :

Ouvrir dans l'éditeur
pdflatex mondoc.tex
pdfcrop mondoc.pdf
pdf2svg mondoc-crop.pdf mondoc.svg
(26 Nov '15, 11:42) Maxime ♦ Maxime's gravatar image

Le problème est que la chaîne « Coucou » ne figure pas dans le document svg. Or exporter du TikZ en svg me permet de mettre ce graphique à disposition d'une communauté d'utilisateurs (non LaTeXiens), notamment pour qu'ils le traduisent dans leur langue.

Comment faire pour retrouver dans les fichiers svg les légendes des graphiques TikZ ?

(27 Nov '15, 11:44) Pathe ♦♦ Pathe's gravatar image

C'est étrange, parce que moi j'ai le «Coucou»... Avec quoi a été produit le fichier svg ?

(27 Nov '15, 11:50) Maxime ♦ Maxime's gravatar image

C'est étrange en effet. J'ai produit le svg selon ta méthode pdf2svg, puis je l'ai édité sous Vim : la chaîne est introuvable.

J'ai même déplacé le « Coucou » vers le bas pour qu'il n'interfère pas avec les lignes diagonales, et le résultat est le même.

(27 Nov '15, 11:52) Pathe ♦♦ Pathe's gravatar image

Juste un truc : dans ton code il manque \usepackage{tikz}. Je l'aurais bien rajouté moi-même, mais aujourd'hui OSQA bugge et ne me permet pas de le faire.

(27 Nov '15, 11:54) Pathe ♦♦ Pathe's gravatar image

Ah okay ! Le texte est transformé en chemin malheureusement...

Troll : MetaPost lui sait faire :)

(27 Nov '15, 11:58) Maxime ♦ Maxime's gravatar image

Ah okay ! Le texte est transformé en «chemin» malheureusement...

Troll : MetaPost lui sait faire !

(27 Nov '15, 11:59) Maxime ♦ Maxime's gravatar image

Non il ne manque pas \usepackage{tikz} puisqu'il est passé en option de la classe.

Très bizarre, peut-être une fausse manip de ma part, mais en supprimant un commentaire en double, ça a supprimé mon premier commentaire avec la chaîne de production, je ne sais pas comment le retrouver...

(27 Nov '15, 12:03) Maxime ♦ Maxime's gravatar image
Affichage de 5 parmi 9 Afficher 4 commentaire(s) en plus
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.

Mots-clés de la question :

×56
×3

Question posée : 26 Nov '15, 10:13

Question vue : 3,311 fois

Dernière mise à jour : 12 Déc '15, 13:29