1675년 10월 29일, 라이프니츠는 초고에 ∫를 적었습니다. 이는 summa(합)의 머리글자 s를 세로로 길게 늘인 긴 s이며, 적분 기호가 본래 “더하기”의 기호였다는 사실을 그 모양이 지금도 말해 줍니다. 총합의 Σ를 도입한 사람은 오일러로, 1755년 『Institutiones calculi differentialis』 제1장에서였습니다. 그런데 LaTeX에서는 이 형제 같은 두 기호가 전혀 다르게 행동합니다. 별행 수식에서 \sum은 범위를 위아래로 쌓지만 \int는 옆에 둡니다. 게다가 그 비대칭은 \int의 정의 자체에 적혀 있습니다. 이 페이지에서는 \sum, \prod, \int, \oint, \bigcup 같은 대형 연산자에 대해 리미트가 붙는 원리, \limits・\nolimits를 통한 위치 제어, \substack을 이용한 여러 줄 조건, 그리고 \DeclareMathOperator로 만드는 사용자 정의 연산자까지 다룹니다.
대형 연산자란 무엇인가 — “리미트”는 첨자가 아닙니다
대형 연산자란 TeX이 \mathop 클래스로 분류한 기호를 말합니다. \sum, \prod, \int, \bigcup 등이 여기에 속하며, 그로 인해 두 가지 성질을 갖습니다. 첫째, 주변 스타일에 따라 큰 글리프와 작은 글리프를 오갑니다. 둘째, 붙은 아래첨자 _와 위첨자 ^를 보통의 첨자가 아니라 리미트로 다룹니다. x_i의 i는 글자 오른쪽 아래에 놓일 뿐이지만, \sum_{k=0}^{n}의 k=0과 n은 기호 바로 아래와 바로 위에 쌓일 수 있습니다. 어느 쪽이 되는지는 스타일과 기호의 종류가 정하며, 그것이 다음 절들의 주제입니다.
핵심 기호들은 표준 LaTeX(정확히는 그 바탕인 TeX)에 내장되어 있어 추가 패키지가 필요 없습니다. 다중적분 \iint・\iiint, 여러 줄 아래첨자를 만드는 \substack, 연산자를 정의하는 \DeclareMathOperator는 amsmath 패키지가 필요합니다. amsmath는 사실상의 표준이므로, 제대로 수식을 조판한다면 \usepackage{amsmath}를 프리앰블에 넣어 두는 편이 현실적입니다.
\sum과 \prod — 범위는 위아래인가, 옆인가
별행 수식이면 위아래, 본문 안이면 옆입니다. 총합은 \sum, 총곱은 \prod, 쌍대곱은 \coprod이며 범위는 아래첨자 _와 위첨자 ^로 줍니다. \sum_{k=0}^{n} a_k를 \[ … \]에 넣으면 Σ가 크게 조판되고 k=0이 바로 아래, n이 바로 위에 올라갑니다. 같은 식을 $ … $로 본문에 넣으면 Σ는 작아지고 k=0과 n은 오른쪽 옆에 위아래로 놓입니다. 상자를 재 보면 차이가 한눈에 들어옵니다. 디스플레이에서는 너비 14.54521pt·높이 16.51393pt·깊이 13.02782pt로 세로로 길고, 본문에서는 너비 25.6008pt·높이 8.04175pt·깊이 3.00005pt로 가로로 깁니다. 세로로 길면 위아래, 가로로 길면 옆인 셈입니다.
% displayed: limits stack above and below
\[
\sum_{k=0}^{n} a_k = a_0 + a_1 + \dots + a_n,
\qquad \prod_{k=1}^{n} k = n!
\]
% inline: the same sum keeps its limits at the side
The series $\sum_{k=0}^{n} a_k$ fits inside the line.이 위아래와 옆의 전환은 스타일에 연동된 기본 동작입니다. 총합·총곱·쌍대곱 등 이른바 sum 클래스 기호는 디스플레이 스타일에서만 리미트를 위아래로 쌓고, 텍스트 스타일에서는 옆에 둡니다. amsmath는 이 방식을 displaylimits라고 부릅니다. 행간을 공연히 벌리지 않는, 잘 고른 기본값입니다. 범위가 한쪽뿐이면 한쪽만 쓰면 되고, \sum_{i \in S}처럼 조건을 아래 한계에 넣을 수도 있습니다. 주의할 점은 내용이 토큰 두 개 이상이면 반드시 { }로 감싸는 것입니다. \sum_k=1이라고 쓰면 k만 아래첨자가 되고 =1은 기호 오른쪽으로 흘러나옵니다.
적분의 위아래에 조건 쓰기 — \int가 \intop\nolimits인 이유
적분 기호 \int는 별행 수식에서도 리미트를 옆에 둡니다. 총합과 다른 이 동작은 우연이 아니라 정의에 직접 적혀 있는 것입니다. LaTeX의 fontmath.ltx 253~254행에는 \DeclareMathSymbol{\intop}{\mathop}{largesymbols}{"52}에 이어 \DeclareRobustCommand\int{\intop\nolimits}가 있습니다. 즉 \int는 적분 글리프 \intop에 \nolimits를 붙인 것이며, 수학의 관례가 명령 안에 새겨져 있는 셈입니다. 260~261행의 \oint도 구조가 같아 \ointop\nolimits입니다. 뒤집어 보면 탈출구가 됩니다. 맨 글리프 \intop나 \ointop을 직접 쓰면 sum 클래스의 기본값으로 돌아갑니다. 실측에서도 디스플레이의 \int_0^1은 너비 14.48615pt·높이 15.65013pt인 반면 \intop_0^1은 너비 10.00002pt·높이 21.12231pt·깊이 15.789pt로, 가로로 퍼지느냐 세로로 뻗느냐가 뚜렷이 갈렸습니다.
\[
\int_{0}^{\infty} e^{-x}\,dx = 1,
\qquad \oint_{C} \mathbf{F}\cdot d\mathbf{r},
\qquad \intop_{0}^{1} x^2\,dx
\]다중적분은 \int\int처럼 늘어놓아도 조판되지만 기호 사이 간격이 늘어져 보입니다. amsmath는 간격을 좁힌 전용 명령을 마련해 두었습니다. 이중 \iint, 삼중 \iiint, 사중 \iiiint, 그리고 두 적분 기호 사이에 점을 찍는 \idotsint(∫⋯∫)입니다. 좁힌 정도는 잴 수 있습니다. 디스플레이에서 \int\int는 너비 21.66666pt, \iint는 16.66678pt로, 정확히 5pt, 즉 10pt 조판의 1/2em만큼 당겨져 있습니다. \iiint는 23.33354pt, \iiiint는 30.0003pt, \idotsint는 34.9999pt였습니다. 물리에서 자주 쓰는 폐곡면·폐체적 적분 기호가 필요하면 esint 패키지가 \oiint(폐곡면), \varoiint, \sqint, \sqiint, \ointclockwise, \ointctrclockwise, \fint 등을 더해 줍니다. \oiiint는 esint에 들어 있지 않습니다. 삼중 폐적분이 필요하면 다른 글꼴 계열 패키지를 찾아야 합니다. 순정 LaTeX에서 쓸 수 있는 것은 \oint뿐입니다.
% preamble: \usepackage{amsmath}
\[
\iint_{D} f(x,y)\,dx\,dy,
\qquad \iiint_{V} f\,dV,
\qquad \iiiint f, \qquad \idotsint_{A} f\,dV
\]\limits와 \nolimits — 위치를 강제하는 두 명령
기본값을 덮어쓰려면 연산자 뒤에 \limits(위아래로 강제)나 \nolimits(옆으로 강제)를 씁니다. 본문 속 총합을 위아래로 쌓고 싶으면 \sum\limits_{k=1}^{n}, 반대로 별행 적분의 위아래에 조건을 쓰고 싶으면 \int\limits_0^1입니다. 뒤의 것은 앞 절에서 본 대로 맨 \intop과 같은 결과가 되며, 실측에서도 둘 다 너비 10.00002pt·높이 21.12231pt·깊이 15.789pt로 일치했습니다. 스타일 연동 기본값으로 되돌리려면 \displaylimits를 씁니다.
% force limits above and below inside running text
The partial sum $\sum\limits_{k=1}^{n} k$ sits in the line.
% force limits above and below on a displayed integral
\[
\int\limits_{0}^{1} x^2\,dx = \frac{1}{3}
\]놓는 자리에는 규칙이 있습니다. \limits는 \mathop 바로 뒤에 와야 하며, 그렇지 않으면 ! Limit controls must follow a math operator.로 멈춥니다(TeX은 이어서 I'm ignoring this misplaced \limits or \nolimits command.라고 알려 줍니다). 예컨대 x\limits^2나 \frac{1}{2}\limits가 이 오류를 냅니다. 한편 흔한 오해로 “첨자보다 뒤에 쓰면 오류”라는 말이 있지만 이는 사실이 아닙니다. \sum_{k=1}\limits^{n}은 문제없이 통과하며, 실측에서도 \sum\limits_{k=1}^{n}과 같은 상자(너비 14.54521pt·높이 16.51393pt·깊이 13.02782pt)가 되었습니다. 바로 앞에 있는 원자가 여전히 연산자이기 때문입니다. 그렇더라도 읽는 사람에게나 자신에게나 연산자 바로 뒤가 알아보기 쉬우니 그쪽을 습관으로 삼으세요. 또 \limits・\nolimits・\displaylimits가 잇따라 나오면 마지막 것이 이깁니다. \sum\limits\nolimits_{k=1}^{n}은 옆에, \sum\nolimits\limits_{k=1}^{n}은 위아래에 놓였습니다. 다만 이 규칙에는 예외가 하나 있습니다. \log이나 \lim 같은 함수 이름 뒤에서는 amsmath를 읽어 들인 상태에서 \limits가 조용히 무시됩니다. amsopn.sty가 \@ifnextchar\limits{\nolimits\@gobble}로 삼켜 버리기 때문이며, 오류도 경고도 나지 않습니다. 실측하면 amsmath가 없을 때 \log\limits_{k}x의 깊이는 9.4722pt이지만, amsmath를 읽으면 \log_{k}x와 똑같은 2.44443pt에 머뭅니다. 함수 이름 아래에 첨자를 두려면 \DeclareMathOperator*를 쓰십시오.
문서 전체의 방침을 바꾸고 싶다면, 명령을 매번 쓰는 대신 amsmath의 패키지 옵션을 쓸 수 있습니다. amsmath.sty 46~49행이 intlimits/nointlimits/sumlimits/nosumlimits를 선언하고, 92~93행의 \ExecuteOptions가 기본값을 nointlimits, sumlimits로 설정합니다. 지금까지 설명한 동작 그대로입니다. \usepackage[intlimits]{amsmath}라고 쓰면 문서 안의 모든 별행 적분이 리미트를 위아래로 쌓습니다. 실제로 해 보니 디스플레이의 \int_0^1이 너비 10.00002pt·높이 21.12231pt·깊이 15.789pt가 되어 \intop_0^1과 일치했습니다. 반대로 nosumlimits를 넘기면 총합도 옆에 놓입니다. 개별 수식마다 \limits를 흩뿌리기 전에, 문서 전체의 방침으로 이쪽을 검토할 가치가 있습니다.
| 기호 / 명령 | 별행(디스플레이) | 본문(텍스트) |
|---|---|---|
\sum, \prod, \bigcup | 위아래로 쌓임 | 오른쪽 옆에 붙음 |
\int, \oint, \iint | 오른쪽 옆에 붙음(정의에 \nolimits가 들어 있음) | 오른쪽 옆에 붙음 |
\intop, \ointop | 위아래로 쌓임(\nolimits가 붙지 않은 맨 글리프) | 오른쪽 옆에 붙음 |
\limits | 위아래로 강제. 연산자 바로 뒤에 둠 | 위아래로 강제 |
\nolimits | 오른쪽 옆으로 강제. 연산자 바로 뒤에 둠 | 오른쪽 옆으로 강제 |
\displaylimits | 스타일 연동 기본값으로 복귀(위아래로 쌓임) | 스타일 연동 기본값으로 복귀(오른쪽 옆) |
\lim 일가 — 정체로 조판되고 아래에 조건이 붙습니다
\lim(극한), \limsup(상극한), \liminf(하극한)은 함수 이름과 마찬가지로 정체(로만)로 조판되는 연산자이지만, 첨자의 처리는 sum 클래스와 같습니다. 별행에서는 아래첨자가 바로 아래에, 본문에서는 오른쪽 아래에 붙습니다. \limsup과 \liminf는 “lim sup”, “lim inf”라는 두 단어로, 사이에 알맞은 간격을 두고 조판됩니다. \sup, \inf, \max, \min도 같은 일가로 첨자를 아래에 둡니다(함수 이름 목록은 별도 페이지 “수식 모드의 기본”에도 정리되어 있습니다). 화살표 →는 \to, 무한대는 \infty입니다.
\[
\lim_{n \to \infty} \frac{1}{n} = 0,
\qquad \limsup_{n \to \infty} a_n \ge \liminf_{n \to \infty} a_n,
\qquad \sup_{x \in X} f(x)
\]\bigcup 계열의 n항 연산자 — 이항 연산자에 big을 붙일 뿐
집합론·논리·대수에서 쓰는 n항 연산자에도 \sum처럼 크게 조판되는 판이 있습니다. 이름 짓기는 기계적이어서, 대응하는 이항 연산자의 이름 앞에 big을 붙일 뿐입니다. 이항 합집합 \cup(A ∪ B)에 대응하는 가변 크기판이 \bigcup입니다. 이들은 모두 sum 클래스라서 별행에서는 리미트를 위아래로 쌓고 본문에서는 옆에 둡니다. 실측에서도 디스플레이의 \bigcup_{i=1}^{n}은 너비 12.95433pt·높이 16.51393pt·깊이 12.79865pt로 \sum과 거의 같은 세로로 긴 상자가 되었습니다.
| 명령 | 의미 | 대응하는 이항 연산자 |
|---|---|---|
\bigcup | 합집합(n항) | \cup (∪) |
\bigcap | 교집합(n항) | \cap (∩) |
\bigsqcup | 분리합집합 | \sqcup (⊔) |
\biguplus | 다중집합 합 | \uplus (⊎) |
\bigvee | 논리합 / 상한 | \vee (∨) |
\bigwedge | 논리곱 / 하한 | \wedge (∧) |
\bigoplus | 직합(원 안의 +) | \oplus (⊕) |
\bigotimes | 텐서곱(원 안의 ×) | \otimes (⊗) |
\bigodot | 원 안의 점(n항) | \odot (⊙) |
\[
\bigcup_{i=1}^{n} A_i, \qquad
\bigcap_{i \in I} A_i, \qquad
V = \bigoplus_{k} V_k
\]총합 아래에 조건을 두 줄 쓰기 — \substack과 subarray
amsmath의 \substack{…}를 아래첨자 자리에 통째로 놓습니다. \\로 나눈 각 줄이 가운데 정렬로 세로로 쌓이므로, 예컨대 “0 ≤ i ≤ m”과 “0 < j < n”을 Σ 바로 아래에 두 줄로 놓을 수 있습니다. 마지막 줄 뒤에는 \\를 붙이지 않습니다. 왼쪽 정렬을 원하면 더 일반적인 subarray 환경을 써서 \begin{subarray}{l} … \end{subarray}라고 씁니다. {l}이 왼쪽 정렬, {c}가 가운데 정렬이며 줄 나눔은 \substack과 마찬가지로 \\입니다. 실은 \substack의 정의 자체가 \subarray{c}…\endsubarray이므로, 둘은 같은 장치의 다른 얼굴일 뿐입니다. 한편 기호 위나 아래에 괄호나 선을 두르는 \overbrace・\underbrace・\overline은 다른 이야기로, 별도 페이지 “위아래 장식”이 담당합니다. 여기서 다루는 것은 어디까지나 연산자의 리미트입니다.
% preamble: \usepackage{amsmath}
\[
\sum_{\substack{0 \le i \le m \\ 0 < j < n}} P(i,j)
\qquad
\sum_{\begin{subarray}{l} i \in \Lambda \\ 0 < j < n \end{subarray}} P(i,j)
\]argmax를 직접 정의하기 — \DeclareMathOperator*의 별표가 뜻하는 것
별표의 유무가 조건을 바로 아래에 둘지 오른쪽 아래에 둘지를 정합니다. 표준에 없는 연산자 이름——argmax, argmin, esssup 등——을 정체로 조판하고 \lim처럼 첨자를 바로 아래에 두고 싶다면, amsmath의 \DeclareMathOperator*로 프리앰블에서 한 번 선언한 뒤 본문에서는 짧은 명령으로 부릅니다. 별표를 붙이지 않으면 첨자는 이름 오른쪽 아래에 붙습니다. 실측에서도 \operatorname*{argmax}_{\theta}의 상자는 깊이 9.4722pt로 아래로 뻗은 반면, 별표 없는 \operatorname{argmax}_{\theta}는 너비 37.05215pt·깊이 2.44443pt로 오른쪽으로 뻗었습니다. 한 번만 쓸 용도라면 선언 없이 \operatorname{rank}를 바로 써도 됩니다(리미트를 아래에 두려면 \operatorname*{…}).
% in the preamble:
\usepackage{amsmath}
\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator{\rank}{rank}
% in the body:
\[
\hat{\theta} = \argmax_{\theta} L(\theta),
\qquad \rank A \le n,
\qquad \sideset{}{'}\sum_{n} a_n
\]이름 텍스트에는 전용 약속이 있습니다. 하이픈 -은 본문의 하이픈으로(마이너스 기호가 아니라), 별표 *는 올려 쓴 텍스트 별표로(가운데 정렬된 이항 연산자가 아니라) 조판됩니다. arg\,max의 \,는 두 단어 사이에 넣는 가는 여백입니다. 함수 이름은 \text{…}가 아니라 \DeclareMathOperator나 \mathrm으로 조판하는 것이 정석이며, 그러면 앞뒤 간격이 자동으로 조정되고 정리 환경 같은 이탤릭 문맥에서도 정체로 남습니다. 끝으로 sum 클래스 기호의 네 모서리에 첨자를 두고 싶을 때——예컨대 Σ에 프라임(′)을 붙이고 싶을 때——는 amsmath의 \sideset을 쓸 수 있습니다. \sideset{}{'}\sum_{n} a_n이라고 쓰면 아래에 리미트를 둔 채 Σ 오른쪽 위에 프라임이 붙습니다. 첫 인수가 왼쪽 두 모서리, 둘째 인수가 오른쪽 두 모서리이며, 각 인수 안에서는 _{아래}^{위}로 나누어 씁니다. sum 클래스 전용이라는 점에 주의하세요.