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 codice_1. Rappelons toutefois l'existence de la commande codice_2 qui trace un trait de la largeur du paragraphe, et la commande codice_3 qui trace un trait de longueur et d'épaisseur déterminés ; ces commandes sont utilisables hors environnement codice_1.
L'extension codice_5 améliore de nombreuses choses à l'environnement codice_1, il est donc recommandé de le charger systématiquement.
Exemple complet et minimal.
Le programme suivant affiche un trait barrant le texte.
\begin{picture}(0,0)
Texte.
Le trait est tracé avec la commande codice_7. Le paramètre codice_8 indique que la longueur est 5 fois la longueur unité, définie par la commande codice_9, donc . Le paramètre codice_10 indique que le trait est incliné dans des proportions 5/1.
La commande est encapsulée dans un environnement codice_1. Le paramètre codice_12 indique que l'on ne réserve pas de place à l'image : elle se superpose au texte.
On peut améliorer cet exemple :
\begin{picture}(0,0)
Texte barré.
La première partie de l'entête est classique : elle permet d'utiliser les accents dans le code source (on peut écrire codice_13 au lieu de codice_14) et d'utiliser les règles de typographie française (voir "Premier exemple > Améliorations du code source").
L'extension codice_5 permet ici d'avoir un trait plus incliné : la proportion codice_16 n'est pas possible sans cette extension.
Définir l'unité par défaut et la largeur des traits.
La première chose à faire est de définir l'unité par défaut, appelée codice_17. Cela se fait avec l'instruction codice_9 :
où "grandeur" est une longueur classique (un nombre assorti d'une unité), par exemple codice_19, codice_20, codice_21, …
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
On peut choisir d'avoir des lignes épaisses avec codice_22, des lignes fines avec codice_23 (option par défaut), ou bien régler l'épaisseur avec
où "épaisseur" est un nombre avec une dimension. Ces commandes peuvent se placer hors de l'environnement codice_1, ou à l'intérieur si des objets doivent avoir des épaisseurs de ligne différentes.
L'environnement codice_1.
L'appel de l'environnement codice_1 se fait en passant la dimension du graphique, exprimé en unité par défaut :
 \begin{picture}("largeur","hauteur")
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")("x"0,"y"0)
où "x"0 et "y"0 sont les coordonnées du coin inférieur gauche en unité par défaut :
Notons que l'environnement codice_1 peut être mis dans une figure flottante (environnement codice_28).
Placer un objet graphique.
Le placement d'un objet dans le graphique se fait avec la commande codice_29 :
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 de côté avec marqué « carré » à à droite :
\begin{picture}(20,20)
Ici, la fonction codice_3 n'est pas une fonction de l'environnement codice_1, 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 codice_32 :
où
Par exemple, pour placer trois fois la lettre « a » sur une ligne :
\begin{picture}(4,2)
Et pour faire un carré de 3×3 :
\begin{picture}(4,2)
\multiput(0,0)(1,0){3}{
Objets graphiques.
Texte et cadre.
Le 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 codice_33, il faut utiliser la commande codice_34 :
\begin{picture}(40,20)
\put(0,0){
 \shortstack{texte sur\\
Le texte est alors centré. On peut passer l'alignement en paramètre : codice_35 pour aligner à gauche, et codice_36 pour aligner à droite, par exemple
\shortstack[l]{texte sur\\
On peut encadrer le texte en utilisant la fonction codice_37. Par rapport à la fonction codice_38, elle utilise les unités par défaut et ne laisse pas de blanc autour. La syntaxe est
pour un texte centré dans le cadre, ou bien
où "options" indique l'alignement : codice_35 ou codice_36 pour aligner à gauche ou à droite, et codice_41 ou codice_42 pour aligner en haut ou en bas. On peut combiner deux alignements, par exemple
pour aligner en haut à gauche.
On peut aussi utiliser :
La fonction codice_43 a la même syntaxe que codice_37. La syntaxe de codice_44 est :
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 codice_29 place le coin en bas à gauche du rectangle.
Traits et flèches.
Pour tracer un segment de droite, on utilise la fonction codice_7 :
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 :
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 :
la limite des valeurs avec codice_5 étant en valeur absolue. On peut aussi utiliser un facteur arbitraire, par exemple codice_54.
Si l'on n'utilise pas codice_5, 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 codice_56 qui a la même syntaxe.
La fonction codice_29 place l'extrémité de départ du segment ou du vecteur.
Par exemple
\thicklines
\begin{picture}(40,20)
\put(0,0){
Cercles, disques.
On dessine un cercle avec la commande
où "diamètre" est dans l'unité par défaut. On dessine un disque avec
La commande codice_29 place le centre du cercle ou du disque.
Rectangles arrondis.
On peut dessiner un rectangle aux coins arrondis avec
 \oval("longueur","hauteur")
Si l'extension codice_5 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 codice_35 ou codice_36 pour la moitié gauche ou droite, codice_41 ou codice_42 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 codice_29 place le centre du rectangle.
Courbes de Bézier.
LaTeX 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("x"A,"y"A)("x"B,"y"B)("x"C,"y"C)
Contrairement aux autres objets, cette commande ne se place pas dans une commande codice_29.
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"]("x"A,"y"A)("x"B,"y"B)("x"C,"y"C)
L'extension codice_5 permet de tracer des courbes de Bézier cubiques :
 \cbezier("x"A,"y"A)("x"B,"y"B)("x"C,"y"C)("x"D,"y"D)
Réutilisation d'objets.
Comme 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 :
où "nom" est le nom de la boîte.
Lorsque la commande codice_70 est "à l'intérieur" d'un environnement codice_1, on peut utiliser la syntaxe suivante :
où ("largeur","hauteur") est en unités par défaut, et "placement" prend les valeurs suivantes :
Extensions utiles.
On peut utiliser l'extension codice_81 qui permet de retailler (codice_82), de faire tourner des objets (codice_83) et d'intégrer des images extérieures (codice_84), 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 :
\begin{picture}(40,20)
\put(0,0){
 \scalebox{2}[1]{
cependant, le trait est plus large dans la dimension qui a été étirée.
L'extension codice_85 permet de changer la couleur des objets dessinés. On utilise pour cela codice_86 (puisque les dessins sont à base de caractères). La commande peut être à l'intérieur de l'environnement codice_1, définissant ainsi la couleur de tel ou tel objet, ou bien peut contenir l'environnement codice_1 et s'appliquer à tous les objets.
\begin{picture}(40,20)
\textcolor{blue}{
 \put(0,0){
 \scalebox{2}[1]{
\textcolor{blue}{
 \begin{picture}(40,20)
L'extension codice_89 permet d'obtenir du papier millimétré avec la commande codice_90 :
 \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.
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 (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.
</syntaxhighlight>
Exercice 2.
Ré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 , soit codice_91 en unité par défaut ; le trait fin a une épaisseur de , soit codice_92 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 codice_1, on utilise volontairement des valeurs simples.
</syntaxhighlight>
Exercice 3.
Réaliser l'organigramme ci-contre (format 5×5).
L'ajustement des coordonnées et dimensions peut se faire par calcul et/ou essai-erreur.
% losange
</syntaxhighlight>
Exercice 4.
Réaliser le document ci-contre.
 \multiput(-1,-0.2)(1,0){6}{\line(0,1){0.4}} % traits de graduation
 \put(0.9,-0.6){1} % valeurs graduées
% axe y
 \multiput(-0.2,-1)(0,1){6}{\line(1,0){0.4}} % traits de graduation
 \put(-0.8,-1.1){$-1$} % valeurs graduées
% quadrillage
 \multiput(-1,-1)(1,0){7}{
 \multiput(-1,-1)(0,1){7}{
% demi-droite
</syntaxhighlight>
On peut faire un code un peu plus compact en ajoutant
dans l'en-tête du fichier codice_94, puis dans le fichier codice_95 :
% axe x
 \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
 \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 codice_96 sert à avoir l'équivalent de codice_97 pour le placement en "x" (l'extension codice_98 pose problème avec l'unité par défaut).