1675 年 10 月 29 日、ライプニッツは草稿に ∫ と書きました。これは summa(和)の頭文字 s を縦に引き伸ばした長い s であり、積分記号がもともと「足し合わせ」の記号だったことを、いまも形が語っています。総和の Σ を導入したのはオイラーで、1755 年の『Institutiones calculi differentialis』第 1 章です。ところが LaTeX では、この兄弟のような二つの記号がまったく違うふるまいをします——別行立てで \sum は範囲を上下に積むのに、\int は脇に置く。しかもその非対称は \int の定義そのものに書き込まれています。このページでは \sum・\prod・\int・\oint・\bigcup といった大型作用素について、限界(リミット)が付く仕組み、\limits/\nolimits による位置の制御、\substack による多段の条件、そして \DeclareMathOperator による自作の作用素までを扱います。
大型作用素とは何か——「限界」は添字ではない
大型作用素とは、TeX が \mathop クラス に分類した記号のことです。\sum・\prod・\int・\bigcup などがこれに当たり、二つの性質を持ちます。第一に、文脈(スタイル)に応じて大きい字形と小さい字形を切り替えること。第二に、付けられた下付き _ と上付き ^ を、ふつうの添字ではなく 限界(リミット) として扱うことです。x_i の i は文字の右下に置かれるだけですが、\sum_{k=0}^{n} の k=0 と n は記号の真下と真上に積まれ得ます。どちらになるかはスタイルと記号の種類で決まり、それが次節以降の主題です。
中核の記号は標準の LaTeX(というより下地の TeX)に組み込まれていて、追加パッケージは要りません。多重積分の \iint・\iiint、多段の下付きを作る \substack、作用素を定義する \DeclareMathOperator は amsmath パッケージ が必要です。amsmath は事実上の標準なので、まともに数式を組むなら \usepackage{amsmath} はプリアンブルに入れておくのが実際的です。
\sum と \prod — 範囲は上下か、脇か
別行立てなら上下、本文中なら脇です。総和は \sum、総乗は \prod、余積は \coprod で、範囲は下付き _ と上付き ^ で与えます。\sum_{k=0}^{n} a_k を \[ … \] に置けば、Σ が大きく組まれ k=0 が真下に、n が真上に載ります。同じ式を $ … $ で本文に埋めると、Σ は小さくなり k=0 と n は右脇に上下に並びます。箱を測ると差は一目瞭然で、ディスプレイでは幅 14.54521pt・高さ 16.51393pt・深さ 13.02782pt と縦長、テキストでは幅 25.6008pt・高さ 8.04175pt・深さ 3.00005pt と横長になります。縦に伸びていれば上下、横に伸びていれば脇 というわけです。
% displayed: limits stack above and below
\[
\sum_{k=0}^{n} a_k = a_0 + a_1 + \dots + a_n,
\qquad \prod_{k=1}^{n} k = n!
\]
% inline: the same sum keeps its limits at the side
The series $\sum_{k=0}^{n} a_k$ fits inside the line.この上下と脇の切り替えは スタイルに連動した既定の動作 です。総和・総乗・余積などいわゆる sum クラス の記号は、ディスプレイスタイルでのみ上下に積み、テキストスタイルでは脇に置きます。amsmath はこの方式を displaylimits と呼びます。行間をむやみに広げない、よくできた既定値です。範囲が片方だけなら片方だけ書けばよく、\sum_{i \in S} のように条件を下限に置くこともできます。注意すべきは 中身が 2 トークン以上なら必ず { } で囲む こと。\sum_k=1 と書くと k だけが下付きになり、=1 は記号の右にこぼれ出ます。
積分の上下に条件を書く — \int が \intop\nolimits である理由
積分記号 \int は、別行立てでも限界を脇に置きます。総和と違うこの挙動は偶然ではなく、定義に直接書き込まれたものです。LaTeX の fontmath.ltx 253〜254 行にこうあります——\DeclareMathSymbol{\intop}{\mathop}{largesymbols}{"52} に続けて \DeclareRobustCommand\int{\intop\nolimits}。つまり \int は「積分の字形 \intop」に \nolimits を貼り付けたもの で、数学の慣習が命令の中に焼き込まれているわけです。260〜261 行の \oint も同じ構造で、\ointop\nolimits です。裏を返せば、素の字形 \intop や \ointop を直接使えば sum クラスと同じ既定に戻ります。実測でも、ディスプレイの \int_0^1 は幅 14.48615pt・高さ 15.65013pt なのに対し、\intop_0^1 は幅 10.00002pt・高さ 21.12231pt・深さ 15.789pt——横に広がるか縦に伸びるかがはっきり分かれました。
\[
\int_{0}^{\infty} e^{-x}\,dx = 1,
\qquad \oint_{C} \mathbf{F}\cdot d\mathbf{r},
\qquad \intop_{0}^{1} x^2\,dx
\]多重積分は \int\int と並べても組めますが、記号どうしの間隔が間延びします。amsmath は 間隔を詰めた専用命令 を用意していて、二重の \iint、三重の \iiint、四重の \iiiint、そして記号の途中に点を打つ \idotsint(∫⋯∫)があります。詰め具合は測れます——ディスプレイで \int\int は幅 21.66666pt、\iint は 16.66678pt。ちょうど 5pt、10pt 組版の 1/2em ぶん寄せられています。\iiint は 23.33354pt、\iiiint は 30.0003pt、\idotsint は 34.9999pt でした。物理でよく使う閉曲面・閉体積の積分記号が要るなら esint パッケージで、\oiint(閉曲面)・\varoiint・\sqint・\sqiint・\ointclockwise・\ointctrclockwise・\fint などが加わります。\oiiint は esint には入っていません(三重の閉積分が要る場合は別のフォント系パッケージを探すことになります)。素の LaTeX で使えるのは \oint だけです。
% preamble: \usepackage{amsmath}
\[
\iint_{D} f(x,y)\,dx\,dy,
\qquad \iiint_{V} f\,dV,
\qquad \iiiint f, \qquad \idotsint_{A} f\,dV
\]\limits と \nolimits — 位置を強制する二つの命令
既定を上書きするには、作用素のうしろに \limits(上下に強制)か \nolimits(脇に強制)を書きます。本文中の総和を上下に積みたければ \sum\limits_{k=1}^{n}、逆に別行立ての積分の上下に条件を書きたければ \int\limits_0^1 です。後者は前節で見たとおり素の \intop と同じ結果になり、実測でもどちらも幅 10.00002pt・高さ 21.12231pt・深さ 15.789pt で一致しました。スタイル連動の既定に戻すには \displaylimits を使います。
% force limits above and below inside running text
The partial sum $\sum\limits_{k=1}^{n} k$ sits in the line.
% force limits above and below on a displayed integral
\[
\int\limits_{0}^{1} x^2\,dx = \frac{1}{3}
\]置き場所には規則があります。\limits は \mathop の直後 に来なければならず、そうでなければ ! Limit controls must follow a math operator. で止まります(TeX は続けて I'm ignoring this misplaced \limits or \nolimits command. と教えてくれます)。たとえば x\limits^2 や \frac{1}{2}\limits はこのエラーになります。一方でよくある誤解として「添字より後ろに書くとエラー」と言われることがありますが、これは誤りです。\sum_{k=1}\limits^{n} は問題なく通り、実測でも \sum\limits_{k=1}^{n} と同じ箱(幅 14.54521pt・高さ 16.51393pt・深さ 13.02782pt)になりました。作用素の原子がまだ直前にあるためです。とはいえ読み手にも自分にも分かりやすいのは作用素の直後なので、そちらを習慣にしてください。なお \limits・\nolimits・\displaylimits が連続したときは 最後のものが勝ちます——\sum\limits\nolimits_{k=1}^{n} は脇に、\sum\nolimits\limits_{k=1}^{n} は上下になりました。ただしこの規則には例外が一つあります。\log や \lim のような関数名の直後では、amsmath を読み込んでいると \limits が黙って無視されます——amsopn.sty が \@ifnextchar\limits{\nolimits\@gobble} で食べてしまうためで、エラーも警告も出ません。実測でも、amsmath 無しなら \log\limits_{k}x の深さは 9.4722pt になるのに、amsmath 有りでは \log_{k}x と同じ 2.44443pt のままでした。関数名の下に添字を置きたいときは \DeclareMathOperator* を使ってください。
文書全体で方針を変えたいときは、命令ごとに書く代わりに amsmath のパッケージオプション が使えます。amsmath.sty の 46〜49 行が intlimits/nointlimits/sumlimits/nosumlimits を宣言し、92〜93 行の \ExecuteOptions が既定を nointlimits, sumlimits に設定しています——ここまで説明してきた挙動そのものです。\usepackage[intlimits]{amsmath} と書けば、文書中のすべての別行立て積分が限界を上下に積むようになります。実際に試すと、ディスプレイの \int_0^1 は幅 10.00002pt・高さ 21.12231pt・深さ 15.789pt となり、\intop_0^1 と一致しました。逆に nosumlimits を渡せば総和も脇に置くようになります。個別の式ごとに \limits を書き散らす前に、文書全体の方針としてこちらを検討する価値があります。
| 記号・命令 | 別行立て(ディスプレイ) | 本文中(テキスト) |
|---|---|---|
\sum, \prod, \bigcup | 上下に積む | 右脇に付く |
\int, \oint, \iint | 右脇に付く(定義に \nolimits が入っているため) | 右脇に付く |
\intop, \ointop | 上下に積む(\nolimits の付かない素の字形) | 右脇に付く |
\limits | 上下に強制。作用素の直後に置く | 上下に強制 |
\nolimits | 右脇に強制。作用素の直後に置く | 右脇に強制 |
\displaylimits | スタイル連動の既定に戻す(上下に積む) | スタイル連動の既定に戻す(右脇に付く) |
\lim の一族 — 立体で組まれ、下に条件が付く
\lim(極限)・\limsup(上極限)・\liminf(下極限)は、関数名と同じく 立体(ローマン体) で組まれる作用素ですが、添字の扱いは sum クラスと同じです。別行立てでは下付きが真下に、本文中では右下に付きます。\limsup と \liminf は「lim sup」「lim inf」という二語として、あいだに適切な空きを入れて組まれます。\sup・\inf・\max・\min も同じ一族で、添字を下に置きます(関数名の一覧は別ページ「数式モードの基本」にもまとめてあります)。矢印 → は \to、無限大は \infty です。
\[
\lim_{n \to \infty} \frac{1}{n} = 0,
\qquad \limsup_{n \to \infty} a_n \ge \liminf_{n \to \infty} a_n,
\qquad \sup_{x \in X} f(x)
\]\bigcup 系の n 項作用素 — 二項演算子に big を冠すだけ
集合論・論理・代数で使う n 項作用素 にも、\sum と同じく大きく組まれる版があります。命名は機械的で、対応する二項演算子の名前に big を冠すだけ。二項の和集合 \cup(A ∪ B)に対して、可変サイズ版は \bigcup です。これらはすべて sum クラスなので、別行立てでは限界を上下に積み、本文中では脇に置きます。実測でもディスプレイの \bigcup_{i=1}^{n} は幅 12.95433pt・高さ 16.51393pt・深さ 12.79865pt と、\sum とほぼ同じ縦長の箱になりました。
| 命令 | 意味 | 対応する二項演算子 |
|---|---|---|
\bigcup | 和集合(n 項) | \cup (∪) |
\bigcap | 共通部分(n 項) | \cap (∩) |
\bigsqcup | 直和(非交和) | \sqcup (⊔) |
\biguplus | 多重集合の和 | \uplus (⊎) |
\bigvee | 論理和・上限 | \vee (∨) |
\bigwedge | 論理積・下限 | \wedge (∧) |
\bigoplus | 直和(丸の中の +) | \oplus (⊕) |
\bigotimes | テンソル積(丸の中の ×) | \otimes (⊗) |
\bigodot | 丸の中の点(n 項) | \odot (⊙) |
\[
\bigcup_{i=1}^{n} A_i, \qquad
\bigcap_{i \in I} A_i, \qquad
V = \bigoplus_{k} V_k
\]総和の下に条件を二行書く — \substack と subarray
amsmath の \substack{…} を下付きの位置に丸ごと置きます。\\ で区切った各行が中央そろえで縦に積まれ、たとえば「0 ≤ i ≤ m」と「0 < j < n」を Σ の真下に二行で並べられます。最後の行のうしろに \\ は付けません。左そろえにしたいときは、より一般的な subarray 環境を使い、\begin{subarray}{l} … \end{subarray} と書きます。{l} が左そろえ、{c} が中央そろえで、行の区切りは \substack と同じく \\ です。実は \substack の定義自体が \subarray{c}…\endsubarray なので、両者は同じ仕組みの別の顔にすぎません。なお、記号の上や下に括弧や線を渡す \overbrace・\underbrace・\overline などは別の話で、別ページ「上下の装飾」が担当します。ここで扱っているのはあくまで 作用素の限界 です。
% preamble: \usepackage{amsmath}
\[
\sum_{\substack{0 \le i \le m \\ 0 < j < n}} P(i,j)
\qquad
\sum_{\begin{subarray}{l} i \in \Lambda \\ 0 < j < n \end{subarray}} P(i,j)
\]argmax を自分で定義する — \DeclareMathOperator* の星の意味
星の有無が、条件を 下に置くか右下に置くか を決めます。標準にない作用素名——argmax・argmin・esssup など——を立体で組み、\lim と同じように添字を真下に置きたいときは、amsmath の \DeclareMathOperator* をプリアンブルで一度宣言し、本文では短い命令として呼びます。星を付けなければ添字は名前の右下に付きます。実測でも、\operatorname*{argmax}_{\theta} の箱は深さ 9.4722pt(下に伸びている)、星なしの \operatorname{argmax}_{\theta} は幅 37.05215pt・深さ 2.44443pt(右に伸びている)でした。一度きりの用途なら宣言せずに \operatorname{rank}(限界を下に置くなら \operatorname*{…})を直接書くこともできます。
% in the preamble:
\usepackage{amsmath}
\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator{\rank}{rank}
% in the body:
\[
\hat{\theta} = \argmax_{\theta} L(\theta),
\qquad \rank A \le n,
\qquad \sideset{}{'}\sum_{n} a_n
\]名前のテキストには専用の約束があります。ハイフン - は本文のハイフンとして(マイナス記号ではなく)、アスタリスク * は上付きのテキストアスタリスクとして(中央そろえの二項演算子ではなく)組まれます。arg\,max の \, は二語のあいだに入れる細い空きです。関数名は \text{…} ではなく \DeclareMathOperator か \mathrm で組むのが定石で、そうすれば前後の空きが自動で調整され、定理環境のような斜体の文脈でも立体のままになります。最後に、sum クラスの記号の 四隅 に添字を置きたいとき——たとえば Σ にプライム(′)を付けたいとき——は amsmath の \sideset が使えます。\sideset{}{'}\sum_{n} a_n と書けば、下に限界を置いたまま Σ の右上にプライムが付きます。第一引数が左の二隅、第二引数が右の二隅で、各引数の中では _{下}^{上} と書き分けます。sum クラス専用である点に注意してください。