L'article d'aujourd'hui et le suivant présentent ce qui peut être considéré par certains comme le summum de la geekerie LaTeXienne : faire des dessins en utilisant LaTeX lui-même, ou bien un langage de programmation dédié à LaTeX. Et non pas un logiciel Wysiwyg comme Illustrator, Inkscape ou même le module de dessin d'OpenOffice…
À ceux pour qui LaTeX, en tant que programme non-Wysiwyg, est déjà un blasphème en soi, je conseille de passer leur chemin sous peine d'être choqués à vie ! :-) J'espère cependant que cet article intéressera les autres, qu'ils soient utilisateurs convaincus de LaTeX ou simplement curieux de nature. Il est quand même préférable d'avoir des notions de LaTeX, même basiques, pour comprendre les deux articles qui vont suivre. Je rappelle qu'il n'est jamais trop tard pour consulter cet excellent cours d'introduction, du moins les deux premiers chapitres !
Tout d'abord précisons qu'il ne s'agit pas ici de faire des dessins « artistiques » mais bien des schémas scientifiques : arbres, graphes, courbes de fonctions, surfaces, diagrammes, etc. Bref des schémas gouvernés par des règles géométriques ou analytiques précises, qu'il est alors possible de spécifier via des instructions LaTeX ou assimilé.
L'intérêt de le faire en LaTeX est alors triple :
- On minimise le nombre de fichiers annexes utilisés pour constituer le document final : au lieu d'être stockées dans des figures externes, les figures sont en quelque sorte « contenues » dans le fichier .tex du document.
- L'intégration du dessin dans le reste du texte est bien meilleure, car la police utilisée pour les « labels » de la figure est a priori exactement la même, et si le « paquet » de dessin est de bonne qualité, le « coup de crayon » général est en accord avec le trait utilisé par la police du texte. Alors que souvent les figures externes, une fois incorporées, semblent jurer avec le reste du document.
- Contrairement à ce qui se passe souvent lors de l'utilisation d'un logiciel classique, on peut contrôler bien plus de paramètres. De l'épaisseur des traits à leur couleur en passant par la forme de la pointe des flèches et la police de texte choisie, pratiquement tout est configurable et personnalisable, ou presque, quitte à apprendre les commandes qu'il faut. Sans exagérer dans ce sens, sinon on peut se retrouver en contradiction avec le point précédent : par exemple si on souhaite changer de polices pour le texte des labels…
LaTeX fournit déjà par défaut des commandes pour faire ce genre dessins, qui sont placées dans un environnement appelé picture. Néanmoins, ces commandes sont très insuffisantes : elles ne permettent pas, par exemple, de tracer aisément des graphes de fonctions, et même pour les figures simples comme les cercles, il n'est pas possible d'en tracer de toutes tailles ou de toute épaisseur. De plus, sa syntaxe est particulièrement lourde. Par rapport aux solutions que je vais aborder dans cet article et le suivant, la même figure dessinée avec picture peut nécessiter beaucoup plus de codage.
Certaines des limitations de l'environnement picture sont levées par le paquet pict2e, mais pas toutes (et notamment pas la syntaxe…). Voyez la documentation de celui-ci pour faire un tour des difficultés résolues.
Il existe cependant plusieurs alternatives à picture, aussi performantes que l'utilisateur le plus exigeant puisse le souhaiter. Le but de cet article et du suivant est de présenter ces alternatives. Pour ma part, mon choix personnel s'est porté sur deux solutions complémentaires : le paquet mfpic, et le langage de programmation MetaPost, sur lequel mfpic est basé. L'article d'aujourd'hui est consacré à la présentation de ces deux solutions.
Je ne vais pas ici faire vraiment de cours introductif au paquet mfpic ni au langage MetaPost : cela demanderait bien plus que deux articles, et il s'agit ici de faire un tour de présentation des principales solutions de dessin pour LaTeX, pas de détailler chacune d'elles. Néanmoins, je vais en préciser les principes de fonctionnement.
Pour cette présentation, je vais fixer à chaque solution de dessin le même objectif, relativement élémentaire : tracer la parabole d'équation y = x2 dans un repère orthonormé. Ça a l'air élémentaire mais c'est déjà une chose pour laquelle l'environnement picture n'a rien de prévu…
Nous utiliserons comme éditeur de texte le programme bien connu des amateurs de LaTeX sur Mac OS X : TeXShop. Les programmes ci-dessous ont été testés sur la distribution MacTeX la plus récente à ce jour, celle de 2011.
mfpic
mfpic est un « paquet » de commandes LaTeX. Il peut aussi être utilisé avec TeX, et sous LaTeX il fonctionne aussi bien avec pdfLaTeX qu'avec LaTeX + dvips, LuaLaTeX ou XeLaTeX (avec certaines précautions dans ce dernier cas). Le but de mfpic est de produire des dessins de type scientifique. Il a été élaboré à partir de 1992 par Thomas Leathrum, Geoffrey Tobin et Dan Luecking, son « mainteneur » actuel. Sa particularité est qu'il repose en fait sur un outil externe à LaTeX : le langage de programmation MetaPost, ou alternativement le langage MetaFont. Ces deux langages ont également été conçus pour fonctionner avec (La)TeX, mais de façon différente. Nous utiliserons ici mfpic avec le langage MetaPost.
Voici un fichier .tex minimal qui montre comment notre parabole peut être tracée en utilisant mfpic :
|
\documentclass[12pt]{article} % \usepackage[metapost]{mfpic} \setlength{\mfpicunit}{1cm} \opengraphsfile{parabole} % \begin{document} \begin{center} \begin{mfpic}[1.25]{-2.75}{2.75}{-0.5}{5.5} % Tracé des axes \doaxes{xy} % Tracé du graphe de la fonction en rouge \draw[red]\function{-2.2, 2.2, 0.2}{x**2} % Marques sur les axes \xmarks{-1, 1} \ymarks{1, 2, 3, 5} % Lignes tiretées \dashed\lines{(-2, 0), (-2, 4), (2, 4), (2, 0)} % Labels \tlpointsep{3pt} % Décalage \tlabels{[tr](0, 0){$O$} [tc](2, 0){2} [tc](-2, 0){$-2$} [tc](\xmax, 0){$x$} [br](0, 4){4} [cr](0, \ymax){$y$}} % \end{mfpic} \end{center} % \closegraphsfile \end{document} |
Sauvegardez ce fichier, par exemple sous le nom parabole.tex. Pour faire apparaître le dessin, on a besoin non pas d'une, mais de trois compilations de ce fichier.
La première compilation se fait avec LaTeX : vous verrez apparaître un cadre sans dessin, mais avec les labels, et dans le Finder, à l'endroit où votre fichier LaTeX a été sauvegardé apparaît un fichier parabole.mp. C'est ce fichier qui contient le code MetaPost qui servira à produire le dessin proprement dit.
La deuxième composition de votre fichier LaTeX se fait avec MetaPost (choisir « MetaPost » dans le menu « Composition » ou dans le menu déroulant en haut du fichier LaTeX).
À ce moment-là, TeXShop lance la composition du fichier parabole.mp. Apparaîtra alors dans le Finder un fichier parabole.1 contenant cette fois-ci le code PostScript du dessin, c'est-à-dire le dessin lui-même en fait. Si votre fichier LaTeX parabole.tex avait contenu plusieurs dessins mfpic, ce seraient plusieurs fichiers appelés parabole.1, parabole.2, etc, qui seraient apparus.
Ne reste qu'à inclure ce dessin parabole.1 dans votre fichier PDF, et cela se fait grâce à une troisième compilation de votre fichier parabole.tex, à nouveau avec LaTeX. Le dessin apparaît alors entièrement :
Revenons au contenu du fichier parabole.tex et analysons plus en détail les commandes nécessaires au fonctionnement de mfpic.
Le chargement du paquet se fait classiquement avec l'instruction \usepackage[metapost]{mfpic}. L'option metapost indique à mfpic que c'est MetaPost qui devra faire les dessins proprement dits, et non MetaFont qui est le choix par défaut. MetaPost est cependant préférable, ne serait-ce que parce qu'il donne accès à la couleur…
L'unité de longueur de base du schéma est donné par la commande \setlength{\mfpicunit}{1cm}. Par défaut c'est le « point » pt, soit 0,3515 mm. Pas très pratique a priori, d'où le changement !
La commande \opengraphsfile{parabole} précise dans son argument le nom qui sera donné au fichier .mp produit par MetaPost lors de la première compilation. En fait on est libre de lui donner le nom qu'on souhaite, mais en pratique il est impératif de l'appeler par le même nom que celui du fichier LaTeX de départ, si on souhaite que ce fichier MetaPost puisse être compilé par TeXShop directement à partir du fichier LaTeX de départ. Nous avons donc entré le nom parabole puisque notre fichier LaTeX s'appelle parabole.tex
La commande \closegraphsfile doit se trouver en fin de fichier LaTeX et permet de clore le fichier MetaPost.
Le codage du dessin proprement dit se trouve dans
l'environnement
|
\begin{mfpic}[1.25]{-2.75}{2.75}{-0.5}{5.5} … \end{mfpic} |
lequel dispose d'un argument optionnel (entre crochets) et de quatre arguments obligatoires. Analysons-les : dans l'argument optionnel on précise que l'unité des axes du graphe fera concrètement 1.25 unités de base, soit 1.25 cm dans notre cas. Si on veut différencier les unités des axes des abscisses et des ordonnées, on entrera deux arguments optionnels consécutifs au lieu d'un, le premier pour l'axe des abscisses et le deuxième pour l'axe des ordonnées, chacun inclus entre deux paires de crochets. Les quatre arguments obligatoires précisent que l'axe des abscisses du graphe ira de -2.75 unités à 2.75 unités, et que l'axe des ordonnées ira de -0.5 unités à 5.5 unités.
Un mot sur la commande \function{-2.2, 2.2, 0.2}{x**2} : c'est elle qui fait tracer le graphe de la fonction y=x2 sur l'intervalle [-2,2; 2,2]. Précisément, suite à cette commande MetaPost va calculer les coordonnées des points du graphe en incrémentant les abscisses de 0,2 unités en 0,2 unités à partir de -2,2 jusqu'à 2,2, puis va relier ces points entre eux par une courbe de Bézier.
Vous aurez noté la syntaxe de l'expression de la fonction : x**2 (et non x^2). ** est l'opérateur d'exponentiation de MetaPost. L'expression de la fonction étant traitée par MetaPost, il faut utiliser la syntaxe de celui-ci lors de l'écriture de la fonction. Ceci dit, l'expression x^2 fonctionnera aussi, mais uniquement parce que mfpic a prévu un mécanisme de substitution pour remplacer ^ par ** lors de l'envoi de la fonction à MetaPost. Dans un programme MetaPost proprement dit, ^ ne sera pas reconnu.
Attention, l'opérateur d'exponentiation de MetaPost a pour particularité importante de ne pas être prioritaire par rapport à l'opérateur de multiplication *. Ainsi, 3*x**2 signifiera (3x)2 pour MetaPost, et non 3x2, pour lequel il aurait fallu entrer 3*(x**2). Dès que les opérateurs * et ** sont utilisés dans la même formule, il ne faut donc pas hésiter à user de parenthèses ! Les autres règles d'opérations arithmétiques dans MetaPost sont les règles classiques, avec même quelques simplifications bienvenues, comme la possibilité d'écrire 3x au lieu de 3*x si x est une variable numérique ou un vecteur.
J'ai expliqué le reste du codage dans les commentaires du programme lui-même. Vous aurez noté qu'il s'agit de commandes (La)TeX sous forme classique, et donc (relativement) faciles d'accès pour tout familier de (La)TeX.
Remarque importante : si vous souhaitez que mfpic puisse fonctionner avec XeLaTeX, il faut introduire la ligne suivante en préambule, après le chargement de mfpic :
| \setfilenametemplate{\_-\#.eps} |
Cette commande, version mfpic de la commande MetaPost outputtemplate que je présente plus bas, fera en sorte que le ou les fichiers MetaPost produits par la seconde compilation ne seront plus nommés parabole.1, parabole.2, etc, mais parabole-1.eps, parabole-2.eps, etc. XeLaTeX reconnaitra alors ces fichiers comme des schémas au format eps (Encapsulated PostScript), et pourra les incorporer. En revanche, pdfLaTeX refusera de les inclure avec cette extension.
(En fait, les dessins de MetaPost sont au format mps (MetaPost PostScript), un sous-ensemble du format eps que pdfLaTeX est capable d'incorporer, contrairement à l'eps et au PostScript généraux.)
Pour une introduction plus complète et bien illustrée de mfpic, je vous renvoie à cette présentation faite par son mainteneur actuel. Ceux qui à terme voudraient tout savoir de ce paquet feront comme moi du manuel de référence leur livre de chevet :-).
Comme vous avez pu le constater la figure produite est de très bonne qualité esthétique. En particulier le trait utilisé est de approximativement de la même finesse que celui des fontes du texte, et ces dernières sont reprises pour les labels de la figure. Mais cette qualité esthétique est assez logique, puisqu'il s'agit exactement du but de MetaPost, le « dessinateur » en coulisses : produire des dessins (scientifiques) de la plus haute qualité possible. C'est le moment d'en dire plus sur ce langage.
MetaPost
On l'a vu, mfpic se base sur le langage de programmation MetaPost (ou MetaFont) pour produire ce dessin. Mais qu'est-ce que MetaPost, plus précisément ?
Il s'agit en fait d'un langage reprenant l'essentiel des commandes de MetaFont, un autre programme-langage. MetaFont a été créé en même temps que TeX, en 1978, par le mathématicien-informatien Donald Knuth. Il est destiné à la production de polices bitmap pour fonctionner avec (La)TeX. MetaPost (créé vers 1992 par John Hobby, un étudiant de Knuth), quant à lui, ne se destine pas spécialement à la création de fontes, mais à l'élaboration de dessins PostScript destinés eux à l'inclusion dans un fichier (La)TeX.
PostScript se présente lui-même comme un langage de programmation, mais MetaPost est beaucoup plus abordable pour le novice, et surtout, n'utilise en sous-main qu'une classe limitée de commandes PostScript (sans perdre pour autant en qualité) avec pour conséquence précieuse que les dessins qu'il produit peuvent être directement inclus dans un documment pdfLaTeX, contrairement à un dessin PostScript général.
Bonheur supplémentaire, le langage MetaPost est supporté par TeXShop, et donc nous pouvons entrer notre programme MetaPost dans notre éditeur LaTeX favori pour Mac OS X, ce que nous allons faire ici. Notez cependant que TeXShop, bizarrement, ne propose pas de colorisation syntaxique spécifique à MetaPost.
Voici notre schéma précédent, codé cette fois-ci directement en langage MetaPost :
|
% Préambule pour indiquer à
MetaPost % qu'on utilise LaTeX (et non TeX) pour les labels % et qu'ils sont de taille « 12pt » verbatimtex %&latex \documentclass[12pt]{article} \begin{document} etex; % % Le code du dessin proprement dit beginfig(1); % L'unité du graphe u = 1.25cm; % les longueurs des axes xmax = 2.75; ymax = 5; % Les axes drawarrow (-xmax*u, 0)--(xmax*u, 0); drawarrow (0, -0.5*u)--(0, ymax*u); % Construction de la parabole path parabole; parabole = u*(-2.2, -2.2**2) for i := -2 step 0.2 until 2.2: .. u*(i, i**2) endfor; % Tracé de la parabole en rouge draw parabole withcolor red; % Lignes tiretées draw ((2, 0) -- (2, 4) -- (-2, 4) -- (-2, 0)) scaled u dashed evenly; % Marques sur les axes draw (u, -2pt) -- (u, 2pt); draw (-u, -2pt) -- (-u, 2pt); for j := 1 upto 3: draw (-2pt, u*j) -- (2pt, u*j); endfor; % Labels label.bot (btex 2 etex, (2u, 0)); label.bot (btex $-2$ etex, (-2u, 0)); label.bot (btex $x$ etex, (xmax*u, 0)); label.llft (btex $O$ etex, origin); label.ulft (btex 4 etex, (0, 4u)); label.lft (btex $y$ etex, (0, ymax*u)); % endfig; % end; |
Pour ce qui est du code proprement dit, contentons-nous d'indiquer qu'un seul fichier .mp peut contenir et produire plusieurs dessins, dont les codes seront respectivement inclus dans les balises beginfig(1); ... endfig;, beginfig(2); ... endfig;, etc. La commande end; doit terminer le fichier. Toute commande MetaPost doit se terminer par un point-virgule, à quelques exceptions près (dont les commandes end…), mais même s'il n'est pas nécessaire le point-virgule n'est jamais dommageable, donc autant systématiquement le placer…
Malgré l'absence, forcément, de commandes telles que les \usepackage{mfpic} ou \opengraphsfile, vous aurez noté la longueur nettement supérieure du programme MetaPost par rapport à son équivalent mfpic. Ce qui n'a rien d'étonnant, vu que mfpic est de par sa conception censé fournir des macros (en LaTeX) regroupant en une seule instruction plusieurs commandes MetaPost.
Une fois ce programme entré dans TeXShop, sauvegardez-le sous un nom avec l'extension « mp », par exemple parabole.mp. Le voilà près à la compilation.
Vous avez trois choix possibles dans le menu de composition pour ce faire. Le premier est d'utiliser le programme « MetaPost » basique dont on s'est servi plus haut pour mfpic. Mais dans ce cas vous ne verrez pas apparaître tout de suite votre dessin : un fichier parabole.1 sera créé, incorporable dans un document LaTeX (ce que fait d'ailleurs mfpic), mais qui ne sera directement visible que si vous changez vous-même son extension en eps avant de double-cliquer dessus. Il sera alors converti en PDF et apparaîtra… si le Distiller d'Apple a bien fait son travail, ce qui n'est pas garanti.
Il vaut beaucoup mieux utiliser un des deux « moteurs » (engines) de composition mis à disposition par TeXShop : les scripts nv-metapost et nv-metafun disponibles dans une version suffisamment récente de TeXShop (par exemple celle de MacTeX 2011). Si c'est le cas, ils sont listés dans le menu déroulant de composition en haut de la fenêtre de codage de TeXShop :
Choisissez par exemple « nv-metapost ». La seule véritable différence avec « nv-metafun » est que ce dernier dispose de macros supplémentaires, le tout formant avec MetaPost un ensemble appelé MetaFun, dont nous n'avons pas besoin ici (mais qui pourrait vous être utiles plus tard, notamment si vous utilisez ConTeXt). Pour vous faire une idée plus précise de ces scripts, voyez le fichier README contenu dans le dossier « Engines/Inactive/MetaPost » du dossier « TeXShop » de votre Bibliothèque personnelle.
Sur notre programme, que vous choisissiez nv-metapost ou nv-metafun, le résultat serait de toutes façons le même, et le schéma s'affichera immédiatement dans TeXShop :
Cerise sur le gâteau, vous pourrez vérifier que le schéma a été converti au format PDF, sous le nom parabole-1.pdf. Il y en a même une copie appelée parabole.pdf (c'est en fait ce fichier qui est visionné par TeXShop).
Vous disposez donc, grâce à nv-metapost, simultanément d'un version PostScript de votre dessin (parabole.1) et d'une version PDF (parabole-1.pdf).
Si votre fichier parabole.mp avait contenu plusieurs dessins, c'est-à-dire plusieurs environnements beginfig();… endfig;, ils auraient été créés en PostScript sous les noms parabole.1, parabole.2, etc, et en PDF sous les noms parabole-1.pdf, parabole-2.pdf, etc. Et tous ces dessins auraient été repris et regroupés dans un fichier appelé parabole.pdf, que TeXShop aurait visionné.
Ne reste plus qu'à incorporer ce ou ces fichiers de dessins à votre document LaTeX. Cela se fait classiquement en utilisant le paquet graphicx bien connu de tous les TeXniciens, et sa commande \includegraphics. Si vous utilisez LaTeX + dvips, on inclut le ou les fichiers PostScript (pas le choix), si on utilise pdfLaTeX on incluera de préférence naturellement le ou les fichiers PDF.
Si pour une raison ou pour une autre vous souhaitez incorporer dans votre document pdfLaTeX le(s) fichier(s) PostScript genre parabole.1, et non le(s) fichier(s) PDF, vous devez faire en sorte que pdfLaTeX puisse les reconnaître comme fichiers PostScript issus de MetaPost, en choisissant une des méthodes suivantes :
- Soit leur octroyer vous-même une extension .mps (« mps » comme « MetaPost PostScript »), ce qui peut être fastidieux si les fichiers sont nombreux ;
- Soit introduire dans préambule de votre fichier LaTeX
la déclaration suivante :
Cette déclaration fait en sorte que les fichiers à extension .1, .2, etc, soient traités comme des fichiers .mps par pdfLaTeX. C'est l'option choisie par mfpic quand il est utilisé avec pdfLaTeX.\DeclareGraphicsRule{*}{mps}{*}{} - Soit incorporer dans votre fichier Metapost, ici
parabole.mp, la commande
outputtemplate := "%j-%c.mps";
en début de fichier, avant le premier beginfig() mais après l'environnement verbatimtex … etex. Dès lors le ou les fichiers PostScript créés par MetaPost s'appelleront non plus parabole.1, parabole.2, etc, mais parabole-1.mps, parabole-2.mps, etc. Ainsi pdfLaTeX pourra les reconnaître immédiatement comme des fichiers PostScript issus de MetaPost et les inclure directement.
Si vous souhaitez faire de même, mais pour XeLaTeX, les trois solutions précédentes restent de mise, mais il faut remplacer l'extension mps par eps.
Revenons au dessin lui-même. Vous aurez peut-être noté quelques petits détails divergents par rapport à celui produit par mfpic, comme le dessin des pointes de flèche sur les axes, ou la position du label de l'origine du repère : les auteurs de mfpic ont parfois développé leurs propres conceptions esthétiques ou pratiques de certaines constructions, par rapport à celles des auteurs de MetaPost. Personnellement, le « style » mfpic me convient mieux, mais c'est peut-être une question d'habitude.
Alors pourquoi s'intéresser à MetaPost, si mfpic semble plus simple et plus esthétique ?
Essentiellement parce que MetaPost est beaucoup plus flexible et puissant : c'est en effet, contrairement à LaTeX, un langage de programmation classique, avec variables, boucles et instructions conditionnelles faciles d'accès, et surtout avec des capacités de calcul étendues qui lui permettent par exemple de résoudre un système d'équations linéaires ou de donner les points d'intersection de deux courbes quelconques.
Ainsi, suivant la complexité des besoins, on peut faire appel à l'un ou à l'autre. On peut même combiner les deux en incorporant directement du code MetaPost dans un environnement mfpic grâce à des commandes spéciales, mais pour cela il faut (justement) bien s'y connaître en MetaPost…
On peut également aimer le style particulier du langage MetaPost : pour ma part, j'apprécie qu'un langage de programmation permette souvent d'utiliser un langage (anglais) presque directement compréhensible, comme dans l'instruction draw parabole withcolor red qui figure dans notre programme.
Si vous souhaitez vous mettre à MetaPost, je vous conseille cet excellent tutoriel d'André Heck, truffé d'exemples et d'exercices résolus, que j'ai moi-même utilisé pour m'initier à ce langage. Il existe également un très bon tutoriel en français écrit par Laurent Chéno. Et pour compléter ces initiations, il y a l'indispensable manuel de référence par John Hobby lui-même. Une version en français de ce manuel (moins récente toutefois), existe également. Vincent Zonnekynd propose sur son site une considérable suite d'exemples de dessins MetaPost avec leurs codes, du plus simple au plus compliqué. Enfin, le site Syracuse propose une section MetaPost avec en particulier de très belles galeries de dessins.
Voilà pour la présentation de mes deux outils de dessin favoris parmi ceux liés à LaTeX. Dans mon prochain article, je présenterais deux autres paquets de dessins, très largement utilisés : pstricks et tikz, et un langage de programmation concurrent de MetaPost, Asymptote.

