裏紙に雑文

日記とか,とりとめのないこと

数式の相互参照: mathtools の紹介

某会で LaTeX を紹介したとき,知っている人が少ないと感じたので紹介してみる. 一言で言うと,相互参照した数式にのみ式番号を振る方法を紹介したい. ある程度知識がある人は端末エミュレータtexdoc mathtools と叩くか,CTAN で公式ドキュメントを読むと良いと思う.

https://ctan.org/pkg/mathtools

今回紹介する機能の他にも色々あって便利そう*1

mathtools の紹介

LaTeX には強力な相互参照機能があって,大部分の人はこの機能のお世話になっていると思う. 定理や命題,数式の直後に \label{hoge} と書き,参照する箇所で \ref{hoge} とか \eqref{hoge} とかするアレだ. 今日は数式に式番号を振る話が主題なので,定理番号とかの話はしない. 数式を書いたりするのに amsmath パッケージを使う. 例えばこんな感じにすると

\LaTeX の相互参照機能を使って式番号を参照することはよくありますよね.
例えば
\begin{align}
    A &= a \label{eq:a}, \\
    B &= b \label{eq:b}
\end{align}
という数式を後ろの節で
\begin{quote}
    \eqref{eq:a} 式より主張が従う.
\end{quote}
のように使えたりします.

f:id:mtino1594:20171120003733p:plain

のように出力される. 非常に便利な機能だけど,2番目の式のように参照していない数式にも式番号が振られている. 参照した数式にだけ式番号を振りたいとき,mathtools パッケージを使うのが便利だ. 使い方は簡単でプリアンブル*2に次のように書けば良い.

\usepackage{amsmath}
\usepackage{mathtools}
\mathtoolsset{showonlyrefs,showmanualtags}

\mathtoolsset{showonlyrefs=true} のように書いても良い. また showmanualtags については本稿では説明しないので,気になる人はドキュメントを読んでほしい. さて mathtools パッケージを使うと参照した数式にのみ式番号を振ることができる. 確認してみよう:

\texttt{mathtools} パッケージを使うと引用した式にだけ式番号を振ることができます.
例えば
\begin{align}
    C &= c \label{eq:c}, \\
    D &= d \label{eq:d}
\end{align}
とし,後ろの節で
\begin{quote}
    \eqref{eq:c} 式より主張が従う.
\end{quote}
としたときは 2 番目の数式には式番号が振られません.

f:id:mtino1594:20171120005249p:plain

確かに2番目の数式は参照していないので式番号が振られていない,やったぜ. これで手作業で \nonumber やら \notag やらを書いたり,align 環境と align* 環境を使い分けたりしなくて済むようになった.

ちなみに参照はしないけど式番号は振りたい,という場合 \noeqref{<label, label, ...>} とすれば良い.

最高な mathtools パッケージですが,ドキュメントを読むといくつかバグがあるなので簡単に紹介する.

問題その1

長い数式を書くと,式番号が数式と被ってしまうという問題がある.

f:id:mtino1594:20171120005946p:plain

残念なことに,一般的な解決策が無いらしく,長過ぎる数式を書かないように注意しましょうとドキュメントに書かれている. ちなみに上の画像,1番目の数式の右辺が 12 cm なのだけれど,これを少し伸ばして 13 cm にしてみよう:

f:id:mtino1594:20171120010102p:plain

は? ナニコレ. この記事を書くために遊んでいたら先程見つけました.謎です. 解決策を知っている人がいたらコメント等で教えてください…….

問題その2

ntheorem パッケージを thmmarks オプション付きで使っていると,証明終の記号がうまく出力されないという不具合がある. これには解決策があって,empheq パッケージを使えばよろしいらしい. だいたいこんな感じでOK:

\usepackage[overload,ntheorem]{empheq} % ntheorem の前に読み込む
\usepackage[amsmath,thmmarks]{ntheorem}

まぁ私は thmmarks を使わないのであまり関係がない().

問題その3

unicode-math パッケージと併せて使うとなんだか警告を吐く*3. 例えばこんな感じ:

* unicode-math warning: "mathtools-colon"
*
* ... <warning message> ...

unicode-math パッケージのドキュメントを読むと,警告を無視するためのオプションが紹介されている. この場合には

\usepackage[warnings-off={mathtools-colon}]{unicode-math}

とすれば警告がでなくなる. unicode-math のバージョンが上がれば色々と問題は解決するだろう,たぶん.

記事作成時の TeX のバージョン
$ tlmgr --version
tlmgr revision 45286 (2017-09-13 03:55:27 +0200)
tlmgr using installation: /usr/local/texlive/2017
TeX Live (http://tug.org/texlive) version 2017

$ luatex --version
This is LuaTeX, Version 1.0.4 (TeX Live 2017)

*1:ぶっちゃけ私は数式の相互参照にしか使っていない

*2:別にプリアンブルでなくても良いけれど

*3:最近 LuaLaTeX + unicode-math に移行したので