Quels sont les arguments contre l’utilisation d’eqnarray ?#

L’environnement eqnarray paraît attractif pour les utilisateurs occasionnels de mathématiques dans des documents il semble permettre d’alignement de systèmes d’équations.

\documentclass{article}
  \usepackage{lmodern} % Caractères plus lisibles
  \pagestyle{empty}    % N'affiche pas de numéro de page

\begin{document}
\begin{eqnarray}
  a & = & b + c \\
  x & = & y - z
\end{eqnarray}
\end{document}

Et, en effet, il fournit cette fonctionnalité d’alignement… mais en gérant l’espacement de façon douteuse.

Ce sujet est discuté en détail dans un article en anglais du journal paper de Lars Madsen ; Stefan Kottwitz a également rédigé un billet du blog en anglais qui inclut des copies d’écran illustrant clairement les problèmes associés à eqnarray. La présente page se limite à trois arguments importants.

1.  L’espacement autour du symbole de relation#

Typographiquement, eqnarray rajoute beaucoup d’espacement autour du symbole de relation, de façon injustifiée et incohérente avec les autres environnements mathématiques (ci-dessous equation, eqnarray puis align).

\documentclass{article}
  \usepackage{lmodern} % Caractères plus lisibles
  \pagestyle{empty}    % N'affiche pas de numéro de page
  \usepackage{mathtools}

\begin{document}
\begin{equation*}
  x = y
\end{equation*}
\vspace*{-0.8cm}
\begin{eqnarray*}
  x & = & y
\end{eqnarray*}
\vspace*{-1cm}
\begin{align*}
  x & = y
\end{align*}
\end{document}

De fait, dans l’environnement eqnarray, les espaces autour du symbole «  \(=\) » ne sont pas ceux définis par les métriques de la fonte. Ils sont définis par \arraycolsep, qui peut être arbitrairement fixé à des valeurs utiles aux véritables tables présentes dans le document.

2.  La gestion du numéro d’équation#

Quand l’équation occupe toute la largeur de la page, eqnarray ne s’en rend pas compte et place le numéro d’équation en surimpression sur le texte. Les autres environnements standard, comme equation, ne présentent pas ce problème et placent le tag en-dessous (pour les deux premières lignes ci-dessous, est utilisé eqnarray avec \setlength\arraycolsep{2pt} ; pour les deux suivantes, align).

\documentclass{article}
  \usepackage{lmodern} % Caractères plus lisibles
  \pagestyle{empty}    % N'affiche pas de numéro de page
  \usepackage{mathtools}

\begin{document}
\setlength\arraycolsep{2pt}
\begin{eqnarray}
  a & = & b \\
    & = & cdefghijklmnopqrstuvwxyzcdefghijklmnopqrstuvwxyzcdeghijklmno
\end{eqnarray}
\vspace*{-0.5cm}
\begin{align}
  a & = b \\
    & = cdefghijklmnopqrstuvwxyzcdefghijklmnopqrstuvwxyzcdeghijklmno
\end{align}
\end{document}

3.  Des incomptabilités avec mathtools#

Par ailleurs, eqnarray ne fonctionne pas correctement avec les commandes de l’extension mathtools (ou amsmath), incontournable pour composer les mathématiques. Par exemple, les commandes \tag et \intertext fonctionnent avec tous les environnements sauf eqnarray.

4.  Ce qu’il existe pour la remplacer#

4.1.  L’environnement align#

Pour ces raisons, eqnarray doit être considéré comme obsolète et ne plus être utiliser. Il est avantageusement remplacé par les environnements de mathtools (ou de amsmath), notamment align défini pour répondre aux besoins des mathématiciens dont voici la syntaxe pour corriger l’exemple ci-dessus :

\documentclass{article}
  \usepackage{lmodern} % Caractères plus lisibles
  \pagestyle{empty}    % N'affiche pas de numéro de page
  \usepackage{mathtools}

\begin{document}
\begin{align}
  a & = b + c \\
  x & = y - z
\end{align}
\end{document}

4.2.  Un correctif ancien et partiel#

Avertissement

Ce qui suit est informatif et n’est conservé que pour historiser la méthode. L’utilisation de l’environnement eqnarray n’étant pas recommandé, cette astuce ne l’est pas plus.

\makeatletter
\newlength{\earraycolsep}
\setlength{\earraycolsep}{2pt}
 
\def\eqnarray{\stepcounter{equation}%
  \let\@currentlabel%
  \theequation
  \global\@eqnswtrue\m@th
  \global\@eqcnt\z@\tabskip\@centering
  \let\\\@eqncr
  $$\halign to\displaywidth\bgroup\@eqnsel
  \hskip\@centering
  $\displaystyle\tabskip\z@{##}$&
  \global\@eqcnt\@ne\hskip 2\earraycolsep 
  \hfil$\displaystyle{##}$\hfil
  &\global\@eqcnt\tw@ \hskip 2\earraycolsep
  $\displaystyle\tabskip\z@{##}$\hfil
  \tabskip\@centering&\llap{##}\tabskip\z@\cr}
\makeatother