LaTeX 수식의 공백은 단 세 개의 수에서 나옵니다. fontmath.ltx의 마지막 세 줄——\thinmuskip=3mu, \medmuskip=4mu plus 2mu minus 4mu, \thickmuskip=5mu plus 5mu입니다. 가는 공백・중간 공백・굵은 공백의 3・4・5가 a+b의 + 주위도, a=b의 = 주위도 정합니다. 게다가 중간 공백은 마이너스 4 mu까지 줄어들 수 있습니다. 즉 완전히 사라질 수도 있다는 뜻인데, 여기까지 적어 둔 자료는 많지 않습니다. 이 페이지에서는 위 첨자 ^와 아래 첨자 _의 규칙, 그리고 \, \: \; \! \quad \qquad의 실제 치수를 모두 재어 늘어놓습니다. “latex 공백 조정”으로 오셨든 ! Double superscript 때문에 오셨든 답은 여기 있습니다.
^와 _는 바로 다음 한 토큰에만 걸립니다
수식 모드에서 ^는 위 첨자, _는 아래 첨자를 만들지만, 걸리는 범위는 바로 뒤의 한 토큰——문자 하나 또는 명령 하나——뿐입니다. 두 글자 이상을 올리거나 내리려면 중괄호 { }로 한 덩어리로 묶습니다. 곤란한 점은 잊어도 오류가 나지 않는다는 것입니다. x^{10}은 “10” 전체가 지수가 되지만, 중괄호를 뺀 x^10은 “1”만 올라가고 “0”은 본문 크기 그대로 남습니다. 조용히 통과하므로 인쇄하고 나서야 알아차리는 종류의 사고입니다. 두 글자 이상의 첨자에는 반드시 중괄호를——손이 기억할 때까지 의식하십시오.
$x^{10}$ % the whole 10 is the exponent
$x^10$ % only the 1 is raised; the 0 stays full size
$a_{ij}$ % ij together as one subscript
$2^{n+1}$ % n+1 as one exponent
$x_i^2$ % both scripts; the order does not matter하나의 기호는 위 첨자와 아래 첨자를 동시에 가질 수 있습니다. x_i^2로 쓰든 x^2_i로 쓰든 LaTeX은 같은 방식으로 쌓습니다. 첨자는 중첩도 되지만 단계마다 중괄호가 필요합니다. x^{y^z}에서는 z가 y의 지수이고, 그 y^z 전체가 x의 지수입니다. 중괄호를 뺀 x^y^z는 다음 절의 오류가 됩니다. 한편 \sum이나 \lim 같은 대형 연산자에서는 ^ _가 기호의 바로 위・바로 아래로 옮겨 갈 수 있고, \limits/\nolimits로 그 위치를 강제할 수 있습니다. 이 동작은 연산자 쪽 이야기이므로 합・적분・대형 연산자 페이지에 맡깁니다.
! Double superscript.와 ! Double subscript.
같은 바탕에 위 첨자를 두 번 붙이려 할 때 나오는 오류입니다. $x^y^z$를 컴파일하면 TeX Live 2024의 pdfLaTeX은 ! Double superscript.로 멈추고, 아래 첨자라면 $x_i_j$가 ! Double subscript.가 됩니다. 둘 다 “이 바탕에는 이미 첨자가 붙어 있다”는 뜻입니다. 고치는 방법은 의도한 중첩을 중괄호로 다시 쓰는 것입니다. x^{y^z}이면 z가 y의 지수이고, {x^y}^z이면 x^y 전체를 z제곱한 형태입니다. 이 둘은 수학적으로 다른 것이므로, 오류만 없애려고 아무 데나 중괄호를 두면 식의 뜻이 바뀝니다.
도함수의 프라임 f'(x) — f^'이라고 쓰면 안 되는 이유
아포스트로피 '를 치기만 하면 됩니다. 그 자체가 이미 위 첨자이므로 ^를 따로 붙여서는 안 됩니다. latex.ltx는 수식 안의 '를 활성 문자로 만들어 ^\bgroup\prim@s로 전개하며, 실측에서도 f'(x)와 f^{\prime}(x)가 모두 22.27089 pt로 완전히 일치합니다. 이계는 f''(x), 삼계는 f'''(x)입니다. 재미있는 것은 이 장치가 바로 뒤의 ^를 삼킨다는 점입니다. f'^2는 오류가 나지 않고 f^{\prime2}와 같은 12.76395 pt로 조판됩니다. 그러니 “프라임 다음에 제곱”을 의도했다면 결과가 뜻대로인지 확인하고 쓰십시오.
기호 왼쪽에 첨자 놓기 — {}^{A}_{Z}X와 \sideset
동위원소 표기처럼 기호의 왼쪽에 위 첨자・아래 첨자를 내고 싶을 때는 빈 중괄호 {}를 바탕으로 씁니다. {}^{14}_{6}\mathrm{C}라고 쓰면 {}가 “너비 0의 보통 기호”로 놓이고 거기에 첨자가 붙은 뒤 C가 이어집니다. 이 {}를 빼면 첨자가 바로 앞에 있는 것에 제멋대로 붙어 버립니다. = ^{14}_{6}C처럼 쓰면 첨자가 =에 매달리고, 앞의 것이 이미 첨자를 달고 있으면 ! Double superscript.가 됩니다. 대형 연산자의 좌우에 첨자를 나누어 두려면 amsmath의 \sideset{_a^b}{_c^d}\sum을 쓰지만, 이는 연산자 쪽 도구이므로 자세한 것은 합・적분 페이지를 보십시오. mathtools의 \prescript도 같은 용도의 다른 답입니다.
\[
{}^{14}_{6}\mathrm{C}, \qquad {}^{t}\!A, \qquad
x^{y^z} \ne {x^y}^z, \qquad f''(x)
\]mu라는 단위 — 1 mu는 1/18 em이며 첨자 안에서는 줄어듭니다
1 mu는 1/18 em, 곧 18 mu가 정확히 1 em입니다. 여기서 말하는 em은 수식 기호 폰트의 크기에 묶여 있으므로, mu로 적힌 공백은 글자 크기를 따라갑니다. 10 pt article에서 a\,b와 ab의 너비 차를 재면 1.66662 pt——3 mu = 1/6 em = 1.6667 pt와 일치합니다. 같은 \,를 위 첨자 안에 넣은 x^{a\,b}에서는 1.36574 pt, 한 단계 더 깊은 첨자에서는 1.22685 pt까지 줄어듭니다. 12 pt 문서로 옮기면 1.99997 pt가 됩니다. 공백이 실제로 주변 글자에 맞춰 늘고 주는 증거입니다.
다만 \quad과 \qquad는 같은 식구가 아닙니다. latex.ltx의 정의는 \def\quad{\hskip1em\relax}이고 \qquad는 2 em으로, 단위가 mu가 아니라 본문 폰트의 em입니다. 그래서 첨자 안에 넣어도 줄지 않아, 실측에서도 x^{a\quad b}는 맨 x^{ab}보다 10.00002 pt——본문과 같은 1 em——넓은 그대로였습니다. 게다가 12 pt 문서에서는 \quad이 11.74988 pt인 데 비해 18 mu는 정확히 12 pt입니다. 즉 \quad과 18 mu는 같은 길이가 아닙니다. 세밀한 조정은 mu 계열(\, \: \; \!), 큰 칸막이는 em 계열(\quad \qquad)로 역할을 나누는 것이 안전합니다.
| 명령 | 정의된 양 | 10pt article 실측 |
|---|---|---|
\, | \thinmuskip = 3 mu(별칭 \thinspace) | 1.66662 pt. 가장 자주 쓰는 미세 조정 |
\: | \medmuskip = 4 mu +2 −4(\medspace, \>) | 2.22216 pt. 신축성이 있어 사라질 수도 있음 |
\; | \thickmuskip = 5 mu +5(\thickspace) | 2.77771 pt. 늘어나면 두 배까지 벌어짐 |
\! | −3 mu(\negthinspace와 동일) | −1.66663 pt. \,의 정확한 반대 |
\negmedspace | −4 mu. amsmath 불필요(latex.ltx에 있음) | −2.22217 pt |
\negthickspace | −5 mu. 마찬가지로 LaTeX 커널에 있음 | −2.77771 pt |
\quad | \hskip1em. mu가 아니라 본문의 em | 10.00002 pt. 첨자 안에서도 줄지 않음 |
\qquad | \hskip2em. \quad의 두 배 | 20.00003 pt |
(backslash-space) | 제어 공백. 본문의 낱말 사이와 같은 간격 | 3.33332 pt |
\enspace | 0.5 em의 고정 공백 | 5 pt |
\,가 본문에서도 수식에서도 통하는 것은 latex.ltx의 \tmspace가 \ifmmode로 갈라지기 때문입니다. 수식이면 \mskip\thinmuskip(3 mu), 본문이면 고정된 \kern .16667em입니다. 하나의 명령이 두 단위 체계를 나누어 씁니다. 같은 파일에 \let\>=\:라고 적혀 있어 \>가 \:의 별칭임도 알 수 있습니다. 그리고 표의 \negmedspace와 \negthickspace는 흔히 amsmath에서 온 것으로 설명되지만, TeX Live 2024의 LaTeX 커널에 둘 다 들어 있어 \usepackage{amsmath} 없이도 동작함을 확인했습니다.
첨자가 작아지는 정체——\displaystyle과 네 가지 수식 스타일
TeX은 모든 수식을 네 가지 스타일 중 하나로 조판하며, 그 스타일이 글자 크기와 mu의 실제 치수를 함께 정합니다. 큰 것부터 \displaystyle(별행 수식), \textstyle(본문 안), \scriptstyle(첨자), \scriptscriptstyle(첨자의 첨자)입니다. 10pt 본문에서 X의 높이를 재면 display와 text가 똑같이 6.83331pt이고, script는 4.78334pt, scriptscript는 3.41667pt입니다. 작아지는 것은 첨자로 들어가는 두 단계뿐이며 거기서 멈춥니다. 더 작은 다섯 번째 스타일은 없습니다. 앞 절에서 mu가 줄어든다고 한 것이 바로 이 구조입니다. 실무에서 쓸모 있는 것은 강제 지정입니다. 본문 속 $\sum_{k=1}^{n}$은 높이 8.04175pt로 눌리지만, $\displaystyle\sum_{k=1}^{n}$으로 쓰면 16.51393pt가 되어 별행 수식과 같은 모습이 되고 합의 상·하한도 위아래로 돌아옵니다. 다만 줄 간격이 들쭉날쭉해지므로, 본문에서 자꾸 쓰게 된다면 그 수식은 별행으로 빼는 편이 읽기 좋습니다.
실무에서 가장 많이 쓰는 셋 — dx 앞의 \,, \int\!\!\int, 함수 이름 뒤
먼저 적분입니다. \int f(x)dx는 38.71877 pt, \int f(x)\,dx는 40.38539 pt——차이는 정확히 3 mu인 1.66662 pt이며, 이 가는 공백이 피적분 함수와 dx를 갈라 줍니다. 넣지 않으면 f(x)dx가 한 줄로 이어진 기호 열처럼 보입니다. 다음은 다중적분입니다. \int\!\!\int는 음의 공백 두 개를 끼워 적분 기호를 붙이는 고전적인 표기이며, 실측하면 amsmath의 \iint와 너비가 완전히 일치합니다(둘 다 19.3056 pt, 맨 \int\int는 22.63885 pt). 즉 \iint는 이 수작업을 정식 명령으로 만든 것입니다.
\[
\int f(x)\,dx, \qquad \int\!\!\int f \;(=\ \iint f),
\qquad \sin x, \qquad \operatorname{sinc} x
\]셋째는 함수 이름 뒤의 간격인데, 여기서는 직접 넣을 필요가 없습니다. \sin은 연산자(Op)로 선언되어 있어 뒤따르는 기호와의 사이에 가는 공백이 자동으로 들어갑니다. 실측하면 \sin x가 19.6597 pt인 데 비해 \mathrm{sin}x는 17.99307 pt——차이는 1.66663 pt, 곧 정확히 3 mu입니다. 그러니 직접 만든 함수 이름을 \mathrm{}로 쓰면 바로 그 간격이 사라집니다. 올바른 방법은 amsmath의 \operatorname{sinc}이며, 실측에서도 \operatorname{sin}x는 \sin x와 같은 19.6597 pt가 되었습니다. 자주 나온다면 \DeclareMathOperator로 이름을 정의해 두십시오.
보이지 않는 상자로 높이와 너비 맞추기 — \phantom \vphantom \mathstrut
“자리만 잡고 내용은 보이지 않는다”——조판에서 거듭 필요해지는 이 작업을 맡는 것이 \phantom 계열입니다. \phantom{…}은 인수를 보통대로 조판했을 때와 같은 높이・깊이・너비의 빈 상자를 만듭니다. 아무것도 인쇄되지 않지만 그만큼의 자리는 확실히 확보됩니다. 차원을 좁힌 판도 있어서, \hphantom{…}은 너비만(높이와 깊이는 0), \vphantom{…}은 높이와 깊이만(너비는 0) 남깁니다. “세로 자리는 주장하되 가로로는 퍼지지 않기를” 바랄 때가 \vphantom의 차례입니다.
\[
\sum_{j \in \{0,\ldots,10\} \vphantom{3^{3^{3^j}}}}
\sum_{i \in \{0,\ldots,3^{3^{3^j}}\}} i \cdot j
\]
% level the radicals: each argument gets a parenthesis of vertical room
$\sqrt{\mathstrut a}\;\sqrt{\mathstrut a^2}\;\sqrt{\mathstrut b}$위의 예는 두 합 기호의 높이가 맞지 않는 장면입니다. 오른쪽 합은 첨자에 3^{3^{3^j}}라는 높은 탑을 안고 있어 TeX이 그 합의 본체를 내려 자리를 만들고, 그 결과 좌우의 \sum 위치가 어긋납니다. 왼쪽에 \vphantom{3^{3^{3^j}}}을 두면 보이지 않은 채 같은 높이를 확보할 수 있어 둘이 맞춰집니다. 가까운 친척인 \mathstrut은 인수를 받지 않는 전용 버팀대로, 내부는 \vphantom(——곧 여는 괄호 ( 와 같은 높이・깊이에 너비는 0입니다. \sqrt{a}와 \sqrt{a^2}를 나란히 둘 때 각 인수의 앞머리에 놓으면 근호의 천장이 가지런해져 줄이 안정됩니다. 요컨대 너비를 맞추려면 \hphantom, 높이를 맞추려면 \vphantom이나 \mathstrut, 둘 다면 \phantom입니다. 모두 보이지 않는 상자로 치수만 다룬다는 하나의 발상 위에 서 있습니다.