TEX マクロプログラミング

Preview:

Citation preview

TEXマクロ プログラミング

2012.03.30

植原 昂

TeXで論文を書く時に、 マクロを使うと効率的です

しかし、 体系的にまとまった資料は なかなか見つかりません

そこで、 使えそうなものに絞り まとめてみました

この資料で伝える項目です✓マクロ基礎 ✓カウンタ ✓条件分岐 ✓ループ ✓入出力 ✓特殊マクロ

マクロを定義する

マクロ定義は簡単です\dev\myname{ウエハラ} 私は \myname です

=> 私は ウエハラ です

引数も使えます\dev\hour#1{#1時} 今は \hour{5} です

=> 今は 5時 です

別の定義方法もあります

\newcommand{\myname}{ウエハラ} \newcommand{\hour}[1]{#1時}

defとnewcommandの違い- マクロを多重定義した場合の動作

- 引数のとり方

- 処理系

多重定義の違い

\dev\lang{ruby} \dev\lang{python}

言語は \lang です => 言語は python です

>> 上書きされる

\newcommad{\lang}{ruby} \newcommad{\lang}{python}

>> コンパイルエラーとなる

def newcommand

引数の取り方

\def\todo(#1,#2)#3{#1月#2日 #3}\todo(3,3){耳の日}

=> 3月3日 耳の日

def ではパターンマッチのイメージでマクロを使用できる

処理系の違い

LaTeXTeXdef newcommand

newcommandはTeXの環境では使用できません

マクロを操作する

マクロをコピーします\def\person{ウエハラ}\let\clone\person\clone=> ウエハラ

マクロを初期化します\def\hoge{ほげ} let\hoge\relax\hoge=> 未定義エラー \relaxは初期化のために利用する空の定義です

カウンタを使う

カウンタを定義します

\newcount\num

>> カウンタ num が作られます

値を代入・参照します\newcount\num\num=100\number\num => 100

\num=300\number\num => 300

計算します\newcount\num\num=100

\advance\num by3\number\num => 103

\advance\num by-5\number\num => 98

条件分岐を使う

文字列と比較します\def\today{休日}

\if\today{平日} \def\wakeup{7時} \else \def\wakeup{9時} \fi

\wakeup=> 9時

数値と比較します\newcount\price\price=380

\ifnum\price>500 \def\lunchbox{普通の弁当} \else \def\lunchbox{ワンコイン弁当} \fi

\lunchbox=> ワンコイン弁当

2個のマクロを比較します\def\mikeIsAt{東京} \def\emilyIsAt{大阪}

\ifx \mikeIsAt \emilyIsAt 会える!\else すれ違い\fi

=> すれ違い

他にもたくさん

参考)http://www-sop.inria.fr/marelle/tralics/doc-i.html

ifundefined ifodd

ifdim

iftrue iffalse

ifcase ifinner ifdefined

ifhbox

ifvoid

ifvbox

ifcat

ifthenelse

ifmmode

スイッチを使います\newif\ifrainy #スイッチrainyを作る

\rainytrue #スイッチをtrueにする\ifrainy 部屋干し \else 外干し\fi=>部屋干し

\rainyfalse #スイッチをfalseにする\ifrainy 部屋干し \else 外干し \fi=> 外干し

繰り返しを使う

ループを使います\newcount\n #ループ変数を用意します\n=0

\loop\ifnum\n<3 \advance\n by1 test \number\n, \repeat=> test1, test2, test3

色々組み合わせてみます\newcount\n

\def\seq#1{\n=0 \loop\ifnum\n<#1 \advance\n by1 \number\n. \repeat}

\seq{3}=> 1.2.3.

\seq{5}=> 1.2.3.4.5.

✓ マクロ定義 ✓ カウンタ操作 ✓ 条件分岐 ✓ ループ

入出力を使う

入力をマクロに代入します

\read-1 to\tmp

tmp = (\tmp)=> tmp= (abc)

texコンパイル時に入力を求められます試しに ”abc” と入力します

文字列を出力します

\def\tmp{テスト}\message{ABC \tmp 012}

コンパイル時に “ABC テスト 012” と表示されます

特殊文字を使う

マクロ名に数字を使います

\makeatletter\@namedef{test1}#1{テスト1:#1}\makeatother

\def\test1 はエラーとなります

数字を含むマクロを参照します

\makeatletter\@nameuse{test1}{走り幅跳び} \makeatother

=> テスト1:走り幅跳び

\test1 もエラーとなります

まとめ

マクロ定義 \dev\name{名前} \newcommand{\name}{名前} マクロ参照 \name

コピー \let\dst\src

初期化 \let\temp\relax

カウンタ定義 \newcount\num

カウンタの参照 \number\num

加減算 \advance\num by5

分岐\if\macro{比較文字列} 真です \else 偽です \fi

\ifnum\counter<10 真です \else 偽です \fi

\ifx\macroA\macroB 真です \else 偽です \fi

スイッチ

\newif\ifcond

\condtrue

\condfalse

\ifcond 真です \else 偽です \fi

ループ \loop\ifnum\n<3 \advance\n by1 ループ\n \repeat入力 \read-1 to\hoge

出力 \message{Hello World!}

特殊文字付きマクロ定義\makeatletter

\@namedef{macro1}#1{MACRO1 #1} \makeatother

特殊文字付きマクロ参照\makeatletter

\@nameuse{macro1}{ABC} \makeatother

Recommended