スキップしてメイン コンテンツに移動

TeXマクロプログラミング

2012.03.30 更新

スライド化しました.
 

新しいマクロ定義

以下に例を示す.
\dev\hoge{ほげ}
 
 これにより,\hogeが「ほげ」に変換される.引数を使うには,以下のように記述する.
\dev\hour#1{今は#1時です}

 

別の方法

上に示した処理は,以下のようにも記述できる.
\newcommand{\hoge}{ほげ}
\newcommand{\hour}[1]{今は#1時です}

 

defとnewcommand違い

defとnewcommandが異なる箇所として,以下が上げられる.

  • 定義命令を定義している処理系
  • マクロを多重定義した場合の動作
  • 引数のとり方

 まず,定義されている処理系が異なる.defはtexで定義されており,newcommandは,latexで定義されている.
 次に,多重定義した際の動作が異なる.defでは,新しい定義で上書きする.一方,newcommandではエラーを出力する.
 最後に,defでは,引数のとり方としてパターンマッチングを利用できる.例えば,以下のマクロ定義があるとする.
\def\Hatchr(#1,#2)(#3,#4)#5
これにより,以下に示すインターフェイスを実現する.
\Hatchr(3,4)(7,8){hoge}

 

マクロの複製

以下の処理では,\hogeの内容を\fugaに複製する.
\let\fuga\hoge

 

マクロの初期化

以下のコードで,\hogeを初期化する.
\let\fuga\relax
 ここで,\relaxは初期化のために利用する空の定義である.

 

マクロに文字を追加し再定義

defによる定義は,マクロの多重展開をおこなわない.例えば,以下のコードを考える.
\def\hoge{ほげ}
\def\hoge{\hogeふぇふぇ}
 この後,\hogeを利用すると「\hogeふぇふぇ」と展開される.つまり,一度だけしかマクロは展開されない.
 マクロを展開してから定義する際には,以下の記述を用いる.
\edef\hoge{\hogeふぇふぇ}
 これにより,\hogeは 「ほげふぇふぇ」 に展開される.

 

カウンタの定義

カウンタは以下のようにして定義する.
\newcount\n

 

値の代入

カウンタnに0を代入する式は,以下のようになる.
\n=0

 

加減算

カウンタnに3を加算するには,以下を使用する.
\advance\n by3

 

参照

数値を参照(展開)するには,以下を使用する.
\number\n

 

特殊文字を含むマクロ

ここまでで述べたマクロの定義方法では,マクロ名に英語以外の文字は使用できない.数字を含むマクロ名を利用するには,以下の定義方法を使用する.
\makeatletter
\@namedef{Test1}#1{test1のテストで,引数は#1}
\makeatother
 そして,呼び出す際には,以下の書式を利用する.
\makeatletter
\@nameuse{Test1}{ABC}
\makeatother

 

分岐

条件によって処理内容をわけるには,以下の書式を用いる.
\if(条件)(真の場合) \else(偽の場合) \fi
ここで「\else(偽の場合)」は,省略することもできる.\ifは,文字同士の比較のみ使用できる.
 整数の比較には,以下のマクロを用いる.
\ifnum
 例えば,カウンタnが1より大きいかを判定するには,以下の式を用いる.
\ifnum\n<1 br="">
 文字列の比較には,以下のマクロを用いる.
\ifx
 以下は,変数answerが,文字列Yesかどうかを判断する式である.
\ifx\answer{Yes }
 また,スイッチを作成できる.これは,C言語のifdefに似た使い方をする.まず,以下のコマンドでスイッチhogeを作成する.
\newif\ifhoge
 すると,\ifhoge,\hogetrue,\hogefalse,の3つのコントロールシーケンスが作成される.\ifhogeはスイッチに用いる.\hogetrueは,スイッチを真にする.\hogefalseは,スイッチを偽にする.

 

ループ

ループの書式を以下に示す.
\loop(処理A) \if(継続条件)(処理B) \repeat
 まず,処理Aを展開し,継続条件が真のとき,処理Bを展開した後,これらの過程を処理Aから繰り返す.条件が偽のとき,ループを抜ける.
 以下は,ループを用いた例である.
\newcount\K
\def\MgcSqr#1{\K=0 %
\loop\ifnum\K<#1 \advance\K by1
\number\K,
\repeat}
 ループの部分は,Kが0から引数で指定された数値まで,インクリメントする.このマクロを使用すると,例えば,\MgcSqr{5}の結果は,1,2,3,4,5に置き換わる.

 

入出力

例えば,キーボードからの入力を文字カテゴリ1としてhogeに登録するには,以下のとおり記述する.
\read-1 to\hoge
 コンパイルログに出力するには,次のマクロを使う.
\message{hoge hoge hoge}

 

参考文献

  • TeXの数値処理
    http://www.geocities.co.jp/HeartLand-Poplar/1240/latex/value.html

このブログの人気の投稿

beamerでしおりを付ける

しおり   しおりとは,acroreadなどでpdfを表示する際に,ウィンドウの左側に表示される目次のようなものである.このしおりを使うことで,文章の構成を大まかに把握したり,特定の項目に移動することが簡単にできる.   beamerには,標準でしおりを付ける機能が備わっている.以降では,しおりを付ける方法について述べる. しおりをつける   beamerでしおりを付けるには,次のコマンドをtexの文章中に記述する. section{} subsection{} subsubsection{}   カッコの中に記述する文字列が,しおりの項目名に使用される.また,section,subsection,subsubsectionを使い分けることで,階層化をすることも可能. 文字化け対策   しおりは,標準の仕様ではUnicodeのみがサポートされている.EUCを使う場合は,そのままではしおりの日本語が文字化けする.このため,Unicodeを用いない際には,何らかの対策が必要である.   以下では,EUCを利用する人のための対処策を述べる.ここで,dviからpdfを生成する際の方法によって,対処の仕方が異なることに注意する.具体的には,(1)dvipdfmxを用いる場合と,(2)dvipsおよびps2pdfを用いる場合で,対処の仕方が異なる.以降,それぞれについて述べる. dvipdfmxを用いる場合   次のコードをプリアンブルに記述しておくことで解決できる.これにより,しおりの部分の文字列が,自動でUnicodeに変換される. \ifnum 42146=\euc"A4A2 \AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}\else \AtBeginDvi{\special{pdf:tounicode 90ms-RKSJ-UCS2}}\fi   ただし,実行にはEUC-UCS2というファイルが必要.texをインストールする際に,標準でシステムに入る場合はこのままコンパイルできるが,無ければコンパイルできない.私がこれまで経験したなかでは,Vine 5.0, Mac OSXには含まれているが,Debian lennyには入っていなかった.   システムにEUC-UCS2が無い場合,以下のようなサイトから取ってくる.取って

ssh-agentの管理を自動化する

ssh-start.sh ssh-agentの管理を自動化するスクリプトssh-start.shを紹介する. 詳細 ssh-agentを使うことで,sshでリモートログインする際に,パスワードの入力を省略できる. ssh-agentを利用するためには,ソケットのパスとプロセスIDを環境変数に登録する必要がある.環境変数に登録すべき情報は,ssh-agentの起動時に,以下のように標準出力に出力される. $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XTqIvn4918/agent.4918; export SSH_AUTH_SOCK; SSH_AGENT_PID=4919; export SSH_AGENT_PID; echo Agent pid 4919; 上記のように,ssh-agentの出力はシェルコマンドとなっており,実行すれば環境変数がセットされる.このため,多くの解説記事では,次のようにevalを用いる方法が述べられている. $ eval `ssh-agent` Agent pid 4919 しかし,この方法は,同じssh-agentのプロセスを複数のシェルから利用することはできない.上記コマンドを他のシェル上でも実行すれば,動作はするが,次の点で優れた手法とは言えない. ssh-agentのプロセスを複数起動する (本来は1個で充分). 起動毎に秘密鍵の登録,およびパスフレーズの入力が必要となる. 上記の問題は解決するには,1個のssh-agentを複数のシェルから再利用すればよい.例えば2個のターミナルから1個のssh-agentプロセスを利用するには,次のようにする. # terminal 1 $ ssh-agent > ~/tmp.sh $ source ~/tmp.sh Agent pid 4919 # terminal 2 $ source ~/tmp.sh Agent pid 4919 こうすることで,2個のターミナルから同一プロセスのssh-agentを利用できる. 以上の処理を自動化したものが,ここで紹介するスクリプトである. 使い方 環境変数を扱かうため,通常のスクリプトのようには利用できない.このため,sourceコマンドや.(ドット)コマンドで実行する. $ source /path/to/dir/s