数式の技巧

たいていの数式は、書いたとおりに LaTeX が美しく組んでくれます。ところが、ときどき細かな乱れが残ります——分数のなかの根号が高すぎて行間が広がる、隣り合う平方根の天井がそろわない、総和の下に付けた長い条件のせいで前後に余白が空く。こうした「あと少し」を直すための、小さくて切れ味のよい道具がいくつもあります。このページでは、それらを 問題 → 直し方 の形で集めます。深掘りは各専門ページに譲り、ここでは「どの不具合に、どの命令を当てるか」を素早く引けるようにするのが狙いです。とくに、他のページでは扱わない **\smash** を中心に据えます。

微調整の道具箱

これらの道具に共通する発想は一つです——ある要素が占める寸法(高さ・深さ・幅)を、見た目とは別に操る。文字は見えているのに「寸法はゼロ」にしたり、逆に文字は見えないのに「寸法だけ確保」したりできれば、隣の要素や行送りに与える影響を思いどおりに調整できます。縦方向(高さ・深さ)を操るのが \smash\vphantom\mathstrut、横方向(幅)を操るのが \mathrlap\mathllap\mathclap や負の空き \!、両方を操るのが \phantom です。

いずれも 印刷結果を微調整するための最後の一手 であり、数式の意味は変えません。だからこそ、まずは素直に書いてみて、不具合が出たところにだけピンポイントで当てるのが基本です。下の表が早見表です。

症状当てる命令出どころ
tall-pushes-lines背の高い要素が行間を押し広げる\smash\smash[t] / \smash[b]LaTeX 標準([tb] は amsmath)
radical-heights-differ隣り合う根号・行の高さがそろわない\vphantom / \mathstrutLaTeX 標準
reserve-space見えない分の場所を確保して位置をそろえる\phantom / \hphantom / \vphantomLaTeX 標準
wide-subscript広い下付き条件が列を広げてしまう\mathclap\mathrlap / \mathllapmathtools
stack-symbol等号などの上に任意の記号を乗せたい\overset / \undersetamsmath
too-much-space記号どうしが離れすぎている\!(負の細space)LaTeX 標準

`\smash` — 高さ・深さをゼロとして扱わせる

問題。 分数の分子や分母に根号が入ると、\sqrt の天井(根号記号の上辺)が通常の行より高くなります。LaTeX は行どうしが重ならないよう、その高い分だけ 上の行との間隔を広げます。結果、その 1 行だけ行送りが空いて、ページ全体の行間が不ぞろいに見えてしまいます。

直し方。 \smash{...} は、引数を 高さ・深さがともにゼロであるかのように 組みます。インク(実際の文字)は変わらず印刷されますが、LaTeX はその箱を縦方向の大きさゼロとみなすので、行送りを広げる判断をしなくなります。LaTeX2e の公式リファレンスも、\smash がなければ「その行が上の行から引き離され、不ぞろいな行間が見苦しくなりうる」と説明しています(代わりに、つぶした要素が上の行へ食い込む可能性がある点には注意します)。

latex
% 問題:分数のなかの根号が、この行だけ行間を押し広げる
$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] で消すと、三つの根号がそろいます。

latex
% 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 個分の高さがそろいます。

latex
% 根号の天井をそろえる:各 \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{...}(高さ・深さはゼロ)を使います。

latex
% 「= 」の左を、上の行の項の幅だけ空けて桁をそろえる
\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 系は「横の大きさ(幅)をゼロにする」道具です。

latex
% 問題:長い下付き条件が総和の前後に余白を作る
\[ \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 引数が添える側です。

latex
\[
  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 の表にまとめています。

latex
\[
  \int\int f \, dA          % 間が空きすぎ
  \qquad
  \int\!\!\int f \, dA      % \! で適度に詰める
\]