LoginSignup
7
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-11

大型演算子の取り扱い

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

mathop.png

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

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

ディスプレイスタイルの数式における大型演算子にはlimits 型とnolimits 型の2つがある.1

積分記号 積分以外の記号
limits 型 intlimits sumlimits
nolimits 型 nointlimits nosumlimits

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

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

\usepackage[intlimits]{amsmath}
Option 積分記号 積分以外の記号
sumlimits (デフォルト) nointlimits sumlimits
nosumlimits nointlimits nosumlimits
intlimits intlimits sumlimits
nointlimits (デフォルト) nointlimits sumlimits

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

amsmath とmathtools のパッケージオプション - Qiita

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

コマンド
右側から上下に変更する \limits
上下から右側に変更する \nolimits
% amsmath オプションはsumlimits(デフォルト)
\begin{equation*}
    \int\limits^\infty_0, \qquad    % インテグラルの上下に
    \sum\nolimits_X    % 総和記号の右側に
\end{equation*}

limit-nolimit.png

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

cf. The amsmath Package, 7.2 The \sideset command

sideset-example.png

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

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

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

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

sideset.png

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

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

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

\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

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

そこで,以下の2つの方法でコンパクトにしてしまおう.2

■ substack を使う

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

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

\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

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

\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

■ smashoperator を使う

cf. The mathtools Package, §3.1.3 Smashing an operator

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

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

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

オプション 詰まる場所
オプションなし 左右両側
r みぎ
l ひだり
\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

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

\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

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

smashoperator-nosumlimits.png

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

○ 積分記号いろいろ

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

  • 多重積分

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

\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

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

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

math-ix5int.png

  • 周回積分
\oint_C \mathrm{d}z \frac{1}{z}

math-oint.png

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

esint パッケージ3では,積分記号を新たに提供している.

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

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

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

esint-1.png

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

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

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

\newcommand{\opE}{\mathop{E}}    % E をOperator クラスにしている
\begin{equation*}
    \opE^\infty_0
\end{equation*}

mathop-E.png

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

参考


  1. $ で囲うようなテキストスタイルではいずれもnolimits 型になる. 

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

  3. esint.sty | CTAN から. 

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4