2項演算子

「掛け算の記号として × は好きになれない。文字の 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 とまったく同じ二項演算子で、組版結果も一致します。

latex
% \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畳み込みなど。数式中の * と同一
\star5 角の星。独自に定義した積によく使う
\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)で、関係子に使われる \thickmuskip5mu 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$ とぴたりと同じ幅です。

latex
% 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大きな丸
\circledastamssymb丸囲みアスタリスク
\circledcircamssymb丸囲みの丸
\boxplusamssymb角囲みプラス
\boxminusamssymb角囲みマイナス
\boxtimesamssymb角囲みの掛け算
\boxdotamssymb角囲み中点
latex
% 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輪積(リース積)
\smallsetminusamssymb細身の差集合
\Capamssymb二重の共通部分
\Cupamssymb二重の和集合
latex
% 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右向き三角。群作用など
\dotplusamssymb点付きプラス
\intercalamssymb転置の肩に置く記号
\ltimesamssymb左半直積
\rtimesamssymb右半直積
\divideontimesamssymb点付きの掛け算記号
\lhdlatexsym / amssymb太めの左向き三角。素の LaTeX では使えない
\rhdlatexsym / 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)扱いになり、使うたびに \, を手で足して回る羽目になります。記号を足す前にクラスを決める——二項演算子まわりの事故は、その一手でほとんど防げます。