たいていの数式は、書いたとおりに LaTeX が美しく組んでくれます。ところが、ときどき細かな乱れが残ります——分数のなかの根号が高すぎて行間が広がる、隣り合う平方根の天井がそろわない、総和の下に付けた長い条件のせいで前後に余白が空く。こうした「あと少し」を直すための、小さくて切れ味のよい道具がいくつもあります。このページでは、それらを 問題 → 直し方 の形で集めます。深掘りは各専門ページに譲り、ここでは「どの不具合に、どの命令を当てるか」を素早く引けるようにするのが狙いです。とくに、他のページでは扱わない **\smash** を中心に据えます。
微調整の道具箱
これらの道具に共通する発想は一つです——ある要素が占める寸法(高さ・深さ・幅)を、見た目とは別に操る。文字は見えているのに「寸法はゼロ」にしたり、逆に文字は見えないのに「寸法だけ確保」したりできれば、隣の要素や行送りに与える影響を思いどおりに調整できます。縦方向(高さ・深さ)を操るのが \smash と \vphantom・\mathstrut、横方向(幅)を操るのが \mathrlap・\mathllap・\mathclap や負の空き \!、両方を操るのが \phantom です。
いずれも 印刷結果を微調整するための最後の一手 であり、数式の意味は変えません。だからこそ、まずは素直に書いてみて、不具合が出たところにだけピンポイントで当てるのが基本です。下の表が早見表です。
| 症状 | 当てる命令 | 出どころ | |
|---|---|---|---|
tall-pushes-lines | 背の高い要素が行間を押し広げる | \smash(\smash[t] / \smash[b]) | LaTeX 標準([tb] は amsmath) |
radical-heights-differ | 隣り合う根号・行の高さがそろわない | \vphantom / \mathstrut | LaTeX 標準 |
reserve-space | 見えない分の場所を確保して位置をそろえる | \phantom / \hphantom / \vphantom | LaTeX 標準 |
wide-subscript | 広い下付き条件が列を広げてしまう | \mathclap(\mathrlap / \mathllap) | mathtools |
stack-symbol | 等号などの上に任意の記号を乗せたい | \overset / \underset | amsmath |
too-much-space | 記号どうしが離れすぎている | \!(負の細space) | LaTeX 標準 |
`\smash` — 高さ・深さをゼロとして扱わせる
問題。 分数の分子や分母に根号が入ると、\sqrt の天井(根号記号の上辺)が通常の行より高くなります。LaTeX は行どうしが重ならないよう、その高い分だけ 上の行との間隔を広げます。結果、その 1 行だけ行送りが空いて、ページ全体の行間が不ぞろいに見えてしまいます。
直し方。 \smash{...} は、引数を 高さ・深さがともにゼロであるかのように 組みます。インク(実際の文字)は変わらず印刷されますが、LaTeX はその箱を縦方向の大きさゼロとみなすので、行送りを広げる判断をしなくなります。LaTeX2e の公式リファレンスも、\smash がなければ「その行が上の行から引き離され、不ぞろいな行間が見苦しくなりうる」と説明しています(代わりに、つぶした要素が上の行へ食い込む可能性がある点には注意します)。
% 問題:分数のなかの根号が、この行だけ行間を押し広げる
$y = \frac{1}{\sqrt{1 - x^2}}$
% 直し方:根号の高さをゼロ扱いにして行送りへの影響を消す
$y = \frac{1}{\smash{\sqrt{1 - x^2}}}$どちらも見た目の数式は同じですが、後者では \sqrt{1-x^2} の高さが行送りの計算に算入されないため、前後の行と同じ間隔で組まれます。本文(インライン)の数式に背の高い要素を入れたときに、とくに効いてきます。
amsmath を読み込むと、\smash は 省略可能な引数 を取れるようになります。\smash[t]{...} は 上(top, 高さ)だけ をつぶして深さは自然なまま残し、\smash[b]{...} は 下(bottom, 深さ)だけ をつぶして高さを残します。amsmath のマニュアルが言うとおり、「高さや深さの一方だけをつぶし、もう一方は自然のままにしたい」場面があるためです。
amsmath が挙げる典型例が、隣り合う平方根の高さそろえです。\sqrt{x} + \sqrt{y} + \sqrt{z} と書くと、y は下に伸びる字(descender)を持つため、まんなかの根号だけがわずかに下がって見えます。中身の深さだけを \smash[b] で消すと、三つの根号がそろいます。
% amsmath マニュアルの例:まんなかの根号だけ下がるのを直す
$\sqrt{x} + \sqrt{y} + \sqrt{z}$ % y の descender で不ぞろい
$\sqrt{x} + \sqrt{\smash[b]{y}} + \sqrt{z}$ % y の深さを消してそろえる\smash は数式モードだけでなく地の文でも使えますが、地の文では水平モードに入らないため、段落の先頭で使うときは前に \leavevmode が要ります。なお \smash と次節の \vphantom は 正反対の操作 です——\smash は「大きいものをゼロ扱い」、\vphantom は「ゼロのものに大きさを与える」。実際、amsmath はこの二つを 組み合わせて 高さをそろえる例も示しています。
`\vphantom` と `\mathstrut` — 見えない高さでそろえる
問題。 \smash の逆で、「中身が低いほうの要素を、高いほうに合わせて持ち上げたい」ことがあります。たとえば \sqrt{a} と \sqrt{a^2} を並べると、指数のぶん右の根号だけが背高になり、天井がそろいません。場合分けや行列で、行ごとに中身の高さが違うときも同様です。
直し方。 \vphantom{...}(vertical phantom)は、引数と 同じ高さ・深さ を持ちながら 幅はゼロ、中身は見えない箱を作ります。低いほうの要素に「高いほうと同じ中身の \vphantom」を仕込めば、見えないまま高さだけがそろいます。引数を取らない簡便版が \mathstrut(マスストラット)で、これは \vphantom( として定義された 開き括弧 1 文字分の見えない支柱 です。各要素の頭に置くだけで、括弧 1 個分の高さがそろいます。
% 根号の天井をそろえる:各 \sqrt の中身に \mathstrut を足す
$\sqrt{\mathstrut a}\;\sqrt{\mathstrut a^2}\;\sqrt{\mathstrut b}$
% 任意の高さにそろえたいときは、揃え先の中身を \vphantom に渡す
$\sqrt{a} \;\sqrt{\vphantom{a^2}\,a}$これらは添字とスペーシングのページで詳しく扱っているので、仕組みや \hphantom との使い分けはそちらを参照してください。ここで押さえるべきは、**\smash(高いものを下げる)と \vphantom/\mathstrut(低いものを上げる)は、高さをそろえるための表裏一体の道具** だということです。
`\phantom` — 見えない場所取りで位置をそろえる
問題。 複数行の式で、「上の行のこの項の真下に、下の行のこの項を置きたい」のに、左側の長さが違って桁がそろわない——ということがあります。空白を手で詰めても、フォントや式が変わるたびに崩れます。
直し方。 \phantom{...} は、引数を組んだときと 同じ高さ・深さ・幅 を持つ、中身の見えない箱です。そろえたい相手の式をそのまま \phantom に渡せば、その式とぴったり同じ幅の空白が空き、桁が自然にそろいます。横幅だけが欲しいときは \hphantom{...}(高さ・深さはゼロ)を使います。
% 「= 」の左を、上の行の項の幅だけ空けて桁をそろえる
\begin{align*}
f(x) &= x^2 + 2x + 1 \\
\phantom{f(x)} &= (x + 1)^2
\end{align*}この例では、二行目の左辺に \phantom{f(x)} を置くことで、f(x) と同じ幅の空白が確保され、二つの = が縦にそろいます。\phantom の仲間(\hphantom・\vphantom)の詳細も、添字とスペーシングのページにまとまっています。
`\mathclap`・`\mathrlap`・`\mathllap` — 幅ゼロの箱(横方向の `\smash`)
問題。 総和や積の 下に付ける条件 が、記号本体より横に長いことがあります。たとえば \sum_{1 \le i \le j \le n} のように。すると LaTeX はその幅に合わせて総和記号の前後に余白を空け、式全体が間延びして見えます。表や整列のなかでは、この余分な幅が列ごとずれる原因にもなります。
直し方。 mathtools の \mathclap{...} は、中身を 幅ゼロの箱 に入れて中央寄せします(左右に等しくはみ出す)。条件は見えたまま、式の幅は記号本体ぶんに保たれます。左右どちらか片側だけにはみ出させたいときは、左へ寄せる \mathllap{...}、右へ寄せる \mathrlap{...} を使います。実はこれらは **\smash の横方向版** として作られたもので、\smash が「縦の大きさをゼロにする」のに対し、lap 系は「横の大きさ(幅)をゼロにする」道具です。
% 問題:長い下付き条件が総和の前後に余白を作る
\[ \sum_{1 \le i \le j \le n} a_{ij} \]
% 直し方:条件を幅ゼロの箱に入れ、式の幅を記号本体に保つ
\[ \sum_{\mathclap{1 \le i \le j \le n}} a_{ij} \]mathtools の読み込み(\usepackage{mathtools}、amsmath も自動で入ります)が前提です。これらの命令と、\clap などの本文版、[mathstyle] の省略可能引数については、mathtools のページで詳しく扱っています。
記号を重ねる・空きを詰める
問題(その一)。 「(要請として)等しい」を表す等号の上の感嘆符 \overset{!}{=} や、「本当に等しいか?」の \overset{?}{=} のように、既存の記号の上下に 任意の記号を小さく乗せたい ことがあります。添字(^・_)は記号の右脇に付いてしまい、真上・真下には来ません。
直し方。 amsmath の \overset{乗せるもの}{土台} と \underset{敷くもの}{土台} を使います。\overset{!}{=} なら等号の真上に感嘆符が小さく乗ります。第 2 引数が土台、第 1 引数が添える側です。
\[
a \overset{!}{=} b, \qquad x \overset{?}{=} y,
\qquad A \overset{f}{\longrightarrow} B
\]\overset / \underset の詳しい使い方(矢印への適用や入れ子)は「上下に付けるもの」のページにあります。
問題(その二)。 逆に、記号どうしが 離れすぎている ことがあります。代表が二重・三重積分で、\int\int と並べると積分記号の間が空きすぎて、別々の積分のように見えます。
直し方。 負の細い空き \!(−3 mu、\, のちょうど逆向き)で詰めます。\int\!\!\int のように挟むと、二つの積分記号が適度に近づきます(多重積分には amsmath の \iint・\iiint という専用命令もあります)。\! を含む数式の空き調整は、添字とスペーシングのページの mu の表にまとめています。
\[
\int\int f \, dA % 間が空きすぎ
\qquad
\int\!\!\int f \, dA % \! で適度に詰める
\]