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

LaTeXマクロ

LaTeX では,簡単なプログラム(マクロ)を実行できます.マクロを使うと,定型的な処理をまとめられるため,文書の作成が楽になり,誤植や修正漏れも減らせます.ここでは,マクロの作成方法と使い方を説明します.

目次


マクロを理解するために

マクロをどこに書くか?

LaTeX ファイルのどこにでも,マクロを定義できます.定義した場所以降で,そのマクロは有効になります.通常は,\begin{document} の前にあるプリアンブルの後半に記述します.

TeX の読み取り方

マクロを正しく理解するには,TeX が入力をどのように読むかを知る必要があります.最初は読み飛ばし,まずマクロを使ってみても構いません.慣れてから読み直すと理解しやすくなります.

トークン(token)TeX は,入力ファイルをトークンの列として読みます.トークンは,カテゴリーコードを持つ 1 文字,または \sqrt のような制御綴です.例えば「\sqrt{23}\pi hoge」では,\sqrt,{,2,3,},\pi,h,o,g,e がトークンになります.複数の空白は一つの空白になり,制御綴の直後の空白とコメントは無視されます.

カテゴリーコード(category code)LaTeX は,文字をカテゴリーコードで分類します.同じ文字でも,カテゴリーコードが変わると TeX での意味が変わります.

制御綴(control sequence)\section や \hoge のように,バックスラッシュから始まる命令です.アルファベットで続くものを制御語,\% や \{ のように 1 文字で終わるものを制御記号と呼びます.制御語の直後の空白は,命令名の終わりを示すだけなので出力されません.

グループ(group)と引数(argument)波括弧 {...} は,複数のトークンを一つのまとまりとして扱うために使います.マクロの引数を渡すときにも波括弧を使います.また,波括弧で作ったグループの中で変更した設定は,通常はそのグループの外へ出ると元に戻ります.

展開(expansion)マクロは,定義された処理をその場で実行するというより,まず別のトークン列に置き換えられます.この置き換えを展開と呼びます.\def や \newcommand は,命令名と置き換え後のトークン列を対応させるための命令です.

コマンド

マクロ定義 (\def)

ユーザー定義のコマンド(マクロ)を作成する場合,TeX の \def と LaTeX の \newcommand を使えます.これらは,プログラミング言語の関数のように働きます.同じマクロ名を使った場合の動作は異なります.\def は後の定義で上書きしますが,\newcommand はエラーを表示します.通常の文書では,安全な \newcommand を使う方がよいです.

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

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

定義方法

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

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

引数の区切り

引数を取る \def では,通常は \hoge{引数1}{引数2}{引数3} のように,波括弧で引数を区切ります.それ以外の区切り方もあります.以下の方法は,本格的なスタイルファイルを作成するときに役立ちます.

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

コマンド作成 (\newcommand)

\newcommand は,LaTeX で新しいコマンドを定義するための命令です.TeX の \def とは異なり,同じマクロ名が既にある場合はエラーになります.単純なコマンドを定義する場合は,\newcommand を使う方が安全です.

\newcommand の基本形は,次のとおりです.

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

引数がない場合

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

引数がある場合

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

省略可能な引数

最初の引数だけは,角括弧を使って省略可能な引数にできます.例えば,\newcommand{\Name}[1][匿名]{#1} と定義すると,\Name は「匿名」,\Name[山田] は「山田」と出力されます.

\newcommand{\Name}[1][匿名]{#1}

複雑な引数の場合

現在の LaTeX では,\NewDocumentCommand も利用できます.星付きコマンド,複数の省略可能引数,特殊な区切りの引数を扱う場合は,\newcommand より書きやすくなります.単純な置換なら \newcommand,複雑な入力を受け取るコマンドなら \NewDocumentCommand と使い分けるとよいでしょう.古い LaTeX 環境では,\usepackage{xparse} が必要な場合があります.

\NewDocumentCommand{\Cmd}{s O{既定値} m}{%
  % #1: 星の有無,#2: 省略可能引数,#3: 必須引数
}

よく使う補助コマンド

通常の文書では,まず \newcommand,\newif,\newcounter を使えれば十分です.ただし,スタイルファイルやクラスファイルを読むと,以下のコマンドもよく出てきます.必要になったときに調べられるように,役割をまとめます.

LaTeX マクロ 動作
\renewcommand{\Cmd}{処理} 既にあるコマンドを再定義します.元のコマンドがない場合はエラーになります.LaTeX の標準コマンドや自作コマンドの動作を変更するときに使います.
\providecommand{\Cmd}{処理} 同じ名前のコマンドが未定義の場合だけ,新しく定義します.既に定義済みの場合は何もしません.複数のスタイルファイルで同じ補助コマンドを使うときに便利です.
\DeclareRobustCommand{\Cmd}{処理} 壊れにくいコマンドを定義します.節見出しや図表のキャプションのように,目次や補助ファイルにも書き出される場所で使うコマンドに向いています.
\let\NewCmd=\OldCmd その時点でのコマンドの意味を別名に保存します.標準コマンドを再定義する前に,元の動作を退避したいときによく使います.
\makeatletter ... \makeatother コマンド名の中で @ を使えるようにします.LaTeX の内部コマンドを扱うときに使います.通常の本文ではなく,プリアンブルやスタイルファイル内で使います.
\protect\Cmd コマンドが早く展開されて壊れるのを防ぎます.節見出し,キャプション,目次への書き込みなどで必要になることがあります.
\csname 名前\endcsname 文字列からコマンド名を作ります.番号や文字列を組み合わせて,多数の似た名前のコマンドを自動的に扱うときに使います.

これらは便利ですが,使いすぎるとマクロが読みにくくなります.まずは \newcommand で分かりやすく書き,必要な場合だけ上のコマンドを使うのが安全です.

制御構造

条件分岐 (IF)

一般的なプログラミング言語では「if(条件){処理A} else {処理B}」のように書きます.LaTeX では,目的に応じてさまざまな if 文を使います.基本形は「\ifコマンド 判断式 処理A \else 処理B \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 と \repeat を使えます.基本形は「\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) マクロの実行結果

真偽値とスイッチ

TeX のマクロでは,一般的なプログラミング言語のような変数をそのまま使うわけではありません.条件分岐で使う真偽値は,\newif で作るスイッチとして扱います.数値を保存して増減する場合は,次節のカウンターを使います.

TeX マクロ 動作
\newif\ifDraft 新しいスイッチを作成します.この例では,判定用の \ifDraft,真にする \Drafttrue,偽にする \Draftfalse が使えるようになります.
\Drafttrue スイッチを真(true)にします.
\Draftfalse スイッチを偽(false)にします.
\ifDraft 処理A \else 処理B \fi スイッチが真なら処理Aを,偽なら処理Bを実行します.\else 以降は省略できます.

以下は,原稿の下書き版と完成版で出力を切り替える例です.マクロの先頭でスイッチを定義し,文書の状態に合わせて真偽を切り替えます.

\newif\ifDraft
\Drafttrue

\ifDraft
  下書き版です.
\else
  完成版です.
\fi

カウンター

基本コマンド

カウンターには,LaTeX のコマンドと TeX のコマンドがあります.LaTeX でも両方を使えますが,通常は LaTeX の \newcounter を使います.\newcounter は同じ名前のカウンターが既にあるとエラーになるため,名前の衝突に気づきやすいです.一方,TeX の \newcount は低水準の命令で,うっかり上書きすると見つけにくいバグになります.

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

LaTeX マクロ 動作
\newcounter{Cntr} カウンター「Cntr」を作成します.
\newcounter{Cntr}[PCntr] カウンター「Cntr」を作成し,「PCntr」を親カウンターにします.親カウンターが増えると,子カウンターは 0 に戻ります.
\setcounter{Cntr}{387} カウンターの値を 387 にします.整数なら負の値も設定できます.
\value{Cntr} カウンターの値を数値として取り出します.
\the\value{Cntr} カウンターの値を表示します.
\theCntr TeX のカウントレジスターの値を表示します.
\stepcounter{Cntr} カウンターを 1 増やします.あわせて,そのカウンターを親に持つ子カウンターを 0 に戻します.
\refstepcounter{Cntr} \stepcounter と同様に 1 増やし,さらに \label と \ref で参照できる値を設定します.
\addtocounter{Cntr}{5} カウンターの値を 5 増やします.負の値を指定すれば減らせます.
\ifnum\value{Cntr}<10 処理\fi カウンターが 10 未満のとき,処理を実行します.条件は任意に設定できます.
\c@Cntr LaTeX が内部で使うカウンター本体です.通常の文書では直接使いません.
TeX マクロ 動作
\newcount\Cntr TeX のカウントレジスター「\Cntr」を作成します.
\Cntr=387 カウントレジスターの値を 387 にします.整数なら負の値も設定できます.
\the\Cntr カウントレジスターの値を表示します.
\advance\Cntr by 2 カウントレジスターの値を 2 増やします.負の値を指定すれば減らせます.by を書かない場合は「by 1」とみなされます.
\ifnum\Cntr<10 処理\fi カウントレジスターが 10 未満のとき,処理を実行します.条件は任意に設定できます.

カウンターを使った LaTeX マクロの例を以下に示します.6行目でカウンター MyCnt を作成します.7 — 10 行で,カウンターを表示してから 1 増やす命令 \MyCnt を定義します.カウンター名と命令名が同じでも,LaTeX では別のものとして扱われます.

% -*- 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: カウンターを使ったマクロの実行結果

カウンター出力

カウンターは,表示方法を変えられます.見出しや箇条書きの番号を変更するときにも,この仕組みを使います.

LaTeX マクロ 出力形式
\arabic{Cntr} 1,2,3 のようなアラビア数字で表示します.
\roman{Cntr} i,ii,iii のような小文字のローマ数字で表示します.
\Roman{Cntr} I,II,III のような大文字のローマ数字で表示します.
\alph{Cntr} a,b,c のような小文字のアルファベットで表示します.
\Alph{Cntr} A,B,C のような大文字のアルファベットで表示します.
\fnsymbol{Cntr} 脚注で使う記号列で表示します.使える値は 1 から 9 までです.
\documentclass[10pt,a4paper]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}

\newcounter{MyCnt}

\newcommand{\MyCnt}{%
\arabic{MyCnt} -- \roman{MyCnt} -- \Roman{MyCnt}%
 -- \alph{MyCnt} -- \Alph{MyCnt} -- \fnsymbol{MyCnt}%
\stepcounter{MyCnt}%
}

\begin{document}

\setcounter{MyCnt}{0}
カウンターの値の変化\\
\MyCnt\\
\MyCnt\\
\MyCnt\\
\MyCnt\\
\MyCnt

\end{document}

図4: カウンター出力形式の例

マクロの例

よく使う文字列や書式は,マクロにしておくと修正が簡単です.例えば,強調表示の書式を本文に直接書く代わりに,意味を表すコマンド名で定義します.後で太字を赤字に変えたい場合も,定義を 1 箇所直すだけで済みます.

\newcommand{\Important}[1]{\textbf{#1}}
\newcommand{\Unit}[1]{\,\mathrm{#1}}

これは \Important{重要な説明} です.
長さは 10\Unit{mm} です.

コマンド名には,出力の見た目ではなく意味を付けると管理しやすくなります.例えば \RedText よりも \Important の方が,後で書式を変更しても名前が不自然になりません.

スタイルファイルの作成

同じマクロを複数の文書で使う場合は,スタイルファイルにまとめます.ファイル名を mystyle.sty のようにして,文書側では \usepackage{mystyle} と読み込みます.

% mystyle.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}[2026/05/15 v0.1 My local macros]

\newcommand{\Important}[1]{\textbf{#1}}

\endinput

スタイルファイルでは,必要なパッケージを \RequirePackage で読み込みます.また,内部用の命令名を使う場合は \makeatletter と \makeatother の範囲に書きます.まずは小さなマクロだけをまとめ,動作を確認しながら少しずつ育てると安全です.

ページ作成情報

参考資料

  1. このページの多くの部分は,藤田眞作著「LaTeX2εまくろの八衢」を参考にしました.pdf のオンライン版が公表されており,大変役に立ちます.
  2. 初心者にとって,三重大学の奥村先生のTeX Wiki TeX入門/マクロの作成は大変参考になります.まずは,ここを見るべきでしょう.
  3. カテゴリーコードについては「TeX by Topic ゼミ (2)カテゴリーコードの研究」が詳しいです.
  4. LaTeX for authors current version は,現在の LaTeX で使える \NewDocumentCommand などの説明に使いました.
  5. LaTeX2e: An unofficial reference manual は,\newcommand とカウンターの基本コマンドの確認に使いました.

更新履歴

2015年04月10日 ページの新規作成
2026年05月15日 説明を整理し,TeX の読み取り方,真偽値とスイッチ,補助コマンド,カウンター出力,スタイルファイルの説明を追加.


no counter