수식 모드 기초

닫는 $를 하나 빠뜨리면 LaTeX는 잘못된 자리를 짚어 주지 않습니다. 문단 끝까지 달려간 뒤에야 ! Missing $ inserted.라고 말하고, 출력에서는 단어들이 기울임꼴로 달라붙어 버립니다. 수식 모드의 본질이 여기에 있습니다. 수식 모드는 글꼴을 바꾸는 것이 아니라 규칙 자체를 바꾸는 장치입니다. 입력한 공백은 사라지고, 글자는 변수 이름이 되며, +=는 앞뒤에 정해진 간격을 갖게 됩니다. 이 페이지에서는 LaTeX 수식 모드로 들어가는 두 입구, 곧 줄 안의 $…$\(…\), 별행의 \[…\]를 정리하고, $$…$$만은 피해야 하는 이유와 수식 안에 보통 단어를 넣으려면 \text{}가 필요한 이유를 살펴봅니다.

수식 모드에 들어가면 무엇이 달라지는가

달라지는 것은 세 가지입니다. 입력한 공백이 사라지고, 모든 글자가 변수 이름이 되어 수식 이탤릭으로 조판되며, 모든 기호에 “종류”가 부여되어 앞뒤 간격이 자동으로 계산됩니다. 그래서 a+ba + b는 털끝만큼도 다르지 않은 같은 결과가 되고, 반대로 log x라고 입력하면 “logx”, 즉 l・o・g・x 네 변수의 곱이 나옵니다. 함수로서 \log x라고 쓰면 log는 곧은 글꼴로 조판되고 x 앞에 가는 공백이 들어갑니다. 같은 세 글자라도 TeX에게는 전혀 다른 물건입니다.

latex
% identical output: spaces in the source are ignored
$a+b$ \qquad $a  +  b$

% "logx" (four variables) vs. the function name
$log x$ \qquad $\log x$

이 “종류”는 TeX의 핵심 장치입니다. 수식 안의 요소는 모두 보통 원자(Ord), 큰 연산자(Op), 이항 연산자(Bin), 관계 기호(Rel), 여는 기호, 닫는 기호, 구두점 가운데 하나로 분류되고, 이웃한 둘의 간격은 그 조합으로 표에서 찾아옵니다. =는 관계 기호이므로 양옆에 \thickmuskip, 기본값으로 5mu가 들어갑니다. 10pt 문서에서는 18mu가 1em 곧 10pt이므로, 한쪽당 2.78pt가 됩니다. 숫자를 외울 필요는 없지만 간격은 의미에서 나온다는 발상은 기억해 둘 만합니다. 손으로 간격을 넣고 싶을 때는 \,(가는 공백), \;, \quad, \qquad를 씁니다.

이 규칙은 수식 모드 안에서만 작동합니다. 그래서 본문에 곧바로 \to\alpha라고 쓰면 오류가 납니다. 보기 나쁜 정도가 아니라 수식 모드 밖에서는 간격 규칙 자체가 존재하지 않기 때문입니다. 실제로 A \to B를 본문에 쓰면 pdflatex는 ! Missing $ inserted.라고 답합니다. 수학 기호를 쓰려면 먼저 수식 모드로 들어가야 합니다. 이제 그 입구 이야기입니다.

인라인 수식은 $…$\(…\) 중 무엇으로 쓸까

출력은 완전히 같습니다. 다른 것은 틀렸을 때 무슨 일이 일어나는가뿐입니다. $는 TeX에서 범주 코드 3, 이른바 “수식 시프트”이며 여는 기호와 닫는 기호가 같은 한 글자입니다. 즉 $는 괄호가 아니라 토글입니다. 반면 \(\)latex.ltx에서 서로 다른 매크로로 정의되어 있고, 각각 “지금 수식 모드인가”를 확인한 뒤에 동작합니다. 구분자를 빠뜨렸을 때 둘의 거동이 근본적으로 다른 이유가 여기에 있습니다.

latex
% one closing $ dropped: this compiles, and prints "We compare xandyinthetext."
We compare $x and $y$ in the text.

% the same mistake with \( \): pdflatex stops on this very line
We compare \( x and \( y \) in the text.

위 첫 줄이 무서운 이유는 바로 컴파일이 통과된다는 점입니다. TeX는 첫 $부터 두 번째 $까지를 수식으로 읽어 “x and ”의 공백을 모두 버리고 기울임꼴로 조판하며, 남은 $는 문단 끝에서 걸려 ! Missing $ inserted.를 냅니다. 보고되는 줄 번호는 \end{document}를 가리키고, 지면에는 “We compare xandyinthetext.”가 찍힙니다. 둘째 줄은 같은 실수지만, 두 번째 \(가 이미 수식 모드임을 알아채고 바로 그 줄에서 ! LaTeX Error: Bad math environment delimiter.를 냅니다. 긴 문단을 눈으로 훑지 않아도 된다는 차이는 실무에서 생각보다 큽니다.

실무 판단은 이렇습니다. 새로 쓰기 시작하는 문서, 특히 수식이 많은 문서에서는 \(…\)를 기본으로 삼습니다. 짧은 $…$는 어디서나 통하고 편집기가 짝을 색으로 구분해 준다면 충분히 쓸 만하며, 기존 원고를 바꿔 쓸 이유는 되지 않습니다. 환경 형태인 \begin{math}…\end{math}도 같은 일을 하지만 줄 안에 놓기에는 너무 길어 거의 쓰이지 않습니다. 본문에 달러 기호 자체를 찍고 싶다면 \$라고 씁니다.

별행 수식은 \[…\]로 조판합니다

중요하거나 덩치가 큰 수식은 문단에서 떼어 독립된 줄에 조판합니다. 번호가 필요 없으면 \[\], 번호가 필요하면 equation 환경입니다. \[…\]는 환경 형태인 displaymath와 완전히 같은 물건으로, 기본은 가운데 정렬이고 문서 클래스에 fleqn 옵션을 주면 왼쪽 정렬이 됩니다. 위아래에는 \abovedisplayskip\belowdisplayskip, 10pt 문서에서는 각각 10pt의 여백이 들어가며, 이 세로 공기가 별행 수식다움의 정체입니다.

latex
The following identity holds.
\[
  \int_0^1 x^2 \, dx = \frac{1}{3}
\]
It is one of the first integrals anyone computes.

알고 나면 나머지가 맞아떨어지는 사실이 하나 있습니다. amsmath를 읽어 들이면 \[\]equation* 환경 그 자체로 바뀝니다. amsmath.sty의 마지막 두 줄이 \DeclareRobustCommand{\[}{\begin{equation*}}\DeclareRobustCommand{\]}{\end{equation*}}입니다. 그러므로 amsmath 아래에서 “\[…\]equation* 중 무엇을 쓸까”라는 물음은 내용이 없습니다. 같은 물건이기 때문입니다. equation\[…\] 사이의 선택은 오로지 번호가 필요한가로 결정하면 됩니다.

표기번호비고
\[ … \]없음LaTeX의 표기. amsmath 아래에서는 equation* 자체
displaymath없음\[ \]와 같은 환경 형태. 길어서 잘 쓰지 않음
equation있음일련번호 자동 부여. \label을 붙이면 \ref\eqref로 참조 가능
equation*없음amsmath 필요. amsmath 아래 \[ \]의 정체
$$ … $$없음plain TeX 표기. 쓰지 않습니다(다음 절)

$$…$$만은 쓰면 안 되는 이유

$$…$$plain TeX이 별행 수식을 여는 방식이며, LaTeX가 저자용으로 문서화한 적은 한 번도 없습니다. 금지된 것은 아닙니다. 오히려 LaTeX 자신이 내부에서 씁니다. latex.ltx에는 \def\equation{$$\refstepcounter{equation}}이라고 적혀 있어, equationeqnarray도 속은 $$입니다. 문제는 직접 $$를 쓰면 LaTeX의 매크로 층을 그대로 지나쳐 버린다는 점입니다. 클래스 옵션도 amsmath의 장치도 바로 그 층에 얹혀 있습니다.

  • fleqn 옵션이 듣지 않습니다. fleqn.clo가 재정의하는 것은 정확히 네 가지, \[\]equationeqnarray뿐이고 $$에는 손대지 않습니다. [fleqn]을 준 article에서 실측하면 \[a=b\]는 왼쪽 여백에서 25pt 지점에서 시작하는데 $$a=b$$는 그대로 가운데에 남아, 지면에서 135pt나 벌어집니다.
  • 세로 간격이 달라집니다. \[는 문단 첫머리에 놓이면 $$를 실행하기 전에 줄 너비의 0.6배짜리 보이지 않는 상자를 슬며시 끼워 넣습니다. TeX에게 “앞 줄이 길었다”고 믿게 하려는 장치이며, 이것이 없으면 TeX는 짧은 쪽 간격(\belowdisplayshortskip, 6pt)을 고릅니다. 실측에서도 $$ 쪽은 아래 여백이 정확히 4pt 좁았습니다.
  • \qedhere가 엉뚱한 자리에 놓입니다. amsthm의 proof 환경에서 마지막 수식에 \qedhere를 두면 \[…\] 안에서는 증명 종료 기호가 오른쪽 여백에 붙습니다. $$…$$ 안에서는 기호가 수식에 달라붙고, 그만큼 수식 전체가 가운데에서 밀립니다.
  • amsmath가 더해 준 것이 통째로 빠집니다. amsmath 아래의 \[는 곧 equation*이므로, $$를 쓰는 순간 \tag, \qedhere, 번호 자동 회피가 딛고 선 토대를 버리게 됩니다.

AMS의 Short Math Guide for LaTeX(version 2.0, 2017/12/22, TeX Live 2024 동봉)도 같은 입장으로, $$ 사용을 강하게 만류하며 두 가지 이유를 듭니다. LaTeX 명령 집합의 일부로 어디에도 문서화되어 있지 않다는 점, 그리고 fleqn 같은 기능의 정상 동작을 방해한다는 점입니다. 정리는 짧습니다. 번호 없는 별행 수식은 \[…\], 번호 있는 것은 equation. $$로 가득한 원고를 이어받았다면 지금 기계적으로 바꿔 두는 편이 낫습니다. 나중에 fleqn이나 증명 환경을 넣는 날이 조용히 지나갑니다.

수식 안에 단어 넣기 — \text{}가 필요한 이유

수식 모드에서는 글자가 변수이므로 if라고 쓰면 i와 f의 곱, area라고 쓰면 네 변수의 곱이 됩니다. 단어를 단어로, 곧 곧은 글꼴로 올바른 간격과 함께 놓으려면 amsmath\text{…}를 씁니다. 그 안은 본문과 같은 서체·같은 간격으로 조판되고, 안에 입력한 공백도 살아 있어 \text{ for all }은 양옆의 여백을 그대로 지킵니다. 반대로 \text{…} 안에서 $…$를 쓰면 그 부분만 다시 수식으로 돌아갑니다.

latex
\[
  f(x) = x^2 \quad \text{for all } x \in \mathbb{R},
  \qquad v_{\text{max}} = 3.
\]

\text의 장점은 주위의 크기를 따라간다는 점입니다. amstext.sty의 정의는 \mathchoice를 써서 디스플레이・텍스트・첨자・이중 첨자 네 문맥에 각각 다른 글꼴 크기를 배정합니다. 위 예의 v_{\text{max}}에서 “max”를 재면 높이 6.19pt, 곧 첨자 크기인데, 같은 것을 \mbox{max}로 쓰면 8.85pt가 되어 본문 크기 그대로 첨자 자리에 눌러앉아 주위에서 붕 뜹니다. \mbox는 “상자에 넣는다”는 범용 명령이지 수식용 도구가 아닙니다. 또한 \text는 본문 모드에서 불리면 \mbox로 물러나므로, 어느 모드에서 쓰일지 모르는 매크로 안에서도 안전합니다. amsmath를 읽어 들이는 것을 잊으면 ! Undefined control sequence.가 납니다.

텍스트 스타일과 디스플레이 스타일 — 같은 식이 달라 보이는 이유

수식 모드에는 네 가지 스타일이 있고 TeX가 문맥에서 자동으로 고릅니다. 줄 안에서는 줄 높이를 망가뜨리지 않을 만큼 작은 텍스트 스타일, 별행에서는 여유 있는 디스플레이 스타일, 첨자는 스크립트 스타일, 첨자의 첨자는 스크립트스크립트 스타일입니다. 같은 \sum_{i=1}^{n}이 인라인에서는 범위가 기호 오른쪽에 작게 붙고 별행에서는 위아래에 크게 붙는 이유가 여기에 있습니다.

  • 합과 적분의 범위: 디스플레이 스타일에서는 \sum의 범위가 기호의 위아래에, 텍스트 스타일에서는 오른쪽에 붙습니다. \int도 같은 방식으로 자리가 바뀝니다.
  • 분수: \frac는 디스플레이 스타일에서 크고 텍스트 스타일에서 작고 조밀합니다. 문맥과 무관하게 크기를 고정하려면 amsmath의 \dfrac\tfrac를 씁니다.
  • 첨자: 중첩될 때마다 한 단계씩 작아지며, 스크립트스크립트 스타일보다 더 작아지지는 않습니다.

스타일은 \displaystyle, \textstyle, \scriptstyle, \scriptscriptstyle으로 손수 바꿀 수도 있습니다. 흔한 경우는 본문 안에서 합의 범위를 위아래로 내보내고 싶을 때 쓰는 $\displaystyle\sum_{i=1}^{n} i$입니다. 다만 본문에 \displaystyle을 흩뿌리면 줄 높이가 들쭉날쭉해져 문단이 출렁입니다. 그 한 곳이 정말 필요로 할 때에만 쓰는 것이 정석입니다.

latex
% limits sit at the right of the sign
Inline: $\sum_{i=1}^{n} i$

% limits forced above and below
Forced: $\displaystyle\sum_{i=1}^{n} i$

함수 이름은 \sin처럼 명령으로 씁니다

앞의 규칙들의 귀결로, sin x라고 치는 것은 s・i・n・x의 곱을 쓰는 일입니다. 올바른 방법은 \sin 같은 전용 명령입니다. LaTeX는 주요 함수·연산자 이름을 미리 정의해 두었고, 모두 곧은 글꼴로 조판되며 뒤에 가는 공백이 자동으로 붙습니다. \mathrm{sin}으로 겉모습만 곧게 만들어서는 이 공백이 생기지 않습니다. 실측하면 \log x는 “log”와 “x” 사이에 1.8pt를 두는데, \mathrm{log} x는 “logx”로 붙어 나옵니다.

  • 삼각·쌍곡선: \sin \cos \tan \cot \sec \csc, \sinh \cosh \tanh \coth, 역함수 \arcsin \arccos \arctan.
  • 로그·지수: \log \ln \lg \exp.
  • 극한과 상하한: \lim \limsup \liminf \sup \inf \max \min \varinjlim \varprojlim.
  • 대수 등: \arg \det \dim \gcd \ker \hom \deg \Pr, 나머지 연산의 \bmod\pmod.
latex
\[
  \lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^{n} = e,
  \qquad \sin^2\theta + \cos^2\theta = 1.
\]

이 목록의 일부, 곧 \lim, \max, \min, \sup, \inf, \det, \gcd, \Pr 등은 디스플레이 스타일에서 첨자를 바로 아래에 놓습니다. \lim_{n\to\infty}가 별행에서는 “lim” 바로 밑에, 인라인에서는 오른쪽 아래에 붙는 이유입니다. 목록에 없는 rankHom 같은 연산자를 직접 더하고 싶다면 amsmath의 \operatorname{…}\DeclareMathOperator를 씁니다. 그것은 amsmath 페이지의 이야기입니다.