Takatani Note

【LaTeX】マクロの作り方(\def、\newcommand)

この記事では、LaTeXでマクロを作るときに用いる\def\newcommandについて入門的な解説をします。

マクロが使えるようになれば、複雑で長いコマンドを簡略化でき、作業能率が格段に上がります。 マクロはとても便利なテクニックなので、必ずマスターしておきましょう。

マクロの記述場所

マクロはプリアンブルでも本文内でも定義可能です。 定義された場所以降でそのマクロは有効になります。 一般的に、マクロはプリアンブルの最後の方で記述されることが多いです。

ただし、\defまたは\newcommandを本文中(\begin{document}~\end{document})に記述するならば、文書モードで入力してください。
数式モード($ $の中)で入力したらコマンドは無効になります。

\def

引数なし

構文:
\def\マクロ名{文字列}
例:
\def\a{\alpha}
$\a$

$\def\a{\alpha}$ $\a$

このように\aを入力するだけでアルファ $\a$ が表示されます。

例:
\def\Z{\mathbb{Z}}
$\Z$

$\def\Z{\mathbb{Z}}$ $\Z$

このように、\Zを入力するだけで $\Z$ が表示されます。

引数あり

構文:
\def\マクロ名#1#2 …{引数付き文字列}

引数は #1 から #9 までの任意の個数を設定できます。

例:
\def\norm#1{\| #1 \|}
$\norm{A}$

$\def\norm#1{\| #1 \|}$ $\norm{A}$

上記のとおり、\defによって\norm{}という新しいコマンドをつくりました。
この{}の中にA\alphaなどの文字列を入れると、そのノルムが出力されます。
\|は $\|$ を出力するコマンドです。

例:
\def\dd#1#2{\frac{\partial #1}{\partial #2}}
$\dd{f}{x} \dd{g}{y}$

$\def\dd#1#2{\frac{\partial #1}{\partial #2}}$ $\displaystyle\dd{f}{x} \ \dd{g}{y}$

上記のとおり、\defによって\dd{}{}という新しいコマンドをつくりました。
1つ目の{}にfやgなどの関数を、2つ目の{}にxやyなどの変数を入れると、その偏微分が出力されます。
\partialは $\partial$ を出力するコマンドです。

\newcommand

引数なし

構文:
\newcommand{マクロ名}{文字列}
例:
\newcommand{\a}{\alpha}
$\a$

$\newcommand{\b}{\alpha}$ $\b$

引数あり

構文:
\newcommand{マクロ名}[引数]{文字列}
例:
\newcommand{\norm}[1]{\| #1 \|}
$\norm{A}$

$\norm{A}$

例:
\newcommand{\dd}[2]{\frac{\partial #1}{\partial #2}}
$\dd{f}{x} \dd{g}{y}$

$\displaystyle\dd{f}{x} \ \dd{g}{y}$

例:
\newcommand{\hoge}[2]{#1 は #2 である}
\hoge{我輩}{猫}

$\newcommand{\hoge}[2]{#1 は #2 である}$ $\hoge{我輩}{猫}$

\def\newcommandの違い

\defはTeXで定義されているコマンドであり、 \newcommandはLaTeX で定義されているコマンドです。

すでにあるマクロ名を定義しようとする場合、\defの場合は後から定義されたマクロが使われます。それに対して、\newcommandはエラーメッセージが表示されます。

\newcommandのほうがバグが起きる心配は少ない

\newcommandのほうがバグが起きる心配は少ないです。 というのも、amsmathやamsfontsなどのパッケージでは多くのマクロが定義されています。複雑に定義されたマクロも少なくありません。

\defによって新しく定義したコマンドが、パッケージ内にあるマクロと一致してしまうと、エラーが起きたり、変な出力表示がされる可能性があります。 やっかいなことは\defで定義したら、そのバグはすぐにはわからないことです。

一方で、\newcommandでは、エラーが表示されるので、新しいコマンド名がすでに定義されているものだとすぐにわかります。

そういうわけで、マクロを定義する場合は\newcommand を用いるほうが望ましいです。