LaTeX

amsmathの数式環境まとめ

LaTeXで数式環境と言ったらequation環境かalign環境, みたいな風潮がある気がするけど, align環境は目的に依っては不適切(というか, 所望の表示を得られない可能性がある)だし, 実際にはamsmath.styには他にも数式環境が用意されているので, それをまとめておく.
適材適所で環境を用いれば目に優しい論文を書けるだろう.

ここに書くことはAMS-LaTeXのUser's Guide1にも書かれているので, 細かいことはそちらを参照.
また, ちょっと古いけど「使ってはいけない LaTeX のコマンド・パッケージ・作法」という記事も参照.

推奨されない環境: eqnarray環境

amsmath.styはこの環境をサポートしていないらしい.
beamerのスライドでイコールの前後のスペースがやたらと広くなっている数式はこの環境を使っているのだと思う.

推奨されない別行立て数式: $$ ... $$

$$で挟むやり方は, LaTeXではなくPlain TeXのコマンドである.
つまり, LaTeXで使うのは正しくない. (MathJaxでも正しくないのではないだろうか)
意図しない挙動をすることがあるようだ.
(参考: 古い情報 - TeX Wiki)

*付き環境と数式番号

以下で説明する環境の中で, それ単体で別行立て数式になる環境 (例えばequation環境) には, *付きの環境 (例えばequation*環境) が用意されている.
これらの違いは, 数式番号を付けるか付けないか, であるが, 手動でその区別をするのはとても面倒である.
しかし, mathtools.styというパッケージ2を読み込んで, プリアンブルで\mathtoolsset{showonlyrefs=true}と入力すると, 参照した数式だけに数式番号を付けることができるようになる (ただし, 複数回のコンパイルが必要).

使い方
\documentclass{jsarticle}

\usepackage{amsmath,amssymb}
\usepackage{mathtools}
\mathtoolsset{showonlyrefs=true}

\begin{document}

\begin{equation}
    y = \sin x  \label{eq:1}
\end{equation}

\begin{equation}
    y = \cos x  \label{eq:2}
\end{equation}

後半の数式~\eqref{eq:2} だけに数式番号が付く.

\end{document}

つまり, スライドならともかく, 論文を書く際は, 余程のことがない限り*付き環境は不要であると思うので, 以下ではいちいち説明しない.

ただしこの機能はcleveref.styと共存できない. この点については後述.

equation環境

これは説明するまでもないだろう. 1行だけの別行立て数式の環境である.
\[ \] というコマンドは数式番号を付けない別行立て数式を表す.

align環境

複数行の別行立て数式の環境. 改行は\\.
&を使って位置を揃えることができるが, 奇数番目の&は位置を揃える役割, 偶数番目の&はタブの役割を意味する.
よく使われるのは各行に&を1つだけ用いて等号や不等号の位置を揃える場面だろう.

\begin{align}
a &= b \\
  &= c
\end{align}
\begin{align}
a &= b \\
  &= c
\end{align}

&を複数使う場合は, 複数の同じような式を並べたいときに使うのが良いと思う.

\begin{align}
a  &= b  & c  &= d  & e  &= f \\
a' &= b' & c' &= d' & e' &= f'
\end{align}
\begin{align}
a  &= b  & c  &= d  & e  &= f \\
a' &= b' & c' &= d' & e' &= f'
\end{align}

偶数番目の&によって余計なスペースを入れて欲しくない!という場合には次のalignat環境を使うと良いだろう.

alignat環境

\begin{alignat}{(行ごとの&の個数 + 1)/2}という使い方をする3.
環境内では揃えたい位置に&を入れて, 改行したいところに\\を入力する.
のだが, ここでもalign環境のように, 奇数番目の&は位置を揃える役割, 偶数番目の&はタブの役割であることは変わりない.
ただし, タブの部分にスペースが入らないのがalign環境との違いである.

\begin{alignat}{3}
a  &= b  & c  &= d  & e  &= f \\
a' &= b' & c' &= d' & e' &= f'
\end{alignat}
\begin{alignat}{3}
a  &= b  & c  &= d  & e  &= f \\
a' &= b' & c' &= d' & e' &= f'
\end{alignat}

$b$と$c$の間などのスペースがalign環境のときとは異なるという点に注意.
また, 奇数番目の&でしか位置が揃っていないという点にも注意.
例えば次のような使い方が想定されているようだ.

\begin{alignat}{2}
a &= b & \quad & \text{(定義)} \\
  &= c &       & \text{(なんかすごい定理)}
\end{alignat}
\begin{alignat}{2}
a &= b & \quad & \text{(定義)} \\
  &= c &       & \text{(なんかすごい定理)}
\end{alignat}

スペースの大きさを自分でコントロールできるのがalignと異なる点である.

aligned環境

これは数式モード内で使う環境.
部分的にalign環境のような状態にできる.

\begin{equation}
    \left.
    \begin{aligned}
        u_t + (u \cdot \nabla)u + \nabla p &= f \\
        \operatorname{div} u               &= 0
    \end{aligned}
    \right\} 
    \quad \text{Euler equation}
\end{equation}
\begin{equation}
    \left.
    \begin{aligned}
        u_t + (u \cdot \nabla)u + \nabla p &= f \\
        \operatorname{div} u               &= 0
    \end{aligned}
    \right\} 
    \quad \text{Euler equation}
\end{equation}

通常のalign環境と同様に奇数番目の&は位置を揃える役割, 偶数番目の&はタブの役割であり, タブの部分にはスペースが入るので, 例えば次のように, 連立1次方程式を書いて項ごとに位置を揃えたい, という場合には不向きである.

\begin{equation}
    \left\{
    \begin{aligned}
          x & +2y & +3z & = 1 \\
        -3x & + y & - z & = 2 \\
         2x &     & - z & = -1
    \end{aligned}
    \right.
\end{equation}
\begin{equation}
    \left\{
    \begin{aligned}
          x &+2y &+3z &= 1 \\
        -3x &+ y &- z &= 2 \\
         2x &    &- z &= -1
    \end{aligned}
    \right.
\end{equation}

そういうときは, 次のalignedat環境を用いると良い.

alignedat環境

部分的にalignat環境と同じ状態にする. &の挙動も同じ.
つまり, 奇数番目の&は位置を揃える役割, 偶数番目の&はタブの役割であって, スペースは自分で決める.

\begin{equation}
    \left\{
    \begin{alignedat}{4}
          x &+2y & &+3z & &= 1   &        & \text{(A)} \\
        -3x &+ y & &- z & &= 2   &        & \text{(B)} \\
         2x &    & &- z & &= -1  & \qquad & \text{(C)}
    \end{alignedat}
    \right.
\end{equation}
\begin{equation}
    \left\{
    \begin{alignedat}{4}
          x &+2y & &+3z & &= 1   &        & \text{(A)} \\
        -3x &+ y & &- z & &= 2   &        & \text{(B)} \\
         2x &    & &- z & &= -1  & \qquad & \text{(C)}
    \end{alignedat}
    \right.
\end{equation}

cases環境

これもよく使われていると思うが, 役割的にはaligned環境などに似ている.
ただし, 各行で&は1回しか使えず, 強制的にスペースが入り, 左側に中括弧が入る.

\begin{equation}
f(x) = 
\begin{cases}
    e^{-1/x}, & x > 0 \\
    0,        & x \le 0
\end{cases}
\end{equation}
\begin{equation}
f(x) = 
\begin{cases}
    e^{-1/x}, & x > 0 \\
    0,        & x \le 0
\end{cases}
\end{equation}

ちなみに, cases環境内では数式はインライン数式モードで書かれる(例えば分数は小さくなる)が, 先述のmathtools.styには強制的にディスプレイモードにするdcases環境が用意されている.
cases環境内とdcases環境内とで分数がどう表示されるかを比較すると良い.

cases*環境

cases環境では&の後ろも数式環境のままなので, 「それ以外」「otherwise」などのように数式でない単語を書きたい場合は, \textコマンドを使う必要がある. 1行だけならそれで良いが, 「$n$が偶数」「$n$が奇数」のように数式以外の方が多い場合は, やや面倒である.
そういうときは, cases*環境を用いると良い.
この場合, &の後ろは数式モードではなくなるので, 以下のように\textコマンド無しで記述できる (ただし数式を入れる場合は$が必要).

\begin{equation}
f(x) = 
\begin{cases*}
    e^{-1/x}, & if $x>0$ \\
    0,        & otherwise
\end{cases*}
\end{equation}

[Qiitaの数式モードはcases*には対応していないようだ...]

ちなみに, mathtools.styにはdcases*環境もある.

gather環境

gather環境は, 全ての数式を中央揃えにして表示する, 複数行の別行立て数式環境である.
とにかく式を羅列したいときに使うと良いと思う.

\begin{gather}
(\sin x)' = \cos x, \quad (\cos x)' = -\sin x, \quad (\tan x)' = \frac{1}{\cos^2 x} \\
(e^x)' = e^x, \quad (\log x)' = \frac{1}{x}
\end{gather}
\begin{gather}
(\sin x)' = \cos x, \quad (\cos x)' = -\sin x, \quad (\tan x)' = \frac{1}{\cos^2 x} \\
(e^x)' = e^x, \quad (\log x)' = \frac{1}{x}
\end{gather}

gathered環境

これはalignedのように, 部分的にgather環境にする環境で, 数式モード内で用いる.

\begin{equation}
S := \left\{ x \in \mathbb{R}^3 ;
\begin{gathered}
    x_1 \ge 0, 0 \le x_2 \le 1, \\
    x_1 + x_2 + x_3 = 1. 
\end{gathered}
\right\}
\end{equation}
\begin{equation}
S := \left\{ x \in \mathbb{R}^3 ;
\begin{gathered}
    x_1 \ge 0, 0 \le x_2 \le 1, \\
    x_1 + x_2 + x_3 = 1. 
\end{gathered}
\right\}
\end{equation}

multline環境

multline環境 (スペル注意) はそれ単体で別行立て数式にする. 1行の長い数式を書く際に使う.
改行したい位置に\\を入力すると, 適切な感じでスペースを入れてくれる.
align環境のように位置を揃えることはできない.
数式番号を付ける場合は最後の行に1つだけ付く (\label の位置に依らない)4.

\begin{multline}
a+b+c+d+e+f \\
-g-h-i+j+k-l-m+n \\
-o-p-q-r-s+t+u \\
+v+w+x-y-z
\end{multline}
\begin{multline}
a+b+c+d+e+f \\
-g-h-i+j+k-l-m+n \\
-o-p-q-r-s+t+u \\
+v+w+x-y-z
\end{multline}

ちなみに, 数式環境内でmultlineのようにするmultlined環境は, amsmath.styには含まれていないのだが, mathtools.styには含まれている.
ただし, 使い勝手が良いかと言われると微妙なので, ここでは紹介しない5.

split環境

部分的にmultline環境のようにするが, 位置を揃えることができる. むしろ, aligned(at)環境に近いような気がする.
ただし, &は各行で1回しか使えない.
また, aligned(at)環境などと比べてスペースの入り方が異なるようだ.
ユーザーガイド的にはgather環境内で部分的に複数行にしたいときに使うことを想定しているっぽい.

\begin{gather}
\sin(2x) = 2 \sin x \cos x, \\ 
\begin{split}
    \cos(2x) &= \cos^2 x - \sin^2 x \\
             &= 1 - 2 \sin^2 x \\
             &= 2 \cos^2 x - 1,
\end{split} \\
\tan(2x) = \frac{2 \tan x}{1 - \tan^2 x}
\end{gather}
\begin{gather}
\sin(2x) = 2 \sin x \cos x, \\ 
\begin{split}
    \cos(2x) &= \cos^2 x - \sin^2 x \\
             &= 1 - 2 \sin^2 x \\
             &= 2 \cos^2 x - 1,
\end{split} \\
\tan(2x) = \frac{2 \tan x}{1 - \tan^2 x}
\end{gather}

split環境 と aligned または alignedat 環境の違い

これらは align (系の) 環境内に入れ子にされたときの挙動が異なる (場合がある?) ようだ.

\begin{align}
a &= b \\
\begin{split}
p &= q \\
  &= r
\end{split}
\\
\begin{aligned}
x &= y \\
  &= z
\end{aligned}
\end{align}
\begin{align}
a &= b \\
\begin{split}
p &= q \\
  &= r
\end{split}
\\
\begin{aligned}
x &= y \\
  &= z
\end{aligned}
\end{align}

Qiitaの数式モードでは上のように違いが見られないが, 著者の環境6 では次の画像のようになる.

image.png

少々ややこしいが, 違いを文章で説明すると, 「align 環境内に入れ子にされた場合, split 環境の &align 環境の & と同期し, aligned 環境の場合はそうではない」ということ.

ただしこれが正しい理解なのかは不明.

flalign環境

align環境では, 数式の左右にも余白が入った.
一方で, flalign環境は左右には余白が入らない.

\begin{flalign}
a  &= b  & c  &= d  & e  &= f \\
a' &= b' & c' &= d' & e' &= f'
\end{flalign}

[Qiitaの数式モードはflalignには対応していないようだ...]

おまけ

複数行に渡る別行立て数式内での改ページを許す

プリアンブルに\allowdisplaybreaksと記入すると, 別行立て数式中で改ページする.
他にも「ここで改ページを許すがここではダメ」みたいなことを (手動で) できるようだが, 詳しくはユーザーガイド参照.

複数行に渡る別行立て数式を中断して文を入れる

\intertextというコマンドを (例えば) align環境内で使うと, align環境が中断される.

\begin{align}
a & = b, \\
c & = d, \\
\intertext{and}
e &= f.
\end{align}

[これもQiitaの数式モードは対応していないようだ...]

なお, 上下にめっちゃ余白が入るので, 気になる場合は\intertextコマンドの代わりに, mathtools.styで定義されている\shortintertextコマンドを用いると良い.

数式番号を節番号とセットにする

例えば第3節の12番めの数式番号を(3.12)と表示させたいときに, \theequation\renewcommandする, みたいな情報がよくあるけれど, amsmath.styにはもっと簡便なコマンドが用意されている.
それが\numberwithinというコマンドで, \numberwithin{子にしたいカウンタ名}{親にしたいカウンタ名}という形で, プリアンブルで用いる.
(節番号.数式番号)という形式にしたければ, プリアンブルに\numberwithin{equation}{section}と書くと良い7.

showonlyrefs=truecleveref.styとの共存

cleveref.sty(スペル注意)とは, 定理などを参照するときに, 定理番号だけでなく定理の種類(TheoremとかLemmaとか)も一緒に参照してくれる賢いパッケージである.
使い方は例えば「cleverefで賢く参照する」などを参照.

しかし, cleverefのマニュアルに書かれているように, cleveref.stymathtools.styshowonlyrefsオプションと共存できない8.
その代わり, autonum.styというパッケージがあるので, cleveref.styを使いつつ参照した数式だけに番号をつけたい場合はこちらを使うと良い9.
使い方は例えば「autonum.sty を使ってみる」という記事を参照.

注意点(autonumのマニュアル§3参照)だけ書いておくと,

  • hyperref.styを読み込む場合は, autonum.styより先に読み込んで, hypertexnames=falseというオプションをつける.
  • 特に, cleveref.styを読み込む場合は, amsmathhyperrefcleverefautonum の順で読み込む.
読み込み順の注意
\usepackage{amsmath,amssymb}
\usepackage[hypertexnames=false]{hyperref}
\usepackage{cleveref}
\usepackage{autonum}

(mathtools.styにはすでに述べたように他にも便利なコマンド/環境が用意されているので, 読み込んでおいて損はないと思う.)

終わりに

ここに書いてあることをすべて覚える必要はないと思う.
「こういうことができる環境が存在する」ということだけ知っておいて, 必要になったらこの記事とかを読めば十分だろう.


  1. AMS-LaTeX本家のページからリンクされているユーザーガイドはリンクが切れている...? 

  2. 最近のtexliveなどのディストリビューションに含まれている. 

  3. 引数の謎の計算式は, 「数式の列数」を意味する (ユーザーガイドには "the number of 'equation columns'" と書かれている). 「奇数番目の&は位置を揃える役割, 偶数番目の&はタブの役割」というルールがあるから, 偶数番目の&の後ろは数式ではない, ということが想定されているようだ. 

  4. \documentclassleqnoオプションを付けていると, 1行目に付く. 

  5. 詳細はmathtools.styのマニュアル参照. 

  6. ドキュメントクラスは, article, scrartcl, ltjsarticle でテストした. 

  7. これは「すでに定義されているカウンタに親子関係を設定する」というコマンドである. もし自分で作るカウンタに最初から親子関係を入れておきたい場合は, \newcounter{新しいカウンタ名}[親にしたいカウンタ名]とすれば良い. 

  8. コンパイルは通ってしまうが, 意図しない出力になる. 

  9. と, cleverefのマニュアルに書かれている.