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
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
\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
\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 :
- Afficher un pourcentage dans une page HTML
- VNC : Virtual Network Computing
- Git : déménagement d'un dépôt
- Quelques liens au sujet de l'analyse statique
- Ocaml: mon principal langage de développement
- Disque dur externe
- Les profiles dans Firefox
- Cryptographie et mail sous Android
- Quelques liens au sujet du C
- Git rebase : pour diviser un commit