amsmath+mathtools と仲良くなろう


**～ amsmath+mathtools と仲良くなりたい人に贈る ～**

本記事では基本的にamsmath パッケージユーザガイドを参考にしている．
mathtools はamsmath の拡張パッケージとして提供されているので，ぜひこちらも活用していきたい．

mathtools パッケージは読み込むと同時にamsmath パッケージを読み込むようになるが，明示的にパッケージを読み込ませておく方が良い．

```tex
\usepackage{amsmath}
\usepackage{mathtools}
```

- [amsmath とmathtools のパッケージオプション - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/c1c33eb67953e291b466)

一度にすべてを読んで覚えるのは大変なので，欲しい情報があるときに逐次確認すると良いと思います．
(欲しいときに欲しい情報が手に入るようにしていた方が，ぜんぶ覚えているよりも脳みそ使わなくて楽です．)


# TOC

長いので目次を置いておきます．

<details><summary>もくじ (折りたたみ)</summary>
<div>

- [TOC](#toc)
- [数式モードの基本的なところ](#数式モードの基本的なところ)
  - [★ 数式モードのスタイル](#-数式モードのスタイル)
  - [★ 数学シンボルのクラス](#-数学シンボルのクラス)
    - [☆ 数学記号を上下に組み合わせる](#-数学記号を上下に組み合わせる)
  - [★ 数学フォント](#-数学フォント)
    - [☆ 太字にしたい](#-太字にしたい)
- [数式テクニック](#数式テクニック)
  - [★ 複数行に渡る数式全体に式番号を振りたい](#-複数行に渡る数式全体に式番号を振りたい)
  - [★ 数式にインデントを一括で入れたい](#-数式にインデントを一括で入れたい)
  - [★ 行間を広くとる環境](#-行間を広くとる環境)
  - [★ 拡張されたgathered 環境](#-拡張されたgathered-環境)
  - [★ 分数に複数行の数式を挿入する](#-分数に複数行の数式を挿入する)
- [式番号テクニック](#式番号テクニック)
  - [★ 数式を相互参照させたい](#-数式を相互参照させたい)
  - [★ 式番号を節でリセットしたい](#-式番号を節でリセットしたい)
  - [★ 式番号のスタイルを変更したい](#-式番号のスタイルを変更したい)
- [数式にテキストを挿入する](#数式にテキストを挿入する)
  - [★ 数式中のテキスト](#-数式中のテキスト)
  - [★ ディスプレイ数式にテキストを割り込ませたい](#-ディスプレイ数式にテキストを割り込ませたい)
  - [★ 数式中の項にコメントを入れたい](#-数式中の項にコメントを入れたい)
- [数式改ページ](#数式改ページ)
  - [★ 数式途中で改ページさせたい](#-数式途中で改ページさせたい)
    - [☆ 特定の数式環境中での改ページを許す](#-特定の数式環境中での改ページを許す)
    - [☆ すべての数式環境中での改ページを許す](#-すべての数式環境中での改ページを許す)
- [数式シンボル](#数式シンボル)
  - [★ 定義イコールを使いたい](#-定義イコールを使いたい)
  - [★ 自作で演算子を定義したい](#-自作で演算子を定義したい)
- [数学的構造](#数学的構造)
  - [★ 分数を定義したい](#-分数を定義したい)
  - [★ 左側に上付き / 下付き添え字を与えたい](#-左側に上付き--下付き添え字を与えたい)
    - [☆ vphantom を使う](#-vphantom-を使う)
    - [☆ prescript を使う](#-prescript-を使う)
    - [☆ 転置行列](#-転置行列)
    - [☆ このほか](#-このほか)
- [デリミタ](#デリミタ)
  - [★ 括弧と垂直棒をコマンドで表示させたい](#-括弧と垂直棒をコマンドで表示させたい)
    - [☆ 括弧](#-括弧)
    - [☆ 垂直棒 (Vertical bar)](#-垂直棒-vertical-bar)
  - [★ 括弧（デリミタ）のサイズを手動で調整したい](#-括弧デリミタのサイズを手動で調整したい)
  - [★ 対応するデリミタを定義したい](#-対応するデリミタを定義したい)
- [参考](#参考)
- [余談](#余談)
- [追記](#追記)

</div>
</details>

その他関連記事を紹介しておきます．

- [LaTeX の数式モードをまとめたよ - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/ef693d7abb195c55af7a)
- [amsmath とmathtools のパッケージオプション - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/c1c33eb67953e291b466)
- **きれいに書きたいシリーズ**
  - [大型演算子をきれいに書く - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/bac4ec7c59e78e44e390)
  - [連立方程式をきれいに書く - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/dc8f983d24698119bf71)
  - [場合分けをきれいに書く - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/26cbc47ea0b18906d1ff)
- [行列環境のエトセトラをまとめる - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/d488d3b2f98f37354b8a)
  - [ベクトル書きたい - Qiita (限定共有記事)](https://qiita.com/Yarakashi_Kikohshi/private/324e07b0162cfb618dc9)
  - [テンソル書きたい - Qiita (限定共有記事)](https://qiita.com/Yarakashi_Kikohshi/private/cc2e204e408940813335)
- [LaTeX で定義として管理しておいた方が良い数式コマンド - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/ff3ea22b43ae604aef6b)

# 数式モードの基本的なところ

## ★ 数式モードのスタイル

数式モードのスタイルには4つの種類がある．

|       | スタイル             |                |
| :---: | :------------------- | :------------- |
|   1   | `\displaystyle`      | 別行立て数式   |
|   2   | `\textstyle`         | インライン数式 |
|   3   | `\scriptstyle`       | 添え字         |
|   4   | `\scriptscriptstyle` | 添え字の添え字 |

`{\XXXstyle \sum_{n=0}^N A_n}` とすることで，それぞれのスタイルを使うこと出来る．

```tex
\begin{align*}    % いずれも同じ \sum_{n=0}^N A_n を異なるスタイルで表示させる
    {\displaystyle \sum_{n=0}^N A_n} \\
    {\textstyle \sum_{n=0}^N A_n} \\
    {\scriptstyle \sum_{n=0}^N A_n} \\
    {\scriptscriptstyle \sum_{n=0}^N A_n}
\end{align*}
```

![math-style.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/0b1a990a-e6f8-c7b1-cdc5-ae75f414bea4.png)


## ★ 数学シンボルのクラス

数式モードでは以下のような数式に対するクラスとして括られているようだ．このクラスによって，左右に適切な空白を入れる等の効果がある．[^anothermathclass]

[^anothermathclass]: `\mathalpha` や`\mathinner` もあるようだが，これらのクラスはどうなっているのだろうか．

このような数式シンボルのクラスを$\rm\LaTeX$ ユーザにとって必要な情報なのかは怪しい[^texonlatex]が，知っておくことで数式を作成するときに意味を持った数式の書き方が出来るのではないかと思う．

[^texonlatex]: $\rm\TeX$ ユーザは知っておくべきなのだと思う．しかし，数式を打てれば良いお気持ちの$\rm\LaTeX$ ユーザとしては知らずとも作成できるので知っていたらちょっと良いドキュメント作成が出来るかなと言う感じ．


<details><summary>What's math symbol (折りたたみ)</summary>
<div>

| Class No. | Mnemonic |   コマンド   | 種類                     | 例                                        |
| :-------: | :------- | :----------: | :----------------------- | :---------------------------------------- |
|     0     | Ord      |  `\mathord`  | 通常の記号               | $A\quad 0\quad \Phi\quad \infty$          |
|     1     | Op       |  `\mathop`   | 大型演算子               | $\sum\quad \prod\quad \int$               |
|     2     | Bin      |  `\mathbin`  | 二項演算子               | $+\quad \times \quad $                    |
|     3     | Rel      |  `\mathrel`  | 関係演算子               | $=\quad <\quad \in$                       |
|     4     | Open     | `\mathopen`  | 左デリミタ, 開きデリミタ | $(\quad \lbrack\quad \langle\quad \lvert$ |
|     5     | Close    | `\mathclose` | 右デリミタ, 閉じデリミタ | $)\quad \rbrack\quad \rangle\quad \rvert$ |
|     6     | Pun      | `\mathpunct` | 句読点類                 | $.\quad ,\quad ;\quad !$                  |

`\mathXXX{<数学記号>}` とすれば，`<数学記号>` が`XXX` のシンボルクラスと同等の扱いとなる．

**例 :**
`E` という大型演算子を新たに定義する．

```tex
\newcommand{\opE}{\mathop{E}}    % E をOperator クラスにしている
\begin{equation*}
    \opE^\infty_0
\end{equation*}
```
![mathop-E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/52df9741-297c-3bdd-910b-86f569dfc865.png)


これで`E` が大型演算子`\opE` として利用できるようになった．
しかし，この大型演算子はnosumlimits 等のamsmath のオプションを受け付けないようだ．

</div>
</details>


### ☆ 数学記号を上下に組み合わせる

以下のコマンドがamsmath から提供されている．

|                            |    コマンド     | 例                                      |
| -------------------------: | :-------------: | :-------------------------------------- |
|                 上に重ねる |   `\overset`    | `\overset{<上側>}{<基準>}`              |
|                 下に重ねる |   `\underset`   | `\underset{<下側>}{<基準>}`             |
|               上下に重ねる | `\overunderset` | `\overunderset{<上側>}{<下側>}{<基準>}` |
| 関係演算子として上に重ねる |   `\stackrel`   | `\stackrel{<上側>}{<基準>}`             |

<details><summary>explane some commands (折りたたみ)</summary>
<div>

`\overset`, `\underset`, `\overunderset` はともに`<基準>`となる数学記号のシンボルクラスに依存する．特に，`*` や`^` などのアクセントをつける場合の使用が想定されているのだろう．[^accents]

[^accents]: いくつかのアクセントは$\rm\LaTeX$ で定義されている．「[数式アクセント-講座 - PukiWiki](http://emath.s40.xrea.com/ydir/Wiki/index.php?%BF%F4%BC%B0%A5%A2%A5%AF%A5%BB%A5%F3%A5%C8-%B9%D6%BA%C2)」に詳しい．

逆に，`\stackrel` では全体を関係演算子とすることが出来る．

`A` に`=` を上下に重ねてみると以下のようになる．
`\XXXset` では通常の記号として扱われているが，`\stackrel` では関係演算子として扱われているために前後に間隔が空けられているのが分かる．

![set-rel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/bc85251c-9bfb-eb40-acfe-609b63b6fc5e.png)


このことから，以下のように数学記号を上下に組み合わせた場合，同等の結果が得られる．

```tex
\overset{*}{=}    % シンボルクラスが"=" に依存する
\stackrel{*}{=}    % 基準となる数学記号に依らずに関係演算子のシンボルクラスとなる
```
$$
\stackrel{*}{=}
$$

同等の結果が得られるが，新たな"等号" の意味で定義するのであれば，`\stackrel` で定義する方が意味があるだろう．

実用的な例とすれば，以下のようなものだろうか．

```tex
\stackrel{\scriptscriptstyle \mathsf{def}}{=}
```

</div>
</details>

## ★ 数学フォント

amsmath とmathrsfs パッケージを導入しておけば以下のすべてを利用できる．
数学の流派によってさまざまなフォントが使用されるので，どのフォントがどの数学に使用するのかについては言及しない．(把握もしていない)



|                          |   コマンド    | 備考                                              |
| :----------------------- | :-----------: | :------------------------------------------------ |
| デフォルトの数学フォント | `\mathnormal` | 省略可能                                          |
| ローマン                 |   `\mathrm`   | 本文中のフォント                                  |
| イタリック               |   `\mathit`   | `\mathnormal` よりも少し字がつまるようだ          |
| ボールド                 |   `\mathbf`   | -                                                 |
| サンセリフ               |   `\mathsf`   | -                                                 |
| カリグラフィー           |  `\mathcal`   | 大文字のみ                                        |
| 等幅フォント             |   `\mathtt`   | -                                                 |
| 黒板太字                 |   `\mathbb`   | 大文字のみ，amsfonts またはamssymb が必要         |
| フラクトゥール           |  `\mathfrak`  | アルファベットのみ，amsfonts またはamssymb が必要 |
| スクリプト               |  `\mathscr`   | 大文字のみ，mathrsfs が必要                       |

euscript パッケージを導入しても`\mathscr` を用いることが出来るが，異なるフォントが出力される．

<details><summary>Math fonts sample (折りたたみ)</summary>
<div>


![math-font.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/fcbd9f65-0e4a-7d94-ee7d-bb87582ca455.png)

- ブランクとなっている部分は本来の文字が出力されないか，おかしな文字が出力される
- 小文字のアルファベットに対応していない書体が一部ある
- 小文字のギリシャ文字はいずれの書体も対応していない

ギリシャ文字に関してはいずれのコマンドも使用することが出来ない．(ただし，`\mathbf` はギリシャ文字の大文字は太字にすることが出来る．)
以下のコマンドを用いると，ギリシャ文字であっても太字にすることが出来る．

</div>
</details>



### ☆ 太字にしたい

> **ベクトルにはbm パッケージを使う方が容易で確実だろう**

ベクトル表記ではボールド体にすることが多い．いくつかの方法があるのでまとめておきたい．


<details><summary>How to use bold symbol (折りたたみ)</summary>
<div>


| 提供                         |   コマンド    |                          |
| :--------------------------- | :-----------: | :----------------------- |
| LaTeX                        |   `\mathbf`   | ボールド                 |
| amsmath パッケージ           | `\boldsymbol` | bm パッケージと等価      |
| LaTeX                        |    `\pmb`     | poor man's bold          |
| bm パッケージ[^bm]           |     `\bm`     | `\boldsymbol` とほぼ等価 |
| physics パッケージ[^physics] |     `\vb`     | `\mathbf` と等価         |
| physics パッケージ           |    `\vb*`     | `\boldsymbol` と等価     |

[^bm]: [bm.sty | CTAN](https://www.ctan.org/pkg/bm) から．
[^physics]: [physics.sty | CTAN](https://www.ctan.org/pkg/physics) から．


![math-font-bold.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/82ee9935-fe38-02bb-8afd-62f34d60c910.png)


`\pmb` は2回(3回?)重ねることで太字を作り出すもので，あまり推奨されない[^pmb]ようだ．実際に出力してみると，文字がダブっているためあまり綺麗ではない．

[^pmb]: 緊急で必要な場合には使用しても良いだろうが，よっぽどは使わないほうが良いという意見がよく見られた．ボールドが設定されていない場合に限るだろう．

bm パッケージは`\boldsymbol` を踏襲しているようだが，より拡張的に構成されている．
おもしろいところはいくつかあるが，例としては`\boldsymbol` ではボールドにすることの出来ない記号をボールドに変換することが出来る点だろう．

physics パッケージにもボールドにするコマンドがある．ボールドの他にもさまざまな機能があるので，パッケージをあまり使用したくない場合にはこちらのベクトル表記を用いても良いだろう．(bm パッケージより少し劣るか?)

他にも以下のような方法で太字にする方法が紹介されているところがあるが，bm パッケージを使用すれば特に必要ないだろう．

```tex
\newcommand{\vector}[1]{\mbox{\boldmath $ #1 $}}    % \vector として定義した
```

上のフォントを並べた図は以下のコードから見ることが出来る．

<details><summary>LaTeX Math Fonts Demo Code (折りたたみ)</summary>
<div>

typeset : upLaTeX + dvipdfmx

```tex
\documentclass[uplatex,dvipdfmx,12pt,a4paper]{jsreport}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{upgreek}
\usepackage{mathrsfs}
\usepackage{mathtools}
\usepackage{bm}
\usepackage{physics}
\begin{document}
\newcommand{\mathsymbol}[5]{
&\text{Fonts}& #1 & \text{alph} & #1 & \text{Alph} & #1 & \text{greek} & #1 & \text{Greek} \\
&\text{normal}&  & \mathnormal{#2} &  & \mathnormal{#3} &  & \mathnormal{#4} &  & \mathnormal{#5} \\
&\text{mathrm}&  & \mathrm{#2} &  & \mathrm{#3} &  & \mathrm{#4} &  & \mathrm{#5} \\
&\text{mathit}&  & \mathit{#2} &  & \mathit{#3} &  & \mathit{#4} &  & \mathit{#5} \\
&\text{mathbf}&  & \mathbf{#2} &  & \mathbf{#3} &  & \mathbf{#4} &  & \mathbf{#5} \\
&\text{mathsf}&  & \mathsf{#2} &  & \mathsf{#3} &  & \mathsf{#4} &  & \mathsf{#5} \\
&\text{mathcal}&  & \mathcal{#2} &  & \mathcal{#3} &  & \mathcal{#4} &  & \mathcal{#5} \\
&\text{mathtt}&  & \mathtt{#2} &  & \mathtt{#3} &  & \mathtt{#4} &  & \mathtt{#5} \\
&\text{mathbb}&  & \mathbb{#2} &  & \mathbb{#3} &  & \mathbb{#4} &  & \mathbb{#5} \\
&\text{mathfrak}&  & \mathfrak{#2} &  & \mathfrak{#3} &  & \mathfrak{#4} &  & \mathfrac{#5} \\
&\text{mathscr}&  & \mathscr{#2} &  & \mathscr{#3} &  & \mathscr{#4} &  & \mathscr{#5}
}
\newcommand{\mathboldsymbol}[5]{
&\text{Fonts}& #1 & \text{alph} & #1 & \text{Alph} & #1 & \text{greek} & #1 & \text{Greek} \\
&\text{mathbf} &   & \mathbf{#2} &   & \mathbf{#3} &   & \mathbf{#4} &   & \mathbf{#5} \\
&\text{vb}&  & \vb{#2} &  & \vb{#3} &  & \vb{#4} &  & \vb{#5} \\
&\text{BoldSymbol}&  & \boldsymbol{#2} &  & \boldsymbol{#3} &  & \boldsymbol{#4} &  & \boldsymbol{#5} \\
&\text{bm}&  & \bm{#2} &   & \bm{#3} &  & \bm{#4} &  & \bm{#5} \\
&\text{vb*}&  & \vb*{#2} &  & \vb*{#3} &  & \vb*{#4} &  & \vb*{#5} \\
&\text{pmb}&  & \pmb{#2} &  & \pmb{#3} &  & \pmb{#4} &  & \pmb{#5} \\
}

% Math Fonts
\begin{alignat*}{8}
\mathsymbol{\qquad}{afg}{AGZ}{\alpha\lambda\omega}{\Gamma\Delta\Theta}
\end{alignat*}

% Math Fonts for Bold
\begin{alignat*}{8}
\mathboldsymbol{\qquad}{afg}{AGZ}{\alpha\lambda\omega}{\Gamma\Delta\Theta}
\end{alignat*}

\end{document}
```

今回は出していないが，upgreek に関しても他のギリシャ文字と同様の結果を得た．ぜひ試してみてほしい．

</div></details>



</div>
</details>



# 数式テクニック

## ★ 複数行に渡る数式全体に式番号を振りたい

equation+split で出来る．あたりまえ体操を踊りたくなるが，あまり考えたことがなかった．eqnarray 環境を使いたい人もこのように書くと良いのだろう．

```tex
\begin{equation}
    \begin{split}
    (x+1)^2
        &= (x+1)(x+1) \\
        &= x^2+2x+1
    \end{split}
\end{equation}
```

split 環境はsplit が入る数式環境の仕様に依存しているので，equation 環境に入れた場合には1つの式番号で出力される．


## ★ 数式にインデントを一括で入れたい

たとえば，以下のような左辺が長い数式の場合，右辺は左辺より少し右にずらしていた方が自然である．

```tex
\begin{align}
&\framebox[10cm][c]{ Long Left Hand Side } \\
	& = \framebox[6cm][c]{ Right Hand Side } \\
	& \leq \dots
\end{align}
```
![nomal-equation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d4330cb5-2748-bfe7-2570-ac6f384a7d73.png)


右辺を少し右にずらすには，`&` の後に`\qquad` などの空白を挿入することで可能にするが，改行のたびに挿入する必要があり面倒である．

<details><summary>Use MoveEqLeft command (折りたたみ)</summary>
<div>

そこで，`\MoveEqLeft` コマンドを使おう．(mathtools §3.4.4参照)
これによって，右辺を右にずらすことが出来る．[^moveeqleft]

[^moveeqleft]: 実はこれは少し嘘である．本当は，1行目の数式がアンパサンドの整列から左にずれるようになっている．コマンド名が`\MoveEqRight` でないのはこのためである．

```tex
\begin{align}
\MoveEqLeft % <-- 今回の主役!!
\framebox[10cm][c]{ Long Left Hand Side } \\
	& = \framebox[6cm][c]{ Right Hand Side } \\
	& \leq \dots
\end{align}
```

![use-moveeqleft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/093969e2-dd8b-c6f4-ff20-f983f387d106.png)

デフォルトでは左から2em だけ右にずらすようになっている．`\MoveEqLeft[1]` などとすれば，1em に変更することも可能である．

右辺の途中で改行する場合には，以下のようにするとよい．[^mathtoolsoffialmoveeqleft]

[^mathtoolsoffialmoveeqleft]: 公式にはsplit 環境を用いずに右辺の式を途中改行していたが，式番号を付与することを考えるとsplit 環境を用いた方が有用だろうと思われる．

```tex
\begin{align}
\MoveEqLeft[3] % [3] とすることを公式で推奨されていた
\framebox[10cm][c]{Long Left Hand Side} \\
    \begin{split}
    	= {} & \framebox[8cm][c]{ Right Hand Side 1st part } \\ % "=" と "&" の順序注意
    	& + \framebox[6cm][c]{ Right Hand Side 2nd part }
    \end{split}\\
    = {} & \framebox[8cm][c]{ Right Hand Side }
    % "{}" を挿入しておかないと "=" と数式の間が詰まるので注意．
\end{align}
```

![moveeqleft-split.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/44fc8443-1d42-4a12-8390-22d00126ff84.png)

これと併せて「[すぐに忘れるLaTeX数式のインデントまとめ - Qiita](https://qiita.com/tueda/items/8b35d7b178645210769e)」も参照すると良いだろう．
また，これに関連して拙文「[autobreak を使いこなす - Qiita](https://qiita.com/Yarakashi_Kikohshi/private/098621ab4b4d4f5ce8cc)」を紹介しておく．実は，上の記事を書いた人がautobreak パッケージの作成者でした．（`\MoveEqLeft` なんて誰も紹介していないだろ?とググっていたら出てきました．）

</div>
</details>


## ★ 行間を広くとる環境

**cf. The mathtools Package, §4.4 Spreading equations**

spreading 環境を利用しよう．

<details><summary>How to use spreading env. (折りたたみ)</summary>
<div>

この環境内では，テキストモードで文字が挿入でき，かつ数式では`-ed` 環境ではないことに注意したい．subequations 環境に少し似ている．

```tex
\begin{spreadlines}{<dimen>}
    <contents>
\end{spreadlines}
```

`<dimen>` で数式の行間を指定する．

```tex
\begin{spreadlines}{20pt}    % ここでは20pt の行間を取っている
Large spaces between the lines.
\begin{gather}
    a = b \\
    c=d
\end{gather}
\end{spreadlines}
Back to normal spacing.
\begin{gather}
    a = b \\
    c=d
\end{gather}
```

</div>
</details>



## ★ 拡張されたgathered 環境

**cf. The mathtools Package, §4.5 Gathered environments**

通常のgathered 環境では中央揃えになるが，これを左揃えや右揃えにする環境が提供されている．

<details><summary>How to use "extended gathered" env.(折りたたみ)</summary>
<div>

|          |  環境名   |
| :------: | :-------: |
| 中央揃え | gathered  |
|  左揃え  | lgathered |
|  右揃え  | rgathered |

また，gathered 環境を任意に定義することも可能である．

```tex
\newgathered{<name>}{<pre_line>}{<post_line>}{<after>}    % 新しいgathered 環境を定義
\renewgathered{<name>}{<pre_line>}{<post_line>}{<after>}    % 既存のgathered 環境を定義
```

```tex
\newcounter{steplinecnt}
\newcommand{\stepline}{\stepcounter{steplinecnt}\thesteplinecnt}
\newgathered{stargathered}
    {\llap{\stepline}$*$\quad\hfil}    % \hfil for centering
    {\hfil}    % \hfil for centering
    {\setcounter{steplinecnt}{0}}    % reset counter
```

以下のような結果を得る．


</div>
</details>


## ★ 分数に複数行の数式を挿入する

**cf. The mathtools Package, §4.6 Split fractions**

`\frac` で分数を作成する際に，分子や分母にsprit 環境のように複数行の数式を挿入することが出来るコマンドがある．
`\splitfrac` を使おう．

<details><summary>How to use splitfrac command (折りたたみ)</summary>
<div>

```tex
\begin{equation}
a = \frac{
        \splitfrac{xy + xy + xy + xy + xy}
            {+ xy + xy + xy + xy}
}
{z}
= \frac{
        \splitdfrac{xy + xy + xy + xy + xy}
            {+ xy + xy + xy + xy}
}
{z}
\end{equation}
```

|               | 特徴                                       |
| :-----------: | :----------------------------------------- |
| `\splitfrac`  | 引数にテキストモードの数式を強制**する**   |
| `\splitfracd` | 引数にテキストモードの数式を強制**しない** |

`\splitfrac` を入れ子にすることは可能だが，入れ子になっている`\splitfrac` 側には`\mathstrut` を挿入することが推奨されている．以下のように利用しよう．

```tex
\begin{equation}
\frac{
    \splitfrac{xy + xy + xy + xy + xy}
        {
        \splitfrac{xy + xy + xy + xy + xy}
            {+ xy + xy + xy + xy}
        }
}
{z}
 = \frac{
    \splitfrac{xy + xy + xy + xy + xy}
        {
        \splitfrac{\mathstrut xy + xy + xy + xy + xy}
            {+ xy + xy + xy + xy}
        }
}
{z}
\end{equation}
```


</div>
</details>



# 式番号テクニック

## ★ 数式を相互参照させたい


`\ref` ってすればいいと思ってない?!
amsmath では，`\eqref` にすると丸括弧`()` 付きで式番号が相互参照で出てくる．どうせなら頭に "Eq." を常に付けたいので，プリアンブルで以下のようにしておくと楽かもしれない．

```tex
\newcommand{\eref}[1]{Eq.\eqref{#1}}
```

ちなみに，mathtools の`showonlyrefs` オプションは`\eqref` でないと対応してくれない．~~筆者はこれに手間取らせられた記憶が大いにあるので，読んだ皆さんは注意してね．~~[^showonlyrefs]

[^showonlyrefs]: 逆に，括弧を付けてほしくないけれど，`showonlyrefs` を使いたい場合にはどうするのだろう．


## ★ 式番号を節でリセットしたい

<details><summary>再定義することによるリセット方法 (折りたたみ)</summary>
<div>

通常$\rm\LaTeX$ では，数式番号を（節番号．式の通し番号）として出力される．これを節ごとの式の通し番号にする場合には`\theequation` をプリアンブルで再定義することによって可能にする．

```tex
\renewcommand{\theequation}{\thesection.\arabic{equation}}
```
しかし，この場合では，数式番号のカウンタをいちいち`\setconter` で指定しない限りには新しい節や章の開始ではゼロにリセットされない．

</div></details>

`\numberwithin` コマンドをプリアンブルで設定することで，数式の式番号を節番号に結び付けて，自動的にカウンタをリセットすることが出来る．

```tex
\numberwithin{equation}{section}  % <-- これを置くだけ!!
```

<details><summary>LaTeX レベルでの修正 (折りたたみ)</summary>
<div>

筆者はどこかで見た以下のようなことをしていたが，`\numberwithin` コマンドの方が断然簡単に設定できて良い．実はこの方法であってもsection で式番号がリセットされるので，これでも良い．[^texonlatex]

[^texonlatex]: $\rm\TeX$ on $\rm\LaTeX$ でしか使用していないので，実は良くない挙動をしている可能性もある．筆者が使っていた分には異常はなかった．

```tex
\makeatletter
\renewcommand{\theequation}{\thesection.\arabic{equation}}
\@addtoreset{equation}{section}  % ここでsection ごとに式番号をリセットしている
\makeatother
```

</div></details>



## ★ 式番号のスタイルを変更したい

**cf. The mathtools Package, §3.2.1 The appearance of tags**

mathtools から提供されている`\newtagform` を活用しよう．[^ntheorem]

[^ntheorem]: ntheorem パッケージを使用している場合には，ntheorem を読み込んであから`\newtagform` を設定する方が良いようだ．使っていないのでよく分からない．

<details><summary>How to use newtagform command (折りたたみ)</summary>
<div>


```tex
\newtagform{<name>}[<inner_format>]{<left>}{<right>}
\renewtagform{<name>}[<inner_format>]{<left>}{<right>}
\usetagform{<name>}
```

- `<name>` : デフォルトは "default" ，その他任意に名前を定義可能
- `<inner_format>` : 式番号のスタイルを指定
- `<left>`, `<right>` : ひだり括弧，みぎ括弧のスタイルの指定

**例 :** "[<式番号>]" にしたい

プリアンブルで以下のようにすれば良い．

```tex
\newtagform{bracket}{[}{]}
\usetagform{bracket}
```

本文中の途中で式番号のスタイルを変更したい場合は，`\usetagform` を途中で挿入すればよい．このとき，式番号は連続することに注意しておきたい．

![usetagform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/cea2f613-c0ca-26b4-f4ee-a054ccc444e5.png)

このときに`\usetagform{default}` を挿入しないと，これ以降の`\eqref` は`bracketBf` を反映することになる．

オイオイ，`\eqref` にも式番号のスタイルを反映しないのか......
単一のスタイルを使用するのであれば問題なのだろう．[^usetagformfix]

[^usetagformfix]: これの解決策を知っている人いれば教えてほしい．

</div>
</details>




# 数式にテキストを挿入する

## ★ 数式中のテキスト

数式中にテキストを挿入することはよくある．
`\text` と`\mathrm` の2つがあるがどのように使い分けるべきなのだろうか．

<details><summary>What's the difference between text and mathrm (折りたたみ)</summary>
<div>


| コマンド  | 効果                                                                                                   |
| :-------: | :----------------------------------------------------------------------------------------------------- |
|  `\text`  | 数式中にテキストを表示させる．フォントは本文と同様．`\text` 内に`$` を用いて数式を挿入することも可能． |
| `\mathrm` | 数式中にローマン体を表示させる．                                                                       |

`\text` はあくまで数式の注釈を挿入するためのコマンドであり，関数名を挿入するためのコマンドではないようだ．関数名には`\mathrm` を用いるべきだろう．

|   環境    |                 推奨                  |               非推奨                |
| :-------: | :-----------------------------------: | :---------------------------------: |
|  `\text`  |   `<equation> \text{word or phase}`   | `<function>_{\text{function name}}` |
| `\mathrm` | `<function>_{\mathrm{function name}}` | `<equation> \mathrm{word or phase}` |

場合分けに用いるcases, dcases, rcases 環境には`\text` を用いる．

ちなみに，本文中でローマン体を使用するコマンドは`\textrm` である．間違えないように注意が必要だ．[^rm]

[^rm]: `\rm` コマンドでローマン体にするのはオワコンってかなり前から言われているから使わないようにしておこう．

</div>
</details>




## ★ ディスプレイ数式にテキストを割り込ませたい

数式環境内で`\intertext` を用いることでalign 環境等のアンパサンドによる整列を崩さずに数式環境内にテキストを挿入することが出来る．

<details><summary>How to use intertext command (折りたたみ)</summary>
<div>

```tex
\begin{align}
A_1
    & = N_0(\lambda;\Omega’)-\phi(\lambda;\Omega’),\\
A_2
    & = \phi(\lambda;\Omega’)-\phi(\lambda;\Omega),\\
\intertext{and}  % 上2式と下1式の間に "and" が表示される
A_3
    & = \mathcal{N}(\lambda;\omega).
\end{align}
```

![math-intertext.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d809a512-5284-7720-d6ec-d0bf62bbdd26.png)

ただし，これは数式環境を分けて書いているのとほとんど同じくらい行が空いてしまう．
それを嫌う場合には，mathtools パッケージで提供されている`\shortintertext` を用いると良いだろう．（むしろこちらの方が自然に見えるが，場合によっては文字が詰まって見えるかもしれない．）

</div>
</details>


## ★ 数式中の項にコメントを入れたい

数式の項にコメントを挿入する場合には，項の上下に丸括弧や角括弧を付けることで行う．

<details><summary>Insert text in term (折りたたみ)</summary>
<div>

この場合，$\rm\LaTeX$ で標準で定義されている`\overbrace` や`\underbrace` を用いることになるだろう．
しかし，以下のようなためにmathtools では`\overbrace`, `underbrace` を再定義している．

- 長さが固定されている
- 10pt に最適化されているために，異なるフォントサイズでは最適な結果を得られない(文字と括弧が干渉する等)
- フォントが異なっても最適な結果を得られない(ようだ)


以下を使おう．[^bracketforfont]

|              |    コマンド     |      結果       |
| :----------: | :-------------: | :-------------: |
| 下側，丸括弧 |  `\underbrace`  |  ![underbrace]  |
| 上側，丸括弧 |  `\overbrace`   |  ![overbrace]   |
| 下側，角括弧 | `\underbracket` | ![underbracket] |
| 上側，角括弧 | `\overbracket`  | ![overbracket]  |

- 丸括弧の場合

```tex
\underbrace{<括弧に含める数式>}_{<コメント>}
\overbrace{<括弧に含める数式>}^{<コメント>}
```

- 角括弧の場合

オプションで括弧の太さと括弧の高さを決めることが出来る．

```tex
\underbracket[<括弧の太さ>][<括弧の高さ>]{<括弧に含める数式>}_{<コメント>}
\overbracket[<括弧の太さ>][<括弧の高さ>]{<括弧に含める数式>}^{<コメント>}
```

コメントの部分も数式モードになっているため，テキストを挿入するには`\text` によって行う必要がある．


[underbrace]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d42660c9-ca25-13df-5316-67da38e85ecd.png
[overbrace]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e1c0a5c7-7101-f36e-b17e-2af3c68a0013.png
[underbracket]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2c03e476-8418-69e9-48e0-ec5cc55ece0c.png
[overbracket]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/48388bf5-c49a-49ec-92e7-a6530ad02688.png


[^bracketforfont]: デフォルトのComputer Modernフォントでの作業の他に，パッケージmathpazo，pamath，fourier，eulervm，cmbright，およびmathptmxでも機能します．ただし，ccfonts を使用する場合には，`\LaTeXunderbrace`, `\LaTeXoverbrace` を再定義することを推奨している．


</div>
</details>



# 数式改ページ

## ★ 数式途中で改ページさせたい

amsmath パッケージが使用されているとき，数式の行間で改ページされることを通常は許可していない．ディスプレイ数式の途中で改ページすることは著者の責任で行うべきと言う思想らしい．

数式途中で改ページをさせる方法が2つあるので紹介する．

### ☆ 特定の数式環境中での改ページを許す


<details><summary>Use displaybreak (折りたたみ)</summary>
<div>


特定の数式中での改ページを許す場合，`\displaybreak` を使う．
このコマンドには引数によってその改ページへのレベルを0~4で指定することができ，“ 引数の指定がない ” または “ 引数が4 ” のとき強制的に改ページされる．[^pagebreak]

[^pagebreak]: `\pagebreak` の引数と同様らしい．筆者は使ったことがないのでよく分からない．

```tex
\begin{align}
f(x)
    &=ax^2+bx+c  \\
    &=a\left(x^2+\frac{b}{a}x\right)+c  \displaybreak  \\ % ここで強制改ページ
    &=a\left{\left(x+\frac{b}{2a}\right)^2-\frac{b^2}{4a^2}\right}+c  \\
    &=a\left(x+\frac{b}{a}\right)^2-\frac{b^2}{4a}+c
\end{align}
```

改行`\\` の直前に配置することが望ましいようだ．

</div>
</details>

### ☆ すべての数式環境中での改ページを許す


<details><summary>Use allowdisplaybreaks (折りたたみ)</summary>
<div>


改ページをどの場所であっても複数行の式の途中で行って良い場合は，`\allowdisplaybreaks[引数]` コマンドをプリアンブルで使用すると良いだろう．[^allowdisplaybreaks]

引数には1~4を指定することができ，`[1]` は改ページを許可するが，出来るだけ避けたいことを意味するようだ．数字が増えれば許容度が増える．

また，`\allowdisplaybreaks` を有効にしていても，改ページをさせたくない複数行ある数式の改行で`\\*` としておけばその行での改ページを禁止させることが出来るようだ．

[^allowdisplaybreaks]: split, aligned, gathered, alignedat などは改ページが出来ない数式環境のようだ．これは，内容を分割することのできないボックスで囲んでいることに起因するらしい．

べらぼうに長い数式で紙面を超えてしまう場合には有用な手だてなように思われる．
しかしながら，オフィシャルな文章ではあまり数式途中で改ページを挟むようなものを見たことがない．これに関しては私見ではあるが，複数行に渡る数式の途中で改ページするのはあまり望ましくないのではないかと思う．
まとめノートなどの私用で使う分には有用かもしれない．

</div>
</details>



# 数式シンボル

## ★ 定義イコールを使いたい


$\rm\LaTeX$ では合同は`\equiv` として提供されている．

```tex
a \equiv b
```
$$
a \equiv b
$$

しかし，`:=` でも定義を示したい！[^coloneqq]
mathtools では以下のようにさまざまな等号のサブセットが提供されている．

[^coloneqq]: コロンとイコールを使えば同じように`:=` を表示することは出来る．しかし，コロンとイコールが水平軸中心で揃わない場合があり，あまり綺麗ではない．なるべく`\coloneqq` を使おう．

![eqq-colon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/bc72c953-0f94-dbbf-9350-c15511fa70f0.png)

`\coloneqq` などは`q` が一つ抜けていると`:-` になってしまうので注意が必要．


## ★ 自作で演算子を定義したい


amsmath では，`\sin` や`\log`, `\lim` などの演算子が定義されている．これらにはいくつかの特徴がある．

- ローマン体で出力される
- このコマンドの両端に少しの空間が空く
- 上付き文字，下付き文字を上下に設定することが出来る (e.g.`\lim` 等)

これらと同様のコマンドを定義したい．[^setmathrm]

[^setmathrm]: `\mathrm` で定義することでローマン体で出力することは可能だ．しかし，特徴で挙げた残り2つに関してはまったく有効にならない．

<details><summary>Deffine the command with DeclareMathOperator (折りたたみ)</summary>
<div>

`\DeclareMathOperator` を使おう．これによって，amsmath では以下のコマンドが定義済みとなっている．

![amsmathoperator]

[amsmathoperator]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/21541c17-5014-9b07-5aee-94ede4c71ca7.png

勾配や発散，回転を表す`\grad`, `div` `\rot` はamsmath では定義されていない．これらを例として挙げておこう．

```tex
\DeclareMathOperator{\grad}{grad}
\DeclareMathOperator{\div}{div}
\DeclareMathOperator{\rot}{rot}
```

このようにすればよい．

ただし，`\lim` のように下側に下付き文字を配置したい場合には，`\DeclareMathOperator*` を使って定義する．

`\operatorname` を用いることで，全体で定義せずに演算子を作成することも出来る．また，`\operatorname*` で下側に下付き文字を配置させることが出来る．

![math-operatorname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2dee38ad-1bf2-5211-a0e5-0389a6a1bdf2.png)

</div>
</details>


# 数学的構造

## ★ 分数を定義したい


amsmath では分数のような構造の数式を`\genfrac` を用いて以下のように定義[^genfrac]している．

[^genfrac]: `\over`，`\overwithdelims`，`\atop`，`\atopwithdelims`，`\above`，`\abovewithdelims`(プリミティブな一般化された分数コマンド) をamsmath パッケージで使用することは出来ず，エラーメッセージが表示されるようだ．これは，technote.texで説明されている．

<details><summary>How to use genfrac command (折りたたみ)</summary>
<div>


```tex
\genfrac{<左デリミタ>}{<右デリミタ>}{<括線の太さ>}{<数式スタイル>}{<分子>}{<分母>}
```

デリミタは`\left ~\right` で対応させる必要はない．しかし，片側のみのデリミタを利用する場合には，`\left ~\right` で対応させるときと同様に`.` を用いて対応させる必要がある．

4つ目の引数には数式スタイルを0～3の数字で挿入する．

|       |     数式スタイル     |                          |
| :---: | :------------------: | :----------------------- |
|   0   |   `\displaystyle`    | 背が高い                 |
|   1   |     `\textstyle`     | 背が低い                 |
|   2   |    `\scriptstyle`    | 添え字のスタイル         |
|   3   | `\scriptscriptstyle` | 添え字の添え字のスタイル |

この数式スタイルの引数を空にするとnormal の数式スタイルになる．

amsmath では以下のコマンドがすでに定義されている．

| コマンド  |     スタイル     |                 |
| :-------: | :--------------: | :-------------- |
|  `\frac`  | style にしたがう | normal な分数   |
| `\tfrac`  |   `\textstyle`   | 背の低い分数    |
| `\dfrac`  | `\displaystyle`  | 背の高い分数    |
| `\binom`  | styleにしたがう  | normal な二項式 |
| `\tbinom` |   `\textstyle`   | 背の低い二項式  |
| `\dbinom` | `\displaystyle`  | 背の高い二項式  |

これらは以下のように定義されている．

```tex
\newcommand{\frac}[2]{\genfrac{}{}{}{}{#1}{#2}}
\newcommand{\tfrac}[2]{\genfrac{}{}{}{1}{#1}{#2}}
\newcommand{\binom}[2]{\genfrac{(}{)}{0pt}{}{#1}{#2}}
```

`\binom` では括線を“0pt”とすることで非表示としている．

以下のように`\genfrac` を活用してみよう．

```tex
\newcommand{\fracd}[2]{\genfrac{}{}{}{}{\mathrm{d} #1}{\mathrm{d} #2}}    % 分子分母に"#~" 以外を付け足すことも出来る
\newcommand{\fracdx}[1]{\genfrac{}{}{}{}{\mathrm{d} #1}{\mathrm{d} x}}    % 引数を1つにも出来る
\newcommand{\fracpd}[2]{\genfrac{}{}{}{}{\partial #1}{\partial #2}}
\newcommand{\fracrvb}[2]{\genfrac{.}{\rvert}{}{}{#1}{#2}}    % 右デリミタの縦線と"." を対応付ける
```

![genfrac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e71d33d3-0934-1e24-107e-e79c73202755.png)

`\genfrac` では括線や数式スタイルを決めることが出来ることがうま味になるだろう．その意味では，他の定義方法もある上のような例では活用しきれていないような気もする．

</div>
</details>

## ★ 左側に上付き / 下付き添え字を与えたい

いくつかの方法がある．まとめておこう．

### ☆ vphantom を使う

$\rm\LaTeX$ の標準的なコマンド`\vphantom` を用いる．

<details><summary>How to use vphantom (折りたたみ)</summary>
<div>

これは，幅がなく引数となる数式の高さをもつ空白を作る．

以下のように使うと良いだろう．

```tex
{\vphantom{\int}}^\infty \int
```

ただし，この場合には`\vphantom` の空白にしたがって添え字が生成されるため，空白側の左揃えのような形になることに注意が必要である．

</div>
</details>

### ☆ prescript を使う

mathtools では`\prescript` を与えている．

<details><summary>How to use prescript (折りたたみ)</summary>
<div>


```tex
\prescript{<左上>}{<左下>}{<数式>}
```

として組むことが出来る．
この場合には，数式の左側であることを考慮して作成されているので，左側の添え字は右揃えのような形をとる．

実用的な部分では，転置行列を左上に"t" で表現する場合に必要になるのだろうと思われる．
以下のように作成すると良いだろう．

```tex
\newcommand{\transposevphantom}[1]{{\vphantom{#1}}^t\! #1}    % vphantom を利用
\newcommand{\transposeprescript}[1]{\prescript{t}{}{#1}}    % prescript を利用
```

</div>
</details>

### ☆ 転置行列

実用的な部分では，転置行列を左上に"t" で表現する場合に必要になるのだろうと思われる．
以下のように作成すると良いだろう．

```tex
\newcommand{\transposevphantom}[1]{{\vphantom{#1}}^t\! #1}    % vphantom を利用
\newcommand{\transposeprescript}[1]{\prescript{t}{}{#1}}    % prescript を利用
```


### ☆ このほか

他にも，パッケージを利用することで左側に添え字を与えることが出来るようになる．

- [leftindex.sty | CTAN](https://www.ctan.org/pkg/leftindex)
  : 左側にインデックスを付けるためのパッケージ
- [tensor.sty | CTAN](https://www.ctan.org/pkg/tensor)
  : テンソル表記を平易にするパッケージ
- [mhchem.sty | CTAN](https://ctan.org/pkg/mhchem)
  : 化学記号を出力するパッケージ

mhchem に関しては数式で利用すべきではないが，ネタとして入れておきました．


# デリミタ

## ★ 括弧と垂直棒をコマンドで表示させたい

コマンドで表示させなくても，直接的に`(`, `)` や`|` を打つことが出来るだろうと思われるだろう．しかし，場合によっては直接的に打たない方が良い場合がある．[^paren]

[^paren]: empheq パッケージでは括弧をコマンドで表現する必要があるようだ．

### ☆ 括弧

通常，括弧は丸括弧 `(`, `)`と角括弧 `[`, `]` を利用することが多い．この内，角括弧はamsmath で定義されているが，丸括弧は定義されていない．しかし，mathtools では丸括弧がコマンドとして定義されている．

|           括弧の種類            |  ひだり   |   みぎ    |             |
| :-----------------------------: | :-------: | :-------: | :---------: |
|  丸括弧 (Parenthesis) `(`, `)`  | `\lparen` | `\rparen` |  mathtools  |
|     波括弧 (Brace) `{`, `}`     |   `\{`    |   `\}`    | $\rm\LaTeX$ |
|    角括弧 (Bracket) `[`, `]`    | `\lbrack` | `\rbrack` |   amsmath   |
| 山括弧 (Angle bracket) `<`, `>` | `\langle` | `\rangle` | $\rm\LaTeX$ |


### ☆ 垂直棒 (Vertical bar)

絶対値やノルムを表すには`|` や`\|` を用いられることがあるが，これは数学的な意味に応じた記号を選んでいることにならない（らしい）．したがって，これに代わる垂直棒がamsmath パッケージでは提供されている．

|             |  ひだり  |   みぎ   | 単体で用いる |
| :---------: | :------: | :------: | :----------: |
| 1本の垂直線 | `\lvert` | `\rvert` |   `\vert`    |
| 2本の垂直線 | `\lVert` | `\rVert` |   `\Vert`    |


左側の垂直線と右側の垂直線は異なるコマンドで定義されているが，特に対応関係がなさているわけではなく，独立して出力することが出来る．


## ★ 括弧（デリミタ）のサイズを手動で調整したい

数式に括弧を付ける場合には`\left` と`\right` を用いて自動的にサイズを生成させることが多いだろう．しかし，この方法には2つの制限がある．

- デリミタで囲まれる最大の大きさに対応するものを機械的に作ってしまうこと
- サイズの変更の範囲が連続的でなく，離散的な変化になることがあること(3pt 毎に変化するようだ)

すなわち，思ったよりも大きいデリミタが生成されることがあるということである．


<details><summary>デリミタが上手く自動調整されない例 (折りたたみ)</summary>
<div>


初めに考えられるような状況は，総和作用素の上下に範囲を指定する添え字を置くことのようだ．

```tex
\left[
    \sum_i a_i\Bigl\lvert\sum_j x_{ij}\Bigr\rvert^p
\right]^{1/p}, 
\biggl[
    \sum_i a_i\Bigl\lvert\sum_j x_{ij}\Bigr\rvert^p
\biggr]^{1/p}
```

![math-tall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/3f005cad-0150-d034-ee87-4157fffe4a25.png)


あるいは，括弧内に括弧が挿入されている場合である．

```tex
\left((a_1 b_1) - (a_2 b_2)\right) \times 
\left((a_2 b_1) + (a_1 b_2)\right)\\
\shortintertext{Compare parenthesis size}
\bigl((a_1 b_1) - (a_2 b_2)\bigr) \times 
\bigl((a_2 b_1) + (a_1 b_2)\bigr)
```

![math-bracket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/3f7fc3d6-9fe5-c0e9-f6b8-6e34ecc4e0d8.png)



</div>
</details>



手動的にデリミタのサイズを調整する方法は以下のようなコマンドのセットがある．

![table-math-bracket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/7a976e58-1d0f-2350-e5c8-27029d8d5184.png)


これらのデリミタのサイズを調整するセットは，`\left` と`\right` を除いて対応関係を持っていない．すなわち，単独で使用することが出来る．


## ★ 対応するデリミタを定義したい

括弧や垂直棒は，数式を囲う場合がよくある．手動か自動かを問わずとも，一つ一つにサイズ調整のコマンドをデリミタに付与していくのは煩雑である．
新たなコマンドとして定義してしまった方が良い．

<details><summary>Use DeclarePairedDelimiter (折りたたみ)</summary>
<div>



<details><summary>amsmath での方法 (折りたたみ)</summary>
<div>


amsmath パッケージでは以下のような方法による定義を紹介している．．

```tex
\providecommand{\abs}[1]{\lvert #1\rvert}
\providecommand{\norm}[1]{\lVert #1\rVert}
```

上のようにすることで，`\abs`, `\norm` が定義される．しかし，このような定義を用いても，デリミタのサイズを調整することは出来ない．

定義コマンド内で`\left`~`\right` で対応関係を採っても良いのだが，それでは大きすぎる場合などが生じた際に手動で調整するには新たにコマンドを定義する必要が生じる．
そこで，mathtools で定義されている`\DeclarePairedDelimiter` を用いよう．これは，`\providecommand` よりも対応するデリミタに対してフレキシブルなコマンドを定義することが出来る．

</div>
</details>


mathtools では，対応するデリミタを定義する`\DeclarePairedDelimiter` をサポートしている．このコマンドで定義されたコマンドには，以下のような特徴がある．

- `*` や引数を付けない場合には，`\providecommand` で定義されたコマンドと同様の結果を得る
- `*` 付きでは，`\left` と`\right` を用いたサイズが自動調整されたデリミタとなる
- オプションで引数を付けることで，手動調整をすることが出来る

引数には，`\big`, `\Big`, `\bigg`, `\Bigg` を使うことが出来る．

以下のようにコマンドを組む．

```tex
\DeclarePairedDelimiter{<command>}{<left_delimiter>}{<right_delimiter>}
```


**例 :** 絶対値は以下のように定義する

```tex
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
```

これによって定義された`\abs` は，以下のような結果を得る．

```tex
    \abs{\frac{a}{b}}, \quad    % そのまま
    \abs*{\frac{c}{d}}, \quad    % 自動調整
    \abs[\Bigg]{\frac{e}{f}}.    % \Bigg オプション付き
```

![abs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/ec39a885-c805-ca5e-c318-24e36ca8a34f.png)


このコマンドは，既に定義されているコマンドに対して上書きの機能はないようだ．したがって，physics パッケージ[^physics]等の数式を簡便に打つためのパッケージを利用している際には注意が必要である．

[^physics]: [physics.sty | CTAN](https://www.ctan.org/pkg/physics)から．使い方に関しては，「[数式をもっと楽に書ける TeX の physics パッケージまとめ - Qiita](https://qiita.com/7ma7X/items/ce9f49e9b3fc0344ae23)」に詳しい．

```tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{amsmath}
\usepackage{mathtools}
\DeclarePairedDelimiter\abs{\lvert}{\rvert}    % 先に定義する
\usepackage{physics}    % physics には\abs が定義されている
\begin{document}
\[
    \abs{\frac{a}{b}}, \quad    % physics では自動調整
    \abs*{\frac{c}{d}}, \quad    % physics ではそのまま
    \abs[\Bigg]{\frac{e}{f}}.    % physics では\Bigg オプション付きは定義されていない
\]
\end{document}
```

abs-example1.tex の場合，`\DeclarePairedDelimiter` で定義した`\abs` がphysics によって上書きされるため，`\abs` は自動調整，`\abs*` はデフォルトサイズ，`\abs[\Bigg]` はタイプセットエラーになる．

このようになることを避けるためには，`\DeclarePairedDelimiter` で定義するコマンド名を異なる名前にするか，physics パッケージを利用しないか，になるだろう．

```tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{physics}    % physics には\abs が定義されている
\DeclarePairedDelimiter\abs{\lvert}{\rvert}    % 後に定義する
\begin{document}
\[
    \abs{\frac{a}{b}}, \quad
    \abs*{\frac{c}{d}}, \quad
    \abs[\Bigg]{\frac{e}{f}}.
\]
\end{document}
```

abs-example2.tex ではphysics で`\abs` が定義されているため，新たに定義することが出来ない．(タイプセットエラーになる)


<details><summary>Extension DeclarePairedDelimiter (折りたたみ)</summary>
<div>

少し発展的なコマンドの利用方法を紹介しておくが，パッケージガイドを読んでいてもいま一つ理解できていないので，紹介程度にとどめておく．
(cf: mathtools p.26, §3.6 Paired delimiters)

`\DeclarePairedDelimiter` では，一つの数式しか引数として取り込むことが出来ない．そこで，`\DeclarPairDlimiterX` を用いよう．

```tex
\DeclarePairedDelimiterX{<cmd>}[1]{<left_delim>}{<right_delim>}{#1}
```

**例 :** ディラックのブラケット記法

```tex
\DeclarePairedDelimiterX\innerp[2]{\langle}{\rangle}{#1,#2}
\DeclarePairedDelimiterX\braket[3]{\langle}{\rangle}%
{#1\,\delimsize\vert\,\mathopen{}#2\,\delimsize\vert\,\mathopen{}#3}
```

上のように定義することで，以下のような結果を得る．

```tex
    \innerp*{A}{ \frac{1}{2} } \quad
    \braket[\Big]{B}{\sum_{k} f_k}{C}
```

![Bracket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4887442e-fdc2-973b-49da-b19a6284f70e.png)


しかしながら，ディラックのブラケット記法を定義するのであれば，braket パッケージ[^braket]を用いた方が平易なように思われる．(ちなみに，physics パッケージでもブラケット記法のコマンドは定義されている．)

[^braket]: [braket.sty | CTAN](https://www.ctan.org/pkg/braket) から．使い方に関しては「[TeX でディラックのブラケットを書く - Qiita](https://qiita.com/gon_phys/items/55fef99f67fd930a4a88)」に詳しい．

この場合でももちろんphysics パッケージとの併用と同様の結果が生じる可能性がある．

</div>
</details>

</div>
</details>






# 参考

- [複数行の数式 - 情報系学習サイト](https://shabonlearning.com/LaTeX/align.html)
- [LaTeX/amsmathによる数式環境を見本付きで | tm23forest.com](https://tm23forest.com/contents/latex-amsmath-guide-with-svg-outputexample)
- [「Short Math Guide for LaTeX」を読んで](http://bm.skr.jp/tex/short-math-guide.pdf) [pdf]
- [チョット数式フォントしてみる話(3) - マクロツイーター](https://zrbabbler.hatenablog.com/entry/20160607/1465260507)
- [LaTeX/Mathematics - Wikibooks, open books for an open world](https://en.wikibooks.org/wiki/LaTeX/Mathematics)
- [LaTeX 数式の縦/横の調整(Kodama's tips page)](http://www.math.kobe-u.ac.jp/HOME/kodama/tips-latex-math-margin.html)
- パッケージガイド
    - [User’s Guide for the amsmath Package (Version 2.1)](http://texdoc.net/texmf-dist/doc/latex-dev/amsmath/amsldoc.pdf) [pdf]
    - [amsmathパッケージユーザガイド ( Version 2.1 )](https://www.latex-project.org/help/documentation/amsldoc_jpn.pdf) [pdf]
    - [The mathtools package](https://ftp.kddilabs.jp/CTAN/macros/latex/contrib/mathtools/mathtools.pdf) [pdf]
    - [Short Math Guide for LaTeX](http://tug.ctan.org/info/short-math-guide/short-math-guide.pdf) [pdf][^shortmathguide]

[^shortmathguide]: `$ texdoc short-math-guide` と叩いてもガイドが出すことができる

**AMS-$\rm\LaTeX$ ともっと仲良くなりたい方へ**

- [AMS-LaTeX](http://www.ams.org/arc/resources/amslatex-about.html)
- [American Mathematical Society :: Homepage](https://www.ams.org/home/page)

# 余談

本記事で紹介している内容は，いずれもユーザガイドに記載されている内容であり，このほかにも記載されている内容は山ほどある．ぜひ参照してほしい．正直に言えば，読むのはかなりダルいけれど．

~~本記事では，mathtools 独自のお役立ち情報はまったくない．今後に加筆することがあれば，mathtools 独自のお役立ち情報も加えていきたい．~~

追記に追記を重ねていたら，非常に長い記事になってしまっている．昨日見た記事が更新されて新しいセクションが増えているなんてことが発生しているかもしれない．
あくまでもtips 感覚で見ていただければと思っているので，気付いたことがあれば逐次更新しています．

# 追記
- 2020/08/11 : 「[長い数式のインデントを一括で入れたい](#-長い数式のインデントを一括で入れたい)」を追加しました．
- 2020/08/18 : 「[括弧と垂直棒をコマンドで表示させたい](#-括弧と垂直棒をコマンドで表示させたい)」，「[括弧（デリミタ）のサイズを手動で調整したい](#-括弧デリミタのサイズを手動で調整したい)」，「[対応するデリミタを定義したい](#-対応するデリミタを定義したい)」を追加しました．
- 2020/08/23 : 「[式番号のスタイルを変更したい](#-式番号のスタイルを変更したい)」を追加しました．
- 2020/08/31 : 「[自作で演算子を定義したい](#-自作で演算子を定義したい)」を追加しました．
- 2020/09/09 : 「[分数を定義したい](#-分数を定義したい)」を追加しました．
- 2020/10/03 : 全体の記事構成を変更しました．また，いくつかの記事を追加・軽微修正しました．