読者です 読者をやめる 読者になる 読者になる

\newcommandを乱用するな、\DeclareMathOperatorを使え(LaTeXでの演算子の定義)

LaTeXで数式を書くときにもともと定義されていない記号を使いたくなるときがあります.そういうとき,大抵の参考書には\newcommandが紹介されているので,数式でもこちらを使いたくなります.しかし,数式で新しい記号を書きたいとき,それが演算子のときは\DeclareMathOperatorを使うほうがより適切であることもあります.

\newcommandの復習

\newcommandLaTeXで最初から使うことができる,コマンドを定義するためのコマンドです.使い方は

%% 数式環境内で使うことが出来るコマンドを定義
\newcommand{\diff}{\mathrm{d}} % 引数がないとき
\newcommand{\norm}[1]{\lvert #1 \rvert} % 引数が1つのとき
\newcommand{\henbibun}[2]{\partial #1}{\partial #2} % 引数が2つのとき

のようにします.

\newcommandの問題点

では何が問題かといいますと,\newcommandは単純な置き換えであるということになります.

例えばハイパボリックセカント(sech)関数は元々定義されていないので自分で用意しなければなりません.ここで

\newcommand{\sech}{\mathrm{sech}}

として定義して

\sech x

と使うと非常に汚い式になってしまいます.

\sinなどは演算子として定義されているので余白の調整を自動で行ってくれます.\sin xならばxの前に自動で小さな余白を入れてくれるし,sinのsの前にも小さな余白が自動で入ります.

一方,上記の\newcommandを利用したときは単に\mathrm{sech}と書いたのと同じになるので余白などの調整は行われずにTeXの美しさが損なわれてしまいます.

もう一つ気になる点があります.それは\newcommandはただのコマンドであるので演算子としての意味がない点です.セマンティクスが正確に記述できないので演算子を定義する際には適当ではありません.

\DeclareMathOperatorを使おう

LaTeXを使う日本人でamsmathパッケージを使わない人は殆どいないと思います.\DeclareMathOperatorはこのamsmathパッケージで実装されている,新しい演算子を定義するためのコマンドです.

使い方は簡単で,例えばハイパボリックセカントを定義したいなら

\DeclareMathOperator{\sech}{sech}

としてあげれば使い方は後の使い方は同じです.これなら元々定義されている\sinなどと全く同じ形式で使えるし,コマンドの意味としても演算子として処理系に情報を渡すことが出来ます.

例えば

\newcommand{\divergence}{\mathrm{div}\,}  %ダイバージェンス
\newcommand{\grad}{\mathrm{grad}\,}  %グラディエント
\newcommand{\rot}{\mathrm{rot}\,}  %ローテーション

引用:TeXテンプレート - [物理のかぎしっぽ]

と定義しているのをたまに見かけますが,これは

\DeclareMathOperator{\divergence}{div} %ダイバージェンス
\DeclareMathOperator{\grad}{grad} %グラディエント
\DeclareMathOperator{\rot}{rot} %ローテーション

とするのが今風でしょう.

LaTeX自体については奥村先生の本が入門書として鉄板です.

[改訂第6版] LaTeX2ε美文書作成入門

[改訂第6版] LaTeX2ε美文書作成入門