Équations affichées, alignées et numérotées

Le difficile, dans une formule affichée sur plusieurs lignes en LaTeX, n’est pas de choisir où couper. C’est le nombre de numéros d’équation que le résultat porte : align en donne un par ligne, multline un pour toute la formule, et split n’en porte aucun et en emprunte un à ce qui l’entoure. Se tromper là-dessus décale tous les numéros suivants, et les renvois avec eux. Cette page range les environnements d’amsmath — equation, align, gather, multline, split et cases — selon ce seul axe, puis traite le contrôle des numéros avec \notag, \tag et subequations, et les renvois avec \label et \eqref. Elle se termine sur eqnarray, et sur une mesure qui explique pourquoi il ne faut plus jamais s’en servir.

Charger amsmath d’abord, et ne jamais laisser de ligne vide

Tous les environnements de cette page sauf equation viennent d’amsmath : une ligne dans le préambule conditionne donc tout le reste. amsmath comble un domaine où LaTeX seul n’offrait presque rien, en ajoutant align et align*, gather et gather*, multline et multline*, alignat et alignat*, flalign et flalign*, ainsi que split. Pour des numéros dans la marge gauche, passez \usepackage[leqno]{amsmath} ; à droite (par défaut en écriture horizontale), [reqno] ; et pour des formules affichées calées à gauche, [fleqn].

latex
\usepackage{amsmath}

Avant tout, désamorçons la première mine. Ne mettez jamais de ligne vide dans ces environnements. Si vous le faites, vous obtenez ! Paragraph ended before \align was complete. La raison est historique. Les notes techniques de l’AMS expliquent que ces environnements affichés lisent leur contenu comme un argument de macro délimité et le traitent en plusieurs passes pour déterminer largeurs et positions — avec des algorithmes hérités de l’amstex.tex de Michael Spivak. Une ligne vide est un \par pour TeX, et un \par ne peut pas traverser l’argument d’une macro non déclarée \long. Ce message d’erreur est la preuve directe qu’amsmath porte encore le sang de l’AMS-TeX des années 1980.

Une seule ligne numérotée : l’environnement equation

Le point de départ est l’environnement equation. Il place son contenu sur une ligne à part et ajoute un numéro courant dans la marge droite (par défaut en écriture horizontale). Le numéro est tenu par le compteur equation, et un \label{…} permet de l’appeler depuis le texte avec \ref{…} ou \eqref{…}. Si vous voulez seulement supprimer le numéro, utilisez equation* étoilé — qui, amsmath chargé, est exactement la même chose que \[\]. Bref, equation donne un numéro à une ligne de formule, ni plus ni moins.

latex
\begin{equation}
  \label{eq:euler}
  e^{i\pi} + 1 = 0
\end{equation}

Cela compose l’identité d’Euler centrée sur une ligne à part, avec un numéro comme (1) dans la marge droite (c’est le compteur courant du document, pas forcément 1). Pour une formule qui ne tient pas sur une ligne, ou pour plusieurs formules à aligner, passez aux environnements ci-dessous. Un avertissement : ne jamais imbriquer un environnement numéroté dans \[\]. Écrire \[ \begin{align} … \end{align} \] produit ! Package amsmath Error: Erroneous nesting of equation structures; — le \[\] extérieur est simplement de trop.

Aligner plusieurs formules : align ou gather

align aligne sur la relation ; gather empile au centre et n’aligne rien. C’est toute la différence, et les deux numérotent chaque ligne (les étoilés align* et gather* ne le font pas). Dans align, on sépare les lignes par \\ et on place un & au point à aligner — par convention juste avant une relation comme un signe égal ou une inégalité. Tout ce qui précède & est aligné à droite, tout ce qui suit à gauche : les deux membres se rejoignent exactement sur la relation. Le manuel d’amsmath indique clairement que mettre & après la relation perturbe l’espacement normal — et c’est exactement ainsi que l’ancien eqnarray était conçu.

latex
\begin{align}
  (x + y)^2 &= x^2 + 2xy + y^2 \\
  (x - y)^2 &= x^2 - 2xy + y^2
\end{align}

Cela empile les deux formules, les deux signes égal à la même position horizontale, avec un numéro à droite de chaque ligne. Ne mettez pas de \\ après la dernière ligne : le manuel d’amsmath en avertit explicitement, car cela ajoute une espace verticale indésirable sous la formule. La bévue la plus fréquente est de taper & dans gather : il n’y a pas de colonne d’alignement, d’où ! Extra alignment tab has been changed to \cr. Le même message apparaît si l’on met deux & sur une ligne de split.

align peut aussi placer plusieurs formules côte à côte. Le & sert à la fois de marque d’alignement et de séparateur de colonne : un groupe s’écrit « partie alignée à droite & relation avec partie alignée à gauche », puis un autre & le sépare du suivant. amsmath insère automatiquement un espace fixe entre les colonnes. Pour maîtriser cet espace, utilisez alignat, qui prend le nombre de paires de colonnes en argument et ne laisse aucun espace, à charge pour vous d’en mettre avec \quad ; et flalign lorsque vous voulez pousser les colonnes sur toute la largeur du bloc de texte.

latex
\begin{align}
  x      &= y       & X      &= Y       & a   &= b + c \\
  x'     &= y'      & X'     &= Y'      & a'  &= b      \\
  x + x' &= y + y'  & X + X' &= Y + Y'  & a'b &= c'b
\end{align}

gather, à l’inverse, n’aligne rien du tout : chaque ligne est centrée indépendamment. Les lignes sont séparées par \\ et chacune reçoit un numéro (gather* n’en donne aucun). Retenez align comme « aligner sur la relation » et gather comme « empiler simplement au centre », et le choix se fait tout seul. Une ligne isolée d’un gather peut contenir un split (ci-dessous), afin que cette seule ligne se coupe sur plusieurs.

latex
\begin{gather}
  a^2 + b^2 = c^2 \\
  e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}
\end{gather}

Lorsqu’un long align rencontre une limite de page, LaTeX ne le coupe pas par défaut : amsmath fixe \interdisplaylinepenalty à sa valeur maximale. Dans un document portant des calculs de plusieurs dizaines de lignes, écrire \allowdisplaybreaks dans le préambule assouplit cette interdiction. L’argument optionnel va de [1] à [4], du plus réticent au plus permissif, la valeur par défaut étant le très permissif [4]. Pour interdire une coupure après une ligne précise, écrivez le \\ de cette ligne comme \\*.

Couper une longue formule : multline et split

Deux environnements coupent une seule formule qui ne tient pas sur une ligne, et tous deux diffèrent radicalement d’align/gather : une formule, un numéro. multline n’aligne rien. Il place la première ligne à gauche et la dernière à droite, les lignes intermédiaires étant centrées. « À gauche » ne veut pas dire tout à fait au bord : à la mesure, la première ligne commence à 10pt à l’intérieur de la marge, la valeur par défaut de \multlinegap. Le numéro de toute la formule figure sur la dernière ligne (la première avec leqno). Puisqu’il s’agit d’une formule et d’un numéro, il ne faut pas supprimer des lignes isolées avec \notag. Pour pousser une ligne intermédiaire d’un côté, donnez la ligne entière — sans le \\ qui suit — à \shoveleft{…} ou \shoveright{…}. La forme non numérotée est multline*.

latex
\begin{multline}
  a + b + c + d + e + f \\
  + g + h + i + j + k + l + m + n
\end{multline}

Quand les lignes coupées doivent être alignées, on prend split. Comme align, split aligne sur &, mais n’autorise qu’une colonne d’alignement (un & par ligne) et ne porte aucun numéro propre. On le place dans une structure numérotée telle qu’equation (ou align, ou gather) : l’ensemble reçoit alors un numéro unique de son hôte. Employé seul, il produit ! Package amsmath Error: \begin{split} won't work here. Le corps d’un split doit occuper tout l’hôte ; seules des commandes sans sortie, comme \label, peuvent l’accompagner. Il ne peut pas figurer dans multline.

latex
\begin{equation}
  \label{eq:cosh}
  \begin{split}
    \cosh x &= \frac{e^x + e^{-x}}{2} \\
            &= 1 + \frac{x^2}{2!} + \frac{x^4}{4!} + \cdots
  \end{split}
\end{equation}
EnvironnementFormules et numérosAlignementUsage principal
equationune / unaucunune seule ligne affichée
alignplusieurs / par lignesur &empiler et aligner sur les relations
gatherplusieurs / par ligneaucun (chaque ligne centrée)empiler au centre, sans alignement
multlineune / un (sur la dernière ligne)aucun (gauche vers droite)couper une longue formule, sans alignement
splitune / numéro fourni par l’hôteune colonne &aligner les lignes d’une formule coupée

Définitions par cas : cases

Pour définir une fonction par cas, on utilise l’environnement cases. La grande accolade gauche apparaît automatiquement ; dans chaque ligne, un & sépare la valeur de la condition, et les lignes sont séparées par \\. Écrits tels quels, les mots d’une condition (« if … ») sortent inclinés et trop serrés, car ils restent en mode mathématique : enveloppez-les dans \text{…}. cases ne porte pas de numéro ; on le place donc généralement dans une equation qui en donne un à l’ensemble.

latex
\begin{equation}
  |x| =
  \begin{cases}
    x  & \text{if } x \ge 0, \\
    -x & \text{if } x < 0.
  \end{cases}
\end{equation}

Cela place deux lignes à droite d’une grande accolade — x (condition x ≥ 0) et −x (condition x < 0) — avec un numéro unique venu d’equation. La colonne des valeurs et celle des conditions sont toutes deux alignées à gauche. Un piège : cases compose son contenu en style texte. À la mesure, les chiffres d’un \frac{1}{2} à l’intérieur de cases font 6,19pt de haut contre 8,85pt pour la même fraction dans une formule affichée ordinaire. Pour garder la fraction en pleine taille, utilisez dcases du paquet mathtools, le même environnement composé en style affiché.

Contrôler les numéros : \notag, \tag, subequations

Dans les environnements numérotés, chaque ligne reçoit un numéro automatiquement, et cela s’ajuste ligne par ligne. Un fait rassurant : une ligne portant \notag ne consomme pas de numéro. amsmath redéfinit \nonumber de sorte que supprimer une ligne recule aussi le compteur d’une unité — amsmath.sty contient littéralement \addtocounter{equation}\m@ne. Mettez \notag sur la deuxième de trois lignes d’align et les numéros donnent (1), aucun, (2), la formule suivante étant (3). Aucun trou dans la suite.

  • Supprimer le numéro d’une ligne : placez \notag avant le \\ de cette ligne. Son synonyme est \nonumber ; dans amsmath, \notag est littéralement défini comme un alias de \nonumber.
  • Choisir le numéro soi-même : \tag{…} compose ce que vous donnez à la place du numéro automatique et fournit les parenthèses. \tag*{…} n’ajoute pas de parenthèses et imprime l’argument tel quel. \tag{$\star$} donne (⋆) ; \tag*{NP} donne NP.
  • Grouper des formules en (4a), (4b) : enveloppées dans subequations, les formules internes prennent le numéro parent plus une lettre. Un \label placé juste après \begin{subequations} renvoie au numéro parent (4), non à l’enfant (4a).
  • Repartir la numérotation par chapitre ou section : écrivez \numberwithin{equation}{section} dans le préambule et la première équation de la section 2 devient (2.1). C’est la manière courante d’éviter des numéros à quatre chiffres dans un long document.
latex
\begin{align}
  y &= (x + 1)^2    \notag \\
    &= x^2 + 2x + 1 \\
  E &= mc^2         \tag{$\star$}
\end{align}

\begin{subequations}
  \label{eq:max}
  \begin{align}
    \nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \label{eq:gauss} \\
    \nabla \cdot \mathbf{B} &= 0
  \end{align}
\end{subequations}

Dans l’align ci-dessus, la première ligne reste sans numéro grâce à \notag, la deuxième prend son numéro automatique habituel, et la troisième reçoit (⋆) à la place. Laisser sans numéro les étapes intermédiaires d’une dérivation et ne numéroter que la conclusion est le schéma le plus courant dans un article. Dans le subequations qui suit, les deux équations de Maxwell portent les numéros (4a) et (4b) ; \eqref{eq:gauss} renvoie alors (4a), tandis que \eqref{eq:max} renvoie (4), pour le groupe entier.

Renvoyer avec \label et \eqref

Étiquetez une formule numérotée avec \label{…} et vous pourrez l’appeler par son numéro depuis le texte. \ref{…} renvoie le numéro nu (par exemple 3.2), tandis que \eqref{…} d’amsmath ajoute les parenthèses et renvoie (3.2). Dans amsmath.sty, tout \eqref est enveloppé dans \textup{…} : les parenthèses restent donc droites même en environnement italique — différence que l’on remarque dès le premier renvoi à une équation depuis l’énoncé d’un théorème. Dans un environnement multiligne, placez \label sur la ligne dont vous voulez le numéro. Les renvois passent par le fichier auxiliaire : compilez deux fois pour les fixer.

latex
By~\eqref{eq:euler}, we have $e^{i\pi} = -1$.

% preamble: number equations within sections, giving (2.1), (2.2), ...
\numberwithin{equation}{section}

L’apparence du numéro est fixée par \theequation. Dans article, la valeur par défaut est \arabic{equation} ; dans book et report, la définition dit « si le compteur de chapitre est supérieur à zéro, préfixer \thechapter., puis le compteur courant » — c’est littéralement la ligne de book.cls, d’où le numéro nu, sans préfixe de chapitre, dans les pages liminaires. On peut redéfinir le format directement, par exemple avec \renewcommand{\theequation}{\thesection.\arabic{equation}}, mais \numberwithin reste plus sûr, car il s’occupe aussi de remettre le compteur à zéro.

Ne jamais utiliser eqnarray : 3,6 fois trop lâche

Les anciens documents emploient eqnarray (et eqnarray*) pour les mathématiques multilignes. Ne le faites pas. La raison s’exprime en mesures, non en opinions. La définition de \eqnarray dans latex.ltx place un \hskip \tw@\arraycolsep de part et d’autre de la colonne de relation — or \arraycolsep vaut 5pt par défaut, soit 10pt de chaque côté. Composez la même formule en align ou equation : chaque côté reçoit \thickmuskip, c’est-à-dire 2,78pt. Mesuré dans un document en 10pt : 9,97pt contre 2,77pt, un facteur 3,6. Pire, ces 10pt sont une dimension rigide héritée de l’espacement des colonnes de tableau : elle ne suit pas les changements de corps de la fonte mathématique.

Le second dommage réel est le numéro d’équation. Placez une ligne longue dans un eqnarray et le numéro s’imprime par-dessus la formule. À la mesure, le dernier terme occupait les positions horizontales 483 à 505pt tandis que le numéro (1) occupait 492 à 505pt : recouvrement franc. Le même contenu dans align amène amsmath à détecter la collision et à descendre le numéro sur une ligne à part. Ce sont exactement les deux raisons que le Short Math Guide for LaTeX de l’AMS oppose à eqnarray : un espacement des signes égal incohérent, et aucune tentative d’empêcher le numéro de recouvrir le corps de l’équation. Le manuel d’amsmath en ajoute une troisième : \qed et \qedhere des paquets de théorèmes n’y fonctionnent pas.

Le remplacement est mécanique. Plusieurs formules à aligner : align. Une formule à couper : equation plus split. Le & se déplace aussi — eqnarray était conçu pour mettre & après la relation, la famille align le met avant : x &=& y devient donc x &= y. Quand on hérite d’un manuscrit, cette substitution est le premier travail à faire.