Yamamoto's Laboratory
マクロ
表紙
公開情報
古い情報

LaTeXマクロ

LaTeX では,簡単なプログラム(マクロ)の実行が可能です.これを上手に使うと,文書の作成が簡単になるととともに,ミスプリントを少なくすることができます.ここでは,マクロの作成方法と使い方を説明します.

目次


マクロを理解するために

マクロをどこに書くか?

LaTeX ファイルのどこでも,マクロは定義可能です.定義された場所以降で,そのマクロは有効になります.通常は本文の直前のプリアンブル領域の後半に,マクロを記述します.

トークン

ここでは,マクロを理解するために,基本的な事項を説明します.最初は読み飛ばして,とりあえずマクロを使ってみるのが良いでしょう.マクロになれたところで,基本的なことを理解することを勧めます.

トークン(token)TeX がファイルからテキストを読むとき,トークンのリストに分解します.トークンはカテゴリーコードが取り付けられたシングルキャラクターあるいは命令です.例えば,「\sqrt{23} \pi hoge」の場合,10個のトークン (\sqrt, {1, 212, 312, }2, \pi, h11, o11, g11, e11) があります.下付の整数がカテゴリーコードです.トークンに関しては,(1)複数の空白は一つの空白文字となる,(2)命令の後の空白文字は無視される,(3)コメントは無視されるというような注意が必要です.普通の単語の後の一つあるいは複数の空白は一つの空白文字のトークンになります.

カテゴリーコード(category code)LaTeXは文字をカテゴリーコードで分類します.

コマンド

マクロ定義 (\def)

ユーザー定義のコマンド(マクロ)作成する場合,TeX で定義されている「\def」と LaTeX でで定義されている「\newcommand」を使うことができます.これらは,普通のプログラミング言語のサブルーチン(関数,メソッド)のような働きをします.既にあるマクロ名を使った場合の動作が,両者で異なります.\def の場合は後から定義されたマクロ命令が使われます.それに対して,\newcommand はエラーメッセージを表示します.

\command は次節で示すとし,ここでは \def の使い方を説明します.\def の文法は以下のとおりです.

\def<マクロ名><引数>{<処理>}

定義方法

\def は引数を撮ります.0個から9個までの引数をとることができます.以下に,その例を示します.

LaTeX マクロ定義 動作
\def\マクロ名{文字列} 文書内で \マクロ名 とすると,文字列に置換されます.具体例
\def\マクロ名#1#2 {引数付き文字列} 文書内で \マクロ名{引数 #1 の値}{引数 #2 の値} とすると,文字列に置換されます.引数は #1 から #9 までの任意の個数を設定できます.具体例

引数の区切り

引数を取る \def の場合,\hoge{引数1}{引数1}{引数1}のように記載します.引数の並びは,波括弧で区切ります.その他の方法もあります.以下に示すマクロの引数のとり方は,本格的なスタイルファイルを作成するときには必要なテクニックです.

LaTeX マクロの引数の区切り 動作
\def\マクロ名#1:#2: {引数付き文字列} 文書内で \マクロ名引数1の値:引数2の値: とすると,文字列に置換されます.引数は #1 から #9 までの任意の個数を設定できます.具体例
コロン(:)の他に,スラッシュ(/)やピリオド(.),セミコロン(;)などが使えます.
\def\マクロ名#1\par{引数付き文字列} マクロ定義の引数の部分を「…#1\par{…」とすると,引き続く段落の終わりまでが #1 を表すことになります.文書内で \マクロ名に引き続く段落区切りまでが引数 #1 の値になります.具体例

コマンド作成 (\newcommand)

\newcommand は LaTeX で定義されているコマンドで,新たにコマンドを定義します.TeX で定義されている \def とは異なり,既に同じマクロ名がある場合,\newcommand はエラーメッセージを表示します.単純なコマンドを定義する場合は,\newcommand の方が望ましいです.

\newcommand の書き方は,次の通りです.

\newcommand{<マクロ名>}[<引数>]{<処理>">}

引数がない場合

\newcommand{\hoge}{ホゲホゲ}」とマクロを定義すると,本文で「\hoge」と書かれた部分は「ホゲホゲ」と出力されます.

引数がある場合

\newcommand{\hoge}[2]{#1 は #2 である}」とマクロを定義すると,本文で「\hoge{我輩}{猫}」と書かれた部分は「我輩は猫である」と出力されます.

制御構造

条件分岐 (IF)

一般的なプログラミング言語での「if(論理演算){処理} else if(条件){処理} else{処理}」と書きます.LaTeXの場合,この論理演算が無いため,構文がやや厄介です.論理演算子の代わりに,さまざまな if 文が使われます.LaTeX の条件分岐の構文は,「\ifコマンド 判断式・値など 処理A \else 処理 fi」となります.「\else 処理B」は省略可能です.

LaTeX マクロ 動作
\ifnum<整数 A><比較><整数 B> 整数 A と B の比較.使用可能な比較演算子は「<, >, =」.()
\ifdim<長さ A><比較><長さ B> 長さ A と B を単位付きで比較.使用可能な比較演算子は「<, >, =」.()
\ifx<token A><token B> トークン A と B が一致の場合 ….文字コードとカテゴリーコードが一致,命令の場合は動作が一致.()
\if<token A><token B> 文字トークン A と B が一致の場合 …()
\ifcat<token A><token B> 文字トークン A と B のカテゴリーコードが一致の場合 …
\ifodd<数値> 奇数の場合 …
\ifmmode 数式モードの場合 …
\ifhmode 水平モードの場合 …
\iftrue 常に真.
\iffalse 常に偽.

条件分岐を使った実用的なマクロプログラムとその実行結果を以下に示します.ここではネストした条件分岐を使い,else if のような構文とします.LaTeX の条件分岐はプリミティブな機能しかありませんが,組み合わせることで複雑なことも可能です.

% -*- coding:utf-8 -*-
\documentclass[10pt,a4paper]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}
\usepackage{amsmath}

\newcommand{\pdiff}[3]{%      %%% マクロの定義 
  \ifnum #1<1%
    \text{エラーだよーん (最初の引数は1以上の整数)}%
  \else{%
    \ifnum #1=1%
      \frac{\partial #2}{\partial #3}%
    \else%
      \frac{\partial^{#1} #2}{\partial #3^{#1}
    }\fi%
  }\fi%
}
% --------- ドキュメント開始 ---------------
\begin{document}

偏微分方程式を簡単に記述します.
\begin{align}
  \kappa\pdiff{2}{f}{x}=\pdiff{1}{f}{t}
\end{align}

エラー処理の例を示します.
\begin{align}
  \pdiff{3}{f}{x}=\pdiff{-1}{f}{t}
\end{align}

\end{document}

図1: 条件分岐のマクロの実行結果

繰り返し (loop)

LaTeX のマクロの繰り返し (loop) の構文は,「\loop \ifコマンド 判断式・値など 処理 \repeat」です.以下にに \loop を使った典型的なプログラム例を示します.5行目で,繰り返しの回数を数えるカウンターを作成します.カウンターについては,次節を参照ください.7行目で,繰り返し構文を呼び出すためのコマンド \LoopTest を定義します.8行目でカウンターをリセットします.9 — 13行目が繰り返し構文です.

% -*- coding:utf-8 -*-
\documentclass[10pt,a4paper]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}

\newcounter{LCnt}%            カウンター定義
\newcommand{\LoopTest}[2]{%   コマンド定義
  \setcounter{LCnt}{0}%       設定: LCnt = 0
  \loop%                      ループ開始
    \ifnum \value{LCnt}<#1%   条件
      我が輩は#2である.%
      \stepcounter{LCnt}%     LCnt++
    \repeat%
}%
% --------- ドキュメント開始 ---------------
\begin{document}
\LoopTest{3}{猫}\par
\LoopTest{2}{犬}
\end{document}

図2: 繰り返し (loop) マクロの実行結果

変数

\newif
\newif は,新しいブール変数 (switch, condition, 制御綴) を作成します.「\newif\ifBoolVar」とすると,ブール変数 BoolVar が作成されます,通常は「\newif\ifBoolVar\BoolVarfalse」というように記載します.これで,ブール変数 BoolVar が false (偽) に初期化されます.「\newif\ifBoolVar\BoolVartrue」とすると,BoolVar は true (真) となります.

カウンター

基本コマンド

カウンターには,LaTeX とTeX のコマンドがあります.もちろん,LaTeXでは両方のコマンドを使うことができます.LaTeX の \newcounter でカウンター作成する場合,同名のカウンターのチェックが行われます.同じ名前のカウンターがあると処理が中断されます.一方,TeX の \newcount では後で定義されたものが使われるので,見つけにくいバグが入り込む可能性があります.このことからも,ユーザーは,LaTeX のカウンターを使用すべきです.また,機能も豊富です.

以下にカウンターに関するコマンドをまとめます.カウンター名を「Cntr」や「PCntr」としていますが,任意の名前で定義可能です.

LaTeX マクロ 動作
\newcounter{Cntr} カウンター「Cntr」を作成する.
\newcounter{Cntr}[PCntr] カウンター「Cntr」を作成し「PCntr」を親カウンターとします.親カウンターがカウントアップすると,子カウンターがゼロにリセットされます.孫以降の子孫のカウンターはリセットされません.
\setcounter{Cntr}{387} カウンターの値を 387 にする.整数であれば,どんな値でも設定可能.
\value{Cntr} カウンターの値を取り出す.
\the\value{Cntr} カウンターの値を表示する.
\theCntr カウンターの値を表示する.
\stepcounter{Cntr} カウンターの値をカウントアップ(インクリメント:1増加)する.さらに,子カウンターの値をリセットする.
\refstepcounter{Cntr} \setcounter の動作に加え,\label{参照キー}と\ref{参照キー}を使用可能にする.
\addtocounter{Cntr}{5} カウンターの値が5増加する.負の値を含め任意の整数が設定可能.
\ifnum\value{Cntr}<10 処理\fi カウンターが10以下のとき,処理を実行する.条件は任意に設定可能.
\c@Cntr Cntr と同じ.
TeX マクロ 動作
\newcount\Cntr カウンター「\Cntr」を作成する.
\Cntr=387 カウンターの値を 387 にする.整数であれば,どんな値でも設定可能.
\the\Cntr カウンターの値を表示する.
\advance\Cntr by 2 カウンターの値を2増加させる.負の値を含め任意の整数が設定可能.by を書かない場合は「by 1」とみなされます.
\ifnum\Cntr<10 処理\fi カウンターが10以下のとき,処理を実行する.条件は任意に設定可能.

カウンターを使った LaTeX マクロの例を以下に示します.6行目でカウンター MyCnt を作成します.007 — 010 行でカウンターを表示やカウントアップする命令 \MyCnt を定義します.カウンター名と命令が同じ名前ですが,問題なく動作します.

% -*- coding:utf-8 -*-
\documentclass[10pt,a4paper]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}

\newcounter{mycnt}%                       カウンター定義
\newcommand{\outcnt}{%                    コマンド定義
  \the\value{mycnt}%                      カウンター出力
  \ifnum\value{mycnt}>100 (over 100)\fi%  100以上の場合
  \stepcounter{mycnt}%                    mycnt++
}
% --------- ドキュメント開始 ---------------
\begin{document}
\setcounter{mycnt}{0}
カウンターの初期値: \outcnt\par
カウンターの変化: \outcnt, \outcnt, \outcnt, \outcnt.

\setcounter{mycnt}{98}
カウンターの再設定値: \outcnt\par
カウンター:\outcnt, \outcnt, \outcnt, \outcnt.
\end{document}

図3: カウンターを使ったマクロの実行結果

カウンター出力

マクロの例

スタイルファイルの作成

スタイルファイルを自作する場合,最初は標準的に使われているものを真似るのが良いでしょう.プログラム作法を真似ることは大変重要です.

ページ作成情報

参考資料

  1. このページの多くの部分は,藤田眞作著「LaTeX2εまくろの八衢」を参考にしました.pdf のオンライン版が公表されており,大変役に立ちます.
  2. 初心者にとって,三重大学の奥村先生のTeX Wiki TeX入門/マクロの作成は大変参考になります.まずは,ここを見るべきでしょう.
  3. カテゴリーコードについては「TeX by Topic ゼミ (2)カテゴリーコードの研究」が詳しいです.

更新履歴

2015年04月10日 ページの新規作成


no counter