[[LaTeX入門]] /
[[最初の例>LaTeX入門/最初の例]] /
[[簡単な数式 (1)>LaTeX入門/簡単な数式(1)]] /
[[簡単な数式 (2)>LaTeX入門/簡単な数式(2)]] /
[[各種パッケージの利用>LaTeX入門/各種パッケージの利用]] /
[[レポート>LaTeX入門/レポート]] /
[[HTML と LaTeX の比較>LaTeX入門/HTMLとLaTeXの比較]] /
[[複雑な数式>LaTeX入門/複雑な数式]] /
[[図表>LaTeX入門/図表]] /
[[図表の配置>LaTeX入門/図表の配置]] /
[[相互参照とリンク>LaTeX入門/相互参照とリンク]] /
[[文献引用]] /
[[索引作成]] /
LaTeX マクロの作成 /
[[スライドの作り方(jsarticle 編)>LaTeX入門/スライドの作り方(jsarticle編)]] /
[[応用的な使い方>LaTeX入門/応用的な使い方]] /
[[発展編>LaTeX入門/発展編]]

----


* LaTeX マクロの作成 [#l5aceaca]

LaTeX の特徴の一つにマクロが作成できることが挙げられます。
マクロを活用することによって,ミスの少ない仕上がりや作業効率の向上などの効果が期待できます。
この項では,LaTeX でマクロを作成する方法を説明します。
TeX レベルに踏み込んだ内容は [[TeX入門/マクロの作成]] で解説されていますので,参照してください。

// カテゴリーコードやトークンの概念を理解しなくても,初心者がすぐに定義できる
// \newcommand による置き換えマクロくらいの解説をここに書きたい。
// …と書いてから一か月経ち,ようやく書きました。
// マクロについては素人ですので,適宜修正してください。 -- アセトアミノフェン (2015-06-23)

#contents

** LaTeX におけるマクロのメリット [#j9736d77]

[[LaTeX]] にようやく慣れてきたというユーザの中には「LaTeX のマクロは難しい」と思い込んでいる人がいるかもしれません。
確かに,LaTeX のマクロを解説した文献は TeX 言語の解説にも踏み込んでいる場合が多く見受けられますし,逆に入門書の中には「LaTeX のマクロ」を扱っていない場合すらあります。

しかし,実際は「LaTeX のマクロ作成」には難解な TeX 言語の知識は全く必要なく,何も難しいことはありません。
むしろ ''LaTeX のマクロは文書のメンテナンス性を向上するために欠かせないもの''です。

たとえば,「文字を太くする」という命令である \textbf を本文中で使ったとします。
この場合,単に太くするといっても「何のために太くしたのか」すなわち,強調したかったのか,はたまた記号として太くする決まりになっていたのかという情報が抜け落ちてしまいます。
そうした情報は,処理する LaTeX にしてみれば無意味ですが,ソースを記述するユーザにとっては重要です。
というのも,「強調の方式を太字ではなく斜体に変更したい」という場合には,強調の \textbf だけを選んで \textit に書き換えなければならないという困難が生じるのが目に見えているからです。

もっと分かりやすい例として,中学や高校の数学で学ぶ「順列や組み合わせ」の記号を考えてみます。
数式中では下付き文字を表すアンダーバー _ や括弧 (, ) をよく用いますが,「順列や組み合わせ」の記号はそれらを組み合わせた簡単な記号です。
しかし,その記法にはさまざまな流儀があり,国際的な標準もありませんので,往々にして「ある流儀の記法から別の流儀の記法に書き換えたい」という場合が起こりえます。
そうした場合,あちこちに使われているアンダーバーの中から「順列や組み合わせ」に使われているものだけを探し出すのは困難です。
-[[LaTeX マクロで文書にメンテナンス性を:http://ut-tex.org/weekly_macro.php?no=22]](順列・組み合わせをマクロでマークアップした例)

このような場合に威力を発揮するのが LaTeX マクロで,マクロの定義さえ書きかえれば,本文ソースはそのままで出力を一発で変更するということが可能になるわけです。
これは [[HTML と LaTeX の比較>LaTeX入門/HTMLとLaTeXの比較]]で説明したとおり HTML にはない特徴です。
以下で,簡単な例とともに LaTeX マクロの定義のしかたを学びましょう。


** 引数なしの命令 [#r99a61d7]

LaTeX で新しい命令を定義するには,\newcommand を使います。

たとえば,山田太郎さんが自分の名前を出力する \myname という命令を定義するには,
 \newcommand{\myname}{山田太郎}
のように書きます。
\newcommand の一つ目の引数には「定義したい命令の名前」,二つ目の引数は「定義内容」が入ります。
こうすれば,それ以降 \myname と書いた部分はすべて「山田太郎」という文章に置き換わるわけです。

利用例として,[[表記の哲学/\mathrm{d}x?]] で議論されているような微分記号の d を常にローマン体(立体)にしたい場合に
 \newcommand{\diff}{\mathrm{d}}
と定義すれば,
 \[
   F = - \frac{\mathrm{d}U}{\mathrm{d}x}
 \]
の代わりに
 \[
   F = - \frac{\diff U}{\diff x}
 \]
と書けるので便利かもしれません。

&ref(LaTeX-macro01.png);
//[図:実行結果を貼り付ける]


** 引数をとる命令 [#veb3f0df]

引数をとる命令を定義するには,
 \newcommand{\命令の名前}[引数の個数]{定義内容}
という書式を用います。
引数の個数には 1 から 9 までの整数を指定できます。
この命令を実行すると,定義内容で #1 や #2 …などと書いた部分は,対応する引数1,引数2,…に置き換えられます。

たとえば,中学や高校の数学で登場する組み合わせの総数を表す記号を出力したい場合
 \newcommand{\combination}[2]{{}_{#1} \mathrm{C}_{#2}}
と定義しておけば,
 \[
   \combination{n}{k} = \frac{n!}{k! (n-k)!}
 \]
と書くことで次のように出力できます。

&ref(LaTeX-macro02.png);
//[図:実行結果を貼り付ける]


** オプション引数付きの命令 [#v52306ce]

LaTeX では省略不可能の引数を { } で囲むのに対し,省略可能なオプション引数は [ ] で囲みます。
標準の LaTeX では「オプション引数は最初の一つだけ」という制限があります。
今まで出てきたオプション引数の例としては,[[図表>LaTeX入門/図表]]の \includegraphics[width=5cm]{apple.png} の width=5cm などがあります。

オプション引数付きの命令を定義するには
 \newcommand{\命令の名前}[引数の個数][引数1の既定値]{定義内容}
という書式を用い,この命令を使用するときにはオプション引数を [ ] で指定します。
この命令を実行すると,やはり定義内容の #1 や #2 …は引数1,引数2,…に置き換えられますが,引数1が省略されていた場合には命令を定義したときに与えた規定値が使われます。

引数の個数を増やした実用例として,たとえば図にキャプションと参照用ラベルを付けて
 \newcommand{\myfig}[4][width=5cm]{%
   \begin{figure}[htbp]
     \centering
     \includegraphics[#1]{#2}
     \caption{#3} \label{fig:#4}
   \end{figure}%
 }
と定義したとします(参考:[[図表>LaTeX入門/図表]],[[図表の配置>LaTeX入門/図表の配置]],[[相互参照とリンク>LaTeX入門/相互参照とリンク]])。
すなわち,\includegraphics に渡すオプション引数の規定値を width=5cm にしているわけです(今回の例では \includegraphics のオプション引数と \myfig のオプション引数が一致することになります)。
この場合,オプション引数を省略して
 \myfig{orange.png}{オレンジの図}{orange}
と書けば orange.png を規定値の幅 5cm で表示できますし,オプション引数を指定して
 \myfig[width=3cm]{banana.png}{バナナの図}{banana}
と書けば banana.png を幅 3cm で表示できます。


** 既存の命令の再定義 [#s8152d60]

\newcommand で新しい命令を定義しようとしたとき,既に同じ名前の命令が存在した場合はエラーになります。
たとえば,\begin は既に LaTeX で定義されているので
 ! LaTeX Error: Command \begin already defined.
のようなメッセージが出ます。
つまり,意図せず既存の命令の定義が変更されるのを防いでくれているのです。

もし既に存在する命令の定義を変更したい場合は,代わりに \renewcommand を使います。
書式は \newcommand の場合とまったく同じです。
今度は逆に,\renewcommand で再定義しようとした命令が実は未定義だったという場合に
 ! LaTeX Error: Command \hoge undefined.
のようなエラーになります。

** LaTeXにおける変数の利用 [#tfab8d58]
マクロを組む際、変数が使えると便利です。
LaTeXでは次の種類の変数が使えます。
: カウンタ | 整数値の変数
: 長さ | 単位付きの実数値(例: 25.4mm, 2.5in, 0.4pt など)

LaTeX での変数の扱い方は TeX とは異なります。TeX での変数の扱い方については[[TeX入門/マクロの作成#i41b7d06]]を参照。

*** カウンタの使い方 [#d964c6cb]
まず新しいカウンタを定義します。
 \newcounter{カウンタ名}
または
 \newcounter{カウンタ名}[親カウンタ名]
[親カウンタ名]の部分は省略可能なオプション引数です。すでに定義済みの親カウンタを指定すると、親カウンタの値が\stepcounterによって一つ進められるたびに子カウンタの値が0にリセットされるようになります。
カウンタ名には英数字や記号文字のほとんどが使えます。(例:\newcounter{cntA})(カウンタ名は TeX の \csname~\endcsname によって取り扱われるため、展開されて文字トークンになるものであれば使えます)
カウンタ名には英数字や記号文字のほとんどが使えます。(例:\newcounter{cntA})(カウンタ名は TeX の \csname c@カウンタ名\endcsname によって取り扱われるため、展開されて文字トークンになるものであれば使えます。LaTeX のカウンタの実体は \c@カウンタ名 という TeX の整数レジスタです)

カウンタに値を設定するには
 \setcounter{カウンタ名}{整数値}
とします。

カウンタの値は1ずつ増やすことができます。
 \stepcounter{カウンタ名}
このとき、このカウンタを親カウンタとして設定しているすべての子カウンタの値は0にリセットされます。

カウンタに数値を加えるには
 \addtocounter{カウンタ名}{整数値}
とします。

カウンタの値を他のカウンタとの演算などに使うには
 \value{カウンタ名}
とします。例: \addtocounter{cntA}{\value{cntB}}

カウンタの値を生成文書中に文字列として印字するには
 \arabic{カウンタ名}
 \Roman{カウンタ名}
 \roman{カウンタ名}
とします。それぞれ、アラビア数字(普通の数字)、ローマ数字の大文字、小文字によって値を表します。また、カウンタごとに用途を決めて使う場合用途に合わせた表示形式が定義された
 \theカウンタ名
という命令も使えます。この命令についてはカウンタ名を括弧などで囲む必要はありません。例: \thecntA
最初に \newcounter{カウンタ名} でカウンタが定義されたとき、\theカウンタ名 は \arabic{カウンタ名} と同じものとして定義されます。例えば \thesection は節番号を表す sectionカウンタ の値を紙面に印字しますが、番号の体裁はクラスファイルなどで \thesection命令の中に定義されています。節番号であることが一目でわかるフォントが使われたり「§」などの記号が付けられていたりするかもしれません。文書ごとの仕様を調べなくても \thesection とするだけで「節番号を表す数値だと一目でわかる体裁」で印字することができるようにしているわけです。

*** 長さ変数の使い方 [#cf9185c9]
まず、新しい長さ変数を定義します。
 \newlength{\長さ変数名}
カウンタの場合と異なり、指定するのは変数名ではなく変数として使いたいマクロです。
長さ変数名には英文字しか使えません。
(実体は TeX の \newskip です。)

** マクロをまとめてパッケージを作成する [#b92638df]

[[各種パッケージの利用>LaTeX入門/各種パッケージの利用]]で説明したように,LaTeX のパッケージとはこのような LaTeX マクロ(時には TeX マクロ)をまとめたものです。
もちろん,LaTeX ファイルを作成するたびにプリアンブルに命令の定義を書くことも可能ですが,よく使う命令は “自作パッケージ” にまとめてしまうとよいでしょう。
そうすることで,多くの命令を
 \usepackage{mypackage}
という一行で簡単に使えるようになります(これは mypackage.sty というファイルを作成した場合の例)。

特に工夫しなければ
 \newcommand…
という行をひたすら書き連ねるだけでも,拡張子 .sty を付けて保存すれば一応使うことができます。
もう少し進んで “パッケージらしく” したい場合は,[[パッケージ]]の項目を参照してください。


** 関連リンク [#ybc1070a]

ここでは \newcommand や \renewcommand を簡単に説明しましたが,より詳しくは以下のリンクを参照してください。

-[[完全攻略! LaTeX のマクロ定義:http://qiita.com/zr_tex8r/items/5067307890d36c0e4882]]
-[[xparse パッケージでスゴイ LaTeX マクロを作ろう!:http://qiita.com/zr_tex8r/items/50168ad7087516c3e139]]
-Leslie Lamport によるサンプル LaTeX ソース [[sample2e.tex>CTAN:macros/latex/base/sample2e.tex]]
--お使いの TeX ディストリビューションに含まれているはずです。kpsewhich sample2e.tex などと探してみてください。