Re: #{ 形式の引数のマクロとアラインメント

名前: 清野克宏
日時: 2002-09-06 09:50:21
IPアドレス: 133.35.159.*

>>10651 長文で失礼します. あまり役には立たないかもしれない質問に ていねいにお答えいただき,ありがとうございます. グルーピングのレベルの変化に注目することを教えていただいたので, TeX: The Program を自分で調べることができました. わたしなりに調べてわかったことを報告します. TeX: The Program のセクション 309 にある align_state という 大域変数の変化を追っていけばいいのだと考えました. 789 の説明に書かれてあるように u#v の u テンプレートの終わりで 大域変数 align_state は 0 に設定されます. グループの開始・終了記号により align_state は上・下し, 342 のコードにあるように align_state が 0 のときの & か \cr で v テンプレートの挿入が始まります. TeX の使用例は,つぎの設定のもとで実行します. \tracingonline=1 \tracingcommands=1 \tracingmacros=1 実行する例は,つぎのふたつです. ひとつ目は,北見様が示してくださったものの変形, ふたつ目は,\M{#} の代わりに \M{\relax#} として, エラーを回避するものです. (ひとつ目の例にも \relax が入っていたり, グループ終了命令ひとつの代わりに {{} だったりするのは, \tracingcommands の出力を得るためです) \def\M#1#{} \halign{A\M{#\relax}C\cr B\iffalse{}}\fi \cr} \def\M#1#{} \halign{A\M{\relax#}C\cr B\cr} ひとつ目の例 ------------ 最初の例では align_state が 0 に設定された後で \M{ のグループが開始します. これは,本来 u テンプレートのなかにあるべき \M{ のグループ開始命令が, テンプレートではなく項目のなかに巻き込まれてしまったといえると思います. set incr decr incr set であるべきところが set incr decr set incr となっているのでしょうか. 最後は \iffasle のなかのグループ終了命令によって align_state が 0 まで戻ります. (使用例) \def\M#1#{} \halign{A\M{#\relax}C\cr B\iffalse{}}\fi \cr} (ターミナルからの抜粋) {\halign} -- (省略) -- set align_state to 1000000. {restricted horizontal mode: the letter A} \M #1{->{ -- incr align_state to 1000001. -- decr align_state to 1000000. #1<- -- set align_state to zero. % TeX: The Program, 324 -- incr align_state to 1. % TeX: The Program, 357 {begin-group character {} {the letter B} -- incr align_state to 2. -- decr align_state to 1. -- decr align_state to 0. -- set align_state to 1000000. {\relax} -- decr align_state to 999999. {end-group character }} {the letter C} {end of alignment template} ふたつ目の例 ------------ ふたつ目の例では \relax があるので set incr decr incr set という順番になっています. (使用例) \def\M#1#{} \halign{A\M{\relax#}C\cr B\cr} (ターミナルからの抜粋) {\halign} -- (省略) -- set align_state to 1000000. {restricted horizontal mode: the letter A} \M #1{->{ -- incr align_state to 1000001. -- decr align_state to 1000000. #1<- -- incr align_state to 1000001. {begin-group character {} {\relax} -- set align_state to zero. {the letter B} -- set align_state to 1000000. -- decr align_state to 999999. {end-group character }} {the letter C} {end of alignment template} ここまで書きましたが,結局,問題は残りました. ここでは,単にトレースしてみただけなので, なぜ set incr decr set incr という順番になっているのかは, わかりませんでした.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)