マクロの定義

同じ書き方を何度も繰り返したり、後でまとめて直したくなったら、自分専用の命令(マクロ)を定義します。基本は \newcommand。引数の取り方、既存命令の再定義、現代的な \NewDocumentCommand、そして「壊れやすい命令」を避ける作法まで、自作命令の土台をひととおり見ていきます。

\newcommand で命令を作る

もっとも基本的な道具が **\newcommand{\name}{definition}** です。第 1 引数に作りたい命令の名前、第 2 引数にその中身を書きます。たとえば自分の研究グループ名を何度も書くなら、プリアンブルで一度定義しておけば、本文では \name と打つだけで definition に展開されます。

latex
% プリアンブルで定義 / define in the preamble
\newcommand{\grp}{Knuth Typesetting Lab}

% 本文で使う / use it in the body
Welcome to the \grp. The \grp{} was founded in 1978.

2 つ目の \grp のうしろに付けた **{}** に注目してください。\grp のような英字だけの命令は、直後の空白を「命令名の区切り」として食べてしまうため、\grp was と書くと「Lab was」ではなく「Labwas」のように空白が消えます。空の中括弧 {} を置いて区切りを作るのが定石です(詳しくは「記法のルール」へ)。

重要な原則として、\newcommandその名前がまだ定義されていないときだけ 成功します。すでに存在する命令名(LaTeX カーネルやパッケージの命令も含む)に使うと、Command \name already defined というエラーで止まります。これは既存の命令をうっかり上書きしてしまう事故を防ぐための、わざとの安全装置です。既存の命令を作り直したいときは、後述の \renewcommand を使います。

引数をとるマクロ

中身を呼び出しごとに変えたいなら、引数を持たせます。**\newcommand{\name}[⟨nargs⟩]{... #1 #2 ...} のように、命令名のあとの角括弧に 引数の個数 を書き、定義の中で #1#2 … と参照します。パラメータは #1 から #9 まで、最大 9 個**です。

latex
\newcommand{\unit}[2]{#1\,\mathrm{#2}}

% \unit{9.8}{m/s^2} → 9.8 m/s^2(数と単位の間に細い空き)
$a = \unit{9.8}{m/s^2}$

さらに、最初の引数を「省略可能」にして既定値を与える こともできます。**\newcommand{\name}[⟨nargs⟩][⟨default⟩]{...}** のように角括弧を 2 つ重ねると、#1 がオプション引数になり、その既定値が ⟨default⟩ になります。呼び出し時は \name(既定値を使う)または \name[x]#1x にする)と書きます。残りの必須引数は #2 以降です。

latex
% 全 2 引数、うち #1 は省略可能で既定値 2
\newcommand{\plusbinomial}[2][2]{(x + y)^{#1}_{#2}}

$\plusbinomial{n}$      % → (x + y)^2_n   (#1 は既定の 2)
$\plusbinomial[3]{n}$   % → (x + y)^3_n   (#1 を 3 に)

注意したいのは、角括弧の個数の数え方です。[⟨nargs⟩]⟨nargs⟩ には オプション引数も含めた総数 を書きます。つまり上の例は「引数 2 個、そのうち最初の 1 個が省略可能」という意味です。なお [⟨default⟩]書かない ことと、空の括弧 [] を書くことは別物で、後者は「既定値が空文字列のオプション引数」になります。

再定義・条件定義・頑強化

\newcommand には、目的の違う三つの仲間がいます。いずれも引数の書き方([⟨nargs⟩][⟨default⟩])は \newcommand と同じで、違うのは「すでに定義済みの名前にどう振る舞うか」です。

命令既存の名前に対して主な用途
\newcommandエラーで停止新しい命令を安全に作る
\renewcommand上書きする(未定義だとエラー)既存の命令を作り直す
\providecommand何もしない(既存定義を残す)二重読み込みされ得るスタイル
\DeclareRobustCommand上書きし、ログに記録可動引数で使う頑強な命令

\renewcommand** は既存の命令を作り直すための命令です。\newcommand とは逆に、対象が すでに定義されていないとエラー になります。たとえば箇条書きの先頭記号を変えるなど、LaTeX があらかじめ用意している命令の中身を差し替えるときに使います。

latex
% itemize の第 1 階層の記号をダッシュに
\renewcommand{\labelitemi}{--}

% 既存マクロを新しい中身で作り直す
\renewcommand{\grp}{Lamport Typesetting Lab}

\providecommand は「まだ無いときだけ定義する**」命令です。その名前が未定義なら \newcommand とまったく同じに働き、すでに定義済みなら 何もせず既存の定義を残します(エラーも出ません)。複数の場所から読み込まれる可能性のあるスタイルファイルで、命令を「念のため用意しておく」のに向きます。

\DeclareRobustCommand は、中身に壊れやすいコードを含んでいても 頑強(robust)な命令** を作ります(頑強・壊れやすいの意味は次節で)。\newcommand と違って既存の名前に対してもエラーにならず、再定義したときは ログファイルに記録 を残すだけです。ただし、ここで作った命令はわずかに非効率なので、中身が壊れやすく、かつ可動引数で使う場合に限って用い、それ以外は \newcommand を使うのが推奨です。

壊れやすい命令と \protect

LaTeX には「可動引数(moving argument)」と呼ばれる特別な文脈があります。\section{...} の見出しは、本文に組まれるだけでなく、**目次やページ見出し、.aux 補助ファイルへも書き出されて** あちこちに「移動」します。\caption{...}(図表のキャプション)や \thanks{...}tabulararray@{...} の中身も同じく可動引数です。

こうした文脈で展開されると壊れて不正な TeX コードになってしまう命令を 壊れやすい命令(fragile command) と呼び、平気なものを 頑強な命令(robust command) と呼びます。古典的な対処は、壊れやすい命令の直前に **\protect** を置いて「ここでは展開せずそのまま書き出せ」と指示することです。保護は命令ごとに必要で、\protect は直後の一つだけを守ります。

latex
% 可動引数の中で壊れやすい \verb を保護する
\section{The \protect\verb|\par| primitive}

ただし朗報があります。2019 年 10 月の LaTeX 以降、かつて壊れやすかった命令の多くが頑強になりました。オプション引数をとる \raisebox などや、行内数式 \(...\) も、今では \protect なしで見出しに書けます。それでも残る代表格が **\verb** で、これは \protect でも救えないことが多く、見出しやキャプションでは \texttt{...} で書き直すのが手っ取り早い解決策です。自分でマクロを作るときは、\DeclareRobustCommand で最初から頑強に定義しておけば、\protect の心配自体がなくなります。

現代的な \NewDocumentCommand

もう一つ、現代の LaTeX が用意する強力な定義法が **\NewDocumentCommand{\name}{⟨arg-spec⟩}{...}** です。もとは xparse パッケージの機能でしたが、**現在は LaTeX カーネル(ltcmd)に取り込まれ**、\usepackage なしで使えます。引数の個数を数字で書く代わりに、引数の種類を並べた「引数指定(arg-spec)」 で宣言するのが特徴です。

指定子意味定義内での受け取り
m必須引数(mandatory)通常の #1 などの引数
o省略可能な引数 [...]与えられなければ「無し」を表す値
O{default}既定値つきのオプション引数与えられなければ default
s* の有無\IfBooleanTF で真偽を判定

\newcommand より強力なのは、オプション引数を複数とれることと、星付き(starred)の変種を正式に扱えることです。下の例は星の有無を \IfBooleanTF で分岐しています(#1 が星、#2 が必須引数)。新しく書くコードでは、こちらの現代的なインタフェースを使うのがおすすめです。詳しくは「xparse」のページで扱います。

latex
\NewDocumentCommand{\diff}{s m}{%
  \IfBooleanTF{#1}%
    {\frac{\mathrm{d}}{\mathrm{d}#2}}%   星つき: d/dx 形
    {\mathrm{d}#2}%                      星なし: dx 形
}

$\diff{x}$    % → dx
$\diff*{x}$   % → d/dx

よいマクロの作法

マクロが最も力を発揮するのは 意味づけ(セマンティック)マクロ です。実数全体を \newcommand{\R}{\mathbb{R}}、微分の d を \newcommand{\dd}{\mathrm{d}} のように、「何であるか」に名前を付けて おくと、文書全体で表記が統一され、後から書体を変えたくなっても定義の 1 行を直すだけで全箇所に反映されます。

latex
\newcommand{\R}{\mathbb{R}}
\newcommand{\dd}{\mathrm{d}}

% 統一された表記で書ける / write with consistent notation
$\int_{\R} f(x)\,\dd x$

とはいえ、マクロは増やしすぎても読みにくくなります。\newcommand{\x}{\xi} のような極端な省略は、数か月後の自分や共同執筆者にとって暗号になりかねません。繰り返しが多い・後で一括変更したい・意味に名前を与えたい ものに絞り、それ以外は素直に書くほうが結局読みやすいことも多いです。

最後に名前の衝突を避けましょう。**LaTeX カーネルやパッケージの命令を \renewcommand で安易に書き換えない こと(思わぬ副作用が出ます)。自作命令には短すぎる名前を避け、できればプロジェクト固有の 接頭辞** を付ける(\myR\bookTitle など)と、既存命令や他パッケージとぶつかりにくくなります。迷ったら \newcommand で定義してみて、already defined エラーが出れば既に使われている名前だと分かります。