根号 √ の鈎と、その上に伸びる横棒は、112 年離れて生まれています。鈎だけの記号が印刷されたのは 1525 年、クリストフ・ルドルフの『Die Coss』。上の横棒(vinculum)と繋いでいまの形にしたのは 1637 年のデカルトでした。分数の横棒はさらに古く、12 世紀のマグリブの数学者アル=ハッサールにさかのぼり、ヨーロッパにはフィボナッチが持ち込みます。LaTeX の \frac と \sqrt は、その別々に生まれた部品をいまも別々に組み立てています。このページでは分数・根号・指数を、\frac の正体が \over である ことを出発点に読み解きます。\dfrac/\tfrac/\cfrac/\binom/\genfrac の役割分担、\nicefrac と \sfrac の使い分け、そして「分数が小さくなる」「根号の指数の位置がずれる」といった実際の症状への対処までを扱います。
\frac の正体は \over — 波括弧が付いているかどうかの違い
\frac は LaTeX カーネルの命令 で、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 }. で止まります。
% 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 の別名にすぎません——\dfrac は \genfrac{}{}{}0、\tfrac は \genfrac{}{}{}1 と定義されています。実測でも、ディスプレイ中の \tfrac はテキスト中の \frac と 10 万分の 1pt まで同じ寸法になりました。
% 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 のスタイルはディスプレイ・テキスト・スクリプト・スクリプトスクリプトの 4 段しかなく、分数の分子と分母は常に一段下のスタイルで組まれます。だから \frac を重ねると display → text → script → scriptscript と縮み、4 段目で底を打ちます。実測でも \frac{1}{2} の幅は displaystyle 7.40001pt、textstyle 6.38612pt、scriptstyle 5.80283pt、scriptscriptstyle も 5.80283pt——3 段目と 4 段目は同寸で、そこから先は小さくなりようがありません。もっとも、その頃にはとうに読めません。各層を同じ大きさに保ちたいなら \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 なら分子の前に \hfill を、l なら後ろに \hfill を差し込むだけ。連分数は下へ行くほど分母が長くなり、括線の幅も段ごとに変わるので、分子を左端で縦にそろえたいときに [l] が効きます。
% 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 はここまで出てきた命令すべての土台にあたる汎用命令で、引数を 6 つ取ります——\genfrac{左の区切り}{右の区切り}{線の太さ}{スタイル}{分子}{分母}。第 4 引数のスタイルは 0〜3 の整数で、順に \displaystyle・\textstyle・\scriptstyle・\scriptscriptstyle に対応し、空にすると文脈に従います。だから \genfrac[]{1pt}{0}{a}{b} と書けば「角括弧で囲み、1pt の太い線を引き、常にディスプレイサイズ」の分数が得られます。標準にない見た目が必要になったときの逃げ道はここです。なお古い書き方の {n \choose k} は前節のとおり amsmath が警告を出すので、\binom に置き換えてください。
% 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 を対で入れて相殺しており、送り幅はそのままに指数だけが左右に動きます。手を入れるのは見た目が本当におかしいときだけで、既定のままで十分なことがほとんどです。
% \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 の 2 乗」。カーネルの機能なのでパッケージは不要です。落とし穴は 2 文字以上の指数 で、^ は直後の 1 トークンしか拾いません。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} と入れ子にしてください。上下の添字を同じ文字に付ける話や数式の空き量の単位は、別ページ「添字とスペーシング」の担当です。
% 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)。
% \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 も |
\genfrac | amsmath | 汎用。区切り記号・線の太さ・スタイルを 6 引数で指定する |
\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 | 小さな斜線分数。地の文ではフォント本来の数字を使い、行を崩しにくい |