tex マクロプログラミング

38
T E X マクロ プログラミング 2012.03.30 植原

Upload: koh-uehara

Post on 08-Aug-2015

792 views

Category:

Software


0 download

TRANSCRIPT

Page 1: TEX マクロプログラミング

TEXマクロ プログラミング

2012.03.30

植原 昂

Page 2: TEX マクロプログラミング

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

Page 3: TEX マクロプログラミング

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

Page 4: TEX マクロプログラミング

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

Page 5: TEX マクロプログラミング

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

Page 6: TEX マクロプログラミング

マクロを定義する

Page 7: TEX マクロプログラミング

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

=> 私は ウエハラ です

Page 8: TEX マクロプログラミング

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

=> 今は 5時 です

Page 9: TEX マクロプログラミング

別の定義方法もあります

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

Page 10: TEX マクロプログラミング

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

- 引数のとり方

- 処理系

Page 11: TEX マクロプログラミング

多重定義の違い

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

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

>> 上書きされる

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

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

def newcommand

Page 12: TEX マクロプログラミング

引数の取り方

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

=> 3月3日 耳の日

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

Page 13: TEX マクロプログラミング

処理系の違い

LaTeXTeXdef newcommand

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

Page 14: TEX マクロプログラミング

マクロを操作する

Page 15: TEX マクロプログラミング

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

Page 16: TEX マクロプログラミング

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

Page 17: TEX マクロプログラミング

カウンタを使う

Page 18: TEX マクロプログラミング

カウンタを定義します

\newcount\num

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

Page 19: TEX マクロプログラミング

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

\num=300\number\num => 300

Page 20: TEX マクロプログラミング

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

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

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

Page 21: TEX マクロプログラミング

条件分岐を使う

Page 22: TEX マクロプログラミング

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

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

\wakeup=> 9時

Page 23: TEX マクロプログラミング

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

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

\lunchbox=> ワンコイン弁当

Page 24: TEX マクロプログラミング

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

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

=> すれ違い

Page 25: TEX マクロプログラミング

他にもたくさん

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

ifundefined ifodd

ifdim

iftrue iffalse

ifcase ifinner ifdefined

ifhbox

ifvoid

ifvbox

ifcat

ifthenelse

ifmmode

Page 26: TEX マクロプログラミング

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

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

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

Page 27: TEX マクロプログラミング

繰り返しを使う

Page 28: TEX マクロプログラミング

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

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

Page 29: TEX マクロプログラミング

色々組み合わせてみます\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.

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

Page 30: TEX マクロプログラミング

入出力を使う

Page 31: TEX マクロプログラミング

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

\read-1 to\tmp

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

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

Page 32: TEX マクロプログラミング

文字列を出力します

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

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

Page 33: TEX マクロプログラミング

特殊文字を使う

Page 34: TEX マクロプログラミング

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

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

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

Page 35: TEX マクロプログラミング

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

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

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

\test1 もエラーとなります

Page 36: TEX マクロプログラミング

まとめ

Page 37: TEX マクロプログラミング

マクロ定義 \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

Page 38: TEX マクロプログラミング

スイッチ

\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