[[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 マクロの作成 [#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.club/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. のようなエラーになります。 ** 関連リンク [#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 などと探してみてください。