大型演算子をきれいに書く

# 大型演算子の取り扱い

積分記号や総和記号などの大型演算子では，ほとんどの場合で上限や下限を記述する．
これについて，いくつかまとめておきたい．

![mathop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/9b1a7f54-d408-d4a5-1987-c0be42257f97.png)


**この記事ではamsmath を利用することを標準とし，mathtools を発展的に利用するものとします**

# ○ 上限と下限の位置を変更したい


ディスプレイスタイルの数式における大型演算子には**limits** 型と**nolimits** 型の2つがある．[^textstyle]

[^textstyle]: `$` で囲うようなテキストスタイルではいずれもnolimits 型になる．

|型|積分記号|積分以外の記号|
|:--:|:--:|:--:|
|limits 型|![intlimits]|![sumlimits]|
|nolimits 型|![nointlimits]|![nosumlimits]|

これを**amsmath のオプションで設定する方法**と**手動で変更する方法**の2つがある．

以下の表にあるオプションをプリアンブルで設定することで利用できる．

```tex
\usepackage[intlimits]{amsmath}
```

|          Option          |    積分記号    | 積分以外の記号 |
| :----------------------: | :------------: | :------------: |
|  sumlimits (デフォルト)  | ![nointlimits] |  ![sumlimits]  |
|       nosumlimits        | ![nointlimits] | ![nosumlimits] |
|        intlimits         |  ![intlimits]  |  ![sumlimits]  |
| nointlimits (デフォルト) | ![nointlimits] |  ![sumlimits]  |


[intlimits]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/7d283e14-2e71-5ac1-d80e-9983669dbe16.png
[sumlimits]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/6edc46c0-0771-d662-e161-7158a35bdb7c.png
[nointlimits]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4bd934d1-baf6-ba8e-2096-c2a4c719aef9.png
[nosumlimits]:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e0ed36d2-8bc8-27e9-b628-a0789d36b45e.png

この他のamsmath パッケージオプションについては以下の記事に詳しい．

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


## ■ 手動で個々に変更したい

|                        | コマンド   |
| :--------------------: | :--------- |
| 右側から上下に変更する | `\limits`   |
| 上下から右側に変更する | `\nolimits` |

```tex
% amsmath オプションはsumlimits(デフォルト)
\begin{equation*}
    \int\limits^\infty_0, \qquad    % インテグラルの上下に
    \sum\nolimits_X    % 総和記号の右側に
\end{equation*}
```

![limit-nolimit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4e9f2ccd-1a38-7b94-d1fa-69fe44b4415c.png)

## ■ limits とnolimits を両方同時に利用したい

**cf. The amsmath Package, 7.2 The \sideset command**

![sideset-example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/b7c02573-b451-0f94-10ab-c0b1d98a44a8.png)

上のようにしたい場合には`\sideset` を使おう．

```tex
\sideset{}{^A}\sum_{i > 0}^N A_i
```

`\sideset` の仕様は以下のようになっている．

```tex
\sideset{^1_2}{^3_4}\sum
```

![sideset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2fa4e8f6-f4ce-8edc-a259-c128264fca72.png)


このほかにもmathtools から提供されている`\mathclap` や`\smashoperator` を用いることで同様の結果を得られるようだがここでは紹介しない．



# ○ 長い添え字をコンパクトにしたい

条件を指定するために非常に長い添え字で条件を書く場合がある．

```tex
\int_{0 \le x < 10, 0 \le y < 10, 0 \le z < 10}
    \mathrm{d}x \mathrm{d}y \mathrm{d}z \, f(x,y,z)
\sum_{0 \le i \le m, 0 < j < n}
    P(i,j)
```

![math-mathop-longsubscript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f4b7a20f-9991-d34b-5d54-ef67facab9ed.png)


このようにしたとき，大型演算子の左右に大きな空白が生じてしまい見た目に良くない．また，空白が非常に大きい場合には，タイプセットミスが生じているのではないかと誤解を招く可能性もある．

そこで，以下の2つの方法でコンパクトにしてしまおう．[^anothermethod]

[^anothermethod]: 条件指定に非常に長い数式を用いるのであれば，"条件$\mathcal{A}$は～～" と宣言しておいて，`\int_{\mathcal{A}}` とすれば良いようにも思う．ただし，計算中に条件を変更する場合には条件をあからさまにしておいた方が記述しやすいだろう．適宜考える必要がある．

## ■ substack を使う

**cf. The amsmath Package, §7.1 Multiline subscripts and superscripts**

amsmath から提供されている`\substack` を使って改行してしまおう．

```tex
\int_{\substack{
        0 \le x < 10 \\
        0 \le y < 10 \\
        0 \le z < 10
    }}
    \mathrm{d}x \mathrm{d}y \mathrm{d}z \,
    f(x,y,z)
\sum_{\substack{
        0 \le i \le m \\
        0 < j < n
    }}
    P(i,j)
```

![math-substack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/99df52f1-15a7-b6e8-fd3f-0aeb64c75fb0.png)

積分に関してはlimits 型に変更した方がよりきれい見えるだろう．

```tex
\int\limits_{\substack{
        0 \le x < 10 \\
        0 \le y < 10 \\
        0 \le z < 10
    }}
    \mathrm{d}x \mathrm{d}y \mathrm{d}z \,
    f(x,y,z)
```

![math-substack-intlimit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/81760106-0fe4-9f5b-4dcc-884ed55a5287.png)

## ■ smashoperator を使う

**cf. The mathtools Package, §3.1.3 Smashing an operator**

mathtools から提供されている`\smashoperator` を使ってスペースを詰めよう．

```tex
\smashoperator[<option>]{
        <operator with limits>    % ex. \int_0^\infty
    }
```

オプションは以下のようになっている．

|オプション|詰まる場所|
|:--:|:--:|
|オプションなし|左右両側|
|`r`|みぎ|
|`l`|ひだり|

```tex
\begin{equation*}
V = \sum_{1 \le i \le j \le n}^\infty V_{ij} ,  \qquad
X = \smashoperator{\sum_{1 \le i \le j \le n}^\infty} X_{ij} ,  \qquad
Y = \smashoperator[r]{\sum_{1 \le i \le j \le n}^\infty} Y_{ij} ,  \qquad
Z = \smashoperator[l]{\sum_{1 \le i \le j \le n}^\infty} Z_{ij} .
\end{equation*}
```

![smashoperator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/cf19cfa3-3b8a-2006-e718-6ca9f76befb6.png)

積分記号であっても同様の結果を得る．しかし，オプションでintlimits にしていなくても強制的にlimits 型になるので注意が必要．
そこで，`\substack` と併用すると良いのかもしれない．(`\substack` ではlimits 型にしている方が綺麗だった)

```tex
\smashoperator[r]{
        \int_{\substack{
            0 \le x < 10 \\
            0 \le y < 10 \\
            0 \le z < 10
        }}
    }
    \mathrm{d}x \mathrm{d}y \mathrm{d}z \,
    f(x,y,z)
```

![substack-smashoperator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/7312c163-dc8c-336d-fcd5-6d140f33eec9.png)


また，nosumlimits のオプションを有効にしていてもlimits 型のまま`\smashoperator` が有効になる．

![smashoperator-nosumlimits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d10a8de9-6643-a663-ea07-d9300a483b1f.png)


個人的には，右側を詰めるのは良いがそれ以外はあまり綺麗に思えない．
使い方には注意しておきたい．

# ○ 積分記号いろいろ

`\int` 以外にも積分記号はいくつかある．

- **多重積分**

以下の4つが挙げられる．

```tex
\iint_A f(x,y) \mathrm{d}x \mathrm{d}y,    % 2重積分
\iiint_A f(x,y,z) \mathrm{d}x \mathrm{d}y \mathrm{d}z,    % 3重積分
\iiiint_A f(t,x,y,z) \mathrm{d}t \mathrm{d}x \mathrm{d}y \mathrm{d}z,    % 4重積分
\idotsint_A f(x_1 \cdots x_n) \mathrm{d}x_1 \cdots \mathrm{d}x_n,    % 多重積分
```

![math-int-variation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/02b7d926-4a78-602a-75eb-92f89db43991.png)



`i` の数だけインテグラルが増やされる単純なものになっている．
もしも，5重積分を作りたい場合には，`\!` でインテグラルの間隔を詰めると良いだろう．

```tex
\newcommand{\intfive}{%
    \mathop{\int\!\!\!\int\!\!\!\int\!\!\!\int\!\!\!\int}    % 
}
```

![math-ix5int.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f363556b-63e3-319b-4771-b8399baaa8bf.png)

- **周回積分**

```tex
\oint_C \mathrm{d}z \frac{1}{z}
```

![math-oint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/b9829b48-83d8-2f21-6f84-f3f5616b2a70.png)

## ■ esint パッケージを利用する

esint パッケージ[^esint]では，積分記号を新たに提供している．

[^esint]: [esint.sty | CTAN](https://ctan.org/tex-archive/macros/latex/contrib/esint/) から．

読み込みは**必ず**amsmath の**後**にする．
また，積分記号に関してamsmath をオーバーロードする形を採るので，積分記号に関するオプション設定はesint パッケージ側で行う必要がある．(amsmath 側で行っても反映されない)

```tex
\usepackage{amsmath}    % 積分記号に関するオプションは無効
\usepackage[intlimits]{esint}    % intlimits or nointlimits(default)
```

以下の積分記号を使用できる．

![esint-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/9a2b9b41-2513-695a-1693-8909fd1a7f81.png)

# ○ 大型演算子を定義したい

`\mathop` を用いることで大型演算子と同じ取り扱いをしてくれるようになる．ただし，数学シンボルのサイズは変更できない．

**例 :**
`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 のオプションを受け付けないようだ．

# 参考

- [fonts - which package for \oiint symbol - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/questions/37747/which-package-for-oiint-symbol)
- [math mode - What are the LaTeX codes for clockwise and counter-clockwise integrals (∱ and ⨑)? - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/questions/461843/what-are-the-latex-codes-for-clockwise-and-counter-clockwise-integrals-%E2%88%B1-and-%E2%A8%91)