~ amsmath+mathtools と仲良くなりたい人に贈る ~
本記事では基本的にamsmath パッケージユーザガイドを参考にしている.
mathtools はamsmath の拡張パッケージとして提供されているので,ぜひこちらも活用していきたい.
mathtools パッケージは読み込むと同時にamsmath パッケージを読み込むようになるが,明示的にパッケージを読み込ませておく方が良い.
\usepackage{amsmath}
\usepackage{mathtools}
一度にすべてを読んで覚えるのは大変なので,欲しい情報があるときに逐次確認すると良いと思います.
(欲しいときに欲しい情報が手に入るようにしていた方が,ぜんぶ覚えているよりも脳みそ使わなくて楽です.)
TOC
長いので目次を置いておきます.
その他関連記事を紹介しておきます.
- LaTeX の数式モードをまとめたよ - Qiita
- amsmath とmathtools のパッケージオプション - Qiita
- きれいに書きたいシリーズ
- 行列環境のエトセトラをまとめる - Qiita
- LaTeX で定義として管理しておいた方が良い数式コマンド - Qiita
数式モードの基本的なところ
★ 数式モードのスタイル
数式モードのスタイルには4つの種類がある.
スタイル | ||
---|---|---|
1 | \displaystyle |
別行立て数式 |
2 | \textstyle |
インライン数式 |
3 | \scriptstyle |
添え字 |
4 | \scriptscriptstyle |
添え字の添え字 |
{\XXXstyle \sum_{n=0}^N A_n}
とすることで,それぞれのスタイルを使うこと出来る.
\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*}
★ 数学シンボルのクラス
数式モードでは以下のような数式に対するクラスとして括られているようだ.このクラスによって,左右に適切な空白を入れる等の効果がある.1
このような数式シンボルのクラスを$\rm\LaTeX$ ユーザにとって必要な情報なのかは怪しい2が,知っておくことで数式を作成するときに意味を持った数式の書き方が出来るのではないかと思う.
What's math symbol (折りたたみ)
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
という大型演算子を新たに定義する.
\newcommand{\opE}{\mathop{E}} % E をOperator クラスにしている
\begin{equation*}
\opE^\infty_0
\end{equation*}
これでE
が大型演算子\opE
として利用できるようになった.
しかし,この大型演算子はnosumlimits 等のamsmath のオプションを受け付けないようだ.
☆ 数学記号を上下に組み合わせる
以下のコマンドがamsmath から提供されている.
コマンド | 例 | |
---|---|---|
上に重ねる | \overset |
\overset{<上側>}{<基準>} |
下に重ねる | \underset |
\underset{<下側>}{<基準>} |
上下に重ねる | \overunderset |
\overunderset{<上側>}{<下側>}{<基準>} |
関係演算子として上に重ねる | \stackrel |
\stackrel{<上側>}{<基準>} |
explane some commands (折りたたみ)
\overset
, \underset
, \overunderset
はともに<基準>
となる数学記号のシンボルクラスに依存する.特に,*
や^
などのアクセントをつける場合の使用が想定されているのだろう.3
逆に,\stackrel
では全体を関係演算子とすることが出来る.
A
に=
を上下に重ねてみると以下のようになる.
\XXXset
では通常の記号として扱われているが,\stackrel
では関係演算子として扱われているために前後に間隔が空けられているのが分かる.
このことから,以下のように数学記号を上下に組み合わせた場合,同等の結果が得られる.
\overset{*}{=} % シンボルクラスが"=" に依存する
\stackrel{*}{=} % 基準となる数学記号に依らずに関係演算子のシンボルクラスとなる
$$
\stackrel{*}{=}
$$
同等の結果が得られるが,新たな"等号" の意味で定義するのであれば,\stackrel
で定義する方が意味があるだろう.
実用的な例とすれば,以下のようなものだろうか.
\stackrel{\scriptscriptstyle \mathsf{def}}{=}
★ 数学フォント
amsmath とmathrsfs パッケージを導入しておけば以下のすべてを利用できる.
数学の流派によってさまざまなフォントが使用されるので,どのフォントがどの数学に使用するのかについては言及しない.(把握もしていない)
コマンド | 備考 | |
---|---|---|
デフォルトの数学フォント | \mathnormal |
省略可能 |
ローマン | \mathrm |
本文中のフォント |
イタリック | \mathit |
\mathnormal よりも少し字がつまるようだ |
ボールド | \mathbf |
- |
サンセリフ | \mathsf |
- |
カリグラフィー | \mathcal |
大文字のみ |
等幅フォント | \mathtt |
- |
黒板太字 | \mathbb |
大文字のみ,amsfonts またはamssymb が必要 |
フラクトゥール | \mathfrak |
アルファベットのみ,amsfonts またはamssymb が必要 |
スクリプト | \mathscr |
大文字のみ,mathrsfs が必要 |
euscript パッケージを導入しても\mathscr
を用いることが出来るが,異なるフォントが出力される.
Math fonts sample (折りたたみ)
☆ 太字にしたい
ベクトルにはbm パッケージを使う方が容易で確実だろう
ベクトル表記ではボールド体にすることが多い.いくつかの方法があるのでまとめておきたい.
How to use bold symbol (折りたたみ)
提供 | コマンド | |
---|---|---|
LaTeX | \mathbf |
ボールド |
amsmath パッケージ | \boldsymbol |
bm パッケージと等価 |
LaTeX | \pmb |
poor man's bold |
bm パッケージ4 | \bm |
\boldsymbol とほぼ等価 |
physics パッケージ5 | \vb |
\mathbf と等価 |
physics パッケージ | \vb* |
\boldsymbol と等価 |
\pmb
は2回(3回?)重ねることで太字を作り出すもので,あまり推奨されない6ようだ.実際に出力してみると,文字がダブっているためあまり綺麗ではない.
bm パッケージは\boldsymbol
を踏襲しているようだが,より拡張的に構成されている.
おもしろいところはいくつかあるが,例としては\boldsymbol
ではボールドにすることの出来ない記号をボールドに変換することが出来る点だろう.
physics パッケージにもボールドにするコマンドがある.ボールドの他にもさまざまな機能があるので,パッケージをあまり使用したくない場合にはこちらのベクトル表記を用いても良いだろう.(bm パッケージより少し劣るか?)
他にも以下のような方法で太字にする方法が紹介されているところがあるが,bm パッケージを使用すれば特に必要ないだろう.
\newcommand{\vector}[1]{\mbox{\boldmath $ #1 $}} % \vector として定義した
上のフォントを並べた図は以下のコードから見ることが出来る.
LaTeX Math Fonts Demo Code (折りたたみ)
typeset : upLaTeX + dvipdfmx
\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 に関しても他のギリシャ文字と同様の結果を得た.ぜひ試してみてほしい.
数式テクニック
★ 複数行に渡る数式全体に式番号を振りたい
equation+split で出来る.あたりまえ体操を踊りたくなるが,あまり考えたことがなかった.eqnarray 環境を使いたい人もこのように書くと良いのだろう.
\begin{equation}
\begin{split}
(x+1)^2
&= (x+1)(x+1) \\
&= x^2+2x+1
\end{split}
\end{equation}
split 環境はsplit が入る数式環境の仕様に依存しているので,equation 環境に入れた場合には1つの式番号で出力される.
★ 数式にインデントを一括で入れたい
たとえば,以下のような左辺が長い数式の場合,右辺は左辺より少し右にずらしていた方が自然である.
\begin{align}
&\framebox[10cm][c]{ Long Left Hand Side } \\
& = \framebox[6cm][c]{ Right Hand Side } \\
& \leq \dots
\end{align}
右辺を少し右にずらすには,&
の後に\qquad
などの空白を挿入することで可能にするが,改行のたびに挿入する必要があり面倒である.
Use MoveEqLeft command (折りたたみ)
そこで,\MoveEqLeft
コマンドを使おう.(mathtools §3.4.4参照)
これによって,右辺を右にずらすことが出来る.7
\begin{align}
\MoveEqLeft % <-- 今回の主役!!
\framebox[10cm][c]{ Long Left Hand Side } \\
& = \framebox[6cm][c]{ Right Hand Side } \\
& \leq \dots
\end{align}
デフォルトでは左から2em だけ右にずらすようになっている.\MoveEqLeft[1]
などとすれば,1em に変更することも可能である.
右辺の途中で改行する場合には,以下のようにするとよい.8
\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}
これと併せて「すぐに忘れるLaTeX数式のインデントまとめ - Qiita」も参照すると良いだろう.
また,これに関連して拙文「autobreak を使いこなす - Qiita」を紹介しておく.実は,上の記事を書いた人がautobreak パッケージの作成者でした.(\MoveEqLeft
なんて誰も紹介していないだろ?とググっていたら出てきました.)
★ 行間を広くとる環境
cf. The mathtools Package, §4.4 Spreading equations
spreading 環境を利用しよう.
How to use spreading env. (折りたたみ)
この環境内では,テキストモードで文字が挿入でき,かつ数式では-ed
環境ではないことに注意したい.subequations 環境に少し似ている.
\begin{spreadlines}{<dimen>}
<contents>
\end{spreadlines}
<dimen>
で数式の行間を指定する.
\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}
★ 拡張されたgathered 環境
cf. The mathtools Package, §4.5 Gathered environments
通常のgathered 環境では中央揃えになるが,これを左揃えや右揃えにする環境が提供されている.
How to use "extended gathered" env.(折りたたみ)
環境名 | |
---|---|
中央揃え | gathered |
左揃え | lgathered |
右揃え | rgathered |
また,gathered 環境を任意に定義することも可能である.
\newgathered{<name>}{<pre_line>}{<post_line>}{<after>} % 新しいgathered 環境を定義
\renewgathered{<name>}{<pre_line>}{<post_line>}{<after>} % 既存のgathered 環境を定義
\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
以下のような結果を得る.
★ 分数に複数行の数式を挿入する
cf. The mathtools Package, §4.6 Split fractions
\frac
で分数を作成する際に,分子や分母にsprit 環境のように複数行の数式を挿入することが出来るコマンドがある.
\splitfrac
を使おう.
How to use splitfrac command (折りたたみ)
\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
を挿入することが推奨されている.以下のように利用しよう.
\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}
式番号テクニック
★ 数式を相互参照させたい
\ref
ってすればいいと思ってない?!
amsmath では,\eqref
にすると丸括弧()
付きで式番号が相互参照で出てくる.どうせなら頭に "Eq." を常に付けたいので,プリアンブルで以下のようにしておくと楽かもしれない.
\newcommand{\eref}[1]{Eq.\eqref{#1}}
ちなみに,mathtools のshowonlyrefs
オプションは\eqref
でないと対応してくれない.筆者はこれに手間取らせられた記憶が大いにあるので,読んだ皆さんは注意してね.9
★ 式番号を節でリセットしたい
再定義することによるリセット方法 (折りたたみ)
通常$\rm\LaTeX$ では,数式番号を(節番号.式の通し番号)として出力される.これを節ごとの式の通し番号にする場合には\theequation
をプリアンブルで再定義することによって可能にする.
\renewcommand{\theequation}{\thesection.\arabic{equation}}
しかし,この場合では,数式番号のカウンタをいちいち\setconter
で指定しない限りには新しい節や章の開始ではゼロにリセットされない.
\numberwithin
コマンドをプリアンブルで設定することで,数式の式番号を節番号に結び付けて,自動的にカウンタをリセットすることが出来る.
\numberwithin{equation}{section} % <-- これを置くだけ!!
LaTeX レベルでの修正 (折りたたみ)
筆者はどこかで見た以下のようなことをしていたが,\numberwithin
コマンドの方が断然簡単に設定できて良い.実はこの方法であってもsection で式番号がリセットされるので,これでも良い.2
\makeatletter
\renewcommand{\theequation}{\thesection.\arabic{equation}}
\@addtoreset{equation}{section} % ここでsection ごとに式番号をリセットしている
\makeatother
★ 式番号のスタイルを変更したい
cf. The mathtools Package, §3.2.1 The appearance of tags
mathtools から提供されている\newtagform
を活用しよう.10
How to use newtagform command (折りたたみ)
\newtagform{<name>}[<inner_format>]{<left>}{<right>}
\renewtagform{<name>}[<inner_format>]{<left>}{<right>}
\usetagform{<name>}
-
<name>
: デフォルトは "default" ,その他任意に名前を定義可能 -
<inner_format>
: 式番号のスタイルを指定 -
<left>
,<right>
: ひだり括弧,みぎ括弧のスタイルの指定
例 : "[<式番号>]" にしたい
プリアンブルで以下のようにすれば良い.
\newtagform{bracket}{[}{]}
\usetagform{bracket}
本文中の途中で式番号のスタイルを変更したい場合は,\usetagform
を途中で挿入すればよい.このとき,式番号は連続することに注意しておきたい.
このときに\usetagform{default}
を挿入しないと,これ以降の\eqref
はbracketBf
を反映することになる.
オイオイ,\eqref
にも式番号のスタイルを反映しないのか......
単一のスタイルを使用するのであれば問題なのだろう.11
数式にテキストを挿入する
★ 数式中のテキスト
数式中にテキストを挿入することはよくある.
\text
と\mathrm
の2つがあるがどのように使い分けるべきなのだろうか.
What's the difference between text and mathrm (折りたたみ)
コマンド | 効果 |
---|---|
\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
である.間違えないように注意が必要だ.12
★ ディスプレイ数式にテキストを割り込ませたい
数式環境内で\intertext
を用いることでalign 環境等のアンパサンドによる整列を崩さずに数式環境内にテキストを挿入することが出来る.
How to use intertext command (折りたたみ)
\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}
ただし,これは数式環境を分けて書いているのとほとんど同じくらい行が空いてしまう.
それを嫌う場合には,mathtools パッケージで提供されている\shortintertext
を用いると良いだろう.(むしろこちらの方が自然に見えるが,場合によっては文字が詰まって見えるかもしれない.)
★ 数式中の項にコメントを入れたい
数式の項にコメントを挿入する場合には,項の上下に丸括弧や角括弧を付けることで行う.
Insert text in term (折りたたみ)
この場合,$\rm\LaTeX$ で標準で定義されている\overbrace
や\underbrace
を用いることになるだろう.
しかし,以下のようなためにmathtools では\overbrace
, underbrace
を再定義している.
- 長さが固定されている
- 10pt に最適化されているために,異なるフォントサイズでは最適な結果を得られない(文字と括弧が干渉する等)
- フォントが異なっても最適な結果を得られない(ようだ)
以下を使おう.13
コマンド | 結果 | |
---|---|---|
下側,丸括弧 | \underbrace |
|
上側,丸括弧 | \overbrace |
|
下側,角括弧 | \underbracket |
|
上側,角括弧 | \overbracket |
- 丸括弧の場合
\underbrace{<括弧に含める数式>}_{<コメント>}
\overbrace{<括弧に含める数式>}^{<コメント>}
- 角括弧の場合
オプションで括弧の太さと括弧の高さを決めることが出来る.
\underbracket[<括弧の太さ>][<括弧の高さ>]{<括弧に含める数式>}_{<コメント>}
\overbracket[<括弧の太さ>][<括弧の高さ>]{<括弧に含める数式>}^{<コメント>}
コメントの部分も数式モードになっているため,テキストを挿入するには\text
によって行う必要がある.
数式改ページ
★ 数式途中で改ページさせたい
amsmath パッケージが使用されているとき,数式の行間で改ページされることを通常は許可していない.ディスプレイ数式の途中で改ページすることは著者の責任で行うべきと言う思想らしい.
数式途中で改ページをさせる方法が2つあるので紹介する.
☆ 特定の数式環境中での改ページを許す
Use displaybreak (折りたたみ)
特定の数式中での改ページを許す場合,\displaybreak
を使う.
このコマンドには引数によってその改ページへのレベルを0~4で指定することができ,“ 引数の指定がない ” または “ 引数が4 ” のとき強制的に改ページされる.14
\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}
改行\\
の直前に配置することが望ましいようだ.
☆ すべての数式環境中での改ページを許す
Use allowdisplaybreaks (折りたたみ)
改ページをどの場所であっても複数行の式の途中で行って良い場合は,\allowdisplaybreaks[引数]
コマンドをプリアンブルで使用すると良いだろう.15
引数には1~4を指定することができ,[1]
は改ページを許可するが,出来るだけ避けたいことを意味するようだ.数字が増えれば許容度が増える.
また,\allowdisplaybreaks
を有効にしていても,改ページをさせたくない複数行ある数式の改行で\\*
としておけばその行での改ページを禁止させることが出来るようだ.
べらぼうに長い数式で紙面を超えてしまう場合には有用な手だてなように思われる.
しかしながら,オフィシャルな文章ではあまり数式途中で改ページを挟むようなものを見たことがない.これに関しては私見ではあるが,複数行に渡る数式の途中で改ページするのはあまり望ましくないのではないかと思う.
まとめノートなどの私用で使う分には有用かもしれない.
数式シンボル
★ 定義イコールを使いたい
$\rm\LaTeX$ では合同は\equiv
として提供されている.
a \equiv b
$$
a \equiv b
$$
しかし,:=
でも定義を示したい!16
mathtools では以下のようにさまざまな等号のサブセットが提供されている.
\coloneqq
などはq
が一つ抜けていると:-
になってしまうので注意が必要.
★ 自作で演算子を定義したい
amsmath では,\sin
や\log
, \lim
などの演算子が定義されている.これらにはいくつかの特徴がある.
- ローマン体で出力される
- このコマンドの両端に少しの空間が空く
- 上付き文字,下付き文字を上下に設定することが出来る (e.g.
\lim
等)
これらと同様のコマンドを定義したい.17
Deffine the command with DeclareMathOperator (折りたたみ)
\DeclareMathOperator
を使おう.これによって,amsmath では以下のコマンドが定義済みとなっている.
勾配や発散,回転を表す\grad
, div
\rot
はamsmath では定義されていない.これらを例として挙げておこう.
\DeclareMathOperator{\grad}{grad}
\DeclareMathOperator{\div}{div}
\DeclareMathOperator{\rot}{rot}
このようにすればよい.
ただし,\lim
のように下側に下付き文字を配置したい場合には,\DeclareMathOperator*
を使って定義する.
\operatorname
を用いることで,全体で定義せずに演算子を作成することも出来る.また,\operatorname*
で下側に下付き文字を配置させることが出来る.
数学的構造
★ 分数を定義したい
amsmath では分数のような構造の数式を\genfrac
を用いて以下のように定義18している.
How to use genfrac command (折りたたみ)
\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 |
背の高い二項式 |
これらは以下のように定義されている.
\newcommand{\frac}[2]{\genfrac{}{}{}{}{#1}{#2}}
\newcommand{\tfrac}[2]{\genfrac{}{}{}{1}{#1}{#2}}
\newcommand{\binom}[2]{\genfrac{(}{)}{0pt}{}{#1}{#2}}
\binom
では括線を“0pt”とすることで非表示としている.
以下のように\genfrac
を活用してみよう.
\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
では括線や数式スタイルを決めることが出来ることがうま味になるだろう.その意味では,他の定義方法もある上のような例では活用しきれていないような気もする.
★ 左側に上付き / 下付き添え字を与えたい
いくつかの方法がある.まとめておこう.
☆ vphantom を使う
$\rm\LaTeX$ の標準的なコマンド\vphantom
を用いる.
How to use vphantom (折りたたみ)
これは,幅がなく引数となる数式の高さをもつ空白を作る.
以下のように使うと良いだろう.
{\vphantom{\int}}^\infty \int
ただし,この場合には\vphantom
の空白にしたがって添え字が生成されるため,空白側の左揃えのような形になることに注意が必要である.
☆ prescript を使う
mathtools では\prescript
を与えている.
How to use prescript (折りたたみ)
\prescript{<左上>}{<左下>}{<数式>}
として組むことが出来る.
この場合には,数式の左側であることを考慮して作成されているので,左側の添え字は右揃えのような形をとる.
実用的な部分では,転置行列を左上に"t" で表現する場合に必要になるのだろうと思われる.
以下のように作成すると良いだろう.
\newcommand{\transposevphantom}[1]{{\vphantom{#1}}^t\! #1} % vphantom を利用
\newcommand{\transposeprescript}[1]{\prescript{t}{}{#1}} % prescript を利用
☆ 転置行列
実用的な部分では,転置行列を左上に"t" で表現する場合に必要になるのだろうと思われる.
以下のように作成すると良いだろう.
\newcommand{\transposevphantom}[1]{{\vphantom{#1}}^t\! #1} % vphantom を利用
\newcommand{\transposeprescript}[1]{\prescript{t}{}{#1}} % prescript を利用
☆ このほか
他にも,パッケージを利用することで左側に添え字を与えることが出来るようになる.
-
leftindex.sty | CTAN
: 左側にインデックスを付けるためのパッケージ -
tensor.sty | CTAN
: テンソル表記を平易にするパッケージ -
mhchem.sty | CTAN
: 化学記号を出力するパッケージ
mhchem に関しては数式で利用すべきではないが,ネタとして入れておきました.
デリミタ
★ 括弧と垂直棒をコマンドで表示させたい
コマンドで表示させなくても,直接的に(
, )
や|
を打つことが出来るだろうと思われるだろう.しかし,場合によっては直接的に打たない方が良い場合がある.19
☆ 括弧
通常,括弧は丸括弧 (
, )
と角括弧 [
, ]
を利用することが多い.この内,角括弧は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 毎に変化するようだ)
すなわち,思ったよりも大きいデリミタが生成されることがあるということである.
デリミタが上手く自動調整されない例 (折りたたみ)
初めに考えられるような状況は,総和作用素の上下に範囲を指定する添え字を置くことのようだ.
\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}
あるいは,括弧内に括弧が挿入されている場合である.
\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)
手動的にデリミタのサイズを調整する方法は以下のようなコマンドのセットがある.
これらのデリミタのサイズを調整するセットは,\left
と\right
を除いて対応関係を持っていない.すなわち,単独で使用することが出来る.
★ 対応するデリミタを定義したい
括弧や垂直棒は,数式を囲う場合がよくある.手動か自動かを問わずとも,一つ一つにサイズ調整のコマンドをデリミタに付与していくのは煩雑である.
新たなコマンドとして定義してしまった方が良い.
Use DeclarePairedDelimiter (折りたたみ)
amsmath での方法 (折りたたみ)
amsmath パッケージでは以下のような方法による定義を紹介している..
\providecommand{\abs}[1]{\lvert #1\rvert}
\providecommand{\norm}[1]{\lVert #1\rVert}
上のようにすることで,\abs
, \norm
が定義される.しかし,このような定義を用いても,デリミタのサイズを調整することは出来ない.
定義コマンド内で\left
~\right
で対応関係を採っても良いのだが,それでは大きすぎる場合などが生じた際に手動で調整するには新たにコマンドを定義する必要が生じる.
そこで,mathtools で定義されている\DeclarePairedDelimiter
を用いよう.これは,\providecommand
よりも対応するデリミタに対してフレキシブルなコマンドを定義することが出来る.
mathtools では,対応するデリミタを定義する\DeclarePairedDelimiter
をサポートしている.このコマンドで定義されたコマンドには,以下のような特徴がある.
-
*
や引数を付けない場合には,\providecommand
で定義されたコマンドと同様の結果を得る -
*
付きでは,\left
と\right
を用いたサイズが自動調整されたデリミタとなる - オプションで引数を付けることで,手動調整をすることが出来る
引数には,\big
, \Big
, \bigg
, \Bigg
を使うことが出来る.
以下のようにコマンドを組む.
\DeclarePairedDelimiter{<command>}{<left_delimiter>}{<right_delimiter>}
例 : 絶対値は以下のように定義する
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
これによって定義された\abs
は,以下のような結果を得る.
\abs{\frac{a}{b}}, \quad % そのまま
\abs*{\frac{c}{d}}, \quad % 自動調整
\abs[\Bigg]{\frac{e}{f}}. % \Bigg オプション付き
このコマンドは,既に定義されているコマンドに対して上書きの機能はないようだ.したがって,physics パッケージ5等の数式を簡便に打つためのパッケージを利用している際には注意が必要である.
\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 パッケージを利用しないか,になるだろう.
\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
が定義されているため,新たに定義することが出来ない.(タイプセットエラーになる)
Extension DeclarePairedDelimiter (折りたたみ)
少し発展的なコマンドの利用方法を紹介しておくが,パッケージガイドを読んでいてもいま一つ理解できていないので,紹介程度にとどめておく.
(cf: mathtools p.26, §3.6 Paired delimiters)
\DeclarePairedDelimiter
では,一つの数式しか引数として取り込むことが出来ない.そこで,\DeclarPairDlimiterX
を用いよう.
\DeclarePairedDelimiterX{<cmd>}[1]{<left_delim>}{<right_delim>}{#1}
例 : ディラックのブラケット記法
\DeclarePairedDelimiterX\innerp[2]{\langle}{\rangle}{#1,#2}
\DeclarePairedDelimiterX\braket[3]{\langle}{\rangle}%
{#1\,\delimsize\vert\,\mathopen{}#2\,\delimsize\vert\,\mathopen{}#3}
上のように定義することで,以下のような結果を得る.
\innerp*{A}{ \frac{1}{2} } \quad
\braket[\Big]{B}{\sum_{k} f_k}{C}
しかしながら,ディラックのブラケット記法を定義するのであれば,braket パッケージ20を用いた方が平易なように思われる.(ちなみに,physics パッケージでもブラケット記法のコマンドは定義されている.)
この場合でももちろんphysics パッケージとの併用と同様の結果が生じる可能性がある.
参考
- 複数行の数式 - 情報系学習サイト
- LaTeX/amsmathによる数式環境を見本付きで | tm23forest.com
- 「Short Math Guide for LaTeX」を読んで [pdf]
- チョット数式フォントしてみる話(3) - マクロツイーター
- LaTeX/Mathematics - Wikibooks, open books for an open world
- LaTeX 数式の縦/横の調整(Kodama's tips page)
- パッケージガイド
AMS-$\rm\LaTeX$ ともっと仲良くなりたい方へ
余談
本記事で紹介している内容は,いずれもユーザガイドに記載されている内容であり,このほかにも記載されている内容は山ほどある.ぜひ参照してほしい.正直に言えば,読むのはかなりダルいけれど.
本記事では,mathtools 独自のお役立ち情報はまったくない.今後に加筆することがあれば,mathtools 独自のお役立ち情報も加えていきたい.
追記に追記を重ねていたら,非常に長い記事になってしまっている.昨日見た記事が更新されて新しいセクションが増えているなんてことが発生しているかもしれない.
あくまでもtips 感覚で見ていただければと思っているので,気付いたことがあれば逐次更新しています.
追記
- 2020/08/11 : 「長い数式のインデントを一括で入れたい」を追加しました.
- 2020/08/18 : 「括弧と垂直棒をコマンドで表示させたい」,「括弧(デリミタ)のサイズを手動で調整したい」,「対応するデリミタを定義したい」を追加しました.
- 2020/08/23 : 「式番号のスタイルを変更したい」を追加しました.
- 2020/08/31 : 「自作で演算子を定義したい」を追加しました.
- 2020/09/09 : 「分数を定義したい」を追加しました.
- 2020/10/03 : 全体の記事構成を変更しました.また,いくつかの記事を追加・軽微修正しました.
-
\mathalpha
や\mathinner
もあるようだが,これらのクラスはどうなっているのだろうか. ↩ -
$\rm\TeX$ ユーザは知っておくべきなのだと思う.しかし,数式を打てれば良いお気持ちの$\rm\LaTeX$ ユーザとしては知らずとも作成できるので知っていたらちょっと良いドキュメント作成が出来るかなと言う感じ. ↩ ↩2
-
いくつかのアクセントは$\rm\LaTeX$ で定義されている.「数式アクセント-講座 - PukiWiki」に詳しい. ↩
-
bm.sty | CTAN から. ↩
-
physics.sty | CTAN から. ↩ ↩2
-
緊急で必要な場合には使用しても良いだろうが,よっぽどは使わないほうが良いという意見がよく見られた.ボールドが設定されていない場合に限るだろう. ↩
-
実はこれは少し嘘である.本当は,1行目の数式がアンパサンドの整列から左にずれるようになっている.コマンド名が
\MoveEqRight
でないのはこのためである. ↩ -
公式にはsplit 環境を用いずに右辺の式を途中改行していたが,式番号を付与することを考えるとsplit 環境を用いた方が有用だろうと思われる. ↩
-
逆に,括弧を付けてほしくないけれど,
showonlyrefs
を使いたい場合にはどうするのだろう. ↩ -
ntheorem パッケージを使用している場合には,ntheorem を読み込んであから
\newtagform
を設定する方が良いようだ.使っていないのでよく分からない. ↩ -
これの解決策を知っている人いれば教えてほしい. ↩
-
\rm
コマンドでローマン体にするのはオワコンってかなり前から言われているから使わないようにしておこう. ↩ -
デフォルトのComputer Modernフォントでの作業の他に,パッケージmathpazo,pamath,fourier,eulervm,cmbright,およびmathptmxでも機能します.ただし,ccfonts を使用する場合には,
\LaTeXunderbrace
,\LaTeXoverbrace
を再定義することを推奨している. ↩ -
\pagebreak
の引数と同様らしい.筆者は使ったことがないのでよく分からない. ↩ -
split, aligned, gathered, alignedat などは改ページが出来ない数式環境のようだ.これは,内容を分割することのできないボックスで囲んでいることに起因するらしい. ↩
-
コロンとイコールを使えば同じように
:=
を表示することは出来る.しかし,コロンとイコールが水平軸中心で揃わない場合があり,あまり綺麗ではない.なるべく\coloneqq
を使おう. ↩ -
\mathrm
で定義することでローマン体で出力することは可能だ.しかし,特徴で挙げた残り2つに関してはまったく有効にならない. ↩ -
\over
,\overwithdelims
,\atop
,\atopwithdelims
,\above
,\abovewithdelims
(プリミティブな一般化された分数コマンド) をamsmath パッケージで使用することは出来ず,エラーメッセージが表示されるようだ.これは,technote.texで説明されている. ↩ -
empheq パッケージでは括弧をコマンドで表現する必要があるようだ. ↩
-
braket.sty | CTAN から.使い方に関しては「TeX でディラックのブラケットを書く - Qiita」に詳しい. ↩
-
$ texdoc short-math-guide
と叩いてもガイドが出すことができる ↩