Re: こんなマクロありませんか

名前: 北見 けん
日時: 2006-06-29 17:38:32
IPアドレス: 211.128.71.*

>>43610 43555には > ## 「保存してあるはずの hoge 環境の中身が、\hogeuse でうまく取り出せない」 > ## ということになろうかと思います。 > ## これは、保存しているつもりでもうまく保存できていないからです。 > ## グループの中でローカルに保存してもだめなのと、 > ## \def\aaa{\contents} のようにしてもその時点での \contents の中身を \aaa に > ## 与えたことにはならないのが問題点です。 と書きました。 > 適当に \global\@namedef とかしてみるもエラーでした. “グループの中でローカルに保存してもだめ”な点については、この \global でよいでしょう。 もう一つの > ## \def\aaa{\contents} のようにしてもその時点での \contents の中身を \aaa に > ## 与えたことにはならないのが問題点です。 のほうが問題になっています。 やっていることを単純化してみると \begingroup \def\contents{textA} \global\def\A{\contents} \endgroup \begingroup \def\contents{textB} \global\def\B{\contents} \endgroup などとしておいて、後で \A としたときに“textA”が出てきてほしいわけです。 ところが実際には、\A が展開されると \contents というトークンになってしまいます。 そこで次に \contents が展開されるはずですが、 \contents は未定義ですよとエラーになっています。 解決するには \global\def\A{\contents} の代わりに \global\def\A{ <\contents を展開したもの> } にすればよいわけです。 但し、\contents の中身には単純なテキストばかりとは限りませんから、 \global\edef\A{\contents} とするとうまくないかもしれません。\contents は一段階しか展開しないつもりで、 \expandafter\global\expandafter\def\expandafter\A\expandafter{\contents} などとするとよいでしょう。 実際には \@namedef を使っているわけですが、\@namedef の中に \expandafter を割り込ませるのは 面倒なので、直接 \csname/\endcsname を使って、(ついでに \gdef も使って) \expandafter\gdef\csname unique-string@hoge\the\c@hoge\expandafter\endcsname\expandafter{\contents} のようにするとたぶんうまくいきます。 > > この回避策でもよいですが、<識別番号>が未定義の場合の処理を見直すのが > > 本来的だろうと思います。 > > ここで逃げたつけかしら. これについては今の問題とは直接関係はないでしょうね。

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)