Upload
koh-uehara
View
795
Download
0
Embed Size (px)
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