수학에서 가장 많이 쓰이는 관계 기호에는 만든 사람이 있고, 그 이유까지 글로 남아 있습니다. 1557년 로버트 레코드가 『The Whetstone of Witte』에서 =를 처음 활자로 찍으면서 두 개의 평행선을 고른 이유는, 이보다 더 같은 것은 없기 때문이었습니다. LaTeX에서 이 기호는 한 집안의 맏이입니다. =, \neq, \leq, \approx, \equiv는 모두 관계 기호이고, 중요한 것은 생김새보다 이들이 속한 클래스입니다. TeX은 이들을 하나의 클래스로 묶어 이항 연산자보다 넓은 간격을 자동으로 줍니다. 이 페이지에서는 등호와 그 사촌들, 대소 기호, 부정 표기, 그리고 자기 기호를 관계 기호로 승격시키는 방법까지를 “뜻은 관례가 정하지만 간격은 원본이 선언한다”는 한 줄기로 따라갑니다.
= 양옆이 +보다 넓은 이유
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 | b와 a \mid b를 나란히 조판하면 같은 세로줄 주위의 공백만 달라집니다. \|와 \parallel도 같은 짝으로, 둘 다 자리 "6B입니다. \parallel(∥)는 관계 기호라 “평행하다”라고 말할 수 있지만, \|는 보통 기호인 구분자여서 \|x\| 같은 노름에 쓰는 것입니다. 이런 짝에서 엉뚱한 쪽을 고르는 일이야말로 “간격이 어딘가 이상한데 이유를 모르겠다”는 증상의 가장 흔한 원인입니다.
% 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(≍), 그리고 유니코드 이름이 “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이 제공하며, 아래 가로줄을 위쪽 각도와 나란해지도록 기울여 그립니다. 유니코드는 이 둘을 “같은 문자의 다른 글꼴”이 아니라 별개의 부호 위치 — 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 ⪰는 거울상 |
\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 옵션을 제공합니다. \coloneqq는 amssymb이 아니라 mathtools의 것입니다. ! Undefined control sequence가 \coloneqq를 가리킨다면 대개 이 혼동이 원인입니다.
관계 기호 위에 무언가를 얹고 싶을 때의 정석은 \stackrel{\mathrm{def}}{=}입니다. latex.ltx는 이를 \mathrel{\mathop{#2}\limits^{#1}}로 정의하므로, 무엇을 얹든 결과는 반드시 관계 기호가 됩니다. amsmath의 \overset은 같은 일을 하되 관계 기호로 고정하지 않고 바탕 기호의 클래스를 그대로 물려받습니다. 바탕이 이항 연산자일 때 필요한 것이 바로 이쪽이며, 아래쪽은 \underset이 맡습니다. 그리고 두 번 넘게 쓰는 기호라면 한 번만 정의해 클래스까지 함께 들고 다니게 하십시오. \newcommand{\divides}{\mathrel{|}}라고 적어 두면 간격이 언제나 맞는 나눔 기호를 얻고, 나중에 글리프를 바꿔도 모든 출현 위치가 따라옵니다. 이 페이지 전체가 이 한 줄로 요약됩니다. 쓸 때마다 \,나 \;로 간격을 기우지 말고, 클래스를 선언한 뒤 계산은 TeX에 맡기십시오.
\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} \]