別行立て・整列・番号付き数式

複数行にわたる別行立ての数式で本当に難しいのは、どこで行を折るかではなく、その結果にいくつ式番号が付くか です。LaTeX の align は一行に一つ、multline は式全体に一つ、split は自分では持たず外側から一つ借ります。ここを取り違えると、その先の番号がすべてずれ、参照も一斉に狂います。このページでは amsmath が提供する equationaligngathermultlinesplitcases を「番号がいくつ付くか」という軸で整理し、\notag\tagsubequations による番号の制御と、\label\eqref による参照までを扱います。最後に eqnarray を——等号まわりの空きが実測で正しい値の 3.6 倍という、二度と使わないための理由とともに。

まず amsmath を読み込む — そして環境のなかに空行を置かない

このページで扱う環境は、equation を除いてすべて amsmath が提供します。プリアンブルの一行がすべての前提です。amsmath は素の LaTeX にほとんど何もなかった多行数式の領域を一気に埋め、alignalign*gathergather*multlinemultline*alignatalignat*flalignflalign*、そして split を加えます。式番号を左端に出したいなら \usepackage[leqno]{amsmath}、右端(横書きの既定)なら [reqno]、別行立てを左寄せにするなら [fleqn] をパッケージオプションに渡します。

latex
\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一行ぶんの式に番号を一つ 与える環境で、それ以上でも以下でもありません。

latex
\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; が出ます——外側の \[\] は不要です。

複数行をそろえる — aligngather の違い

align は関係子でそろえ、gather はそろえずに中央に積みます。これが唯一の違いで、どちらも各行に番号を振ります(星付きの align*gather* は振りません)。align では行を \\ で区切り、そろえたい位置に & を一つ置きます。慣例では等号や不等号などの 関係子の直前 に置きます。& の左は右寄せ、右は左寄せに組まれるので、等号を境に左右がぴたりと合います。amsmath のマニュアルは、& を関係子の 後ろ に置くと通常の空きが壊れる、と明記しています——旧 eqnarray がまさにそう設計されていました。

latex
\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 を使います。

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 は整列を持たず、各行がそれぞれ独立に中央寄せされます。行は \\ で区切り、行ごとに番号が付きます(gather* なら付きません)。align が「関係子でそろえる」、gather が「ただ中央に積む」と覚えておけば選択に迷いません。gather の一行のなかに後述の split を入れて、その行だけを複数行に折ることもできます。

latex
\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]。特定の行だけ切らせたくないときは、その行の \\\\* にします。

一つの長い式を折る — multlinesplit

一行に収まらない 一つの式 を折る環境は二つあり、どちらも「式は一つ、番号も一つ」という点で aligngather と決定的に違います。multline はそろえません。最初の行を左端に、最後の行を右端に 寄せ、間の行は中央に置きます。左端といっても、実測では左余白から 10pt——\multlinegap の既定値——だけ内側に入ります。式全体の番号は 最終行 に付きます(leqno なら最初の行)。式一つに番号一つなので、個々の行を \notag で消してはいけません。中間行を片側に寄せたいときは \shoveleft{…}\shoveright{…} に行全体(直後の \\ は含めない)を渡します。番号なしは multline* です。

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

折った行を そろえたい ときは split です。splitalign と同じく & でそろえますが、整列列は一つだけ(一行に & 一つ)で、自分では番号を持ちません。番号を供給する equation(や aligngather)の内側に置き、構造全体で一つの番号を受け取ります。単独で使うと ! Package amsmath Error: \begin{split} won't work here. が出ます。split の中身は外側の本体全体を占めるべきで、\label のような出力を持たない命令だけが同居できます。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}
環境式と番号整列主な用途
equation1 式 / 1 番号なし別行立ての一行
align複数式 / 行ごと& でそろえる関係子をそろえて並べる
gather複数式 / 行ごとなし(各行中央)そろえずに中央に積む
multline1 式 / 1 番号(最終行)なし(左→右)長い式を折る(そろえない)
split1 式 / 番号は外側が供給& 一列のみ折った式を関係子でそろえる

場合分けの定義 — cases

関数を条件で場合分けするときは cases 環境 を使います。左側の大きな中括弧は自動で付き、各行は & で「値」と「条件」を分け、行は \\ で区切ります。条件の語句(「if …」など)を裸で書くと数式モードのまま斜体で詰まって出るので、\text{…} で包みます。cases 自体は番号を持たないので、ふつう equation の内側に置いて全体に一つの番号を付けます。

latex
\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\tagsubequations

番号付き環境では各行に自動で番号が振られますが、行ごとに調整できます。ここで一つ、知っておくと安心できる事実があります。\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) になります。長い文書で番号が四桁に届くのを防ぐ定石です。
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}

上の 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 回コンパイル します。

latex
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}bookreport の既定は「章番号がゼロより大きければ \thechapter. を前置し、そのあとに通し番号」という定義です(book.cls の該当行がまさにそうなっています——だから前付では章番号のない裸の番号になります)。書式を直に変えたければ \renewcommand{\theequation}{\thesection.\arabic{equation}} のように再定義しますが、カウンタのリセットまで面倒を見てくれる \numberwithin のほうがふつうは安全です。

eqnarray を使わない — 等号まわりが 3.6 倍広い

古い文書では多行数式に eqnarray(と eqnarray*)が使われていますが、いまは使うべきではありません。理由は感想ではなく寸法で言えます。latex.ltx\eqnarray の定義を見ると、関係子の列の両側に \hskip \tw@\arraycolsep が入っています——\arraycolsep の既定は 5pt なので 片側 10pt。同じ式を alignequation で組むと、片側は \thickmuskip2.78pt です。10pt 文書で実測しても片側 9.97pt 対 2.77pt、つまり 3.6 倍。しかもこれは表組みの列間隔から来た 固定寸法 なので、数式のフォントサイズが変わっても追随しません。

もう一つの実害は式番号です。長い行を eqnarray に入れると、番号が本文の上に 重なって印刷されます。実測では最後の項が横位置 483〜505pt を占め、番号 (1) が 492〜505pt——完全に重なっていました。同じ内容を align に入れると、amsmath が衝突を検知して番号を次の行に落とします。AMS の Short Math Guide for LaTeXeqnarray を強く戒める理由として挙げているのも、まさにこの二点——等号まわりの間隔が一貫しないことと、番号が本文に重なるのを防ごうとしないこと——です。amsmath のマニュアルはさらに、定理パッケージの \qed\qedhereeqnarray の中では使えないことも指摘しています。

置き換えは機械的です。複数の式をそろえるなら align、一つの式を折るなら equationsplit& の位置も変わります——eqnarray は関係子の 後ろ& を置く設計でしたが、align 系は に置きます。つまり x &=& yx &= y になります。原稿を引き継いだとき、この一括置換が最初にやるべき作業です。