\usepackage{amsmath}은 더하기만 하는 한 줄이 아닙니다. 빼앗기도 합니다. amsmath를 읽어 들이는 순간 LaTeX의 \[는 equation* 환경으로 바뀌고, equation과 cases는 다시 정의되며, plain TeX에서 온 \pmatrix는 오류로 멈추고 \over는 경고를 냅니다. 즉 이것은 “편의 기능 모음”이 아니라 수식 조판 작법 자체의 교체입니다. 이 페이지에서는 그 교체의 내용과, 환경을 가로질러 작동하는 명령인 \DeclareMathOperator, \text, \intertext, \substack, \dfrac를 다룹니다. 정렬 환경 자체는 별도 페이지에 맡깁니다.
amsmath를 읽어 들이면 실제로 무엇이 달라지는가
먼저, amsmath는 하나의 패키지가 아니라 묶음입니다. amsmath.sty 앞부분에는 세 줄의 \RequirePackage가 있어 amstext(수식 안의 글을 조판하는 \text), amsbsy(수식 굵게 \boldsymbol), amsopn(\DeclareMathOperator과 연산자 이름 장치)을 끌고 옵니다. 그래서 한 줄만 쓰면 이 페이지에 나오는 명령이 모두 갖춰집니다.
\usepackage{amsmath}다음은 교체입니다. amsmath.sty의 마지막 두 줄은 \DeclareRobustCommand{\[}{\begin{equation*}}와 \DeclareRobustCommand{\]}{\end{equation*}}입니다. 곧 별행 수식의 기본 명령 자체가 amsmath의 환경으로 바뀝니다. 같은 파일 안에서 equation, cases, matrix, pmatrix도 \renewenvironment를 거치고 \nonumber도 다시 정의됩니다. 이 교체가 있기에 \tag도, \qedhere도, 번호의 자동 회피도 작동합니다. 반대로 이 층을 우회하는 $$ … $$를 쓰면 amsmath의 장치가 통째로 듣지 않습니다.
빼앗기는 것도 있습니다. plain TeX의 표기를 그대로 들여오면 멈춥니다. $\pmatrix{a&b\cr c&d\cr}$는 ! Package amsmath Error: Old form \pmatrix should be \begin{pmatrix}.가 되고, \cases{…}도 같은 투로 꾸중을 듣습니다. 1 \over 2는 통과하기는 하지만 Package amsmath Warning: Foreign command \over; \frac or \genfrac should be used instead라는 경고가 붙습니다. 옛 원고를 amsmath로 옮길 때 가장 먼저 나오는 것이 이 셋이며, 셋 다 같은 말을 합니다. 새 표기로 옮기라는 것입니다.
이렇게 강하게 개입할 수 있는 것은 amsmath가 LaTeX의 required 패키지로 분류되기 때문입니다. 함께 배포되는 README에는 amsmath의 유지보수가 2016년을 기해 AMS에서 LaTeX 프로젝트로 넘어갔다고 명시되어 있습니다. amsmath.sty의 저작권 표시도 “2016–2023 LaTeX Project and American Mathematical Society”이며 현재 관리자로 LaTeX Project를 지목합니다. 사실상 LaTeX 본체의 일부라고 보아도 되며, 그렇기에 표준 명령을 갈아 끼울 수 있습니다.
\DeclareMathOperator — 연산자 이름을 기울임꼴로 쓰면 안 되는 이유
수식 모드에서 글자는 변수이므로 rank A라고 치면 r・a・n・k・A의 곱이 됩니다. LaTeX는 \sin, \log, \lim을 비롯해 수십 개의 연산자 이름을 미리 정의해 두었지만 rank는 그 안에 없습니다. 그러면 \mathit{rank}로 기울임꼴만 끄면 되지 않을까 싶지만, 그렇지 않습니다. 글꼴을 고쳐도 간격은 고쳐지지 않기 때문입니다. 재 봅시다. \operatorname{rank} A는 rank와 A 사이에 1.66pt를 둡니다. \mathit{rank} A는 1.07pt로, 이탤릭 보정뿐이고 연산자로서의 간격은 0입니다. \mathrm{log} x에 이르러서는 “logx”로 붙어 나옵니다.
amsopn.sty를 열면 한 줄로 설명이 됩니다. \operatorname의 실체는 \mathop{…\operator@font…}입니다. 즉 연산자 이름은 단순한 곧은 문자열이 아니라 TeX의 기호 종류 체계에서 연산자(Op) 원자로 등록됩니다. TeX의 간격 표는 Op와 Ord 사이에 \thinmuskip(3mu)을 넣습니다. \log x에서 “log”와 “x” 사이에 공백이 생기는 이유입니다. \mathrm은 글자의 서체만 바꿀 뿐 원자의 종류는 Ord 그대로여서 공백이 생기지 않습니다. \DeclareMathOperator은 겉모습의 도구가 아니라 의미를 선언하는 도구입니다.
% in the preamble
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{arg\,max}
% in the body
\[
\rank A \le n, \qquad
\hat{x} = \argmax_{x \in S} f(x)
\]한 번뿐이라면 \operatorname{rank} A로 충분하지만, 되풀이해 쓰는 연산자는 프리앰블에서 이름을 주는 것이 정석입니다. 별표의 유무가 첨자의 위치를 바꿉니다. 별표가 없으면 \log처럼 오른쪽 아래, 별표가 있으면 \lim・\sup・\max처럼 바로 아래입니다(디스플레이 스타일일 때). 위 예를 실측하면 \argmax_{x \in S}의 x ∈ S는 “arg max” 바로 아래에 가운데 정렬로 놓이고, \rank_{k}의 k는 “rank”의 오른쪽 아래에 붙습니다. \DeclareMathOperator은 프리앰블 전용입니다. 본문에서 쓰면 ! LaTeX Error: Can be used only in preamble.가 나오고, 이어서 정의되지 않은 명령에 대해 ! Undefined control sequence.가 납니다.
정의 안의 \,가 이상해 보인다면 AMS가 자기 것을 어떻게 쓰는지 보세요. amsopn.sty는 \limsup을 lim\,sup, \liminf를 lim\,inf, \injlim을 inj\,lim으로 정의합니다. 두 단어로 된 연산자 이름을 가는 공백으로 잇는 것이 AMS의 작법이고, arg\,max는 그것을 따랐을 뿐입니다. \operatorname에는 숨은 일이 하나 더 있습니다. 인수 안의 -, ., :, /, *의 수식 코드를 잠시 바꿔 하이픈을 빼기 기호가 아니라 진짜 하이픈으로 찍는 것입니다. 실측하면 \operatorname{ess-sup}은 “ess-sup”이라는 한 낱말로 나오는데, \mathrm{ess-sup} f는 “ess − sup f”가 되어 빼기 기호 양옆에 이항 연산자로서 2.22pt가 들어갑니다. 뜻도 모양도 다른 물건이 됩니다.
\text와 \mathrm과 \mbox의 구분
곧은 글자를 수식에 넣는 방법은 셋이며, 저마다 다른 물음에 답합니다. \text{…}(amstext 유래)는 “문장”을 넣는 명령입니다. 안은 본문과 같은 서체·같은 간격으로 조판되고 입력한 공백도 살아남습니다. \text{for all } 끝의 공백은 실제로 출력에 남습니다. \mathrm{…}은 “수식의 글자를 곧게” 만드는 명령입니다. 그 안은 여전히 수식 모드라 공백이 사라집니다. 미분의 \mathrm{d}x나 단위처럼 곧게 쓰는 기호에 씁니다. \mbox{…}는 “상자에 넣는” 범용 명령으로, 수식을 위해 만들어진 것이 아닙니다.
\[
f(x) = x^2 \quad \text{for all } x \in \mathbb{R},
\qquad v_{\text{max}} = 3,
\qquad \int f(x)\,\mathrm{d}x.
\]\text가 \mbox보다 나은 점은 주위의 크기를 따라간다는 것입니다. amstext.sty의 정의는 \mathchoice를 써서 디스플레이・텍스트・첨자・이중 첨자 네 문맥에 각각 다른 크기를 배정합니다. 위 v_{\text{max}}의 “max”를 재면 높이 6.19pt로 첨자 크기이지만, \mbox{max}로 하면 8.85pt가 되어 본문 크기 그대로 첨자에 눌러앉습니다. 실용적인 성질이 하나 더 있습니다. \text는 본문 모드에서 불리면 \mbox로 물러납니다. 어느 모드에서 펼쳐질지 모르는 매크로 안에서도 안전하게 쓸 수 있다는 뜻입니다.
\intertext과 \substack — 정렬을 깨지 않고 끼어들기
align 중간에 한 줄 설명을 넣고 싶습니다. 그런데 환경을 닫고 문장을 쓴 뒤 다시 열면 앞뒤의 정렬 위치가 어긋납니다. \intertext{…}가 이를 해결합니다. 실측하면 \intertext가 끼어든 align의 위아래 줄에서 =가 모두 가로 291.11pt에 놓이고, 끼어든 문장은 왼쪽 여백에서 시작하는 보통 문단으로 조판됩니다. 장치는 단순합니다. amsmath.sty의 \intertext는 \noalign 안에서 “아래쪽 여백 + 문장을 담은 \vbox + 위쪽 여백”을 뱉어 냅니다. 즉 문장은 정렬 표를 결코 벗어나지 않고, 그래서 열의 자리가 유지됩니다. 정렬 환경 밖에서 쓰면 ! Package amsmath Error: Invalid use of \intertext.가 납니다.
\begin{align}
A &= B + C \\
\intertext{expanding $C$ gives}
A &= B + D + E
\end{align}
\[
\sum_{\substack{0 \le i \le m \\ 0 < j < n}} a_{ij}
\]\substack{…}는 더 작은 도구지만 발상은 같습니다. 합이나 곱 같은 대형 연산자 아래에 여러 줄의 조건을 쌓는 도구로, 줄은 \\로 나눕니다. 위 예에서 “0 ≤ i ≤ m”과 “0 < j < n”이 두 줄이 되고, 실측에서도 두 줄 모두 합 기호 아래에 가운데 정렬로 쌓입니다. 안쪽은 여전히 수식 모드라 \le 같은 관계 기호를 그대로 쓸 수 있습니다. 가운데가 아니라 왼쪽 정렬 등을 원하면 거의 같은 역할을 하는 subarray 환경에 l 같은 정렬 문자를 넘깁니다.
\dfrac・\binom・\boldsymbol — 문맥에 휘둘리지 않는 표기
\frac 자체는 표준 LaTeX이지만 그 크기는 놓인 문맥이 정합니다. amsmath는 문맥을 무시하는 판을 더했습니다. \dfrac{…}{…}는 언제나 디스플레이 스타일(크게), \tfrac{…}{…}는 언제나 텍스트 스타일(작게)입니다. 본문 속 분수를 읽히게 하려면 \dfrac, 별행 수식의 일부만 줄이려면 \tfrac입니다. 여러 단으로 이어지는 연분수에는 \cfrac{…}{…}가 있어 깊어져도 각 단이 읽을 만한 크기를 유지합니다. 이항계수는 \binom{n}{k}, 스타일 고정판은 \dbinom과 \tbinom입니다.
\[
\binom{n}{k} = \dfrac{n!}{k!\,(n-k)!},
\qquad \boldsymbol{\nabla} \cdot \boldsymbol{E} = \rho / \varepsilon_0.
\]\boldsymbol을 같은 절에 둔 데는 이유가 있습니다. 물리나 벡터 해석에서는 글자를 굵게 하고 싶을 때가 많은데, \mathbf{E}는 곧은 굵은 글자가 되고 그리스 문자에는 듣지 않습니다. amsbsy(amsmath가 함께 데려옵니다)의 \boldsymbol{E}는 기울임꼴을 유지한 채 굵게 하며, \boldsymbol{\nabla}처럼 기호에도 작동합니다. 분야에서 벡터를 굵은 기울임꼴로 쓴다면 \boldsymbol, 행렬과 텐서를 곧은 굵은 글꼴로 쓴다면 \mathbf을 고르면 됩니다. 식 번호를 절 번호와 잇는 \numberwithin{equation}{section}도 amsmath의 제공물이지만, 번호 이야기는 “별행·정렬·번호가 붙는 수식” 페이지에 맡깁니다.
amssymb와 AMSFonts — 기호를 더하는 짝
역할 분담은 분명합니다. amsmath는 조판 장치를, amssymb는 쓸 수 있는 기호를 늘립니다. amssymb는 AMS의 기호 글꼴 msam과 msbm에 든 기호를 모두 정의하여, 표준 LaTeX에 없는 수백 개의 글리프를 쓸 수 있게 합니다. \leqslant와 \geqslant(기울어진 부등호), \nleq와 \subsetneq, \therefore와 \because, \square와 \blacksquare, \varnothing 등입니다. 내부에서 amsfonts를 읽어 들이므로 amsfonts를 따로 쓸 필요는 없습니다.
\usepackage{amssymb}
\[
\mathbb{R} \subset \mathbb{C}, \qquad
\mathfrak{g} = \operatorname{Lie}(G)
\]AMSFonts는 수식 알파벳도 둘 들여옵니다. \mathbb{…}의 칠판 굵은 글꼴과 \mathfrak{…}의 프락투어입니다. 여기에 조용히 사고를 내는 함정이 있습니다. 칠판 굵은 글꼴에는 대문자밖에 없습니다. 게다가 \mathbb{k}는 오류를 내지 않습니다. amssymb.sty를 보면 AMSb 글꼴의 위치 "6B가 \daleth에 배정되어 있고, 실제로 컴파일하면 소문자 k가 아니라 히브리 문자 달렛 ℸ가 나옵니다. 칠판 굵은 글꼴의 소문자 k가 필요하면 전용으로 마련된 \Bbbk를 쓰세요. 프락투어는 대문자와 소문자가 모두 있어 \mathfrak{g}로 리 대수, \mathfrak{p}로 소 아이디얼을 자유롭게 쓸 수 있습니다.
프리앰블에 쓰는 세 줄
수식이 들어간 문서라면 다음 세 줄을 함께 두는 것이 정석입니다. amsmath(조판 장치), amssymb(기호와 칠판 굵은 글꼴·프락투어), 그리고 정리와 증명을 위한 amsthm입니다. 순서는 대체로 자유롭지만 amsthm은 amsmath 뒤에 둡니다. \qedhere 같은 기능이 amsmath의 별행 구조에 손을 대기 때문입니다.
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\begin{document}
\[
\zeta(s) = \sum_{n=1}^{\infty} \frac{1}{n^{s}}, \qquad s \in \mathbb{C}
\]
\end{document}| 패키지 | 역할 | 주요 제공 기능 |
|---|---|---|
amsmath | 수식 조판 장치 | 정렬 환경, \text, \operatorname, \dfrac, \binom, \boldsymbol |
amssymb | 기호와 수식 알파벳 | msam・msbm의 수백 개 기호, \mathbb, \mathfrak(amsfonts를 스스로 로드) |
amsfonts | 글꼴만 | \mathbb와 \mathfrak(추가 기호 없음) |
amsthm | 정리와 증명 환경 | \newtheorem, proof 환경, \theoremstyle, \qedhere |
amsmath는 이 밖에도 행렬 환경(pmatrix, bmatrix 등)과 크기가 자동으로 바뀌는 구분 기호를 제공하지만, 그것들은 각각 “행렬과 배열”, “합·적분·대형 연산자” 페이지에서 다룹니다. 마지막으로 하나. amsmath의 별행 환경은 내용을 매크로 인수로 한꺼번에 읽어 들이기 때문에, 그 안에 빈 줄을 두면 오류가 납니다. AMS의 기술 노트에 따르면 이 다단 처리 알고리즘은 Michael Spivak의 amstex.tex에서 물려받은 것입니다. 1980년대의 AMS-TeX가 오늘날 “빈 줄 금지”라는 규칙의 모습으로 살아 있는 셈입니다.