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 では次の画像のようになる.
少々ややこしいが, 違いを文章で説明すると, 「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=true
とcleveref.sty
との共存
cleveref.sty
(スペル注意)とは, 定理などを参照するときに, 定理番号だけでなく定理の種類(TheoremとかLemmaとか)も一緒に参照してくれる賢いパッケージである.
使い方は例えば「cleverefで賢く参照する」などを参照.
しかし, cleveref
のマニュアルに書かれているように, cleveref.sty
はmathtools.sty
のshowonlyrefs
オプションと共存できない8.
その代わり, autonum.sty
というパッケージがあるので, cleveref.sty
を使いつつ参照した数式だけに番号をつけたい場合はこちらを使うと良い9.
使い方は例えば「autonum.sty を使ってみる」という記事を参照.
注意点(autonum
のマニュアル§3参照)だけ書いておくと,
-
hyperref.sty
を読み込む場合は,autonum.sty
より先に読み込んで,hypertexnames=false
というオプションをつける. - 特に,
cleveref.sty
を読み込む場合は,amsmath
→hyperref
→cleveref
→autonum
の順で読み込む.
\usepackage{amsmath,amssymb}
\usepackage[hypertexnames=false]{hyperref}
\usepackage{cleveref}
\usepackage{autonum}
(mathtools.sty
にはすでに述べたように他にも便利なコマンド/環境が用意されているので, 読み込んでおいて損はないと思う.)
終わりに
ここに書いてあることをすべて覚える必要はないと思う.
「こういうことができる環境が存在する」ということだけ知っておいて, 必要になったらこの記事とかを読めば十分だろう.
-
AMS-LaTeX本家のページからリンクされているユーザーガイドはリンクが切れている...? ↩
-
最近のtexliveなどのディストリビューションに含まれている. ↩
-
引数の謎の計算式は, 「数式の列数」を意味する (ユーザーガイドには "the number of 'equation columns'" と書かれている). 「奇数番目の
&
は位置を揃える役割, 偶数番目の&
はタブの役割」というルールがあるから, 偶数番目の&
の後ろは数式ではない, ということが想定されているようだ. ↩ -
\documentclass
でleqno
オプションを付けていると, 1行目に付く. ↩ -
詳細は
mathtools.sty
のマニュアル参照. ↩ -
ドキュメントクラスは,
article
,scrartcl
,ltjsarticle
でテストした. ↩ -
これは「すでに定義されているカウンタに親子関係を設定する」というコマンドである. もし自分で作るカウンタに最初から親子関係を入れておきたい場合は,
\newcounter{新しいカウンタ名}[親にしたいカウンタ名]
とすれば良い. ↩ -
コンパイルは通ってしまうが, 意図しない出力になる. ↩
-
と,
cleveref
のマニュアルに書かれている. ↩