amsmathの数式環境まとめ

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

ここに書くことは[AMS-LaTeXのUser's Guide](http://www.tug.org/teTeX/tetex-texmfdist/doc/latex/amsmath/amsldoc.pdf)[^1]にも書かれているので, 細かいことはそちらを参照.
また, ちょっと古いけど「[使ってはいけない LaTeX のコマンド・パッケージ・作法](http://ichiro-maruta.blogspot.jp/2013/03/latex.html)」という記事も参照.

[^1]: [AMS-LaTeX本家のページ](http://www.ams.org/publications/authors/tex/amslatex)からリンクされているユーザーガイドはリンクが切れている...?


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

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


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

`$$`で挟むやり方は, LaTeXではなくPlain TeXのコマンドである.
つまり, LaTeXで使うのは正しくない. (MathJaxでも正しくないのではないだろうか)
意図しない挙動をすることがあるようだ.
(参考: [古い情報 - TeX Wiki](https://texwiki.texjp.org/?%E5%8F%A4%E3%81%84%E6%83%85%E5%A0%B1))


# `*`付き環境と数式番号

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

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

```latex:使い方
\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`](https://www.ctan.org/pkg/cleveref)と共存できない. この点については[後述](http://qiita.com/t_kemmochi/items/a4c390b4967b13f3afb7#showonlyrefstrue%E3%81%A8cleverefsty%E3%81%A8%E3%81%AE%E5%85%B1%E5%AD%98).


# `equation`環境

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


# `align`環境

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

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

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

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

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

```math
\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`環境との違いである.

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

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

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

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

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

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

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


# `aligned`環境

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

```latex
\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}
```

```math
\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次方程式を書いて項ごとに位置を揃えたい, という場合には不向きである.

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

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

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

# `alignedat`環境

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

```latex
\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}
```

```math
\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回しか使えず, 強制的にスペースが入り, 左側に中括弧が入る.

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


```math
\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`コマンド無しで記述できる (ただし数式を入れる場合は`$`が必要).

```latex
\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`環境は, 全ての数式を中央揃えにして表示する, 複数行の別行立て数式環境である.
とにかく式を羅列したいときに使うと良いと思う.

```latex
\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}
```


```math
\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`環境にする環境で, 数式モード内で用いる.

```latex
\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}
```

```math
\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` の位置に依らない)[^label].

[^label]: `\documentclass`で`leqno`オプションを付けていると, 1行目に付く.

```latex
\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}
```


```math
\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`には含まれている.
ただし, 使い勝手が良いかと言われると微妙なので, ここでは紹介しない[^mul]. 

[^mul]: 詳細は[`mathtools.sty`のマニュアル](https://ctan.org/tex-archive/macros/latex/contrib/mathtools)参照.

# `split`環境

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

```latex
\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}
```

```math
\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` (系の) 環境内に入れ子にされたときの挙動が異なる (場合がある?) ようだ.

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


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

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

[^x]: ドキュメントクラスは, `article`, `scrartcl`, `ltjsarticle` でテストした.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/111178/b943705b-bbfe-07cd-b8c1-873ee129817b.png)

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

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


# `flalign`環境

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

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

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



# おまけ

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

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


## 複数行に渡る別行立て数式を中断して文を入れる
`\intertext`というコマンドを (例えば) `align`環境内で使うと, `align`環境が中断される.

```latex
\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}`と書くと良い[^4].

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


## `showonlyrefs=true`と`cleveref.sty`との共存

[`cleveref.sty`](https://www.ctan.org/pkg/cleveref)(**スペル注意**)とは, 定理などを参照するときに, 定理番号だけでなく定理の種類(TheoremとかLemmaとか)も一緒に参照してくれる賢いパッケージである.
使い方は例えば「[cleverefで賢く参照する](http://qiita.com/wktkshn/items/110cd6007837938e6c88)」などを参照.

しかし, `cleveref`のマニュアルに書かれているように, **`cleveref.sty`は`mathtools.sty`の`showonlyrefs`オプションと共存できない**[^5].
その代わり, [`autonum.sty`](https://www.ctan.org/tex-archive/macros/latex/contrib/autonum)というパッケージがあるので, `cleveref.sty`を使いつつ参照した数式だけに番号をつけたい場合はこちらを使うと良い[^6].
使い方は例えば「[autonum.sty を使ってみる](http://konoyonohana.blog.fc2.com/blog-entry-53.html)」という記事を参照.

[^5]: コンパイルは通ってしまうが, 意図しない出力になる.

[^6]: と, `cleveref`のマニュアルに書かれている.

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

- `hyperref.sty`を読み込む場合は, **`autonum.sty`より先に読み込んで, `hypertexnames=false`というオプションをつける**.
- 特に, `cleveref.sty`を読み込む場合は, **`amsmath` → `hyperref` → `cleveref` → `autonum` の順で読み込む**.

```latex:読み込み順の注意
\usepackage{amsmath,amssymb}
\usepackage[hypertexnames=false]{hyperref}
\usepackage{cleveref}
\usepackage{autonum}
```

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




# 終わりに

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