LaTeX マクロ

マクロを使う

コマンド名

  • バックスラッシュ (\) + アルファベット数文字。例:\section
  • バックスラッシュ (\) + 記号1文字。例:\!
  • 半角チルダ (~)

コマンドの引数

必須の引数:波括弧 { } で囲う。引数がトークン1つの場合は、{} は省略できます。{} はネストできる。つまり、\hoge{{}} と書いた場合、 {} が引数になる。

オプション引数:角括弧 [ ] で囲う。[] はネストできないが、{}で囲った部分にある ] は考慮されない。

引数と引数の間の空白は無視される。ただし、空行は無視されず、通常の空行の取り扱いに従って、 \par が置かれているものとして扱われる。

例:
\newcommand{\hoge}[2]{#2#1}
\hoge{a}{b} と \hoge{a}   {b} は完全に等価。
一方で、
\hoge{a}
{b}と
\hoge{a}

{b}
は異なる結果になる。(2番目は \hoge{a}\par{b} と書いたのと同じ)

マクロを定義する

同じような記述を文章中で何回も繰り返す場合、マクロを使うことによって省力化できます。また、ある概念の書き方の流儀が何種類かある場合、文章中でベタ書きするのではなくマクロを使うように使って書いておけば、後で流儀を変更したくなった場合にマクロの定義を書き換えるだけで済みます。

マクロは \newcommand コマンドにより定義でき、使うときは既存のコマンドと同じように使えます。LaTeX が提供するコマンドの多くも、マクロとして実装されています。

文法:\newcommand{コマンド名}{トークン列}

例:\newcommand{\Real}{\mathbf{R}}

この例では、実数全体の集合を表すマクロ \Real を定義しています。この定義の後に \Real と書いた場合は、 TeX の展開時に \mathbf{R} に置き換えられます。

もちろん、文章中に \mathbf{R} と直接書くこともできますが、こうやってマクロにすることによって

  • LaTeX のコードを読むときに意図が伝わりやすくなる
  • 「実数全体の集合」の書き方を別のものに変えたくなったときに、文章全体から \mathbf{R} を探して置き換えるのではなく、マクロの定義だけを置き換えれば済む

というメリットが生まれます。

コマンド名についての注意

以下の名前のコマンドは、 \newcommand を使って自分で定義することはできません。

  • \end から始まる名前。例:\endhoge
  • 定義済みの環境と同じ名前。例:\itemize (itemize 環境が存在するため)
  • \relax

引数を取るマクロを定義する

引数を取るマクロを定義することもできます。引数の個数は最大で9個で、マクロ展開時に「トークン列」中の #1, #2, …, #9 が与えられた引数に置き換えられます。また、「トークン列」中に ## と書くと展開時に # に置き換えられます(「マクロを定義するマクロ」を定義したい場合に有用)。

文法:\newcommand{コマンド名}[n]{トークン列}

例:
\newcommand{\abs}[1]{\lvert #1\rvert}
\abs{z} % → \lvert z\rvert に置き換えられる

例:
\newcommand{\transpose}[1]{{}^t\!#1}
$\transpose{A}$ % → ${}^t\!A$ に置き換えられる

オプション引数を取るマクロを定義する

自分でマクロを定義する際に、最初の引数を省略可能にできます。最初の引数を省略した場合は、 「トークン列」中の #1 はデフォルト値に置き換えられます。

文法:\newcommand{コマンド名}[n][デフォルト値]{トークン列}

\newcommand 単独では、オプション引数を複数取るマクロは定義できません。また、オプション引数の位置は一番最初に限られます。

引数中に空行を許さない場合

\newcommand の代わりに \newcommand* を使うと、引数中に空行(改段落)を許さないようにできます。この機能を使うと、括弧の閉じ忘れをした場合のエラーメッセージが多少分かりやすくなることが期待できます。

文法:\newcommand*{コマンド名}[n]{トークン列}

例:\newcommand*{\abs}[1]{\lvert #1\rvert}
$\abs{z$ % → エラー:Paragraph ended before \abs was complete.