mathtools

amsmath を入れて数式を組み始めると、もう少しだけ手の届かないところが見えてきます——:= の colon が少し下にずれる、行をまたぐ長い矢印にラベルを上下で付けたい、絶対値の縦棒を中身の高さに合わせて自動で伸ばしたい。これらをまとめて面倒見てくれるのが mathtools です。mathtools は amsmath を 読み込んだうえで補強する 拡張パッケージで、\usepackage{mathtools} の一行が amsmath の読み込みも兼ねます。このページでは、最もよく使う追加機能——きれいな :=、伸縮する矢印 \xrightarrow、角張った \overbracket、自動調整の \DeclarePairedDelimiter、幅ゼロの \mathclap、前置の添字 \prescript、列揃え付き行列 matrix*——を順に見ていきます。

mathtools とは

mathtools は、その公式マニュアルの言葉を借りれば「amsmath への拡張パッケージ」です。amsmath が数式組版の事実上の標準であることは前提としたうえで、amsmath に残るいくつかの不足やバグを直し、さらに日々の組版で重宝する道具を足します。重要なのは、mathtools が 内部で amsmath を必要とし、自動で読み込む ことです。したがって amsmath を別途書く必要はなく、プリアンブルにはこの一行で足ります。

latex
\usepackage{mathtools}

amsmath にオプションを渡したいときも、mathtools がそのまま橋渡しします。マニュアルが示すとおり、\usepackage[fleqn,tbtags]{mathtools} は、\usepackage[fleqn,tbtags]{amsmath} に続けて \usepackage{mathtools} と書いたのと同じ意味になります。つまり mathtools を読み込むときに与えたオプションは、下にある amsmath にも届きます。

mathtools の機能は幅広く、ここで全部は扱いきれません。本ページでは、奥村『LaTeX2e 美文書作成入門』でも触れられるような 使用頻度の高い追加機能 に的を絞ります。場合分けの拡張(dcases)、式番号の制御(showonlyrefs)、整列のなかの矢印(\ArrowBetweenLines)といった機能もありますが、整列まわりの詳細は別ページ「別行立て・整列・番号付き数式」に譲ります。

きれいな代入記号 — `\coloneqq` の仲間

定義に使う「:=」を、数式モードでそのまま := と打つと、思いのほか不格好になります。:関係子ではなく区切り記号 として扱われ、前後の空きが整わないうえ、colon が = の中心線より 少し下 に落ちてしまうためです。mathtools の \coloneqq は、colon を等号に対して 正しい高さに中央寄せ し、関係子としての適切な空きを伴った「:=」を組みます。逆向きの「=:」には \eqqcolon を使います。

latex
\[
  f(x) \coloneqq x^2 + 1, \qquad y \eqqcolon g(x)
\]

この例では、左の式は「f(x) を x²+1 と定義する」を表す := が、右の式は「g(x) を y と書く」向きの =: が、いずれも colon を中央に置いた整った形で組まれます。なお二重 colon の \dblcolon::)や、colon と近似・相似を組み合わせた \colonapprox\colonsim なども用意されています。

一点だけ注意があります。2022 年の更新で、mathtools はこれらの colon 記号の 正式名を整理 しました(他パッケージと名前を揃えるためです)。\coloneqq\eqqcolon といった従来名は 互換のためそのまま使えます が、新しい体系では \coloneq などが正式名です。すでにある文書がそのまま通るよう、旧名は残されています。

伸縮する矢印 — `\xrightarrow` と `\xleftarrow`

ふつうの \rightarrow(→)や \Rightarrow(⇒)は長さが固定で、上に乗せたラベルより矢印が短いと不格好です。amsmath は、ラベルに合わせて 横に伸びる矢印 \xrightarrow\xleftarrow を二つだけ用意しています。書き方は \xrightarrow[下のラベル]{上のラベル} で、**波括弧 { } が矢印の上角括弧 [ ] が矢印の下** に置かれます(角括弧は省略可)。矢印はラベルの幅まで自動で伸びます。

latex
\[
  A \xrightarrow{f} B \xrightarrow[\sim]{g} C,
  \qquad
  X \xleftarrow[n \to \infty]{\varphi_n} Y
\]

この例では、A から B へは上に f を載せた右向きの伸縮矢印、B から C へは上に g・下に を付けた矢印が組まれ、いずれも矢印がラベルの幅に合わせて伸びます。右側は左向きの矢印で、上に写像 φ_n、下に極限の条件 n→∞ を添えています。

amsmath が用意する伸縮矢印はこの右・左の二本だけですが、mathtools は 同じ命名規則で仲間を大きく増やします。二重線の \xRightarrow\xLeftarrow\xLeftrightarrow、両向きの \xleftrightarrow、フック付きの \xhookrightarrow\xhookleftarrow、写像の \xmapsto、さらにハープーン(片羽の矢印)や、より長い \xlongrightarrow などです。いずれも [下]{上} の同じ書き方で使えます。

角張った括線 — `\overbracket` と `\underbracket`

LaTeX 標準(および amsmath)には、式の上下に 波形の括線 を渡す \overbrace\underbrace があります。mathtools はこれに対し、角張った(直角の)括線 を引く \overbracket\underbracket を追加します。中括弧の丸い形ではなく、左右の端が直角に折れた「⌜ ⌟」のような括線になり、図式や構造の範囲を示すときに見やすいことがあります。

\overbracket には 二つの省略可能な引数 があります。一つ目が 線の太さ、二つ目が 括線の高さ で、\overbracket[線の太さ][高さ]{中身} の順に書きます。既定では、線の太さは \overbrace と同じ(約 5/18 ex)、高さは約 0.7 ex に設定されており、これはどの文字サイズでも見栄えするよう選ばれています。太さや高さを変えたいときだけ角括弧で与えます。上に乗せる説明は、波形のときと同じく ^{ }(下なら _{ })で付けます。

latex
\[
  \underbracket{a + b + c}_{\text{3 terms}}
  \quad\text{vs}\quad
  \underbrace{a + b + c}_{\text{3 terms}}
\]

この例では、同じ「a+b+c」に対し、左は \underbracket による 直角の括線、右は \underbrace による 波形の括線 が下に渡され、いずれもその下に「3 terms」という注記が添えられます。両者を並べると、角張った括線と丸い括線の違いがはっきり分かります。

自動調整の括弧 — `\DeclarePairedDelimiter`

絶対値 |x| やノルム ‖x‖ を組むとき、中身が背の高い分数などだと、固定サイズの縦棒では中身からはみ出して不格好になります。amsmath のマニュアルは \newcommand*\abs[1]{\lvert#1\rvert} のような自作を勧めますが、これは横方向の空きは正しくても、\abs{\frac{a}{b}} のように中身が高いと縦棒が伸びず、見栄えが崩れます。mathtools の \DeclarePairedDelimiter は、この 左右一対の括弧(fence)を、自動伸縮の機能込みで一度に定義 する命令です。プリアンブルにこう書きます。

latex
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}

こう定義すると、\abs\norm が三通りの使い方を持つようになります。第一に、**素の \abs{x} は固定サイズの縦棒で組みます(中身が低いときはこれで十分です)。第二に、星付きの \abs*{x}** は中身を \left … \right で囲み、高さに合わせて自動で伸縮 します。第三に、**省略可能な引数 \abs[\big]{x}** は手動でサイズを指定する形で、\big\Big\bigg\Bigg の四段階から選べます。

latex
\[
  \abs{x} = \abs{-x}, \qquad
  \abs*{\frac{a}{b}} = \frac{\abs{a}}{\abs{b}}, \qquad
  \norm[\big]{v}
\]

この例では、\abs{x}\abs{-x} は通常サイズの縦棒、\abs*{\frac{a}{b}}分数の高さに合わせて伸びた 縦棒、\norm[\big]{v}\big 一段分だけ大きくした二重縦棒で組まれます。括弧の仕組みそのものについては「括弧類(\left \right)」のページも参照してください。

幅ゼロの中央寄せと前置の添字

残るよく使う道具を三つ、まとめて見ます。一つ目は \mathclap です。総和や積の 下に付ける条件が記号本体より横に長い と、その幅のぶん式全体に余白が空いてしまいます。\mathclap{…} は中身を 幅ゼロの箱に入れて左右対称に中央寄せ するので、条件は見えたまま、式の幅は記号本体ぶんに保たれます。左寄せ・右寄せ版の \mathllap\mathrlap、本文用の \clap もあります。

latex
\[
  \sum_{\mathclap{1 \le i \le j \le n}} a_{ij}
\]

この例では、総和記号の下に「1 ≤ i ≤ j ≤ n」という横に長い条件が付きますが、\mathclap で囲んだことで条件は総和記号の中央に重ねて置かれ、式の左右に無駄な余白が空きません\mathclap を外すと、長い条件の幅だけ総和記号の前後が間延びします。

二つ目は \prescript で、文字の前(左)に上付き・下付きを置く 命令です。引数は三つ、\prescript{前の上付き}{前の下付き}{本体} の順に書きます。化学の同位体表記や、左添字を使う数学記法に便利です。たとえばウラン 238 は質量数 238 を前の上付き、原子番号 92 を前の下付きにして表します。

latex
\[
  \prescript{238}{92}{\mathbf{U}}, \qquad
  \prescript{n}{}{C}_{k}
\]

この例では、左は元素記号 U の左肩に 238、左下に 92 が付いたウランの同位体表記、右は C の左肩に n を置きつつ、通常どおり右下に k を付けた形です。前の下付きが要らないときは、二つ目の引数を空 {} にします。

三つ目は \shortintertext です。amsmath の \intertext は整列を保ったまま行間に文章を挟めますが、上下の空きが やや広すぎる ことがあります。\shortintertext{…} はこれを 詰めた版 で、短い注釈を行間に入れたいときに収まりがよくなります。\intertext\shortintertext とも gather 環境のなかでも使えます。

列を揃える行列 — `matrix*` 系

amsmath の行列環境(matrixpmatrixbmatrix など)は、各列を 常に中央揃え で組みます。負号の付いた成分と付かない成分が混じると、中央揃えでは桁がそろわず読みにくくなります。mathtools は、これらに対応する 星付きの環境 matrix*pmatrix*bmatrix*Bmatrix*vmatrix*Vmatrix* を用意し、列揃えを選べる省略可能な引数 を受け取れるようにしました。\begin{pmatrix*}[r] のように、array 環境と同じ列指定(rlc)を与えます(既定は c)。

latex
\[
  \begin{pmatrix*}[r]
    -1 & 3 \\
     2 & -4
  \end{pmatrix*}
\]

この例では、丸括弧の行列の各列が 右揃え で組まれるため、-123-4 の数字の右端がそろい、負号がきれいに左へ張り出します。標準の pmatrix だと各成分が中央寄せになり、負号のぶん桁がずれて見えます。行列そのものの基本は「行列と配列」のページを参照してください。

オプションの設定 — `\mathtoolsset`

mathtools の各種の挙動は、スイッチを真偽値などで切り替えて調整できます。これをまとめて行う命令が \mathtoolsset{…} で、ふつうはプリアンブルに書いて文書全体に効かせます。鍵(キー)はカンマで区切って並べ、key=value または値の自明な key だけの形で与えます。

latex
\mathtoolsset{
  showonlyrefs = true,
  centercolon
}

よく使う鍵を挙げます。showonlyrefs=true は、本文から参照された式にだけ番号を振り、参照のない式の番号を隠します(ただし参照には \ref ではなく \eqref を使う必要があります)。centercolon は、: を関係子として 中央の高さに置く 挙動を有効にします。このほか、行列の小型版の既定揃えを決める smallmatrix-align\prescript の添字の書体を変える prescript-sub-formatprescript-sup-format など、細かな鍵が多数あります。

機能命令・環境何をするか
coloneqq\coloneqq / \eqqcoloncolon を中央に置いた := / =:
xrightarrow\xrightarrow[下]{上}ラベルに合わせて伸縮する矢印
overbracket\overbracket / \underbracket角張った括線(太さ・高さを指定可)
DeclarePairedDelimiter\DeclarePairedDelimiter自動伸縮する \abs\norm を定義
mathclap\mathclap / \clap幅ゼロで中央寄せ(添字の整形に)
prescript\prescript{上}{下}{本体}文字の前に上付き・下付きを置く
matrix*matrix* / pmatrix* ほか列揃えを選べる行列環境