amsmath / AMSFonts

\usepackage{amsmath} は足すだけの一行ではありません。取り上げもします。 amsmath を読み込んだ瞬間、LaTeX の \[equation* 環境に置き換わり、equationcases は定義し直され、plain TeX 由来の \pmatrix はエラーで止まり、\over は警告を出すようになります。つまりこれは「便利機能の詰め合わせ」ではなく 数式組版の作法の入れ替え です。このページでは、その入れ替えの中身と、環境をまたいで効く命令——\DeclareMathOperator\text\intertext\substack\dfrac——を扱います。整列環境そのものは別ページに譲ります。

amsmath を読み込むと実際に何が変わるのか

まず、amsmath は単体のパッケージではなく です。amsmath.sty の冒頭近くには三つの \RequirePackage があり、amstext(数式中の文章を組む \text)、amsbsy(数式の太字 \boldsymbol)、amsopn(作用素を定義する \DeclareMathOperator ほか)を引き連れてきます。だから一行書けば、このページに出てくる命令はすべて揃います。

latex
\usepackage{amsmath}

次に、置き換えです。amsmath.sty最後の二行\DeclareRobustCommand{\[}{\begin{equation*}}\DeclareRobustCommand{\]}{\end{equation*}}——つまり別行立ての基本命令そのものが amsmath 製の環境に差し替わります。同じファイルのなかで equationcasesmatrixpmatrix\renewenvironment され、\nonumber も再定義されます。この差し替えがあるからこそ、\tag\qedhere も番号の自動退避も動きます。逆に、この層を迂回する $$$$ を書くと、amsmath の仕掛けはまとめて効かなくなります。

取り上げられるものもあります。plain TeX の書き方をそのまま持ち込むと止まります。$\pmatrix{a&b\cr c&d\cr}$! Package amsmath Error: Old form \pmatrix should be \begin{pmatrix}. になり、\cases{…} も同じ調子で叱られます。1 \over 2Package amsmath Warning: Foreign command \over; \frac or \genfrac should be used instead という警告付きで通ります。古い原稿を amsmath 化するときに最初に出るのがこの三つで、いずれも「新しい書き方に移れ」という同じ指示です。

こうした強い介入が許されているのは、amsmath が LaTeX の required パッケージに分類されているからです。同梱の README には、2016 年をもって amsmath の保守が AMS から LaTeX プロジェクトへ移管されたと明記されています(amsmath.sty の著作権表示も「2016–2023 LaTeX Project and American Mathematical Society」で、現在の維持者は LaTeX Project)。実質的に LaTeX 本体の一部だと思ってよく、だからこそ標準命令を差し替えられるわけです。

\DeclareMathOperator — 作用素名を斜体で書いてはいけない理由

数式モードでは文字が変数なので、rank A と打てば r・a・n・k・A の積になります。LaTeX は \sin\log\lim をはじめ数十の作用素名を用意していますが、rank はそこにありません。では \mathit{rank} で斜体をやめれば済むかというと、済みません。書体だけ直しても間隔が直らない からです。実測してみましょう。\operatorname{rank} ArankA の間に 1.66pt の空きを置きます。\mathit{rank} A の間隔は 1.07pt——イタリック補正だけで、作用素としての空きはゼロです。\mathrm{log} x にいたっては「logx」とくっついて出ます。

理由は amsopn.sty を開けば一行で分かります。\operatorname の実体は \mathop{…\operator@font…} です。つまり作用素名は単なる立体の文字列ではなく、TeX の記号種別でいう 作用素(Op)原子 として登録されます。TeX の間隔表では Op と Ord のあいだに \thinmuskip(3mu)が入る——だから \log x の「log」と「x」のあいだに空きができるのです。\mathrm は文字の書体を変えるだけで、原子の種別は Ord のまま。だから空きが生まれません。\DeclareMathOperator は見た目の道具ではなく、意味を宣言する道具です。

latex
% in the preamble
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{arg\,max}

% in the body
\[
  \rank A \le n, \qquad
  \hat{x} = \argmax_{x \in S} f(x)
\]

一度きりなら \operatorname{rank} A で足りますが、繰り返し使う作用素はプリアンブルで名前を与えておくのが定石です。星の有無で添字の位置が変わります。 星なしは \log と同じく右下、星付きは \lim\sup\max と同じく 真下(ディスプレイスタイルのとき)。上の例を実測すると、\argmax_{x \in S}x ∈ S は「arg max」の直下に中央揃えで置かれ、\rank_{k}k は「rank」の右下に付きます。なお \DeclareMathOperator はプリアンブル専用です。本文で使うと ! LaTeX Error: Can be used only in preamble. が出て、続けて定義されなかった命令が ! Undefined control sequence. を出します。

定義のなかの \, を見て「なぜ普通の空白ではないのか」と思ったなら、AMS 自身の書き方を見てください。amsopn.sty\limsuplim\,sup\liminflim\,inf\injliminj\,lim と定義しています。二語からなる作用素名は細い空きでつなぐ——これが AMS の作法で、arg\,max はそれに倣っただけです。\operatorname にはもう一つ隠れた仕事があります。中身の - . : / * の数式コードを一時的に書き換え、ハイフンをマイナス記号ではなく本物のハイフンとして出す のです。実測すると \operatorname{ess-sup} は「ess-sup」と一語で出るのに対し、\mathrm{ess-sup} f は「ess − sup f」——マイナス記号の両側に二項演算子としての 2.22pt が入り、意味も見た目も別物になります。

\text\mathrm\mbox の使い分け

立体の文字を数式に入れる方法は三つあり、目的が違います。\text{…}(amstext 由来)は「文章」を入れる命令 です。中身は本文と同じ書体・同じ空きで組まれ、打った空白も生き残ります——\text{for all } の末尾の空白は出力に残ります。\mathrm{…} は「数式の文字を立体にする」命令 で、中身は数式モードのままなので空白は消えます。微分の \mathrm{d}x や単位のように、立体で書く 記号 に使います。\mbox{…} は「箱に入れる」汎用命令 で、数式のために作られたものではありません。

latex
\[
  f(x) = x^2 \quad \text{for all } x \in \mathbb{R},
  \qquad v_{\text{max}} = 3,
  \qquad \int f(x)\,\mathrm{d}x.
\]

\text\mbox に勝るのは 周囲の大きさに追随する からです。amstext.sty の定義は \mathchoice を使い、ディスプレイ/テキスト/添字/二重添字の四つの文脈それぞれに別のサイズを割り当てています。上の v_{\text{max}} の「max」を測ると高さ 6.19pt——添字サイズ——ですが、\mbox{max} にすると 8.85pt、本文サイズのまま添字に居座ります。もう一つ実用的な性質があります。\text は本文モードで呼ばれると \mbox に退避します。 どちらのモードで展開されるか分からないマクロのなかでも安全に使えるということです。

\intertext\substack — 整列を壊さずに割り込む

align の途中に一行の説明を入れたい——そこで環境をいったん閉じ、文章を書き、また開くと、前後で揃え位置がずれます。\intertext{…} はこれを解決します。実測すると、\intertext を挟んだ align の上下の行では = がどちらも横位置 291.11pt にあり、割り込んだ本文は左余白から始まる通常の段落として組まれます。仕掛けは単純で、amsmath.sty\intertext\noalign のなかで「下方向の空き+文章の \vbox+上方向の空き」を吐き出します。つまり文章は 表組みの外に出ず、列の揃えが保たれるわけです。整列環境の外で使うと ! Package amsmath Error: Invalid use of \intertext. になります。

latex
\begin{align}
  A &= B + C \\
  \intertext{expanding $C$ gives}
  A &= B + D + E
\end{align}

\[
  \sum_{\substack{0 \le i \le m \\ 0 < j < n}} a_{ij}
\]

\substack{…} はもっと小さな道具ですが、同じ発想です。総和や積のような大型作用素の下に 複数行の条件を積む ためのもので、行は \\ で区切ります。上の例では「0 ≤ i ≤ m」と「0 < j < n」が二段になり、実測でも二行とも総和記号の下に中央揃えで積まれます。中身は数式モードのままなので \le などの関係子はそのまま使えます。左揃えなど整列を指定したいときは、ほぼ同じ働きの subarray 環境に l を渡します。

\dfrac\binom\boldsymbol — 文脈に流されない書き方

\frac 自体は LaTeX 標準ですが、その大きさは置かれた文脈で決まります。amsmath は 文脈を無視する版 を足しました。\dfrac{…}{…} は常にディスプレイスタイル(大きい)、\tfrac{…}{…} は常にテキストスタイル(小さい)。本文中の分数を読ませたいときは \dfrac、別行立ての一部だけ小さくしたいときは \tfrac です。何段も続く連分数には \cfrac{…}{…} があり、深くなっても各段が読める大きさを保ちます。二項係数は \binom{n}{k}、そのスタイル固定版が \dbinom\tbinom です。

latex
\[
  \binom{n}{k} = \dfrac{n!}{k!\,(n-k)!},
  \qquad \boldsymbol{\nabla} \cdot \boldsymbol{E} = \rho / \varepsilon_0.
\]

同じ節に \boldsymbol を置いたのには理由があります。物理やベクトル解析では文字を太字にしたい場面が多いのですが、\mathbf{E}立体の太字 になり、ギリシャ文字には効きません。amsbsy(amsmath が連れてくる)の \boldsymbol{E}斜体のまま太らせ\boldsymbol{\nabla} のように記号にも効きます。ベクトルを斜体太字で書く慣習に従うなら \boldsymbol、行列やテンソルを立体太字で書く慣習に従うなら \mathbf——分野の慣習に合わせて選んでください。式番号を節番号と連動させる \numberwithin{equation}{section} も amsmath の提供物ですが、番号まわりの話は「別行立て・整列・番号付き数式」のページに譲ります。

amssymb と AMSFonts — 記号を足す相棒

役割分担は明快です。amsmath は 組版の仕組み を、amssymb は 書ける記号 を増やします。amssymb は AMS の記号フォント msam・msbm に入っている記号をすべて定義し、標準 LaTeX にない数百の記号を使えるようにします——\leqslant\geqslant(斜めの不等号)、\nleq\subsetneq\therefore\because\square\blacksquare\varnothing など。内部で amsfonts を読み込むので、amsfonts を別に書く必要はありません。

latex
\usepackage{amssymb}

\[
  \mathbb{R} \subset \mathbb{C}, \qquad
  \mathfrak{g} = \operatorname{Lie}(G)
\]

AMSFonts はさらに二つの数式アルファベットを持ち込みます。黒板太字\mathbb{…}フラクトゥール\mathfrak{…} です。ここに、知らないと静かに事故る落とし穴があります。黒板太字は大文字しかありません。 しかも \mathbb{k} はエラーになりません——amssymb.sty を見ると AMSb フォントの位置 "6B は \daleth に割り当てられており、実際にコンパイルすると小文字の k ではなく ヘブライ文字のダレット ℸ が出てきます。黒板太字の小文字 k が要るなら、専用に用意された \Bbbk を使ってください。フラクトゥールのほうは大文字・小文字がそろっているので、\mathfrak{g} でリー環、\mathfrak{p} で素イデアルと自由に書けます。

プリアンブルに書く三行

数式を含む文書なら、次の三行をまとめて置くのが定石です。amsmath(組版の仕組み)、amssymb(記号と黒板太字・フラクトゥール)、そして定理と証明のための amsthm。読み込む順序はおおむね自由ですが、amsthm は amsmath より後に置きます。\qedhere のように amsmath の別行立て構造に手を入れる機能があるためです。

document.tex
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\begin{document}
\[
  \zeta(s) = \sum_{n=1}^{\infty} \frac{1}{n^{s}}, \qquad s \in \mathbb{C}
\]
\end{document}
パッケージ役割主な提供物
amsmath数式組版の仕組み整列環境・\text\operatorname\dfrac\binom\boldsymbol
amssymb記号と数式書体msam・msbm の数百の記号、\mathbb\mathfrak(amsfonts を内部で読み込む)
amsfonts書体のみ\mathbb\mathfrak(追加記号は含まない)
amsthm定理と証明の環境\newtheoremproof 環境、\theoremstyle\qedhere

amsmath はこのほかにも行列環境(pmatrixbmatrix ほか)や自動で大きさの変わる括弧を提供しますが、それぞれ「行列と配列」「和・積分・大型作用素」のページで扱います。最後に一つ。amsmath の別行立て環境が中身を マクロの引数として一度に読み込む ため、そのなかに空行を置くとエラーになります。AMS の技術ノートによれば、この多段処理の算法は Michael Spivak の amstex.tex から受け継いだもの——1980 年代の AMS-TeX が、いまも空行の禁止という形で残っているわけです。