Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
19
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

amsmath+mathtools と仲良くなろう

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

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

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

\usepackage{amsmath}
\usepackage{mathtools}

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

TOC

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

もくじ (折りたたみ)


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

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

★ 数式モードのスタイル

数式モードのスタイルには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*}

math-style.png

★ 数学シンボルのクラス

数式モードでは以下のような数式に対するクラスとして括られているようだ.このクラスによって,左右に適切な空白を入れる等の効果がある.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*}

mathop-E.png

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


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

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

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

explane some commands (折りたたみ)

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

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

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

set-rel.png

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

\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 (折りたたみ)

math-font.png

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

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


☆ 太字にしたい

ベクトルには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 と等価

math-font-bold.png

\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}

nomal-equation.png

右辺を少し右にずらすには,& の後に\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}

use-moveeqleft.png

デフォルトでは左から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}

moveeqleft-split.png

これと併せて「すぐに忘れる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.png

このときに\usetagform{default} を挿入しないと,これ以降の\eqrefbracketBf を反映することになる.

オイオイ,\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}

math-intertext.png

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


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

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

Insert text in term (折りたたみ)

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

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

以下を使おう.13

コマンド 結果
下側,丸括弧 \underbrace underbrace
上側,丸括弧 \overbrace overbrace
下側,角括弧 \underbracket underbracket
上側,角括弧 \overbracket 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 では以下のようにさまざまな等号のサブセットが提供されている.

eqq-colon.png

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

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

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

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

これらと同様のコマンドを定義したい.17

Deffine the command with DeclareMathOperator (折りたたみ)

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

amsmathoperator

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

\DeclareMathOperator{\grad}{grad}
\DeclareMathOperator{\div}{div}
\DeclareMathOperator{\rot}{rot}

このようにすればよい.

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

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

math-operatorname.png


数学的構造

★ 分数を定義したい

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.png

\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 を利用

☆ このほか

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

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}

math-tall.png

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

\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


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

table-math-bracket.png

これらのデリミタのサイズを調整するセットは,\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 オプション付き

abs.png

このコマンドは,既に定義されているコマンドに対して上書きの機能はないようだ.したがって,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}

Bracket.png

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

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



参考

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

余談

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

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

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

追記


  1. \mathalpha\mathinner もあるようだが,これらのクラスはどうなっているのだろうか. 

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

  3. いくつかのアクセントは$\rm\LaTeX$ で定義されている.「数式アクセント-講座 - PukiWiki」に詳しい. 

  4. bm.sty | CTAN から. 

  5. physics.sty | CTAN から. 

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

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

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

  9. 逆に,括弧を付けてほしくないけれど,showonlyrefs を使いたい場合にはどうするのだろう. 

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

  11. これの解決策を知っている人いれば教えてほしい. 

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

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

  14. \pagebreak の引数と同様らしい.筆者は使ったことがないのでよく分からない. 

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

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

  17. \mathrm で定義することでローマン体で出力することは可能だ.しかし,特徴で挙げた残り2つに関してはまったく有効にならない. 

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

  19. empheq パッケージでは括弧をコマンドで表現する必要があるようだ. 

  20. braket.sty | CTAN から.使い方に関しては「TeX でディラックのブラケットを書く - Qiita」に詳しい. 

  21. $ texdoc short-math-guide と叩いてもガイドが出すことができる 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
19
Help us understand the problem. What are the problem?