분수, 근호와 지수

근호 √ 의 갈고리와 그 위를 가로지르는 가로줄은 112년의 간격을 두고 태어났습니다. 갈고리만 있는 기호는 1525년 크리스토프 루돌프의 『Die Coss』에 인쇄되었고, 여기에 위쪽 가로줄(vinculum)을 이어 붙여 오늘날의 모양으로 만든 사람은 1637년의 데카르트입니다. 분수선은 그보다 더 오래되어 12세기 마그레브의 수학자 알하사르까지 거슬러 올라가며, 유럽에는 피보나치가 들여왔습니다. LaTeX은 따로 태어난 이 부품들을 지금도 따로 조립합니다. 이 페이지는 \frac의 정체가 \over라는 사실에서 출발해 분수·근호·지수를 읽어 나갑니다. \dfrac, \tfrac, \cfrac, \binom, \genfrac의 역할 분담, \nicefrac\sfrac의 구분, 나아가 “분수가 작아진다”, “근호의 지수 위치가 어긋난다” 같은 실제 증상의 대처까지 다룹니다.

\frac의 정체는 \over — 중괄호가 있느냐 없느냐의 차이

\fracLaTeX 커널의 명령이며 amsmath가 필요하지 않습니다. 정의는 latex.ltx 12700행에 그대로 놓여 있습니다. \DeclareRobustCommand\frac[2]{{\begingroup#1\endgroup\over#2}}. 풀어 읽으면 “전체를 { }로 감싸고, 분자를 \begingroup … \endgroup으로 봉한 다음, 그 사이에 TeX의 원시 명령 \over를 놓는다”입니다. 따라서 \frac{a+b}{c}{a+b \over c}는 같은 결과를 냅니다. TeX Live 2024, 10pt, Computer Modern에서 상자를 실측하면 둘 다 너비 24.19968pt, 높이 13.70952pt, 깊이 6.85951pt로 정확히 일치했습니다.

그렇다면 왜 “\over 말고 \frac을 쓰라”는 말이 계속 나올까요. 차이는 중괄호입니다. \over는 원시 명령이라 현재 그룹 안에서 자기 왼쪽에 있는 것을 전부 분자로 삼켜 버립니다. 그래서 {x + y \over 2}는 “x 더하기 y/2”가 아니라 (x+y)/2가 되고, 같은 의도로 쓴 x + \frac{y}{2}는 제대로 x + y/2가 됩니다. \frac은 분자를 명시적 인수로 받음으로써 이 사고를 구조적으로 막습니다. 게다가 한 그룹에 \over를 둘 쓰면 TeX은 어느 쪽을 먼저 처리할지 정하지 못하고 ! Ambiguous; you need another { and }.로 멈춥니다.

latex
% same shape in the source, two different formulas
\[
  {x + y \over 2} \qquad x + \frac{y}{2}
\]

% error: Ambiguous; you need another { and }.
% \[ 1 \over 2 \over 3 \]

amsmath을 읽어들이면 이 방침이 코드로 명문화됩니다. amsmath.sty는 먼저 \@saveprimitive\over\@@over로 원시 명령을 대피시킨 뒤, \over\atop\above(및 …withdelims 판)를 갈아 끼워 사용하면 Package amsmath Warning: Foreign command \over; \frac or \genfrac should be used instead를 내보내게 합니다. 그리고 234행에서 \frac 자체도 {{\begingroup#1\endgroup\@@over#2}}로 다시 정의합니다. 대피시켜 둔 진짜 \over를 부르기 위해서입니다. 부작용으로, 옛 표기 {n \choose k}\atopwithdelims를 거쳐 같은 경고를 냅니다. 오류가 아니라 경고라 출력은 나오지만, 제대로 된 해결은 \binom으로 바꾸는 것입니다.

분수가 작아지는 이유 — \dfrac\tfrac

\frac이 놓인 스타일에 따라 스스로 크기를 바꾸기 때문입니다. 본문의 $ … $(텍스트 스타일)에서는 줄 높이가 흐트러지지 않도록 작게, \[ … \](디스플레이 스타일)에서는 여유 있게 크게 조판됩니다. 같은 \frac{a+b}{c}를 재 보면 디스플레이판은 너비 24.19968pt·높이 13.70952pt, 본문판은 16.39322pt·8.79842pt로 약 1.5배 차이가 납니다. 이 자동 판정을 끄고 싶을 때 쓰는 것이 amsmath\dfrac(항상 디스플레이 크기)와 \tfrac(항상 텍스트 크기)이며, 정체는 \genfrac의 별칭에 지나지 않습니다. 각각 \genfrac{}{}{}0, \genfrac{}{}{}1로 정의되어 있습니다. 실측에서도 디스플레이 안의 \tfrac은 본문 속 \frac과 10만분의 1pt까지 같은 치수로 나왔습니다.

latex
% preamble: \usepackage{amsmath}
Small in running text: $\frac{a+b}{c}$, forced large: $\dfrac{\partial f}{\partial x}$.

\[
  \frac{a+b}{c} \qquad \tfrac{a+b}{c} \qquad \dfrac{1}{1 + \dfrac{1}{x}}
\]

중첩하면 사정은 훨씬 절실해집니다. TeX의 스타일은 디스플레이·텍스트·스크립트·스크립트스크립트의 네 단계뿐이고, 분수의 분자와 분모는 항상 한 단계 아래 스타일로 조판됩니다. 그래서 \frac을 겹치면 display → text → script → scriptscript로 줄어들다가 네 번째 단계에서 바닥을 칩니다. 실측도 같습니다. \frac{1}{2}의 너비는 displaystyle에서 7.40001pt, textstyle 6.38612pt, scriptstyle 5.80283pt, scriptscriptstyle도 5.80283pt로 셋째와 넷째 단계가 같은 치수이며 더는 작아질 수 없습니다. 물론 그쯤이면 이미 읽을 수 없습니다. 각 층을 같은 크기로 유지하려면 \dfrac을 겹치거나 다음 절의 \cfrac을 씁니다.

  • \frac — 기본값. 문맥에 맡겨 자연스러운 크기로 두고 싶을 때. 추가 패키지가 필요 없습니다.
  • \dfrac — 본문 속 분수를 찌그러뜨리지 않고 전체 크기로 보이고 싶을 때, 또는 중첩의 각 층을 같은 크기로 유지해야 할 때. 줄 높이를 밀어 올리므로 남발하면 행간이 들쭉날쭉해집니다.
  • \tfrac — 별행 수식 안에서 일부 분수만 작게 넣고 싶을 때. 계수 속 분수나 첨자 주변의 분수에 알맞습니다.
  • \cfrac — 연분수 전용. 몇 단계로 깊어져도 크기가 바뀌지 않습니다.

연분수 \cfrac와 분자를 좌우로 붙이는 [l] / [r]

연분수에는 amsmath의 \cfrac을 씁니다. 앞 절에서 본 대로 \frac 중첩은 층마다 줄어들지만, \cfrac은 각 층을 반드시 디스플레이 크기로 조판하므로 몇 단을 쌓아도 글자 크기가 변하지 않습니다. amsmath.sty 913행의 정의가 그 구조를 그대로 말해 줍니다. \DeclareRobustCommand{\cfrac}[3][c]{{\displaystyle\frac{\strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}{#3}}\kern-\nulldelimiterspace}. 안에서 \displaystyle을 명시적으로 세우고, \strut으로 각 단의 높이를 맞추며, 끝의 \kern-\nulldelimiterspace로 분수선 오른쪽에 남는 여백을 지웁니다.

정의의 [3][c]가 보여 주듯 \cfrac은 첫 번째로 선택적 정렬 인수를 받으며 기본값은 c(가운데)입니다. \cfrac[l]은 분자를 왼쪽으로, \cfrac[r]은 오른쪽으로 붙입니다. 장치는 단순해서, r이면 분자 앞에, l이면 분자 뒤에 \hfill을 끼워 넣을 뿐입니다. 연분수는 아래로 갈수록 분모가 길어져 분수선 폭이 단마다 달라지므로, 분자를 왼쪽 끝에 세로로 맞추고 싶을 때 [l]이 효과를 냅니다.

latex
% preamble: \usepackage{amsmath}
\[
  x = 1 + \cfrac{1}{2 + \cfrac{1}{2 + \cfrac{1}{2 + \cdots}}}
  \qquad
  \cfrac[l]{1}{2 + \cfrac[l]{1}{2 + \cfrac[l]{1}{2}}}
\]

이항계수 \binom — 두께 0pt인 분수

\binom{n}{k}(amsmath)는 “n에서 k를 고르는” 이항계수를 분수선 없는 세로 배열로 조판하고 둥근 괄호로 감쌉니다. 가로선이 그어지지 않는 것은 특별 취급을 받아서가 아니라, 분수선 두께를 0pt로 지정한 분수이기 때문입니다. amsmath.sty 240행의 정의는 \DeclareRobustCommand{\binom}{\genfrac()\z@{}}로, 구분 기호를 (), 선 두께를 \z@(=0pt), 스타일은 비워 문맥을 따르게 한 \genfrac 그 자체입니다. 크기를 고정하려면 \dbinom(항상 디스플레이)과 \tbinom(항상 텍스트)이 있으며, 이 역시 \genfrac(){0pt}0\genfrac(){0pt}1에 지나지 않습니다.

\genfrac은 지금까지 나온 명령 전부의 바탕이 되는 범용 명령으로, 인수를 여섯 개 받습니다. \genfrac{왼쪽 구분 기호}{오른쪽 구분 기호}{선 두께}{스타일}{분자}{분모}. 네 번째인 스타일은 0~3의 정수로 차례대로 \displaystyle, \textstyle, \scriptstyle, \scriptscriptstyle에 대응하며, 비워 두면 문맥을 따릅니다. 그래서 \genfrac[]{1pt}{0}{a}{b}라고 쓰면 각괄호로 감싸고 1pt의 굵은 선을 그은, 항상 디스플레이 크기인 분수가 나옵니다. 표준 명령으로는 낼 수 없는 모양이 필요할 때의 탈출구가 여기입니다. 옛 표기 {n \choose k}는 앞 절대로 amsmath 경고를 내므로 \binom으로 바꾸세요.

latex
% preamble: \usepackage{amsmath}
\[
  \binom{n}{k} = \frac{n!}{k!\,(n-k)!}
  \qquad \dbinom{n}{k} \qquad \tbinom{n}{k}
  \qquad \genfrac[]{1pt}{0}{a}{b}
\]

\sqrt와 n제곱근 — 지수가 올라타는 곳은 \root … \of

\sqrt{내용}LaTeX 커널의 명령이라 amsmath가 필요 없습니다. 근호와 거기서 오른쪽 위로 뻗는 가로줄(vinculum)이 내용의 높이와 너비에 맞추어 자동으로 늘어납니다. n제곱근은 각괄호의 선택적 인수로 지수를 넘겨 \sqrt[3]{x+y}처럼 씁니다. 이 둘은 별개의 구현입니다. latex.ltx 12701행의 \DeclareRobustCommand\sqrt{\@ifnextchar[\@sqrt\sqrtsign}은 “다음이 [이면 \@sqrt로, 아니면 맨 글리프 \sqrtsign으로”라는 분기이고, 이어지는 12702행의 \def\@sqrt[#1]{\root #1\of}가 지수가 붙은 경로를 \root … \of로 흘려보냅니다. 지수는 \scriptscriptstyle으로 조판되고, \mkern5mu의 여백을 둔 뒤 기호 높이의 0.6배만큼 들어 올려집니다. 루돌프의 갈고리와 데카르트의 가로줄이 따로 태어났다는 사실이 지금도 구현에 남아 있는 셈입니다.

구조를 알면 고전적인 불만——피개방수가 높은 식일 때 지수가 엉뚱한 자리에 놓인다——의 이유도 보입니다. 지수는 근호 기호의 높이에 비례해 들어 올려지므로, 내용이 높을수록 기호 왼쪽으로 크게 벌어집니다. 조정용으로 amsmath\leftroot{n}\uproot{n}을 마련해 두었고, \sqrt[\leftroot{2}\uproot{3}\beta]{x}처럼 지수 바로 앞에 씁니다. 단위는 mu(math unit, 1em의 1/18)입니다. 실측하면 \sqrt[3]{x}의 상자는 높이 8.00272pt인데, \uproot{10}을 더하니 12.14214pt까지 늘어났습니다. 반면 \leftroot너비를 전혀 바꾸지 않습니다. amsmath.sty\r@@t\mkern-\leftroot@ mu\mkern\leftroot@ mu를 짝으로 넣어 상쇄하기 때문에, 보내는 폭은 그대로이고 지수만 좌우로 움직입니다. 손대는 것은 정말로 모양이 이상할 때뿐이고, 대개는 기본값으로 충분합니다.

latex
% \sqrt is core LaTeX; \leftroot and \uproot need amsmath
\[
  \sqrt{x^2 + y^2} \qquad \sqrt[3]{x+y} \qquad \sqrt[n]{a}
  \qquad \sqrt[\leftroot{2}\uproot{3}\beta]{\frac{a}{b}}
\]

지수(거듭제곱)와 ! Double superscript

지수는 캐럿 ^으로 위 첨자를 만듭니다. x^2는 “x의 제곱”입니다. 커널 기능이라 패키지가 필요 없습니다. 함정은 두 글자 이상인 지수로, ^는 바로 뒤의 토큰 하나만 집어 갑니다. x^10은 “x의 1제곱” 뒤에 0이 따라붙은 모양으로 조판되는데, 오류도 나지 않아 알아채기 어렵습니다. 반드시 x^{10}처럼 중괄호로 묶으세요. 반면 같은 밑에 위 첨자를 둘 쓴 x^2^3! Double superscript.로 멈추고, TeX은 친절하게 자기 나름의 해석까지 알려 줍니다. I treat x^1^2 essentially like x^1{}^2. 이중 지수를 정말 쓰고 싶다면 x^{2^3}처럼 중첩하세요. 같은 문자에 아래·위 첨자를 함께 붙이는 이야기와 수식 간격의 단위는 별도 페이지 “첨자와 간격”의 몫입니다.

latex
% braces decide the scope; x^10 is x-to-the-first followed by 0
\[
  x^{10} \qquad x^{2^3} \qquad
  x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
\]

사선 분수 \nicefrac\sfrac — 본문 줄을 흐트러뜨리지 않는 분수

본문에서 “약 3/4시간” 정도를 말하고 싶을 뿐이라면, 세로로 쌓기보다 사선으로 작게 조판하는 편이 줄을 덜 흐트러뜨립니다. 고참은 nicefrac 패키지의 \nicefrac{a}{b}로, units 번들의 일부로 1998년부터 쓰여 왔습니다. 새로운 선택지는 xfrac 패키지의 \sfrac{a}{b}이며, LaTeX3의 l3packages에 속합니다. TeX Live 2024 동봉판의 날짜는 2024-02-13입니다. CTAN의 nicefrac 설명 자체가 “nicefrac의 기능은 xfrac 패키지가 더 깔끔한 형태로 제공한다”고 밝히고 있으므로, 새 문서라면 \usepackage{xfrac}\sfrac이 안전한 기본값입니다.

차이는 실제로 재 보면 드러납니다. 본문(텍스트 모드)에서 \sfrac{3}{4}의 상자는 너비 9.00314pt에 깊이 0.13495pt인 반면, \nicefrac{3}{4}는 너비 11.30565pt에 깊이 2.5pt입니다. \sfrac은 글꼴이 지닌 진짜 분자·분모용 숫자를 불러 쓰므로 더 좁고 기준선 아래로 거의 내려가지 않습니다. 줄 아래로 삐져나오지 않는 만큼 행간을 덜 흐트러뜨립니다. 다만 수식 모드($ … $)에 넣으면 두 상자는 너비 11.30565pt·깊이 2.5pt로 완전히 같았습니다. \sfrac의 장점은 본문에서 나타나는 장점입니다. 구분은 단순합니다. 세로로 쌓고 싶은 분수는 \frac\dfrac, 문장 안에서 작게 끝내고 싶은 분수는 \sfrac(기존 문서가 이미 쓰고 있다면 \nicefrac)입니다.

latex
% \usepackage{nicefrac}  (the older one)
It takes about \nicefrac{3}{4} of an hour.

% \usepackage{xfrac}  (recommended for new documents)
That is roughly \sfrac{1}{2} of the total, or $\sfrac{1}{2}$ in math mode.
명령필요한 패키지출력
\frac{a}{b}없음(LaTeX 커널)분수선이 있는 분수. 크기는 문맥을 따르며 내부는 \over
\dfrac{a}{b}amsmath항상 디스플레이 크기. \genfrac{}{}{}0의 별칭
\tfrac{a}{b}amsmath항상 텍스트 크기. \genfrac{}{}{}1의 별칭
\cfrac{a}{b}amsmath연분수. 각 층이 같은 크기. [l] [r]로 분자를 좌우 정렬
\binom{n}{k}amsmath둥근 괄호에 분수선 없는 이항계수. \dbinom \tbinom도 있음
\genfracamsmath범용 형태. 구분 기호·선 두께·스타일을 인수 여섯 개로 지정
\over없음(TeX 원시 명령)그룹 안 왼쪽 전부를 분자로 삼음. amsmath 아래에서는 경고가 남
\sqrt{x}없음(LaTeX 커널)제곱근. \sqrt[n]{x}는 n제곱근. 지수 미세 조정은 \leftroot \uproot(amsmath)
\nicefrac{a}{b}nicefrac작은 사선 분수 a/b. 1998년 units 번들에서 유래
\sfrac{a}{b}xfrac작은 사선 분수. 본문에서는 글꼴 고유 숫자를 써서 줄을 거의 흐트러뜨리지 않음