第3章 マクロ
Lamuriyanは当然マクロが使えます。が、nodamushiがTeXの知識が曖昧すぎる為、動けば良いじゃんの精神にしたがってかなりテキトーな実装になっています。実際のTeXはこうだよ、こういう動作にした方が良いよと言うことがありましたら、遠慮無く@nodamushiにリプを送って下さい。参考にします。参考にするだけで、実装するかは分かりません。
3-1章マクロ呼び出し
通常のマクロ呼び出しと同じように呼び出すのですが、LaTeX書いてて常々思うんですが、マクロ名に日本語使うことなくね?私、マクロ名書いた後に日本語が来ると、半角/全角キーを押すことに集中してしまうが為、スペースキーを押すことを忘れ、エラーをよく出してます。むかつきます。
なので、LamuriyanはCharCategoryのアルファベットは、a-z,A-Zのみを登録しています。日本語は使えません。よって「\LamuriyanはCharCategory…」の様にマクロ名の後にスペース無く日本語を入力しても問題ありません。もちろん、マクロ名の後のスペースは無視されるので、書いても問題ありません。
3-2章マクロを定義する
\defと\newcommandを定義しています。使い方は大体本家TeXやLaTeXと同じだと思います。パラグラフの扱いがどうのこうのとかいうのをどっかで読んだんですが、正直よーわからんので、無視してます。改行どこまでも続いてもオーケー。
3-3章展開したトークンを保持する
3-3.1\edefや\protected@edefについて
いわゆる\edefに関しては、\edefと\protedted@edefが定義されています。たぶん、どちらも大体LaTeXと同じ挙動を示すんじゃないかなーと思っています。
注意して貰いたい事は、\edef,\protedted@edefはトークンを保持するだけであり、DOM(TeXで言えばBoxにあたるものか)を保持することは出来ません。\edef,\protected@edef内部でDOMを作成した場合、環境に挿入されます。\Lamuriyan(=Lamuriyan)などはDOMを生成するコマンドなので、うっかり混ぜてしまうことがないよう注意してください。
3-3.2\tdefについて
Lamuriyanには\tdefという特殊なトークンを展開し、保持するマクロが定義されています。基本的な使い方は¥edefとほぼ同じです。
\edefの欠点として、¥verbを使うことが出来ないことがあります。これは、\edefの{~}が引数であり、{}の中身がトークンとして先に読み込まれてしまい、\verbを実行できない為です。この欠点を補う為に、\tdefを定義しておきました。
\tdefにおいて、{~}は 引数ではありません。\tdefにおける引数は\tdef#1となっています。#1は\nameの様なエスケープシーケンスです。\tdefが発行された後には必ず、一番最初に「{」が来なくてはなりません。なお、これは展開された結果一番最初に「{」があれば良く、以下の様に\hogeが展開され、\bgroupが展開された結果「{」が来るような場合は許可されます。また、\tdefによる定義中にで\tdefを使うことは出来ません。これらのルールを破った場合は\tdefは定義を行いません。
- \def\hoge{\bgroup \verb}
- \tdef\hoge\hoge+\(^_^)\+}
さらに、上の例では\tdefで\hogeの定義を書き換えていますが、実際に\tdefが定義を行うのは}の後であるため、\hogeの後の二つ目の\hogeは\bgroup \verbに展開されます。\hogeの実行例↓
\(^_^)\
また、\edef等と同じく、\globalを付加することが出来ます。
なお、\edef同様、\noexpand,\unexpandedを使うことが出来ますが、\protected@tdefは定義されていません。理由は{~}が引数でないが故、\protectを限定的に再定義することが出来なかったからです。それでも\protectを使いたい場合は下のように自分で定義してください。
- \def\protect{\noexpand\protect\noexpand}
- % ちなみに、以下の様にしても良いです。
- % \makeatletter \let\protect\@unexpandable@protect \makeatother
- \tdef\name{~~}
- \let\protect\relax
3-4章リスト
配列構造を扱う為にわざわざ,区切りの文字列で扱うとか、マジ意味わかんない。なんなの?苦行なの?マゾなの?私嫌よ。
というわけで、Lamuriyanはリストが使えます。
3-4.1リスト生成
「\newlist リスト名」で生成します。
- \newlist \listname
の様に宣言すると、\listnameというリストを生成することが出来ます。
3-4.2追加関連(set push unshift)
「\set リスト名 数字 追加する内容」でリストの数字番目の要素を設定します。
「\push リスト名 追加する内容」でリストの最後に内容を追加します。
「\unshift リスト名 追加する内容」でリストの最初に内容を追加します。
- \set\listname 5 {\Lamuriyanです}
- \push\listname{\Lamuriyanです}
- \unshift\listname{\Lamuriyanです}
3-4.3取得関連(get pop shift)
「\get リスト名 数字」でリストの数字番目の要素を取得します。
「\pop リスト名」でリストの最後の要素を取得し、削除します。
「\shift リスト名」でリストの最初の要素を取得し、削除します。
- \get \listname 5
- \pop\listname
- \shift\listname
3-4.4長さ
「\length リスト名」でリストの長さを返します。リストでない場合は-1が返ります。
3-4.5リストが空かどうか
「\ifemptylist リスト名 空の場合 \else 空で無いの場合 \fi」というif構文が使えます。
3-4.6各要素に対して処理をする
foreach構文を用意しています。
- \@foreach \@memory:=\listname\do{"\@memory"}
と書くと、\listnameの内容をすべて""で囲って出力します。
例として、次のコードをLamuriyanソースに書いてみます。
- {%makeatletterや\testlistの有効範囲を限定しておく為
- \makeatletter % @をマクロ名として認識する為です
- \newlist\testlist % \testlistの作成
- \push\testlist{りんご}
- \push\testlist{ごりら}
- \push\testlist{らいお\textcolor{red}{ん}}
- 出力結果「\@foreach \@memory:=\testlist\do{"\@memory"}」
- }
出力結果「"りんご""ごりら""らいおん"」
3-5章今後の予定
なんだかんだいっても、やっぱ複雑なTeXマクロ書くの面倒くさいにゃ!というわけで、マクロの内容をGroovyでかける\directgroovyを作ろうかと思ってるんだけど、どういう風に定義し、実行するのかfixしてないので絶賛放置中。