数式モードの基本

閉じの $ を一つ書き忘れると、LaTeX はその場所を教えてくれません。段落の終わりまで走ってから ! Missing $ inserted. と言い、出力では単語がくっついて斜体の塊になります。ここに 数式モード の本質があります。数式モードはフォントの切り替えではなく、規則そのものの切り替え です。打った空白は消え、文字は変数名になり、+= は前後に決まった空きを持つようになります。このページでは、数式モードへの二つの入口——行中の $…$\(…\)、別行立ての \[…\]——を整理し、$$…$$ だけは避けるべき理由と、数式のなかに普通の単語を置くのに \text{} が要る理由を見ていきます。

数式モードに入ると何が変わるのか

変わるのは三つです。打った空白が消えすべての文字が変数名として数式イタリックになりすべての記号が「種別」を与えられて前後の空きが自動計算される ようになります。だから a+ba + b は一点の違いもない同じ出力になりますし、逆に log x と入力すると出てくるのは「logx」——l・o・g・x という四つの変数の積です。関数名としての \log x なら、log は立体で組まれ、x との間に細い空きが入ります。同じ三文字でも、TeX にとっては別物なのです。

latex
% identical output: spaces in the source are ignored
$a+b$ \qquad $a  +  b$

% "logx" (four variables) vs. the function name
$log x$ \qquad $\log x$

「記号の種別」は TeX の中心的な仕組みです。数式のなかの要素はすべて、順序子(Ord)・作用素(Op)・二項演算子(Bin)・関係子(Rel)・開き・閉じ・句読点のいずれかに分類され、隣り合う二つの種別の組み合わせから空きが表引きされます。= は関係子なので前後に \thickmuskip——既定で 5mu——が入ります。10pt の文書では 18mu が 1em=10pt なので、これは片側 2.78pt。この数字は覚えなくても構いませんが、空きは記号の意味から決まる という発想は覚えておく価値があります。手で空きを足したいときは \,(細い空き)、\;\quad\qquad を使います。

この規則が効くのは数式モードのなかだけです。ですから地の文にいきなり \to\alpha と書くとエラーになります——見た目が崩れるのではなく、空きの計算そのものが数式モードの外では定義されていない からです。実際 A \to B を本文に書けば ! Missing $ inserted. が返ってきます。数学記号を出したければ、まず数式モードに入る。ここから、その入口の話になります。

インライン数式は $…$\(…\) のどちらで書くべきか

出力は完全に同じです。違うのは 間違えたときに何が起きるか だけ。$ は TeX のカテゴリコード 3、いわゆる「数式シフト」で、開きと閉じが同じ一文字です。つまり $ は括弧ではなくトグルです。一方 \(\)latex.ltx で別々のマクロとして定義されていて、それぞれ「いま数式モードか」を確認してから動きます。閉じ忘れたときの挙動が根本的に違うのはこのためです。

latex
% one closing $ dropped: this compiles, and prints "We compare xandyinthetext."
We compare $x and $y$ in the text.

% the same mistake with \( \): pdflatex stops on this very line
We compare \( x and \( y \) in the text.

上の一行目は「通ってしまう」ほうが怖い例です。TeX は最初の $ から二つ目の $ までを数式と読み、x and の空白をすべて捨てて斜体で組み、残った $ が段落の終わりに引っかかって ! Missing $ inserted. を出します。エラーの行番号は \end{document} を指し、紙面には「We compare xandyinthetext.」と印字されます。二行目は同じ間違いですが、二つ目の \( が「もう数式モードだ」と気づいて その行で ! LaTeX Error: Bad math environment delimiter. を出します。長い段落を目で追わずに済む——それだけの差が実務では大きいのです。

実務の判断はこうです。新しく書き始める文書、とくに数式が多い文書では \(…\) を既定にする。 短い $…$ は世界中で通じますし、エディタが対応を色分けしてくれるなら十分実用的で、既存の原稿を書き換える理由にはなりません。環境形の \begin{math}…\end{math} も同じ働きですが、行中に置くには長すぎて、実際に使われることはほとんどありません。なお $ の文字そのものを本文に出したいときは \$ と書きます。

別行立ての数式は \[…\] で組む

大事な式や大きな式は段落から切り離し、独立した行に組みます。番号が要らなければ \[\]、番号が要るなら equation 環境です。\[…\] は環境形の displaymath とまったく同じもので、既定では中央揃え、文書クラスに fleqn オプションを与えると左寄せになります。前後には \abovedisplayskip\belowdisplayskip——10pt 文書ではどちらも 10pt——の空きが入り、これが「別行立てらしさ」の正体です。

latex
The following identity holds.
\[
  \int_0^1 x^2 \, dx = \frac{1}{3}
\]
It is one of the first integrals anyone computes.

ここで一つ、知っておくと腑に落ちる事実があります。amsmath を読み込むと \[\]equation* 環境そのものに置き換わります——amsmath.sty の最後の二行が \DeclareRobustCommand{\[}{\begin{equation*}}\DeclareRobustCommand{\]}{\end{equation*}} です。つまり amsmath 環境下では「\[…\]equation* のどちらを使うべきか」という問いに中身がありません。同じものだからです。番号が要るかどうかだけで equation\[…\] を選べば十分です。

書き方番号備考
\[ … \]なしLaTeX の書き方。amsmath 下では equation* そのもの
displaymathなし\[ \] と同一の環境形。冗長で出番は少ない
equationあり通し番号を自動付与。\label を付ければ \ref\eqref で参照できる
equation*なしamsmath が要る。amsmath 下の \[ \] の正体
$$ … $$なしplain TeX の書き方。使わない(次節)

$$…$$ を使ってはいけない理由

$$…$$plain TeX の別行立て記法で、LaTeX が著者向けに文書化したことは一度もありません。禁止されているわけではなく——むしろ LaTeX 自身が内部で使っています。latex.ltx には \def\equation{$$\refstepcounter{equation}} とあり、equationeqnarray も中身は $$ です。問題は、$$自分で書くと LaTeX のマクロ層を素通りしてしまう ことにあります。クラスオプションも amsmath の仕掛けも、その層に載っているからです。

  • fleqn オプションが効きません。 fleqn.clo が再定義するのは \[\]equationeqnarray の四つだけで、$$ には手が届きません。実測すると、[fleqn] 付きの article\[a=b\] は左余白から 25pt の位置に出るのに、$$a=b$$ は中央のまま——横に 135pt もずれます。
  • 縦の空きが変わります。 \[ は段落の先頭に置かれたとき、行幅の 0.6 倍の見えない箱をそっと差し込んでから $$ を実行します。TeX に「直前の行は長かった」と思わせるための細工で、これがないと短い版の空き(\belowdisplayshortskip の 6pt)が選ばれてしまいます。実測でも $$ 版は下の空きがちょうど 4pt 狭くなりました。
  • \qedhere が正しい位置に出ません。 amsthm の proof 環境で最後の式に \qedhere を置くと、\[…\] なら証明終わり記号が右余白に並びます。$$…$$ では記号が式の直後にくっつき、そのぶん式全体が中央からずれます。
  • amsmath の機能が丸ごと外れます。 amsmath 下の \[equation* そのものなので、$$ を使った瞬間に \tag\qedhere・番号の自動退避といった仕掛けが働く土台を失います。

AMS の Short Math Guide for LaTeX(version 2.0, 2017/12/22。TeX Live 2024 に同梱)も同じ立場で、$$ の使用を強く戒め、その理由として「LaTeX の解説書のどこにも LaTeX の命令として書かれていない」「fleqn のような機能の正常な動作を妨げる」を挙げています。まとめは短くて済みます。番号なしの別行立ては \[…\]、番号付きは equation$$ だらけの原稿を引き継いだら、いま機械的に置換しておくと、あとで fleqn や証明環境を入れる日が静かに過ぎます。

数式のなかに単語を入れる — \text{} が要る理由

数式モードでは文字が変数なので、if と書けば i と f の積、area と書けば四つの変数の積になります。単語を単語として——立体で、正しい空きを伴って——置くには amsmath\text{…} を使います。\text の中身は地の文と同じ書体・同じ空きで組まれ、\text{ for all } のように前後の空白も生きます。逆に \text{…} のなかで $…$ と書けば、その部分だけまた数式に戻ります。

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

\text の利点は 周囲の大きさに追随する ことです。amstext.sty の定義は \mathchoice を使い、ディスプレイ/テキスト/添字/二重添字の四つの文脈それぞれに別の書体サイズを割り当てています。上の例で v_{\text{max}} の「max」を測ると高さ 6.19pt——添字サイズ——なのに対し、同じものを \mbox{max} で書くと 8.85pt、つまり本文と同じ大きさのまま添字に居座り、周囲から浮きます。\mbox は「箱に入れる」という汎用命令で、数式のための道具ではないのです。なお \text は本文モードで呼ばれると \mbox に退避するので、どちらのモードで使われるか分からないマクロの中でも安全です。amsmath を読み込み忘れると ! Undefined control sequence. になります。

テキストスタイルとディスプレイスタイル — 同じ式が違って見える理由

数式モードには四つの スタイル があり、TeX は文脈から自動で選びます。行のなかは行の高さを壊さない テキストスタイル、別行立ては余裕のある ディスプレイスタイル、添字は スクリプトスタイル、添字の添字は スクリプトスクリプトスタイル。同じ \sum_{i=1}^{n} が、インラインでは範囲が記号の右脇に小さく付き、別行立てでは上下に大きく付くのはこのためです。

  • 総和・積分の範囲: ディスプレイスタイルでは \sum の範囲が記号の上下に、テキストスタイルでは右脇に付きます。\int も同様に位置が変わります。
  • 分数: \frac はディスプレイスタイルで大きく、テキストスタイルでは詰めて小さく組まれます。文脈に関係なく大きさを固定したいときは amsmath の \dfrac\tfrac を使います。
  • 添字: 入れ子が深くなるほど段階的に小さくなり、スクリプトスクリプトスタイルより先は小さくなりません。

スタイルは \displaystyle\textstyle\scriptstyle\scriptscriptstyle で手動でも切り替えられます。よく使うのは、本文中の総和の範囲を上下に出したいときの $\displaystyle\sum_{i=1}^{n} i$ です。ただし本文で \displaystyle を多用すると行の高さがまちまちになり、段落が波打ちます。その一箇所が本当に必要とするとき に限って使うのが定石です。

latex
% limits sit at the right of the sign
Inline: $\sum_{i=1}^{n} i$

% limits forced above and below
Forced: $\displaystyle\sum_{i=1}^{n} i$

関数名は \sin のように命令で書く

これまでの規則の帰結として、sin x と打つのは s・i・n・x の積を書くことになります。正しくは \sin x のように 専用の命令 を使います。LaTeX は主要な関数名・作用素をあらかじめ定義していて、いずれも立体で組まれ、後ろに細い空きが自動で入ります。\mathrm{sin} で見た目だけ立体にしても、この空きは入りません——実測すると \log x は「log」と「x」の間に 1.8pt の空きが入るのに対し、\mathrm{log} x は「logx」とくっついて出ます。

  • 三角・双曲線: \sin \cos \tan \cot \sec \csc\sinh \cosh \tanh \coth、逆関数 \arcsin \arccos \arctan
  • 対数・指数: \log \ln \lg \exp
  • 極限と上下限: \lim \limsup \liminf \sup \inf \max \min \varinjlim \varprojlim
  • 代数ほか: \arg \det \dim \gcd \ker \hom \deg \Pr、剰余の \bmod \pmod
latex
\[
  \lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^{n} = e,
  \qquad \sin^2\theta + \cos^2\theta = 1.
\]

この一覧の一部——\lim\max\min\sup\inf\det\gcd\Pr など——は、ディスプレイスタイルで添字を 真下 に置きます。\lim_{n\to\infty} が別行立てでは「lim」の直下に、インラインでは右下に付くのはそのためです。一覧にない rankHom のような作用素を自分で足したいときは amsmath の \operatorname{…}\DeclareMathOperator を使います——それは amsmath のページの話です。