「掛け算の記号として × は好きになれない。文字の x と紛らわしいからだ」——ライプニッツが 1698 年、ヨハン・ベルヌーイ宛の手紙にそう書いています。LaTeX で 二項演算子(binary operator) の \times と \cdot のどちらを打つか迷うとき、あなたは三百年以上続くこの論争に立ち会っているわけです。ただし、本当の主題は字形ではありません。TeX は数式中のすべての記号をクラスに仕分けし、前後の空きはそのクラスだけで決まります。$+1$ の + と $a+1$ の + が、同じ文字なのに違う幅で組まれるのはそのためです。このページでは \times・\div・\cdot・\pm・\oplus・\cup・\setminus といった演算子を一望したうえで、amssymb が要るのはどれか、そして TeX の判断が外れたときに \mathbin でどう覆すかまでを扱います。
\cdot と \times の違い——どちらで掛けるか
既定は \cdot(⋅)です。数式のなかで数と数、量と量を掛けるときは中点を使い、\times(×)はベクトルの外積、直積、次元の表記(3 \times 3 行列)、そして 10 の冪(6.02 \times 10^{23})に取っておきます。この住み分けは、ライプニッツの不満そのものから育ちました。× を活字にして広めたのはウィリアム・オートレッドで、1631 年ロンドン刊の『Clavis Mathematicae』に見えます。ところが代数では x が未知数のいちばんありふれた名前でもありました。そこで 1698 年 7 月 29 日の手紙で、ライプニッツはこの十字を退け、二つの量のあいだに点を打つやり方を勧めたのです。勝ったのは彼のほうでした。現代の数学書で掛け算の × をほとんど見かけないのは、そのためです。
割り算の \div(÷)にも似た経緯があります。この記号は オベルス(obelus) と呼ばれ、除算の記号として最初に使ったのは 1659 年『Teutsche Algebra』のヨハン・ラーンでした。ところが科学技術の数学表記を定める規格 ISO 80000-2 は、除算には斜線 / か分数の横線を、比には : を使うものとし、÷ は使うべきでないと明記しています。実務上の結論は単純で、論文や技術文書では \div ではなく \frac{a}{b} を書きます。\div の出番は初等教育の教材と電卓の話くらいです。もう一つ、\cdot の代わりにピリオドを打って a.b と書くのは失敗します。TeX はピリオドを演算子と見なさないので前後に空きが入らず、10pt の文書で測ると $a.b$ は 12.36pt、$a \cdot b$ は 16.80pt——掛け算ではなく小数点に見えてしまいます。逆に、星印を * と直接打つのは問題ありません。数式モードの * は \ast とまったく同じ二項演算子で、組版結果も一致します。
% \cdot for ordinary products; \times for cross products, dimensions, powers of ten
\[ 2 \cdot 3 = 6, \qquad \mathbf{u} \times \mathbf{v}, \qquad 6.02 \times 10^{23} \]
% a period is not a multiplication dot: it gets no operator spacing
\[ a.b \qquad a \cdot b \]
% in scientific writing prefer a fraction to the obelus
\[ \frac{a}{b} \qquad a \div b \]| 命令 | 字形 | 意味・使いどころ |
|---|---|---|
\pm | ± | 複号「プラスマイナス」。x = a \pm b |
\mp | ∓ | マイナスプラス。\pm と符号が逆 |
\times | × | 外積・直積・次元・10 の冪 |
\div | ÷ | オベルス。科学技術の文書では \frac を推奨 |
\cdot | ⋅ | 掛け算の既定。スカラー倍・内積 |
\ast | ∗ | 畳み込みなど。数式中の * と同一 |
\star | ⋆ | 5 角の星。独自に定義した積によく使う |
\circ | ∘ | 関数の合成。g \circ f |
\bullet | ∙ | 黒丸。\circ より重い演算に |
\diamond | ⋄ | 菱形の演算子 |
なぜ $+1$ の + だけ空きが詰まるのか
二項演算子は左右のものを結ぶ記号ですから、結ぶ相手が片側に無ければ二項演算子ではない——TeX はそう判断します。式の先頭に来た + は符号(単項)と見なされてクラスが格下げされ、空きが一切入りません。数字で見ると一目瞭然です。10pt の文書で $+1$ は 12.78pt。ところが空の波括弧を置いて ${}+1$ と書くと、+ に左の相手ができて本物の二項演算子に戻り、17.22pt に伸びます。差の 4.44pt は片側 2.22pt ずつ。この 2.22pt の正体はパラメータ \medmuskip(既定 4mu plus 2mu minus 4mu)で、関係子に使われる \thickmuskip(5mu plus 5mu、片側 2.78pt)より狭い。だから $a=b$ は $a+b$ よりゆったり組まれます。ソースに空白を何個打とうと出力は変わりません。空きを決めるのはクラスだけです。
この仕組みは、思わぬところで裏目に出ます。記号を波括弧で囲むとクラスが失われるのです。$a\times b$ は 21.80pt ですが、$a{\times}b$ と書いた瞬間に 17.36pt まで縮みます。括弧に包まれた中身はひとかたまりの通常記号(Ord クラス)として扱われ、二項演算子であったことを忘れるからです。自分で書いたマクロで「この記号だけ、なぜか空きが足りない」という症状に出会ったら、原因はたいていこれです。直し方は \mathbin{...} で囲むこと。$a\mathbin{\times}b$ は 21.80pt に戻り、素の $a\times b$ と完全に一致します。逆に空きを消したいときは \mathord{...}、関係子として組みたいときは \mathrel{...} を使います——$a\mathrel{\times}b$ は 22.91pt になり、これは $a=b$ とぴたりと同じ幅です。
% a leading + has nothing to bind: TeX makes it a sign and sets it tight
% an empty group gives it a left operand and the medium space comes back
\[ +1 \qquad {}+1 \]
% braces strip the class; \mathbin puts it back, \mathrel makes it a relation
\[ a \times b \qquad a {\times} b \qquad a \mathbin{\times} b \qquad a \mathrel{\times} b \]
% always declare the class when you define an operator of your own
\newcommand{\op}{\mathbin{\triangle}}
\[ x \op y \]| 命令 | 強制するクラス | 前後に入る空き(10pt 本文) |
|---|---|---|
\mathbin | 二項演算子 | 2.22pt(\medmuskip = 4mu) |
\mathrel | 関係子 | 2.78pt(\thickmuskip = 5mu) |
\mathord | 通常の記号(Ord) | なし。波括弧で囲んだのと同じ結果 |
丸囲みと角囲み——amssymb が必要なのはどれか
丸囲みは LaTeX 標準、角囲みは全部 amssymb が必要——この一行でほぼ片が付きます。直和 \oplus(⊕)、テンソル積 \otimes(⊗)、アダマール積などに使う \odot(⊙)、それに \ominus・\oslash・\bigcirc は、パッケージを一つも読み込まずに使えます。一方 \boxplus(⊞)・\boxminus(⊟)・\boxtimes(⊠)・\boxdot(⊡)と、丸囲みでも AMS が追加した \circledast(⊛)・\circledcirc(⊚)は、プリアンブルの \usepackage{amssymb} が前提です。忘れると ! Undefined control sequence. で組版が止まります。どれを選ぶかの目安は慣習で、加法的な演算には ⊕、乗法的な演算には ⊗ を当てます。圏論や表現論の文献はほぼ例外なくこの読み方で通っています。
| 命令 | 字形 | パッケージ | 意味・用途 |
|---|---|---|---|
\oplus | ⊕ | — | 直和。加法的な演算 |
\ominus | ⊖ | — | 丸囲みマイナス |
\otimes | ⊗ | — | テンソル積。乗法的な演算 |
\oslash | ⊘ | — | 丸囲み斜線。要素ごとの除算に |
\odot | ⊙ | — | アダマール積・要素ごとの積 |
\bigcirc | ◯ | — | 大きな丸 |
\circledast | ⊛ | amssymb | 丸囲みアスタリスク |
\circledcirc | ⊚ | amssymb | 丸囲みの丸 |
\boxplus | ⊞ | amssymb | 角囲みプラス |
\boxminus | ⊟ | amssymb | 角囲みマイナス |
\boxtimes | ⊠ | amssymb | 角囲みの掛け算 |
\boxdot | ⊡ | amssymb | 角囲み中点 |
% circled operators are standard; boxed ones come from amssymb
\usepackage{amssymb}
% ...
\[ V \oplus W, \qquad u \otimes v, \qquad A \boxplus B \]同じ形でも、\bigoplus(⨁)・\bigotimes・\bigodot・\biguplus のような 大きい版 は二項演算子ではありません。これらは総和記号 \sum と同じ 大型作用素 に分類され、上下に添字を取り、行内と別行立てで大きさが変わります。\oplus を \Large などで無理に拡大すると添字の位置が狂うので、必ず \bigoplus を使ってください。詳しくは「和・積分・大型作用素」のページで扱います。
集合と束の演算子——\cup・\cap・\setminus
この節の主役はすべて LaTeX 標準で、追加パッケージは要りません。共通部分 \cap(∩)、和集合 \cup(∪)、多重集合の和 \uplus(⊎)、差集合 \setminus(∖)。束や順序集合では四角い \sqcap(⊓)・\sqcup(⊔)が、論理では \wedge(∧)・\vee(∨)が出てきます。後者には \land・\lor という別名があり、出る字形は同じ——論理の文脈では名前のほうが読み手に伝わりやすい、という違いだけです。ここでいちばん多い事故は、差集合を \backslash で書いてしまうことです。\backslash は通常記号(Ord クラス)なので二項演算子の空きが入らず、10pt で測ると $A \backslash B$ は 20.59pt、$A \setminus B$ は 25.03pt——片側 2.22pt ずつ足りません。差集合には必ず \setminus を使ってください。amssymb を読み込めば、細身の \smallsetminus(∖)も選べます。
| 命令 | 字形 | パッケージ | 意味・用途 |
|---|---|---|---|
\cap | ∩ | — | 共通部分(積集合) |
\cup | ∪ | — | 和集合 |
\uplus | ⊎ | — | 多重集合の和・非交和 |
\sqcap | ⊓ | — | 束の meet(下限) |
\sqcup | ⊔ | — | 束の join(上限) |
\wedge | ∧ | — | 論理積・meet。別名 \land |
\vee | ∨ | — | 論理和・join。別名 \lor |
\setminus | ∖ | — | 差集合。\backslash では代用できない |
\wr | ≀ | — | 輪積(リース積) |
\smallsetminus | ∖ | amssymb | 細身の差集合 |
\Cap | ⋒ | amssymb | 二重の共通部分 |
\Cup | ⋓ | amssymb | 二重の和集合 |
% a set difference needs \setminus, not \backslash
\[ A \setminus B \qquad A \cup (B \cap C) \]
% \land and \lor are aliases of \wedge and \vee
\[ p \wedge q \iff p \land q \]そのほかの演算子と Command \lhd not provided in base LaTeX2e エラー
残りは寄せ集めですが、どれも出番があります。余積・非交和の \amalg(⨿)、随伴や双対を示す \dagger(†)と \ddagger(‡)、正規部分群や作用に使う \triangleleft(◁)・\triangleright(▷)は、いずれも LaTeX 標準です。ここに amssymb 側の常連が加わります。群論の半直積 \ltimes(⋉)・\rtimes(⋊)、転置に使われる \intercal(⊺)、点付きの \dotplus(∔)、そして \divideontimes(⋇)。半直積を書く機会は代数の文書なら必ず来るので、プリアンブルに \usepackage{amssymb} を置いておくのが結局は近道です。
| 命令 | 字形 | パッケージ | 意味・用途 |
|---|---|---|---|
\amalg | ⨿ | — | 余積・非交和 |
\dagger | † | — | 短剣符。随伴・共役転置 |
\ddagger | ‡ | — | 二重短剣符 |
\triangleleft | ◁ | — | 左向き三角。正規部分群など |
\triangleright | ▷ | — | 右向き三角。群作用など |
\dotplus | ∔ | amssymb | 点付きプラス |
\intercal | ⊺ | amssymb | 転置の肩に置く記号 |
\ltimes | ⋉ | amssymb | 左半直積 |
\rtimes | ⋊ | amssymb | 右半直積 |
\divideontimes | ⋇ | amssymb | 点付きの掛け算記号 |
\lhd | ◁ | latexsym / amssymb | 太めの左向き三角。素の LaTeX では使えない |
\rhd | ▷ | latexsym / amssymb | 太めの右向き三角 |
最後の二行には落とし穴があります。正規部分群を太い記号で書こうとして \lhd を打つと、素の LaTeX では ! LaTeX Error: Command \lhd not provided in base LaTeX2e. で止まるのです。\lhd・\rhd・\unlhd・\unrhd は名前だけがカーネルに予約されていて、実体は別のパッケージにあります。\usepackage{latexsym} か \usepackage{amssymb} のどちらかを読み込めば、四つとも通ります。すでに amssymb を使っているなら追加は要りません。逆に、標準の \triangleleft(◁)で足りるなら、そもそもこのエラーには出会わずに済みます。
自分で演算子を定義するときは、冒頭のクラスの話を思い出してください。\newcommand{\op}{\mathbin{\triangle}} のようにクラスを明示しておけば、あとは x \op y と書くだけで前後の空きは TeX が正しく面倒を見ます。クラスを指定し忘れたマクロは通常記号(Ord)扱いになり、使うたびに \, を手で足して回る羽目になります。記号を足す前にクラスを決める——二項演算子まわりの事故は、その一手でほとんど防げます。