Re: 意外なエラー(後日談)

名前: みなも
日時: 2005-03-18 23:28:59
IPアドレス: 220.209.228.*

>>34722 みなも です。 半月以上前の話になって何んか恐縮ですが,「意外なエラー」に対する レスで提示された改造案の追試をやってみました。 # 並行してやってる仕事も一段落して,ようやく落ち着いて # 原因を考えられるようになってきました。 で,結果なんですが,.さんの案(34700),本田さんの案(34722)ともに やはりエラーが出てしまいました。 どうやら,エラーが出るタイミングが TeX の「口」の部分のようで, マクロの置き換えテキストに引数がはめ込まれる「前」, 引数を読み込んでいる時点で突っぱねてしまうようです。 したがって,置き換えテキストに { } をつけようがマクロ化して隠蔽しようが その時点では「手遅れ」になってしまうようです。 (ちょっと自信ありません。間違ってたらフォローをお願いします。) { } をつけるなら引数を読み込む前につけないといけないようですので, 結局(\mathrm をいじる方向での)解決策としては, \let\oldmathrm=\mathrm \def\mathrm#1{\oldmathrm{{#1}}} のような身も蓋もないものしかないようです。 (↑はうまく機能します。) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ちなみに今日,また新しいエラーが出ました。 \def\testcr{\cr} \def\Hbox#1{\hbox{#1}} と定義した上で, \def\testalign#1{\vbox{\let\\=\testcr \halign{\hbox{##}\cr#1\crcr}}} と定義し \testalign{a\\b} としてもエラーは出ませんが, \def\testalign#1{\vbox{\let\\=\testcr \halign{\Hbox{##}\cr#1\crcr}}} と定義し \testalign{a\\b} とするとエラーが出ます。 いずれも \let\testcr=\cr と等置するとエラーは出なくなります。 (ここまで問題を絞り込むのにまた3時間。トホ〜)なぜでしょう? お暇な人は考えてみてください。解答は5行下に↓ エラーの原因は \tracingmakuros=1 でマクロとその引数を追跡すると すぐわかりますが。。。 引数を1つもつマクロである \Hbox は,展開するとき当然引数を要求します。 引数の展開は \Hbox の引数を取り込んだ後で行われるため, 引数中のマクロ \\ は \Hbox{} の中で展開され \Hbox{a\cr b} となって しまいます。 一方プリミティブである \hbox は展開する必要がありませんので, スルーされ,\\ の展開が行われ,その結果 \halign{\hbox{##}\cr a\cr b \crcr} から \hbox{a} \hbox{b} の配列という 正しい解釈がなされます。(説明合ってますよね?)

この書き込みへの返事:

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