# LaTeX/Dessiner avec LaTeX/Dessiner avec PSTricks

PSTricks est une distribution de plusieurs extensions. L'extension de base est pstricks, d'autres extensions peuvent être chargées selon les besoins. L'extension pstricks charge automatiquement l'extension xcolor, la couleur est donc automatiquement prise en compte.
L'utilisation de PSTricks nécessite de passer par du PostScript, on ne peut donc pas compiler avec pdftex/pdflatex. On peut toutefois obtenir un fichier PDF à partir du fichier PostScript en utilisant, par exemple, ps2pdf. Signalons que l'extension PDFtricks permet de placer directement des commandes PSTricks dans un document écrit pour pdflatex (voir ci-après).
Les unités par défaut sont le centimètre pour les longueurs et le degré pour les angles. On peut toutefois utiliser des longueurs avec unité.
Contrairement aux commandes de picture, les commandes de PSTricks peuvent être utilisées en dehors d'un environnement graphique, ce sont alors des objets de « largeur nulle » (le caractère suivant est écrit comme s'il n'y avait pas de dessin). Par exemple, si l'on veut rayer un mot, on peut créer la commande suivante :
(voir aussi ici une autre solution).

## Environnement pspicture

Si l'on veut que LaTeX prenne en compte le graphique pour placer le texte, il faut placer les instructions dans un environnement pspicture. On passe en paramètre les coordonnées du point en haut à droite, le point (0,0) étant au point de référence (sur la ligne de base là où serait le prochain caractère) :
on peut aussi indiquer les coordonnées du point en bas à gauche :
cela décale la position du point (0,0), mais ne change pas l'emplacement de la boîte. Les dimensions de la boîte sont (x$_1$-x$_0$)×(y$_1$-y$_0$).
On peut mettre l'environnement pspicture dans une figure flottante (environnement figure).

## Objets de base
### Segments et lignes brisées

Un segment de droite s'obtiennent avec
Pour tracer un vecteur :
Une ligne brisée s'obtient en mettant les points les uns à la suite des autres
On peut tracer une ligne brisée aux angles arrondis avec l'option linearc=valeur, la valeur en question étant le rayon de courbure.

#### Exemple
### Rectangles

Pour tracer un rectangle, on utilise la commande \psframe, en indiquant les coordonnées des deux coins en bas à gauche et en haut à droite :
La commande \psframe* a la même syntaxe donne un rectangle rempli.
On peut tracer des rectangles aux angles arrondis avec l'option framearc=valeur, la valeur en question étant le rayon de courbure.

#### Exemple
### Polygones

Les polygones sont toujours fermés. Ils sont décrits avec la commande \pspolygon et ont la même syntaxe que \psline :
La commande \pspolygon* donne un polygone rempli.
On peut tracer des polygones aux angles arrondis avec l'option linearc=valeur, la valeur en question étant le rayon de courbure.

#### Exemple
### Cercles, arcs de cercle, portions de disque et ellipses

Les cercles se tracent avec la commande \pscircle :
où (x,y) sont les coordonnées du cercle et r est son rayon. La commande \pscircle* donne un disque plein.
On peut tracer un arc de cercle avec la commande \psarc :
où angle1 et angle2 sont les angles limitant de l'arc, selon la convention trigonométrique. La commande \psarc* donne une portion de disque pleine délimitée par l'arc et la corde.
On peut tracer une portion de disque façon « part de camembert » avec la commande \pswedge, qui a une syntaxe similaire à \psarc. La commande \pswedge* trace une portion pleine.
Les ellipses se tracent avec la commande \psellipse :
où (axe_horizontal,axe_vertical) sont les longueurs des axes. La commande \psellipse* donne une ellipse pleine.

#### Exemple
### Courbes
#### Paraboles

On peut tracer un arc de parabole de direction asymptotique verticale avec la commande \psparabola :
le sommet de la parabole est en (x1,y1), elle passe par (x0,y0) et s'arrête à ce point, et les deux branches sont symétriques.
La commande \psparabola* donne un portion de plan pleine délimitée par l'arc et la corde.

#### Courbes de Bézier

La commande \psbezier permet de tracer une courbe de Bézier avec un nombre arbitraire de points de contrôle, mais composée d'arcs ayant au plus quatre points de contrôle. L'option showpoints=true permet d'afficher les points de contrôle ainsi que les tangentes. La commande \psbezier* donne une surface pleine délimitée par la courbe et la droite joignant les points extrêmes.

#### Courbe d'interpolation

La commande \pscurve crée une courbe passant par tous les points indiqués. La commande \psecurve ne trace pas les premier et dernier arcs, mais prend en compte les points extrêmes pour le calcul de la courbure ; cela permet de s'affranchir d'effets de bord en « forçant » la courbure ou la tangente aux extrémités tracées.
Les commandes étoilées \pscurve* et \psecurve* tracent des surfaces pleines délimitées par la courbe et la droite joignant les points extrêmes.

### Texte

On peut écrire du texte à un point donné avec la commande rput :
On peut faire tourner le texte d'un angle donné :
On peut passer en option le point de la boîte de texte qui sera au point (x,y) désigné :
* B, Bl et Br : respectivement le centre, l'extrême gauche et l'extrême droite de la ligne de base d'écriture (base) ;
* t, tl et tr : respectivement le centre, l'extrême gauche et l'extrême droite du haut de la boîte (top) ;
* b, bl et br : respectivement le centre, l'extrême gauche et l'extrême droite du bas de la boîte (bottom)

#### Exemple

On peut aussi utiliser la commande \uput, qui elle place le texte en décalé par rapport au point indiqué :
va placer le texte à une distance donnée dans une direction donnée (définie par un angle) par rapport à (x,y). On peut aussi faire tourner le texte d'un angle donné :
PSTricks propose plusieurs encadrements pour le texte :
* \psframebox{texte} : cadre rectangulaire ;
* \psdblframebox{texte} : cadre rectangulaire à filet double ;
* \psshadowbox{texte} : cadre rectangulaire ombré ;
* \pstcirclebox{texte} : cadre circulaire ;
* \psovalbox{texte} : cadre oval ;
* \psdiabox{texte} : cadre losange ;
* \pstribox{texte} : cadre triangulaire (triangle isocèle pointe en haut).
Les versions étoilées donnent un cadre plein.

#### Exemple

L'extension pst-text permet de faire en sorte que le texte épouse une ligne, par exemple obtenue avec \psline, \pspolygon, \pscurve, … On utilise pour cela la commande \pstextpath :
Mais il faut auparavant annuler le tracé des lignes avec \psset{linestyle=none} si l'on veut avoir le texte seul.

#### Exemple
### Quadrillage et axes

La commande \psgrid crée un quadrillage sur toute l'image (dans un environnement pspicture), avec un pas de 0,2 (2 mm par défaut). On peut lui adjoindre des paramètres :
* \psgrid(xmax,ymax) : fait un quadrillage de (0,0) à (xmax,ymax) ;
* \psgrid(xmin,ymin)(xmax,ymax) : fait un quadrillage de (xmin,ymin) à (xmax,ymax) ;
* \psgrid(x0,y0)(xmin,ymin)(xmax,ymax) : comme précédemment, et le un des nœuds du quadrillage est en (x0,y0).
On peut utiliser les options suivantes :
* griddots=valeur : le trait plein des graduations principales est remplacé par un trait pointillé, on indique le nombre de points par graduation ;
* subgriddots=valeur : idem avec les sous-gradations ;
* gridcolor=couleur, subgridcolor=couleur : couleur des traits de graduation et sous-graduation ;
* gridwidth=valeur, subgridwidth=valeur : épasseur des traits de graduation et sous-graduation ;
* subgriddiv=valeur : nombre de sous-graduation entre deux graduations principales ;
* gridlabels=valeur : taille des nombres étiquetant les graduations ;
* ticksize=valeur : taille des graduations ;
** ticksize=valeur valeur si l'on indique deux valeurs, on a des graduations dissymétriques : la première valeur est la longueur du côté des coordonnées négatives, la deuxième est celle du côté des coordonnées positives ;
* ticklinestyle=valeur : style des graduations (solid, dashed, dotted) ; utile lorsque les graduations sont très grandes (ticksize élevé), ce qui permet de faire un quadrillage (les case de \psgrid dépendent uniquement de l'unité).

#### Exemple

Si l'on veut placer des axes, il faut utiliser l'extension pstricks-add qui fournit la commande \psaxes :
où (xmin,ymin) et (xmax,ymax) sont les extrêmes des axes, et (x0,y0) est le point où se coupent les axes.
On peut ajouter des options :
* Dx=valeur et Dy=valeur permettent de définir l'espacement entre les graduations ;
* comma permet d'utiliser la virgule comme séparateur décimal.
Par ailleurs, comme pour les segments, {->} permet de mettre des flèches aux axes.

#### Exemple
## Paramètres généraux
### Toutes les figures

On peut ajouter des paramètres optionnels de traits, entre crochet :
* linewidth=valeur : épaisseur du trait, valeur étant un nombre seul (unité par défaut) ou un nombre avec unité ;
* linecolor=couleur : couleur du trait (la couleur est définie avec les commandes de xcolor) ;
* linestyle=valeur : style de ligne, valeur pouvant être dashed (tirets), dotted (pointillés) ;
* doubleline=true : trait double ;
* showpoints=true : les extrémités des segments sont surlignés ; on peut définir la taille des points avec dotscale=valeur, et le type de points avec dotsyle=valeur, les valeurs pouvant être
** * : disque ;
** o : cercle ;
** +, x : croix ;
** square, square* : carré vide ou plein ;
** diamond, diamond* : losange vide ou plein ;
** triangle, triangle* : triangle vide ou plein ;
Par exemple
Si des paramètres s'appliquent à plusieurs figures, on peut les définir avec la commande \psset, par exemple
Cette commande permet également de changer l'unité par défaut avec les paramètres :
* unit=valeur, ou
* xunit=valeur et yunit=valeur si l'on veut avoir des unités différentes selon l'axe,
valeur étant un nombre avec ou sans unité. Cela permet de changer l'échelle d'un dessin, de bénéficier de la graduation automatique des axes, et ne modifie pas l'épaisseur des traits.

### Figures ouvertes

On peut définir l'extrémité d'une figure ouverte (segment, ligne brisée, arc, …) avec un paramètre optionnel, sous la forme :
Les différentes extrémités sont :
* < ou > : flèche ;
* << ou >> : flèche double ;
* | : barre collée à l'extrémité ;
* |* : barre centrée sur l'extrémité ;
* o : cercle centré sur l'extrémité ;
* oo : cercle collé à l'extrémité ;
* * : disque centré sur l'extrémité ;
* ** : disque collé à l'extrémité ;
* |< et >| : flèche centrée sur l'extrémité et barre ;
* c : extrémité arrondie, le disque étant centré sur l'extrémité ;
* cc : extrémité arrondie, le bord du disque étant à l'extrémité.
Par exemple : <->, >-<, |->, |<->|.

### Figures fermées

Pour les figures fermées, on peut définir le type de remplissage :
* fillstyle=valeur : motif de remplissage, les valeurs pouvant être :
** crosshatch : hachures croisées à 45 °, quadrillage transparent,
** crosshatch* : idem, quadrillage opaque,
** vlines et vlines* : hachures simples à −45 °, respectivement transparent et opaque,
** hlines et hlines* : hachures simples à 45 °, respectivement transparent et opaque,
** solid : plein ;
* fillcolor=couleur : couleur de fond ;
* hatchcolor=couleur : couleur des hachures ;
* hatchwidth=valeur : épaisseur du trait ;
* hatchsep=valeur : espacement des traits ;
* hatchangle=valeur : angle des traits.
Par exemple

## Placement des objets

Les commandes \rput et \uput peuvent en fait servir à translater n'importe quel objet.

### Exemple

    est équivalent à
On peut répéter le placement avec la commande \multirput :
où (décalage_x,décalage_y) est le vecteur séparant deux objets placés consécutivement. On peut ajouter les mêmes options qu'avec \rput (point de référence et angle de rotation) :
S'il n'y a pas de texte mais uniquement des objets graphiques, on peut utiliser la commande \multips :

## Extension PDFTricks

L'extension PDFTricks permet d'utiliser PSTricks avec pdflatex. Pour cela, il faut
* déclarer l'extension PDFTricks dans l'entête ;
* placer les extensions PSTricks dans une environnement psinputs, et intégrer toutes les commandes PSTricks dans un environnement pdfpic ;
* sous les environnements Unix, autoriser le lancement d'une commande en ligne depuis le compilateur pdflatex.
Le fichier .tex ressemblera à
Pour autoriser le lancement d'une commande en ligne, on lance la compilation avec l'option -shell-escape :

## Exercices

Dans les exercices suivants, le but est de :
* créer des fichiers compilables, notamment contenant un \begin{document} et un \end{document} ; la classe importe peu ;
* en séparant le fichier image du fichier principal si le document mèle texte et images..

### Exercice 1

Ré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. On donnera deux solutions :
* les coordonnées des points sont calculées par l'utilisateur et entrées dans le code ;
* on ne calcule les coordonnées que pour deux sommets consécutifs, puis on utilise une rotation pour placer les autres ; cette solution donne des effets étranges lorsque l'épasseur du trait devient importante et n'est donc pas recommandée, mais est présentée ici à titre d'exercice.
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.
Pour la première solution, il suffit de placer le point (0,0) au centre du pspicture, les coordonnées du sommet n sont alors (cos(n⋅60°), sin(n⋅60°)) (n allant de 0 à 5).
Pour la seconde solution, l'idée est de partir d'un segment décalé par rapport au centre de l'image, et de faire tourner ce segment de 60° à chaque fois. Il faut donc que le point (0,0) soit au centre du pspicture. On pourra par exemple prendre le segment du bas comme référence : ses points sont (-sin(30°), -cos(30°))–((sin(30°), -cos(30°)), c'est en fait la base d'un triangle équilatéral dont le sommet est en (0,0).

### Exercice 2

Réaliser l'écrou ci-contre (représentation de type dessin technique, format 2×2). Pour l'hexagone, on utilisera la première solution évoquée 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 PSTricks, on utilise volonteairement des valeurs simples.

### Exercice 3

Réaliser l'organigramme ci-contre (format 5×5).
L'extension pst-node permet de simplifier la réalisation de ce type de diagrammes, comme on le verra plus loin.
pour éviter d'avoir à ajuster la longueur des traits, on ne cherchera pas à s'arrêter exactement au bord des cadres, et on affichera les boîtes de texte en dernier en utilisant l'option fillstyle=solid. On peut utiliser astucieusement les options de placement par rapport au point de référence.

### Exercice 4

Réaliser le document ci-contre.

### Exercice 5

Réaliser le document ci-contre, en créant des commandes personnelles pour les objets présents plusieurs fois.
L'image fait 5×5 (unité par défaut), on laisse une marge de 1 en haut, en bas et à droite de la parabole pour pouvoir placer les indications. La tangente aux extrémités faisant un angle supérieur à 45 ° par rapport à l'horizontale, le vecteur v$_x$ est plus petit que le vecteur v$_y$ , mais la valeur exacte importe peu pour cette représentation schématique.
On placera les éléments de texte relativement aux points particuliers du dessin (extrémités ou milieu des vecteurs, sommet de la parabole).

## Notes

* ↑ l'extension pstcol est obsolète
* ↑ contrairement à l'habitude, certains paramètres optionnels sont entre accolades dans PSTricks, c'est le cas ici de ->

## Voir aussi
### Sur Wikipédia

* Courbe de Bézier
* PSTricks

### sur CTAN

* documentation de l'extension