関係演算子

数学でもっともよく使われる 関係演算子、つまり等号 = には作者がいて、しかも本人が理由を書き残しています。1557年、ロバート・レコードが『The Whetstone of Witte』でこの記号を初めて活字にしたとき、二本の平行線を選んだ理由は「これほど等しいものは二つとないから」でした。LaTeX で =\neq\leq\approx\equiv を書くとき効いてくるのは、じつは字形よりもクラスのほうです。TeX はこれらを 関係子(relation) というひとつの仲間として束ね、二項演算子より広い空きを自動で与えます。このページでは、等号とその近縁、大小の記号、否定の作り方、そして自分の記号を関係子に昇格させる方法までを、「意味は慣習が決めるが、まわりの空きはソースが宣言している」という一本の筋で追いかけます。

なぜ = の左右は + より広く空くのか

TeX が空きを字形ではなく クラス で決めているからです。数式中のすべての記号は、通常記号・二項演算子・関係子・開き・閉じ・句読点・内部という区分のどれかに属し、隣り合う二つのクラスの組み合わせから空きが引かれます。+ のような二項演算子には \medmuskip(plain TeX の既定値は 4mu plus 2mu minus 4mu)、= のような関係子には \thickmuskip(同じく 5mu plus 5mu)が入ります。等号のほうがそもそも広く、しかも行を伸ばす必要があるときには伸びる余地まで持っているわけです。そしてこれは自分で打ち込むものではありません。a+b=c と一切スペースを入れずに書いても、出力の空きは正しく付きます。

クラスが効いていて字形は効いていない、という証拠としてもっとも分かりやすいのは、まったく同じ字を出す二つの命令です。LaTeX が数式記号を宣言している fontmath.ltx では、|\DeclareMathDelimiter{|}{\mathord}…{symbols}{"6A}\mid\DeclareMathSymbol{\mid}{\mathrel}{symbols}{"6A} と書かれています。同じフォントの同じスロット "6A、違うのはクラスだけです。a | ba \mid b を並べれば、同じ縦棒のまわりの空きだけが変わります。\|\parallel も同じ関係で、どちらもスロット "6B\parallel(∥)は関係子なので「平行である」と述べられますが、\| は通常記号の区切りで、\|x\| のようなノルムのためのものです。ここを取り違えるのが、「なんとなく空きがおかしいのに理由が分からない」という症状のいちばんよくある原因です。

latex
% same glyph, different class: | is ordinary, \mid is a relation
\[ a | b \qquad a \mid b \]
% a bare letter is ordinary; \mathrel promotes it
\[ A R B \qquad A \mathrel{R} B \]
% the colon trap: ":" is a relation, \colon is punctuation
\[ f : A \to B \qquad f\colon A \to B \]

つまり実務上は、クラスを自分で宣言してしまえばよいということです。\mathrel{...} は中身を関係子に、\mathbin{...} は二項演算子にします。どちらも標準 LaTeX の命令です。裸の文字は通常記号なので、A R B と書くと R が両隣にくっつきますが、A \mathrel{R} B なら = と同じ空きが付きます。逆向きの落とし穴がコロンです。LaTeX は文字 : を関係子として宣言しているため、f : A \to B と書くと、本来は区切りにすぎないコロンの左右に関係子の広い空きが入ってしまいます。まさにこのために \colon\mathpunct として用意されていて、f\colon A \to B が推奨形になっているわけです。なお矢印も関係子クラスに属します——\to が数式モードを要求するのはそのためですが、詳しくは矢印のページに譲ります。

\approx \sim \simeq \cong の使い分け

目安はこうです。数値がほぼ等しいときは \approx(≈)、同値関係や「オーダーが同じ」は \sim(∼)、漸近的に等しい・位相同型は \simeq(≃)、幾何の合同や代数の同型は \cong(≅)。四つとも標準 LaTeX で、パッケージは要りません。似た形をしているのは偶然ではなく、どれも等号の厳しさをそれぞれ違う度合いだけ緩めた記号だからで、だからこそ読者は字形ではなく命令名を頼りにします。これらの周りには、恒等および整数の合同 a \equiv b \pmod n を表す \equiv(≡)、比例の \propto(∝)、「同じ大きさの程度」を表す \asymp(≍)、そして Unicode 名が「approaches the limit(極限に近づく)」でありながら「定義により等しい」と読む著者も多い \doteq(≐)が並びます。\doteq\asymp は分野によって読みが割れるので、初出のところで意味を一言添えておくのが安全です。

命令字形意味・用途
==等号。そのまま打つ。関係子クラス
\neq等しくない。\ne も同じ。標準 LaTeX
\equiv恒等的に等しい/合同 a \equiv b \pmod n
\approxほぼ等しい。数値の近似 \pi \approx 3.14
\sim同値関係、あるいは「オーダーが同じ」
\simeq漸近的に等しい、位相同型
\cong図形の合同、代数の同型。\sim= の重ね組み
\propto比例する
\asymp同じ大きさの程度(解析・整数論)
\doteq= の上に点。「極限に近づく」/「定義により等しい」

じつは、いま挙げた記号のうち三つは、どのフォントにも存在しません。fontmath.ltx を開くと、\cong\mathrel{\mathpalette\@vereq\sim}、つまり \sim= の上に積んだもの、\doteq\buildrel\textstyle.\over= でピリオドを等号の上に載せたもの、\notin\in にスラッシュを重ね打ちしたものだと分かります。クヌースの Computer Modern にその字が入っていなかったので、LaTeX が組版時に組み立てているのです。これは実務にも効く小ネタで、組み立てた記号は数式フォントを替えるとわずかに位置が動きますし、PDF のなかでは本物の文字ではないためコピー&ペーストでは取り出せません。読み上げやコピーを気にする文書なら、LuaLaTeX か XeLaTeX に unicode-math と OpenType 数式フォントを組み合わせると、\cong は U+2245、\doteq は U+2250 という本物の文字になります。

\leq\leqslant——⩽ を使うべきか

意味は完全に同じで、違いはハウススタイル、そして \leqslant にはパッケージ代がかかる、というだけです。\leq(≤)と \geq(≥)は標準 LaTeX で、短い別名 \le\ge はまったく同じ文字を指します。\leqslant(⩽)と \geqslant(⩾)は amssymb の提供で、下の横棒を上の角度に平行になるよう傾けて描きます。Unicode はこの二つを「同じ文字の別フォント」ではなく別々の符号位置——U+2264 less-than or equal to と U+2A7D less-than or slanted equal to——として扱っており、それだけこの好みが気まぐれではなく実在の慣習だということです。だからこそ、文書全体でどちらかに決めてください。同じページに ≤ と ⩽ が混在していると、読者にはただの打ち間違いに見えます。

「はるかに小さい」「はるかに大きい」には \ll(≪)と \gg(≫)があり、これも標準 LaTeX です。どちらも一つの記号であって < を二つ並べたものではないので、手で作ろうとしないでください。<> はそのまま打てますが、必ず数式モードのなかで打ちます。既定の OT1 フォントエンコーディングのまま本文に A<B>C と書くと、出てくるのは A¡B¿C です——<> の位置に、OT1 では逆さの感嘆符と疑問符が入っているからです。また、大小ではない順序——半順序、優先順位、細分——を表したいときは prec/succ 系が定石で、\prec(≺)・\succ(≻)と等号付きの \preceq(⪯)・\succeq(⪰)がすべて標準で使えます。そして斜めの不等号に決めたなら、いちいち書き換える必要はありません。プリアンブルに \let\leq\leqslant と一行書けば文書全体が切り替わり、ソースは読みやすいままです。

命令字形意味・用途
<<より小さい。数式モードでそのまま打つ
>>より大きい。本文に書くと ¿ になる
\leq以下。\le は同じ文字。標準 LaTeX
\geq以上。\ge は同じ文字。標準 LaTeX
\llはるかに小さい。一つの記号
\ggはるかに大きい。一つの記号
\leqslant以下の斜め異体字。amssymb が必要
\geqslant以上の斜め異体字。amssymb が必要
\prec先行する。大小ではない順序に
\preceq先行するか等しい。\succ ≻・\succeq ⪰ は鏡像
latex
\usepackage{amssymb}   % \leqslant, \geqslant, \nleq, \nmid ...
% decide the shape once, in the preamble
\let\leq\leqslant
\let\geq\geqslant
\[ 0 \leq x \leq 1, \qquad n \ll N, \qquad a \prec b \preceq c \]

否定の作り方——\neq\not・amssymb

専用の命令があるならそれを使い——\neq\notin、そして amssymb\nleq\nmid\nsubseteq 一族——無いときだけ \not に頼ります。ただし意外な事実があります。標準 LaTeX の \neq は、独立した字形ではありません。fontmath.ltx には \DeclareRobustCommand\neq{\not=} という一行があり、\ne も同じ定義なので、\not=\neq の出力は一バイトも違いません。つまり「\not= より \neq を使え」という定番の助言は、PDF ではなくソースについての話です。\neq は意図を明示しますし、検索に引っかかりますし、共著者が探すのもこちらです。加えて unicode-math に移ったときの挙動もよく、そこでは \ne が重ね打ちではなく本物の文字 U+2260 になります。

\not が本当に破綻するのは、想定していない記号に重ねたときです。\not は記号フォントのスロット "36 にある一文字で、後続の記号の上に固定の大きさ・傾き・位置で置かれます。その寸法は = 程度の幅の記号に合わせて調整されているので、幅の広い関係子ではスラッシュが届かず、背の高い記号や変わった形の記号では切る場所を間違えます。\not\leq\nleq(≰)、\not\subseteq\nsubseteq(⊈)を並べれば、専用に描かれた AMS の字形が毎回勝ちます。とはいえ、誰も描かなかった組み合わせには \not が今でも有用です。\nequiv は存在しないので、非合同は x \not\equiv y \pmod p と書くのが標準的なやり方です。なお \notin(∉)は AMS 由来に見えて、じつはパッケージ不要で使えます。

命令字形意味・必要なパッケージ
\neq等しくない。標準 LaTeX(中身は \not=
\notin要素でない。標準 LaTeX(\in にスラッシュを重ね打ち)
\nleq以下でない。amssymb
\ngeq以上でない。amssymb
\nsim相似でない。amssymb
\ncong合同・同型でない。amssymb
\nsubseteq部分集合でない。amssymb
\nparallel平行でない。amssymb
\nmid割り切らない。amssymb
\nprec先行しない。amssymb

:= を綺麗に組む・自分の関係子を定義する

「定義により等しい」には、:= と直接打つのではなく mathtools を読み込んで \coloneqq(≔)を使います。直打ちの問題は空きではありません。LaTeX は : を関係子として宣言しており、TeX は隣り合う関係子のあいだに何も入れないので、:= はきちんと詰まって出ます。問題は高さのほうです。文字 : は本文用フォントから取ってくるため点の位置が低く、= は数式軸をまたぐ高さにあるので、コロンがずり落ちて見えます。mathtools はコロンを持ち上げた \coloneqq と、左右反転の \eqqcolon(=:)、さらに文書中のすべてのコロンを持ち上げる centercolon オプションを提供します。\coloneqqamssymb ではなく mathtools の提供です——! Undefined control sequence\coloneqq を指しているときは、たいていこの取り違えです。

関係子の上に何かを載せたいときの定番は \stackrel{\mathrm{def}}{=} です。latex.ltx はこれを \mathrel{\mathop{#2}\limits^{#1}} と定義しているので、何を載せても結果は必ず関係子になります。amsmath\overset は同じ仕事をしますが、関係子に固定せず土台の記号のクラスをそのまま引き継ぎます——土台が二項演算子のときに欲しいのはこちらです(下側は \underset)。そして二回以上使う記号なら、一度だけ定義してクラスごと持ち回るのが正解です。\newcommand{\divides}{\mathrel{|}} と書いておけば、いつでも正しい空きの整除記号が手に入り、あとで字形を変えたくなっても全出現箇所が追随します。このページの全体がこの一行に要約されます——使うたびに \,\; で空きを繕うのではなく、クラスを宣言して計算は TeX に任せてください。

latex
\usepackage{mathtools}  % \coloneqq and \eqqcolon (loads amsmath too)
\newcommand{\divides}{\mathrel{|}}
\[ f(x) \coloneqq x^2 + 1, \qquad y \eqqcolon g(t) \]
% \stackrel always yields a relation; \overset keeps the base class
\[ a \stackrel{\mathrm{def}}{=} b, \qquad a \overset{\mathrm{def}}{=} b \]
\[ 2 \divides 10, \qquad x \not\equiv y \pmod{p} \]