LaTeX/Dessiner avec LaTeX/Dessiner en LaTeX pur
LaTeX dispose en natif d'un certain nombre d'instructions de dessin. Toutefois, celles-ci s'appuient sur des caractères prédéfinis, les possibilités sont donc restreintes. De fait, peu de gens utilisent cette manière de faire. Cependant, pour des dessins simples, cela permet d'avoir un code universel, indépendant notamment du mode de compilation.
Les instructions spécifiques de dessin nécessitent d'être dans un environnement picture
. Rappelons toutefois l'existence de la commande \hrule
qui trace un trait de la largeur du paragraphe, et la commande \rule
qui trace un trait de longueur et d'épaisseur déterminés[1] ; ces commandes sont utilisables hors environnement picture
.
L'extension pict2e
améliore de nombreuses choses à l'environnement picture
, il est donc recommandé de le charger systématiquement.
Exemple complet et minimal
modifierLe programme suivant affiche un trait barrant le texte.
\documentclass[10pt]{article}
\setlength{\unitlength}{1mm}
\begin{document}
\begin{picture}(0,0)
\line(5,1){5}
\end{picture}
Texte.
\end{document}
Le trait est tracé avec la commande \line
. Le paramètre {5}
indique que la longueur est 5 fois la longueur unité, définie par la commande \setlength
, donc 5 mm. Le paramètre (5,1)
indique que le trait est incliné dans des proportions 5/1.
La commande est encapsulée dans un environnement picture
. Le paramètre (0,0)
indique que l'on ne réserve pas de place à l'image : elle se superpose au texte.
On peut améliorer cet exemple :
\documentclass[10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[french]{babel}
\usepackage{pict2e}
\setlength{\unitlength}{1mm}
\begin{document}
\begin{picture}(0,0)
\line(10,1){20}
\end{picture}
Texte barré.
\end{document}
La première partie de l'entête est classique : elle permet d'utiliser les accents dans le code source (on peut écrire barré
au lieu de barr\'e
) et d'utiliser les règles de typographie française (voir Premier exemple > Améliorations du code source).
L'extension pict2e
permet ici d'avoir un trait plus incliné : la proportion (10,1)
n'est pas possible sans cette extension.
Définir l'unité par défaut et la largeur des traits
modifierLa première chose à faire est de définir l'unité par défaut, appelée \unitlength
. Cela se fait avec l'instruction \setlength
:
\setlength{\unitlength}{grandeur}
où grandeur est une longueur classique (un nombre assorti d'une unité), par exemple 1cm
, 1mm
, 1pt
, …
Cette instruction se place de préférence dans le préambule, mais on peut aussi la placer avant un graphique, pour en changer l'échelle (il ne faut alors pas oublier de restaurer la valeur par défaut après le graphique).
Par exemple
\setlength{\unitlength}{1mm}
On peut choisir d'avoir des lignes épaisses avec \thicklines
, des lignes fines avec \thinlines
(option par défaut), ou bien régler l'épaisseur avec
\linethickness{épaisseur}
où épaisseur est un nombre avec une dimension. Ces commandes peuvent se placer hors de l'environnement picture
, ou à l'intérieur si des objets doivent avoir des épaisseurs de ligne différentes.
L'environnement picture
modifier
L'appel de l'environnement picture
se fait en passant la dimension du graphique, exprimé en unité par défaut :
\begin{picture}(largeur,hauteur) … \end{picture}
Le graphique est alors positionné à l'emplacement du « curseur » (point à gauche sur la ligne d'écriture où serait placé le prochain caractère). Notons qu'il s'agit de la place qui est réservée au graphique sur la ligne (avant le positionnement du prochain caractère) ; si le dessin dépasse de ce cadre, il pourra se superposer au reste du texte.
On peut décaler le graphique par rapport au curseur ; LaTeX laisse toujours la même place réservée sur la ligne, mais le graphique est décalé :
\begin{picture}(largeur,hauteur)(x0,y0) … \end{picture}
où x0 et y0 sont les coordonnées du coin inférieur gauche en unité par défaut :
- un nombre négatif décale respectivement vers la gauche et vers le bas;
- un nombre positif décale respectivement vers la droite et vers le haut.
Notons que l'environnement picture
peut être mis dans une figure flottante (environnement figure
).
Placer un objet graphique
modifierLe placement d'un objet dans le graphique se fait avec la commande \put
:
\put(x,y){objet}
où x et y sont en unité par défaut. Le paramètre objet peut être du texte ou un dessin produit par une commande. Par exemple, le code suivant dessine un carré noir de 10 mm de côté avec marqué « carré » à 1 mm à droite :
\setlength{\unitlength}{1mm}
\begin{picture}(20,20)
\put(0,0){\rule{10mm}{10mm}}
\put(11,0){carré}
\end{picture}
Ici, la fonction \rule
n'est pas une fonction de l'environnement picture
, raison pour laquelle on doit lui indiquer les unités.
On peut insérer un objet plusieurs fois à intervalles réguliers. On utilise pour cela la fonction \multiput
:
\multiput(x,y)(décalage_x,décalage_y){nombre_de_fois}{objet}
où
- x et y sont les coordonnées du premier objet ;
- décalage_x et décalage_y sont les espacement entre deux objets :
- nombre_de_fois est le nombre d'objets ainsi placés.
Par exemple, pour placer trois fois la lettre « a » sur une ligne :
\setlength{\unitlength}{1em}
\begin{picture}(4,2)
\multiput(0,0)(1,0){3}{a}
\end{picture}
Et pour faire un carré de 3×3 :
\setlength{\unitlength}{1em}
\begin{picture}(4,2)
\multiput(0,0)(1,0){3}{
\multiput(0,0)(0,1){3}{a}
}
\end{picture}
Objets graphiques
modifierTexte et cadre
modifierLe texte peut simplement s'écrire tel quel. Toutefois, le texte est alors toujours sur une même ligne. Si l'on veut pouvoir utiliser le retour de ligne \\
, il faut utiliser la commande \shortstack
:
\setlength{\unitlength}{1mm}
\begin{picture}(40,20)
\put(0,0){
\shortstack{texte sur\\
plusieurs lignes}
}
\end{picture}
Le texte est alors centré. On peut passer l'alignement en paramètre : l
pour aligner à gauche, et r
pour aligner à droite, par exemple
\shortstack[l]{texte sur\\
plusieurs lignes}
On peut encadrer le texte en utilisant la fonction \framebox
. Par rapport à la fonction \fbox
, elle utilise les unités par défaut et ne laisse pas de blanc autour. La syntaxe est
\framebox(largeur,hauteur){texte}
pour un texte centré dans le cadre, ou bien
\framebox(largeur,hauteur)[options]{texte}
où options indique l'alignement : l
ou r
pour aligner à gauche ou à droite, et t
ou b
pour aligner en haut ou en bas. On peut combiner deux alignements, par exemple
\framebox(10,10)[lt]{bla}
pour aligner en haut à gauche.
On peut aussi utiliser :
\makebox
pour avoir un cadre invisible ;\dashbox
pour avoir un cadre en traits discontinus.
La fonction \makebox
a la même syntaxe que \framebox
. La syntaxe de \dashbox
est :
\dashbox{longueur}(largeur,hauteur)[options]{texte}
où longueur est la longueur des tirets en unité par défaut.
Ces fonctions peuvent s'utiliser pour dessiner des rectangles, en mettant un texte vide.
La fonction \put
place le coin en bas à gauche du rectangle.
Traits et flèches
modifierPour tracer un segment de droite, on utilise la fonction \line
:
\line(directionx,directiony){longueur}
où directionx et directiony sont les coordonnées d'un vecteur directeur de la droite, et longueur est la longueur du segment, le tout exprimé en unité par défaut, avec les conventions suivantes :
- les coordonnées du vecteur directeur sont des nombres entiers ;
- pour les lignes horizontales ou verticales (dont l'une des composantes du vecteur directeur est nulle), la longueur est la longueur réelle du trait ;
- pour les lignes en biais (dont les deux composantes du vecteur directeur sont non nulles), la longueur est en fait la longueur de la projection sur l'axe des x.
Dans le cas d'une ligne en biais, la longueur réelle du trait est donc
Dans la pratique, si l'on veut tracer un trait de (0,0) à (x,y), x et y étant non nuls :
- si x et y sont entiers, on utilise
\line(x,y){x}
; - s'ils ne sont pas entiers, on utilise les valeurs multipliées par 10 ou par 100 :
\line(10*x,10*y){x}
(précision sur la direction de 0,1) ou bien\line(100*x,100*y){x}
(précision sur la direction de 0,01) ;
la limite des valeurs avec pict2e
étant 1 000 en valeur absolue. On peut aussi utiliser un facteur arbitraire, par exemple \line(3*x,3*y){x}
.
Si l'on n'utilise pas pict2e
, les valeurs sont limitées à 6 en valeur absolue et doivent être premières entre elles, ce qui limite à 25 les possibilités.
Une flèche se trace avec la commande \vector
qui a la même syntaxe.
La fonction \put
place l'extrémité de départ du segment ou du vecteur.
Par exemple
\setlength{\unitlength}{1mm}
\thicklines
\begin{picture}(40,20)
\put(0,0){
\vector(1,1){10}
}
\end{picture}
Cercles, disques
modifierOn dessine un cercle avec la commande
\circle{diamètre}
où diamètre est dans l'unité par défaut. On dessine un disque avec
\circle*{diamètre}
La commande \put
place le centre du cercle ou du disque.
Rectangles arrondis
modifierOn peut dessiner un rectangle aux coins arrondis avec
\oval(longueur,hauteur)
Si l'extension pict2e
est chargée, on peut définir le rayon de courbure des coins :
\oval[rayon](longueur,hauteur)
On peut n'afficher qu'une moitié de boîte :
\oval(longueur,hauteur)[option]
ou option vaut l
ou r
pour la moitié gauche ou droite, t
ou b
pour la moitié haute ou basse. On peut n'afficher qu'un quart de la boîte en combinant deux options, par exemple
\oval(30,10)[lt]
pour le quart en haut à gauche. Les dimensions sont bien celles du rectangle complet.
La fonction \put
place le centre du rectangle.
Courbes de Bézier
modifierLaTeX permet de tracer un arc en utilisant une courbe de Bézier quadratique. Cette courbe est définie par trois points de contrôle A, B et C ; A et C sont les extrémités de la courbe, les tangentes aux extrémités passent par B.
La syntaxe est :
\qbezier(xA,yA)(xB,yB)(xC,yC)
Contrairement aux autres objets, cette commande ne se place pas dans une commande \put
.
On peut indiquer le nombre de points servant à tracer cette courbe ; alors, si ce nombre de points est suffisamment faible, on a une courbe pointillée :
\qbezier[nombre_de_points](xA,yA)(xB,yB)(xC,yC)
L'extension pict2e
permet de tracer des courbes de Bézier cubiques :
\cbezier(xA,yA)(xB,yB)(xC,yC)(xD,yD)
Réutilisation d'objets
modifierComme indiqué précédemment, on peut créer des commandes personnelles (macro) pour réutiliser des objets. Mais on peut aussi utiliser des « boîtes de sauvegarde », qui permettent en outre de définir les dimensions de l'objet et le placement au sein de la boîte :
\newsavebox{\nom}
: création de la boîte ;\savebox{\nom}{objet}
: définition du contenu de la boîte ;\usebox{\nom}
; utilisation de la boîte,
où nom est le nom de la boîte.
Lorsque la commande \savebox
est à l'intérieur d'un environnement picture
, on peut utiliser la syntaxe suivante :
\savebox{\nom}(largeur,hauteur)[placement]{objet}
où (largeur,hauteur) est en unités par défaut, et placement prend les valeurs suivantes :
l
,c
,r
: centré verticalement, et respectivement collé à gauche, au centre et à droite ;tl
,tc
,tr
: aligné en haut, et respectivement collé à gauche, au centre et à droite ;bl
,bc
,br
: aligné en bas, et respectivement collé à gauche, au centre et à droite.
Extensions utiles
modifierOn peut utiliser l'extension graphicx
qui permet de retailler (\scalebox
), de faire tourner des objets (\rotatebox
) et d'intégrer des images extérieures (\includegraphicx
), voir Mise en forme du texte (avancé) > Déformation du texte, Inclure des images et Images.
Par exemple, pour avoir une ellipse avec un rapport axe vertical sur horizontal de 1:2, on peut déformer un cercle :
\usepackage{graphicx}
…
\setlength{\unitlength}{1mm}
\begin{picture}(40,20)
\put(0,0){
\scalebox{2}[1]{
\circle{1}
}
}
\end{picture}
cependant, le trait est plus large dans la dimension qui a été étirée.
L'extension xcolor
permet de changer la couleur des objets dessinés. On utilise pour cela \textcolor
(puisque les dessins sont à base de caractères). La commande peut être à l'intérieur de l'environnement picture
, définissant ainsi la couleur de tel ou tel objet, ou bien peut contenir l'environnement picture
et s'appliquer à tous les objets.
\usepackage{xcolor}
…
\setlength{\unitlength}{1mm}
\begin{picture}(40,20)
\textcolor{blue}{
\put(0,0){
\scalebox{2}[1]{
\circle{1}
}
}
}
\end{picture}
…
\textcolor{blue}{
\begin{picture}(40,20)
…
\end{picture}
}
L'extension graphpap
permet d'obtenir du papier millimétré avec la commande \graphpaper
:
\graphpaper[graduation](x,y)(largeur,hauteur)
où graduation est l'espacement entre deux traits fins (par défaut 10), x et y sont l'origine des axes, largeur et hauteur sont les dimensions de la grille (en unité par défaut).
Exercices
modifierExercice 1
modifierRéaliser la molécule de benzène ci-contre (format 2×2). On utilisera la géométrie pour avoir un placement exact des segments (les coordonnées des points et les directions sont calculées par l'utilisateur et entrées dans le code). Le rayon du cercle central est arbitraire et ajusté par essai-erreur « pour faire joli ».
Habituellement, on représente plutôt la groupement « debout » (tourné d'un sixième de tour par rapport au dessin présent). Pour le dessin des molécules, mieux vaut utiliser PPChTeX.
Il faut placer le point (0,0) au centre du picture
, les coordonnées du sommet n sont alors (cos(n⋅60°), sin(n⋅60°)) (n allant de 0 à 5).
Pour le placement d'un segment, on utilise les valeur décimales. Par contre, pour les directions, il faut multiplier les valeurs selon x et y par un même facteur et tronquer ; par exemple, un facteur 100 permet d'avoir une précision de 0,01 sur la direction, l'extension pict2e
est nécessaire (sans pict2e
, il faudrait approcher la direction (50, 87) par (3, 5)).
\documentclass{article}
\usepackage{pict2e}
\begin{document}
\setlength{\unitlength}{1cm}
\begin{picture}(2,2)(-1,-1)
\put(1,0){\line(-50,87){0.5}}
\put(0.5,0.87){\line(-1,0){1}}
\put(-0.5,0.87){\line(-50,-87){0.5}}
\put(-1,0){\line(50,-87){0.5}}
\put(-0.5,-0.87){\line(1,0){1}}
\put(0.5,-0.87){\line(50,87){0.5}}
\put(0,0){\circle{1.2}}
\end{picture}
\end{document}
Exercice 2
modifierRéaliser l'écrou ci-contre (représentation de type dessin technique, format 2×2). Pour l'hexagone, on utilisera la solution ci-dessus.
Le trait fort a une épaisseur de 0,5 mm, soit 0.05
en unité par défaut ; le trait fin a une épaisseur de 0,2 mm, soit 0.02
en unité par défaut.
Notez que les dimensions ne correspondent pas à un écrou normalisé : le but n'étant pas de générer un dessin exact mais d'apprendre à maîtriser l'environnement picture
, on utilise volontairement des valeurs simples.
Pour les trois quarts de cercle, on utilisera des rectangles aux angles arrondis dont le rayon de courbure est égale à la longueur des côtés. Il faut donc impérativement l'extension pict2e
.
\documentclass{article}
\usepackage{pict2e}
\begin{document}
\setlength{\unitlength}{1cm}
\begin{picture}(2,2)(-1,-1)
\linethickness{0.5mm}
\put(1,0){\line(-50,87){0.5}}
\put(0.5,0.87){\line(-1,0){1}}
\put(-0.5,0.87){\line(-50,-87){0.5}}
\put(-1,0){\line(50,-87){0.5}}
\put(-0.5,-0.87){\line(1,0){1}}
\put(0.5,-0.87){\line(50,87){0.5}}
\put(0,0){\circle{1.74}}
\put(0,0){\circle{0.8}}
\linethickness{0.2mm}
\put(0,0){\oval[0.5](1,1)[t]}
\put(0,0){\oval[0.5](1,1)[br]}
\end{picture}
\end{document}
Exercice 3
modifierRéaliser l'organigramme ci-contre (format 5×5).
L'ajustement des coordonnées et dimensions peut se faire par calcul et/ou essai-erreur.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{lmodern}
\usepackage{pict2e}
\begin{document}
\setlength{\unitlength}{1cm}
\begin{picture}(5,5)
% traits entre les boîtes
\put(2.5,3){\line(0,1){1}}
\put(1,2.5){\line(1,0){0.5}}
\put(3.5,2.5){\line(1,0){0.5}}
\put(1,1.3){\line(0,1){1.2}}
\put(4,1.3){\line(0,1){1.2}}
\put(2.1,2.45){choix}
% losange
\put(2.5,3){\line(2,-1){1}}
\put(2.5,3){\line(-2,-1){1}}
\put(2.5,2){\line(-2,1){1}}
\put(2.5,2){\line(2,1){1}}
\put(1.25,4){\framebox(2.5,0.8)[c]{Cas de départ}}
\put(0,0.5){\framebox(2.2,0.8)[c]{Cas final 1}}
\put(2.8,0.5){\framebox(2.2,0.8)[c]{Cas final 2}}
\end{picture}
\end{document}
Exercice 4
modifierRéaliser le document ci-contre.
- Fichier
exercice.tex
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{amsfonts} % pour \mathbb (pour l'ensemble des réels)
\usepackage[frenchb]{babel}
\begin{document}
La première bissectrice du plan
est la droite d'équation
$\forall x \in \mathbb{R}^+,\ y = x$
(cf. figure~\ref{premierebissectrice}).
\begin{figure}[h]
\centering
\input{image1}
\caption{\label{premierebissectrice}Première bissectrice du plan}
\end{figure}
\end{document}
- Fichier
image1.tex
\setlength{\unitlength}{1cm}
\begin{picture}(6,6)(-1,-1)
% axe x
\put(0,-1){\vector(0,1){6}}
\multiput(-1,-0.2)(1,0){6}{\line(0,1){0.4}} % traits de graduation
\put(-1.2,-0.6){$-1$}
\put(0.9,-0.6){1} % valeurs graduées
\put(1.9,-0.6){2}
\put(2.9,-0.6){3}
\put(3.9,-0.6){4}
% axe y
\put(-1,0){\vector(1,0){6}}
\multiput(-0.2,-1)(0,1){6}{\line(1,0){0.4}} % traits de graduation
\put(-0.8,-1.1){$-1$} % valeurs graduées
\put(-0.5,0.9){1}
\put(-0.5,1.9){2}
\put(-0.5,2.9){3}
\put(-0.5,3.9){4}
% quadrillage
\multiput(-1,-1)(1,0){7}{
\multiput(0,0)(0,0.2){31}{\circle*{0.05}}}
\multiput(-1,-1)(0,1){7}{
\multiput(0,0)(0.2,0){31}{\circle*{0.05}}}
% demi-droite
\put(0,0){\line(1,1){5}}
\end{picture}
On peut faire un code un peu plus compact en ajoutant
\usepackage{multido}
dans l'en-tête du fichier exercice.tex
, puis dans le fichier image1.tex
:
…
% axe x
\put(0,-1){\vector(0,1){6}}
\multiput(-1,-0.2)(1,0){6}{\line(0,1){0.4}} % traits de graduation
\put(-1.2,-0.6){$-1$} % valeurs graduées
\multido{\i=1+1}{4}{\put(\i,-0.6){\put(-0.1,0){\i}}}
% axe y
\put(-1,0){\vector(1,0){6}}
\multiput(-0.2,-1)(0,1){6}{\line(1,0){0.4}} % traits de graduation
\put(-0.8,-1.1){$-1$} % valeurs graduées
\multido{\i=1+1}{4}{\put(-0.5,\i){\put(0,-0.1){\i}}}
…
L'imbrication \put(\i,-0.6){\put(-0.1,0){\i}}
sert à avoir l'équivalent de \i-0.1
pour le placement en x (l'extension calc
pose problème avec l'unité par défaut).
Notes
modifier- ↑ la syntaxe est
\rule{longueur}{épaisseur}
on utilise parfois cette commande pour « réserver de la place » en traçant un trait de longueur nulle ou d'épaisseur nulle
Voir aussi
modifier- Sur Wikipédia