Dans la manière classique de tracer des diagrammes de Feynman en LaTeX, chaque diagramme devient un caractère de fonte. Ce n’est pas une métaphore. Passez un diagramme feynmf par METAFONT sous TeX Live 2024 et il annonce "Font metrics written on myfd.tfm" puis "Output written on myfd.600gf (1 character, 4340 bytes)" — un caractère. L’image d’un processus de diffusion, fondue en caractère typographique, table de chasses comprise. Les figures scientifiques obéissent chacune à leur grammaire de dessin, et les paquets spécialisés prennent précisément cette grammaire pour entrée. Cette page classe les outils de chimie mhchem, chemfig et XyMTeX, les outils de physique tikz-feynman et feynmf, ainsi que modiagram pour les diagrammes d’orbitales moléculaires, selon deux axes : ce que chacun produit et sous quel moteur il tourne.
Même au sein des « figures de chimie et de physique », l’outil se distingue nettement selon ce que l’on veut produire. Voyons d’abord la carte d’ensemble, puis chacun à son tour.
| Paquet | Domaine | Ce qu’il produit | Moteur / passes |
|---|---|---|---|
mhchem | Chimie | Formules et équations composées comme du texte (H2O, 2H2+O2 -> 2H2O) | N’importe quel moteur ; une passe |
chemfig | Chimie | Formules développées et squelettiques, schémas réactionnels | Fondé sur TikZ ; pdf, lua ou xe |
xymtex | Chimie | Formules développées ; cycles et squelettes appelés comme commandes | LaTeX standard, avec modes PostScript et PDF |
tikz-feynman | Physique | Diagrammes de Feynman ; nommer les sommets suffit au placement | Suppose LuaLaTeX ; ailleurs le placement se dégrade |
feynmf / feynmp | Physique | Diagrammes de Feynman ; chacun devient un glyphe ou une figure MetaPost | Deux passes ; lancer mf ou mpost à part |
modiagram | Chimie et physique | Diagrammes d’orbitales moléculaires, donc de niveaux d’énergie | Fondé sur TikZ ; une passe |
Formules et équations chimiques dans le texte : le \ce{} de mhchem
mhchem ne sert pas à dessiner des structures mais à composer formules et équations chimiques comme du texte. On le charge par \usepackage[version=4]{mhchem} et l’on écrit l’expression dans sa commande centrale, \ce{...} (chemical equation). Son intelligence tient à ce que la saisie naturelle produit une chimie correcte : un chiffre juste après un symbole d’élément devient un indice (\ce{H2O}), et un nombre ou un signe écrit avec ^ devient un exposant de charge (\ce{SO4^2-}). Les flèches se tapent littéralement — -> sens direct, <=> équilibre, <- sens inverse — et + est composé comme une addition de réactifs avec l’espacement voulu.
\usepackage[version=4]{mhchem}
% ...
\ce{2 H2 + O2 -> 2 H2O}
\ce{CO2 + C ->[\Delta] 2 CO}
\ce{H2O <=> H+ + OH-}
\ce{Ba^2+ + SO4^2- -> BaSO4 v}
\ce{C\bond{-}C}Ces exemples composent, dans l’ordre : la formation de l’eau (coefficients et indices s’alignent d’eux-mêmes) ; le chauffage, où ->[\Delta] place une condition au-dessus de la flèche (écrivez ->[haut][bas] pour deux) ; l’auto-ionisation de l’eau, avec flèche d’équilibre à double sens ; la précipitation du sulfate de baryum, où le v final devient une flèche vers le bas (un gaz dégagé se note ^) ; et un symbole de liaison simple via \bond. \ce{} fonctionne dans le texte courant comme dans $...$. Ce qu’il ne sait pas faire, c’est dessiner des structures : liaisons et cycles sont hors de son champ. Pour une image squelettique, place à chemfig. Un paquet plus tardif au même but, chemformula, propose l’idée par \ch{...}.
Des structures d’un seul trait : symboles de liaison et angles de chemfig
chemfig est l’outil de référence pour les formules développées, ou squelettiques, des molécules ; fondé sur TikZ, il décrit une molécule par un mini-langage de liaisons et de branches. Le chargement se réduit à \usepackage{chemfig} et la commande centrale est \chemfig{...}. La grammaire repose sur deux choses : les symboles de liaison et les angles. Les liaisons — - simple, = double, ~ triple — se placent entre atomes, et la direction de chacune s’indique dans les crochets qui la suivent. Un chiffre de 0 à 7 comme [2] est une direction prédéfinie par pas de 45° : [0] l’est (droite), puis dans le sens antihoraire [2] le haut, [4] l’ouest, [6] le bas. Un angle quelconque s’écrit avec deux-points en valeur absolue, par exemple [:30]. Les parenthèses (...) créent une branche depuis la chaîne principale.
\usepackage{chemfig}
% ...
% methane: hydrogens west, up, down, east
\chemfig{H-C(-[2]H)(-[6]H)-H}
% benzene: alternating bonds, then the inscribed-circle form
\chemfig{*6(=-=-=-)}
\chemfig{**6(------)}Dans l’exemple du méthane, H-C place d’abord un hydrogène à l’ouest du carbone ; les branches (-[2]H) et (-[6]H) ajoutent des hydrogènes vers le haut et vers le bas ; le -H final en étend un vers l’est (direction par défaut), d’où le CH4 en croix. Pour le benzène, *6(...) signifie un cycle à six chaînons et =-=-=- y fait alterner liaisons simples et doubles. * donne un cycle ordinaire et, doublé en **, il donne la forme aromatique à cercle inscrit. chemfig trace aussi des schémas réactionnels : encadrez-les par \schemestart ... \schemestop, disposez les molécules, insérez les flèches par \arrow. \arrow{->[réactif]} annote une flèche de réactifs ou de conditions, \arrow{<=>} donne une flèche d’équilibre.
\schemestart
\chemfig{H-C(-[2]H)(-[6]H)-H}
\arrow{->[\small oxidation]}
\chemfig{O=C(-[2]H)-[6]H}
\schemestopVoici un schéma de gauche à droite allant de la formule développée du méthane, par une flèche étiquetée marquant l’oxydation, à la formule développée du formaldéhyde. Comme chemfig repose sur TikZ, il fonctionne sous pdfLaTeX, LuaLaTeX ou XeLaTeX et ne demande normalement aucun réglage de pilote supplémentaire (avec pLaTeX via DVI, indiquez dvipdfmx). TeX Live 2024 livre la version 1.66, du 28 décembre 2023, de Christian Tellechea.
Appeler des cycles entiers comme des commandes : XyMTeX
L’autre outil de longue date pour les formules développées est XyMTeX (de Shinsaku Fujita), dont le principe est l’inverse de celui de chemfig. Là où chemfig trace les liaisons d’un seul trait, XyMTeX appelle des cycles et des squelettes entiers comme commandes et reçoit les substituants en arguments. Écrivez \bzdrv{1==Cl;4==OH} et vous obtenez un cycle benzénique portant Cl en position 1 et OH en position 4 : on énonce ce qui se trouve où par numéro d’indice, exactement comme le fait la nomenclature chimique. Sa force est de composer de façon fiable des polycycles condensés complexes et des motifs de substitution au moyen de commandes fixes et structurées.
\usepackage{xymtex}
% ...
% benzene with Cl at position 1 and OH at position 4
\bzdrv{1==Cl;4==OH}Pour un travail entamé de zéro, la plupart choisissent chemfig, à la notation plus intuitive et à la maintenance active. XyMTeX reste utile pour entretenir des manuscrits déjà écrits avec lui, et pour qui a la main faite à la désignation par indices de position. Il prend en charge un mode de sortie LaTeX standard ainsi que les modes PostScript et PDF.
tikz-feynman suppose LuaLaTeX : les avertissements de pdfLaTeX
Compilez-le avec LuaLaTeX. Sous d’autres moteurs, il « fonctionne », mais le placement automatique cesse d’opérer et les clés de placement ne sont pas ignorées en silence : chacune est signalée par un avertissement. L’essai avec pdflatex sous TeX Live 2024 a donné d’abord "Package tikz-feynman Warning: LuaTeX is required if you wish to have vertices automatically placed.", puis une ligne pour chacune de horizontal, node distance, level distance et sibling distance : "The key you tried to use ... requires LuaTeX. It will be ignored." L’algorithme de placement est écrit en Lua ; en passant à lualatex, plus aucun avertissement.
Autre chose : surveillez le numéro de compat. Le très cité \usepackage[compat=1.0.0]{tikz-feynman} déclenche un avertissement sous TeX Live 2024 : "Package tikz-feynman Warning: The preamble requested version 1.0.0, but the system version is 1.1.0. This may change some diagrams." La version livrée est 1.1.0, datée du 5 février 2016 ; il faut donc écrire compat=1.1.0. Cette clé sert à vous avertir lorsqu’une mise à jour du paquet modifierait vos diagrammes ; l’usage correct consiste donc à indiquer la version réellement installée (un numéro majeur discordant provoque une erreur, non un avertissement).
% compile with lualatex
\usepackage[compat=1.1.0]{tikz-feynman}
% ...
% one-shot command: e+ e- -> mu+ mu- via a photon
\feynmandiagram [horizontal=a to b] {
i1 -- [fermion] a -- [fermion] i2,
a -- [photon] b,
f1 -- [fermion] b -- [fermion] f2,
};La figure est une diffusion en canal s de manuel : la paire de gauche se rencontre au sommet a, une ligne ondulée, c’est-à-dire un photon, relie a à b, et à droite elle se sépare en une autre paire. Les styles de ligne se posent par [fermion] (droite fléchée), [photon] (ondulée), [gluon] (spirale), etc., et les sommets sont créés implicitement dès qu’on les nomme. horizontal=a to b est une indication de placement signifiant « placer a et b horizontalement » — exactement la clé dont pdfLaTeX annonçait l’abandon. Pour un placement précis, ouvrez un environnement feynman dans un tikzpicture, posez les sommets par \vertex et reliez-les par \diagram*.
feynmf et feynmp : une méthode en deux passes née en 1989
Cette famille compose chaque figure hors de LaTeX puis en importe le résultat : une méthode en deux passes. feynmf recourt à METAFONT, feynmp à MetaPost. L’auteur est Thorsten Ohl, et le copyright de feynmf.sty remonte à 1989, soit avant LaTeX2e (1994). TeX Live 2024 livre la v1.08, dont les horodatages internes de révision datent encore de 1996. Autre façon de le dire : près de trente ans sans qu’une modification soit nécessaire.
L’écriture est déclarative. Les figures se regroupent par nom de fichier dans un environnement fmffile ; à l’intérieur d’un fmfgraph (ou fmfgraph*), on confie les pattes externes à \fmfleft et \fmfright, et les lignes à \fmf{...}. On n’écrit jamais de coordonnées de sommets : on énonce seulement quelle patte passe par quel sommet et vers où, le placement se fait tout seul. \fmf{fermion}{i1,v1,o1} signifie « trace une ligne de fermion de i1 par v1 jusqu’à o1 ».
% feynmp-auto runs MetaPost for you: pdflatex -shell-escape document
\usepackage{feynmp-auto}
% ...
\begin{fmffile}{myfd}
\begin{fmfgraph*}(120,80)
\fmfleft{i1,i2}
\fmfright{o1,o2}
\fmf{fermion}{i1,v1,o1}
\fmf{photon}{v1,v2}
\fmf{fermion}{i2,v2,o2}
\end{fmfgraph*}
\end{fmffile}C’est ici que revient l’ouverture de la page. Sur la voie feynmf, la première exécution de LaTeX écrit myfd.mf, une source METAFONT ; la passer dans mf fond la figure en une fonte. Le compte rendu de METAFONT lors de l’exécution réelle sous TeX Live 2024 indiquait "Font metrics written on myfd.tfm" puis "Output written on myfd.600gf (1 character, 4340 bytes)". Un caractère pour un diagramme. La seconde exécution de LaTeX se contente alors de composer le caractère numéro un de cette fonte dans le texte. La voie feynmp, par MetaPost, produit une figure ordinaire plutôt qu’une fonte, raison pour laquelle un flux PDF moderne la choisit d’ordinaire.
En pratique, charger feynmp-auto est plus simple : il automatise l’exécution de MetaPost. Mais comme un programme externe est lancé, --shell-escape est requis, et l’oublier est fâcheux : sous TeX Live 2024, l’exécution n’a produit ni avertissement ni erreur et a simplement fabriqué un PDF sans la figure. Si l’emplacement d’une figure reste blanc, soupçonnez d’abord un -shell-escape manquant. Avec l’option, deux passes suffisent : mpost s’exécute et la figure se met en place.
modiagram pour les diagrammes OM : l’environnement MOdiagram est obsolète
Employez le nom d’environnement en minuscules, modiagram. Les exemples circulant sur le web — et une version antérieure de cette page — montrent largement \begin{MOdiagram}, mais l’utiliser avec modiagram 0.3a sous TeX Live 2024 déclenche : "Package modiagram Warning: The environment MOdiagram is deprecated. Use modiagram instead." La figure sort tout de même, mais rien ne justifie de conserver un nom appelé à disparaître. Passez en minuscules et l’avertissement s’évanouit.
Un diagramme d’orbitales moléculaires (diagramme OM) se tient à la frontière de la chimie et de la physique : il montre comment des orbitales atomiques (OA) se combinent en orbitales moléculaires (OM) liantes et antiliantes, empilées verticalement selon l’énergie. Le paquet conçu précisément pour cela est modiagram (de Clemens Niederberger ; version 0.3a dans TeX Live 2024), fondé sur TikZ. Chargez-le par \usepackage{modiagram} et, dans l’environnement, écrivez les orbitales atomiques gauche et droite avec \atom et les orbitales moléculaires qui les relient avec \molecule.
\usepackage{modiagram}
% ...
% lower-case environment name: MOdiagram is deprecated
\begin{modiagram}
\atom{left}{ 1s = {0; up} }
\atom{right}{ 1s = {0; up} }
\molecule{ 1sMO = {1; pair, } }
\end{modiagram}Voici le diagramme OM le plus simple qui soit, celui de la molécule de dihydrogène H2. \atom{left} et \atom{right} placent chacun un électron de spin vers le haut dans une orbitale 1s (le 0 de {0; up} est le niveau d’énergie), et \molecule fond les deux en une orbitale liante contenant une paire d’électrons (pair). Il suffit de donner l’occupation — up, down, pair — et les hauteurs de niveau en arguments pour qu’un diagramme de niveaux, fait de lignes horizontales et de flèches de spin, s’assemble seul. De tels diagrammes se dessinent aussi en TikZ pur, mais comme modiagram se spécialise dans les conventions OM, il compose ces figures types plus brièvement et plus correctement.
Comment choisir, et où la compilation coince en général
Le choix découle directement de ce que l’on veut produire. Formules et équations chimiques dans le texte : mhchem. Structures et schémas réactionnels : chemfig (ou XyMTeX lorsqu’une approche par commandes convient à des cycles condensés complexes). Diagrammes de Feynman : tikz-feynman (ou feynmf / feynmp pour des environnements anciens et des manuscrits hérités). Diagrammes OM : modiagram. mhchem et chemfig ne rivalisent pas, ils se complètent, et l’usage courant est de les employer ensemble dans un même document : mhchem pour les équations du texte, chemfig pour les squelettes affichés.
D’expérience, les blocages de compilation se ramènent à trois causes. Le mauvais moteur — le placement de tikz-feynman réclame LuaLaTeX. Un --shell-escape manquant — feynmp-auto laisse tomber la figure sans un mot. Et le nombre de passes — feynmf / feynmp demandent deux exécutions avant que la figure apparaisse. À cela s’ajoute que chemfig et modiagram reposent sur TikZ : le calcul s’alourdit à mesure que les figures se multiplient. Mettre les figures en cache avec tikzexternalize, ou les compiler seules avec la classe standalone, réduit visiblement l’attente pendant l’édition.