複数行にわたる別行立ての数式で本当に難しいのは、どこで行を折るかではなく、その結果にいくつ式番号が付くか です。LaTeX の align は一行に一つ、multline は式全体に一つ、split は自分では持たず外側から一つ借ります。ここを取り違えると、その先の番号がすべてずれ、参照も一斉に狂います。このページでは amsmath が提供する equation・align・gather・multline・split・cases を「番号がいくつ付くか」という軸で整理し、\notag・\tag・subequations による番号の制御と、\label/\eqref による参照までを扱います。最後に eqnarray を——等号まわりの空きが実測で正しい値の 3.6 倍という、二度と使わないための理由とともに。
まず amsmath を読み込む — そして環境のなかに空行を置かない
このページで扱う環境は、equation を除いてすべて amsmath が提供します。プリアンブルの一行がすべての前提です。amsmath は素の LaTeX にほとんど何もなかった多行数式の領域を一気に埋め、align/align*、gather/gather*、multline/multline*、alignat/alignat*、flalign/flalign*、そして split を加えます。式番号を左端に出したいなら \usepackage[leqno]{amsmath}、右端(横書きの既定)なら [reqno]、別行立てを左寄せにするなら [fleqn] をパッケージオプションに渡します。
\usepackage{amsmath}ここで一つだけ、最初に踏む地雷を先に外しておきます。これらの環境のなかに空行を置いてはいけません。 置くと ! Paragraph ended before \align was complete. が出ます。理由は amsmath の歴史にあります。AMS の技術ノートによれば、これらの別行立て環境は中身を マクロの引数として一度に読み込み、複数回走査して幅や位置を決める——その算法は Michael Spivak の amstex.tex から受け継いだものだ、と書かれています。空行は TeX にとって \par であり、\long でないマクロの引数を越えられない。つまりこのエラーは、amsmath が 1980 年代の AMS-TeX の血を引いていることの直接の証拠なのです。
番号付きの一行 — equation 環境
出発点は equation 環境 です。中身を独立した行に組み、右端(横書きの既定)に通し番号を自動で振ります。番号は equation カウンタが管理し、\label{…} を付ければ \ref{…} や \eqref{…} で本文から呼べます。番号が要らないだけなら星付きの equation*——これは amsmath 環境下では \[ … \] とまったく同じものです。要するに equation は 一行ぶんの式に番号を一つ 与える環境で、それ以上でも以下でもありません。
\begin{equation}
\label{eq:euler}
e^{i\pi} + 1 = 0
\end{equation}これはオイラーの等式を独立行の中央に組み、その行の右端に (1) のような番号を置きます(番号は文書中の通し番号なので 1 とは限りません)。一行に収まらない式や、複数の式をそろえたい場合は次節以降の環境に移ります。なお、番号付き環境を \[ … \] の内側に入れてはいけません。\[ \begin{align} … \end{align} \] と書くと ! Package amsmath Error: Erroneous nesting of equation structures; が出ます——外側の \[ … \] は不要です。
複数行をそろえる — align と gather の違い
align は関係子でそろえ、gather はそろえずに中央に積みます。これが唯一の違いで、どちらも各行に番号を振ります(星付きの align*/gather* は振りません)。align では行を \\ で区切り、そろえたい位置に & を一つ置きます。慣例では等号や不等号などの 関係子の直前 に置きます。& の左は右寄せ、右は左寄せに組まれるので、等号を境に左右がぴたりと合います。amsmath のマニュアルは、& を関係子の 後ろ に置くと通常の空きが壊れる、と明記しています——旧 eqnarray がまさにそう設計されていました。
\begin{align}
(x + y)^2 &= x^2 + 2xy + y^2 \\
(x - y)^2 &= x^2 - 2xy + y^2
\end{align}これは二つの式を縦に並べ、両方の等号を同じ横位置にそろえ、各行の右端に番号を置きます。最終行のあとに \\ を付けてはいけません——amsmath のマニュアルはこれを明示的に戒めており、余分な縦の空きが式の下に入ります。ミスとして多いのは gather に & を書いてしまうこと。gather に整列列はないので ! Extra alignment tab has been changed to \cr. が出ます。同じエラーは、split の一行に & を二つ置いたときにも出ます。
align は 複数の式を横に並べる こともできます。& が「そろえ位置」と「列の区切り」を兼ねていて、右寄せ部 & 関係子と左寄せ部 を一組とし、次の組との間にもう一つ & を置きます。列と列の間隔は amsmath が固定幅で自動的に確保します。この間隔を自分で決めたいときは alignat(列数を引数に取り、列間の空きをゼロにして \quad などで自分で入れる)を、ページ幅いっぱいに押し広げたいときは flalign を使います。
\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 は整列を持たず、各行がそれぞれ独立に中央寄せされます。行は \\ で区切り、行ごとに番号が付きます(gather* なら付きません)。align が「関係子でそろえる」、gather が「ただ中央に積む」と覚えておけば選択に迷いません。gather の一行のなかに後述の split を入れて、その行だけを複数行に折ることもできます。
\begin{gather}
a^2 + b^2 = c^2 \\
e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}
\end{gather}長い align がページの継ぎ目に当たったとき、既定では改ページされません。amsmath は \interdisplaylinepenalty を最大値に設定してあるからです。数十行に及ぶ計算を載せる文書では、プリアンブルに \allowdisplaybreaks を書くとこの禁止が緩みます。引数 [1] から [4] で許容度を段階的に指定でき、既定は最も緩い [4]。特定の行だけ切らせたくないときは、その行の \\ を \\* にします。
一つの長い式を折る — multline と split
一行に収まらない 一つの式 を折る環境は二つあり、どちらも「式は一つ、番号も一つ」という点で align/gather と決定的に違います。multline はそろえません。最初の行を左端に、最後の行を右端に 寄せ、間の行は中央に置きます。左端といっても、実測では左余白から 10pt——\multlinegap の既定値——だけ内側に入ります。式全体の番号は 最終行 に付きます(leqno なら最初の行)。式一つに番号一つなので、個々の行を \notag で消してはいけません。中間行を片側に寄せたいときは \shoveleft{…}/\shoveright{…} に行全体(直後の \\ は含めない)を渡します。番号なしは multline* です。
\begin{multline}
a + b + c + d + e + f \\
+ g + h + i + j + k + l + m + n
\end{multline}折った行を そろえたい ときは split です。split は align と同じく & でそろえますが、整列列は一つだけ(一行に & 一つ)で、自分では番号を持ちません。番号を供給する equation(や align・gather)の内側に置き、構造全体で一つの番号を受け取ります。単独で使うと ! Package amsmath Error: \begin{split} won't work here. が出ます。split の中身は外側の本体全体を占めるべきで、\label のような出力を持たない命令だけが同居できます。multline の内側には置けません。
\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}| 環境 | 式と番号 | 整列 | 主な用途 |
|---|---|---|---|
equation | 1 式 / 1 番号 | なし | 別行立ての一行 |
align | 複数式 / 行ごと | & でそろえる | 関係子をそろえて並べる |
gather | 複数式 / 行ごと | なし(各行中央) | そろえずに中央に積む |
multline | 1 式 / 1 番号(最終行) | なし(左→右) | 長い式を折る(そろえない) |
split | 1 式 / 番号は外側が供給 | & 一列のみ | 折った式を関係子でそろえる |
場合分けの定義 — cases
関数を条件で場合分けするときは cases 環境 を使います。左側の大きな中括弧は自動で付き、各行は & で「値」と「条件」を分け、行は \\ で区切ります。条件の語句(「if …」など)を裸で書くと数式モードのまま斜体で詰まって出るので、\text{…} で包みます。cases 自体は番号を持たないので、ふつう equation の内側に置いて全体に一つの番号を付けます。
\begin{equation}
|x| =
\begin{cases}
x & \text{if } x \ge 0, \\
-x & \text{if } x < 0.
\end{cases}
\end{equation}これは大きな中括弧の右に二行——x(条件 x ≥ 0)と −x(条件 x < 0)——を並べ、equation の番号を一つ付けます。値の列も条件の列も左寄せです。一つ落とし穴があります。cases の中身はテキストスタイルで組まれます——実測すると cases のなかの \frac{1}{2} の数字は高さ 6.19pt で、同じ式を別行立てに置いたときの 8.85pt より小さい。分数を大きく出したいなら mathtools パッケージの dcases を使ってください。ディスプレイスタイルで組む同型の環境です。
番号を制御する — \notag・\tag・subequations
番号付き環境では各行に自動で番号が振られますが、行ごとに調整できます。ここで一つ、知っておくと安心できる事実があります。\notag を置いた行は番号を「消費しません」。 amsmath は \nonumber を再定義して、抑制した行のぶんだけカウンタを一つ戻します(amsmath.sty に \addtocounter{equation}\m@ne と書いてあります)。実際に align の三行のうち二行目を \notag にすると、番号は (1)・(なし)・(2) と続き、その次の式は (3) になります。番号に穴は開きません。
- ある行だけ番号を消す: その行の
\\の前に\notag(同義語は\nonumber。amsmath では\notagが\nonumberの別名として定義されています)。 - 番号を自分で決める:
\tag{…}は与えた内容を自動番号の代わりに組み、括弧を補います。\tag*{…}は括弧を付けず、渡したものをそのまま印字します。\tag{$\star$}は (⋆)、\tag*{NP}は NP になります。 - 関連する式を (4a)・(4b) とまとめる:
subequations環境で囲むと、内側の式が親番号+英字で振られます。\begin{subequations}の直後に置いた\labelは 親の番号 (4) を指し、子の (4a) ではありません。 - 章や節ごとに番号を振り直す: プリアンブルに
\numberwithin{equation}{section}と書くと、第 2 節の最初の式が (2.1) になります。長い文書で番号が四桁に届くのを防ぐ定石です。
\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}上の align では、一行目が \notag で番号なし、二行目が通常の自動番号、三行目が自動番号の代わりに (⋆) になります。導出の途中経過を無番号にして結論だけに番号を振る——論文でもっともよく使う型です。下の subequations では二つのマクスウェル方程式が (4a)・(4b) のように振られ、\eqref{eq:gauss} は (4a) を、\eqref{eq:max} はグループ全体を表す (4) を返します。
\label と \eqref で式を参照する
番号付きの式に \label{…} で名札を付ければ、本文から番号で呼べます。\ref{…} は番号そのもの(たとえば 3.2)を返し、amsmath の \eqref{…} は括弧を補って (3.2) を返します。\eqref の中身は amsmath.sty で \textup{…} に包まれており、周囲が斜体でも括弧だけは立体で組まれます——定理の主張のなかで式を参照したときに効いてくる違いです。多行環境では、番号がほしい その行 に \label を置きます。参照は補助ファイル経由なので、確定させるには 2 回コンパイル します。
By~\eqref{eq:euler}, we have $e^{i\pi} = -1$.
% preamble: number equations within sections, giving (2.1), (2.2), ...
\numberwithin{equation}{section}番号の見た目そのものは \theequation が決めます。article の既定は \arabic{equation}、book/report の既定は「章番号がゼロより大きければ \thechapter. を前置し、そのあとに通し番号」という定義です(book.cls の該当行がまさにそうなっています——だから前付では章番号のない裸の番号になります)。書式を直に変えたければ \renewcommand{\theequation}{\thesection.\arabic{equation}} のように再定義しますが、カウンタのリセットまで面倒を見てくれる \numberwithin のほうがふつうは安全です。
eqnarray を使わない — 等号まわりが 3.6 倍広い
古い文書では多行数式に eqnarray(と eqnarray*)が使われていますが、いまは使うべきではありません。理由は感想ではなく寸法で言えます。latex.ltx の \eqnarray の定義を見ると、関係子の列の両側に \hskip \tw@\arraycolsep が入っています——\arraycolsep の既定は 5pt なので 片側 10pt。同じ式を align や equation で組むと、片側は \thickmuskip の 2.78pt です。10pt 文書で実測しても片側 9.97pt 対 2.77pt、つまり 3.6 倍。しかもこれは表組みの列間隔から来た 固定寸法 なので、数式のフォントサイズが変わっても追随しません。
もう一つの実害は式番号です。長い行を eqnarray に入れると、番号が本文の上に 重なって印刷されます。実測では最後の項が横位置 483〜505pt を占め、番号 (1) が 492〜505pt——完全に重なっていました。同じ内容を align に入れると、amsmath が衝突を検知して番号を次の行に落とします。AMS の Short Math Guide for LaTeX が eqnarray を強く戒める理由として挙げているのも、まさにこの二点——等号まわりの間隔が一貫しないことと、番号が本文に重なるのを防ごうとしないこと——です。amsmath のマニュアルはさらに、定理パッケージの \qed/\qedhere が eqnarray の中では使えないことも指摘しています。
置き換えは機械的です。複数の式をそろえるなら align、一つの式を折るなら equation + split。& の位置も変わります——eqnarray は関係子の 後ろ に & を置く設計でしたが、align 系は 前 に置きます。つまり x &=& y は x &= y になります。原稿を引き継いだとき、この一括置換が最初にやるべき作業です。