添字とスペーシング

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」は本行の大きさのまま 残ります。黙って通ってしまうので、印刷して初めて気づく類の事故です。二文字以上の添字には必ず中括弧を、と手が覚えるまで意識してください。

latex
$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^2x^2_i のどちらで書いても、LaTeX は同じように積み上げます。入れ子にもできますが、各段に中括弧が要ります。x^{y^z}zy の指数、その 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} なら zy の指数、{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 に組まれます。つまり「プライムの右にさらに 2 乗」を書きたいなら、意図どおりか確認してから使ってください。

記号の左側に添字を置く — {}^{A}_{Z}X\sideset

同位体の記法のように 記号の左側 に上付き・下付きを出したいときは、空の中括弧 {} を土台にします{}^{14}_{6}\mathrm{C} と書けば、{} が「幅ゼロのふつうの記号」として置かれ、そこに添字が付き、続けて C が並びます。この {} を省くと、添字は 直前にあるものへ勝手に付いてしまう のが困りどころで、= ^{14}_{6}C のように書くと添字が = にぶら下がります。前が別の添字付きなら ! Double superscript. にもなります。総和記号など大型作用素の左右に添字を置き分けたいときは amsmath の \sideset{_a^b}{_c^d}\sum を使いますが、これは作用素側の道具なので、詳しくは和・積分のページへ。mathtools の \prescript も同じ用途の別解です。

latex
\[
  {}^{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\,bab の幅の差を測ると 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——本文と同じ一 em——広いままでした。さらに 12 pt 文書では \quad が 11.74988 pt になるのに対し、18 mu は 12 pt ちょうど。つまり \quad と 18 mu は同じ長さではありません。細かい調整は mu 系(\, \: \; \!)、大きな間仕切りは em 系(\quad \qquad)と、役割で使い分けるのが安全です。

命令定義された量10pt article での実測
\,\thinmuskip = 3 mu(別名 \thinspace1.66662 pt。もっとも使う微調整
\:\medmuskip = 4 mu +2 −4(\medspace\>2.22216 pt。伸び縮みするので消えることもある
\;\thickmuskip = 5 mu +5(\thickspace2.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 ではなく本文の em10.00002 pt。添字の中でも縮まない
\qquad\hskip2em\quad の二倍20.00003 pt
(backslash-space)制御空白。地の文と同じ語間3.33332 pt
\enspace0.5 em の固定空き5 pt

\, が地の文でも数式でも書けるのは、latex.ltx\tmspace\ifmmode で分岐しているからです。数式なら \mskip\thinmuskip(3 mu)、地の文なら \kern .16667em の固定量。つまり 同じ命令が二つの単位系を使い分けています。ついでに、\>\: の別名であることも latex.ltx\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——小さくなるのは添字に入ってからの2段階だけで、しかも4段目より深くは縮みません。前節で 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 は、この手作業を正式な命令にしたものです。

latex
\[
  \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{…}幅だけ(高さと深さはゼロ)、\vphantom{…}高さと深さだけ(幅はゼロ)。「縦の場所は主張したいが横には広がってほしくない」ときが \vphantom の出番です。

latex
\[
  \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(——つまり 開き括弧 ( と同じ高さ・深さで幅ゼロ\sqrt{a}\sqrt{a^2} を並べたときに各引数の先頭へ置くと、根号の天井がそろって行が落ち着きます。要は、幅をそろえるなら \hphantom、高さをそろえるなら \vphantom\mathstrut、両方なら \phantom。どれも見えない箱で寸法だけを操るという一つの発想の上に立っています。