Tikz : boites, et exportation en svg

Anne tikz svg latex

Quelques notes pour se souvenir comment faire un dessin simple à l’aide de TikZ, et comment l’exporter en svg pour l’inclure dans une page web.

L’image

Quelques définitions

Pour avoir un document homogène, il est fortement recommander de définir des objets commun à tous le document. Le fichier my-tikz.sty ci-dessous définit par exemple un type d’ombre, et trois types de boites utilisant la même ombre. Ainsi, si un jour on veux changer la taille, ou la couleur de l’ombre, il suffira de la modifier ici, et de recompiler pour que toutes les images soient modifiées uniformément.

\usepackage{fontspec}
\usepackage{tikz}

\usetikzlibrary{shadows}
\usetikzlibrary{calc}
\usetikzlibrary{shapes}
\usetikzlibrary[positioning]

\tikzstyle{theshadow} = %
  [general shadow={ fill=gray!30, shadow xshift=0.1 cm, shadow yshift=-0.1 cm}]

\pgfmathsetmacro{\myinnersep}{3}

\tikzstyle{mynodestyle} = %
  [rectangle, rounded corners, very thick, draw=black, theshadow,
   inner sep=\myinnersep,
   minimum height=\heightof{Cap}+2*\myinnersep*1mm,
   minimum width=5mm]

\tikzstyle{tool_box} = [ mynodestyle, % fill=cyan
                         top color=cyan!10, bottom color=cyan!70]
\tikzstyle{make_box} = [ mynodestyle, % fill=blue!50
                         ball color=blue!50]
\tikzstyle{file_box} = [ mynodestyle, %fill=yellow!50
                         top color=white, bottom color=yellow!50]

Les boites ont une couleur de fond dégradée, et celle-ci apparaît bien dans le pdf, mais pas dans le svg ci-dessous semble-t-il.

Description d’image

Boites toutes simples

boites

On peut ensuite décrire l’image ci-contre en utilisant les définitions précédentes :

\begin{tikzpicture}[->,>=latex,node distance=5mm and 1cm]

\node [file_box] (input)                     { entrée };
\node [make_box] (do1)    [right = of input] { };
\node [file_box] (tmp)    [right = of do1]   { résultat intermédiaire };
\node [make_box] (do2)    [right = of tmp]   { };
\node [file_box] (output) [below = of do2]   { sortie };
\node [tool_box] (tool1)  [above = of do1]   { outil };
\node [tool_box] (tool2)  [above = of do2]   { un autre outil};

\path
  (input) edge (do1)
  (do1) edge (tmp)
        edge [<-] (tool1)
  (tmp) edge (do2)
  (do2) edge (output)
        edge [<-] (tool2)
;
\end{tikzpicture}

Un peu plus de contôle

buffer

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary[positioning]

\begin{document}
\begin{tikzpicture}[>=latex,auto,minimum height=5mm,thick,font=\bfseries]

  % buffer
  \node[draw,minimum width=8cm,label=left:buf,fill=black!20] (B) at (0,0) {};

  % arrow with max_size legende
  \coordinate [above = 0.2 of B.north west] (b1) {};
  \coordinate [above = 0.2 of B.north east] (b2) {};
  \draw[<->,yshift=5mm] (b1) -- (b2) node [pos=0.5] {max\_size};

  % cur variable node
  \node [below = 0.5 of B.south west] (C)  {cur};

  % arrows from cur to the buffer
  \coordinate [left = 1 of B.south] (p1) {};
  \draw[->,color=blue] (C.east) + (0, 0.1) -| (p1);
  \coordinate [right = 1 of B.south] (p2) {};
  \draw[->,color=green] (C.east) + (0, -0.1) -| (p2);

  % arrow len with legende
  \coordinate [below=0.5 of p1] (l1);
  \coordinate [below=0.5 of B.south east] (l1M);
  \draw[<->,color=blue] (l1) -- (l1M) node[pos=0.7,color=black] {len};

  % other arrow len
  \coordinate [below=0.7 of p2] (l2);
  \coordinate [below=0.7 of B.south east] (l2M);
  \draw[<->,color=green] (l2) -- (l2M);

\end{tikzpicture}
\end{document}

Ici, on utilise \coordinate pour construire des points qui sont utilisés par la suite pour placer les flèches. Il y a sûrement moyen de faire plus simple, mais à la fois cette description a l’avantage d'être assez claire.

On remarquera au passage comment on place une légende sur une flèche (ici, max_size et len). On aurait pu préciser below ou autre si besoin.

Autre exemple

buffer

\begin{tikzpicture}[node distance=0mm]
\tikzstyle{mem} = %
  [rectangle, draw=black,text width=2cm, minimum height=2cm,align=center]
\tikzstyle{addr} = [font=\footnotesize\ttfamily]

\node[mem, fill=blue!20](m1){m1};
\node[addr,right=1em,below left= of m1.north west]  {0x0020000};
\node[addr,right=1em,above left= of m1.south west]  {0x002FFFF};

\node[mem,below= of m1, fill=orange!20](m2){m2};
\node[addr,right=1em,below left= of m2.north west]  {0x0030000};
\node[addr,right=1em,above left= of m2.south west]  {0x003FFFF};

\node[mem,below= of m2, fill=green!20](m3){m3};
\node[addr,right=1em,below left= of m3.north west]  {0x0040000};
\node[addr,right=1em,above left= of m3.south west]  {0x004FFFF};

\end{tikzpicture}

Compilation

La classe standalone

La classe LaTeX standalone permet de mettre l’image dans un fichier qui peut aussi bien être compilé seul pour générer l’image uniquement, qu'être inclus dans un fichier LaTeX.

Le fichier se présente de la façon suivante :

\documentclass[crop,tikz]{standalone}
\usepackage{my-tikz}
\begin{document}
\begin{tikzpicture}
...
\end{tikzpicture}
\end{document}

Compilation en svg

On compile tout d’abord en pdf (ici, avec XeLaTeX, mais on peut aussi utiliser pdfLaTeX par exemple) :

$ xelatex boites.tex

Puis, on utilise inkscape pour générer le svg :

$ inkscape --file=boites.pdf --export-plain-svg=boites.svg

On peut aussi utiliser pdf2svg, mais il semblerait qu’après mes essais que ça produise des fichiers beaucoup plus gros car le texte est alors transformé en image…

Inclusion dans du LaTeX

Pour inclure le fichier standalone il faut simplement utiliser la macro \includestandalone à la place de la macro standard \includegraphics. En fonction du mode choisi, il peut être nécessaire d’utiliser l’option -shell-escape lors de la compilation LaTeX.

Documentation

  • des tonnes d’exemples de schéma en TikZ, dont :
    • un exemple pour mélanger listing et schéma ;
  • “TikZ pour l’impatient” (enfin, 189 pages quand même…) ;
  • dot2tex permet d’inclure un graphe au format dot dans du LaTeX et d’utiliser TikZ pour le rendre plus joli : intéressant !

Voir aussi :