|
マクロ
表紙
図
公開情報
古い情報
|
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個までの引数を取ることができます.以下に例を示します.
引数の区切り引数を取る \def では,通常は \hoge{引数1}{引数2}{引数3} のように,波括弧で引数を区切ります.それ以外の区切り方もあります.以下の方法は,本格的なスタイルファイルを作成するときに役立ちます.
コマンド作成 (\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 を使えれば十分です.ただし,スタイルファイルやクラスファイルを読むと,以下のコマンドもよく出てきます.必要になったときに調べられるように,役割をまとめます.
これらは便利ですが,使いすぎるとマクロが読みにくくなります.まずは \newcommand で分かりやすく書き,必要な場合だけ上のコマンドを使うのが安全です. 制御構造条件分岐 (IF)一般的なプログラミング言語では「if(条件){処理A} else {処理B}」のように書きます.LaTeX では,目的に応じてさまざまな if 文を使います.基本形は「\ifコマンド 判断式 処理A \else 処理B \fi」です.「\else 処理B」は省略できます.
条件分岐を使ったマクロとその実行結果を以下に示します.ここでは条件分岐を入れ子にして,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}
繰り返し (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}
真偽値とスイッチTeX のマクロでは,一般的なプログラミング言語のような変数をそのまま使うわけではありません.条件分岐で使う真偽値は,\newif で作るスイッチとして扱います.数値を保存して増減する場合は,次節のカウンターを使います.
以下は,原稿の下書き版と完成版で出力を切り替える例です.マクロの先頭でスイッチを定義し,文書の状態に合わせて真偽を切り替えます. \newif\ifDraft \Drafttrue \ifDraft 下書き版です. \else 完成版です. \fi カウンター基本コマンドカウンターには,LaTeX のコマンドと TeX のコマンドがあります.LaTeX でも両方を使えますが,通常は LaTeX の \newcounter を使います.\newcounter は同じ名前のカウンターが既にあるとエラーになるため,名前の衝突に気づきやすいです.一方,TeX の \newcount は低水準の命令で,うっかり上書きすると見つけにくいバグになります. 以下にカウンターに関するコマンドをまとめます.カウンター名を「Cntr」や「PCntr」としていますが,任意の名前で定義できます.
カウンターを使った 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}
カウンター出力カウンターは,表示方法を変えられます.見出しや箇条書きの番号を変更するときにも,この仕組みを使います.
\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}
マクロの例よく使う文字列や書式は,マクロにしておくと修正が簡単です.例えば,強調表示の書式を本文に直接書く代わりに,意味を表すコマンド名で定義します.後で太字を赤字に変えたい場合も,定義を 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 の範囲に書きます.まずは小さなマクロだけをまとめ,動作を確認しながら少しずつ育てると安全です. ページ作成情報参考資料
更新履歴
|