이항 연산자

“곱셈 기호로 ×는 마음에 들지 않는다. 문자 x와 너무 쉽게 혼동되기 때문이다.” 1698년 라이프니츠가 요한 베르누이에게 보낸 편지의 한 대목입니다. LaTeX에서 이 페이지가 다루는 이항 연산자\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합성곱 등; 수식 모드의 *와 동일
\star오각 별; 따로 정의한 곱에 자주 사용
\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$와 정확히 같은 너비입니다.

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로 쓰는 것입니다. 이 명령은 일반 기호(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 \]

나머지 연산자와 \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)로 취급되어, 쓸 때마다 \,를 손으로 끼워 넣게 됩니다. 기호를 더하기 전에 클래스를 정한다——이항 연산자 주변의 간격 사고는 이 한 걸음으로 대부분 막을 수 있습니다.