名前: . 日時: 2005-08-27 17:38:05 IPアドレス: 211.4.48.*
>>37677 \protect と \edef の関係については,次の 3 点が要点と思われます. ・\protect による保護,というのは LaTeX で導入されたもので, \edef 自身は \protect による保護を理解するわけではありません. ・\protect というコマンド自身の意味は,処理される文脈によって異なります. # \protect の直後のコマンドを保護しなければならない場合(例えば, # aux ファイルへの書き出しの際)には直後のコマンドを保護しますが, # もちろん,保護しない(\protect = \relax となっている)場合も # あります.実際,\section{\protect\fragilecs ...} のような # 記述において,節見出し自身の組版処理時にも \fragilecs が # 保護されたままであると不都合があります(“保護”というのは結局, # “展開の抑制”ですので). ・LaTeX2e で導入された \protected@edef は,“一時的に \protect の定義を ‘直後のコマンドを保護するように’変更した状態で \edef を実行する” というマクロです. 例えば,通常の文書の地の文の中で \def\x{sample} \edef\y{\protect\x} という記述を行っても,地の文の中では通常 \protect = \relax なので, \y は \def\y{\protect sample} のように定義されたのと同じことになります(\edef は \protect についても \edef が実行される時点での定義に従って処理するのみです). 一方, \let\@@protect\protect \let\protect\@unexpandable@protect \edef\y{\protect\x} \let\protect\@@protect という記述を行うと, # ただし,\makeatletter,\makeatother は省略しました. このときの \y は \x の定義によらず \def\y{\protect\x} のように定義されたのと同じことになります(これが \protected@edef に よって行われることです). 実際,\@unexpandable@protect は \def\@unexpandable@protect{\noexpand\protect\noexpand} のように定義されています(\protect 自身とその直後のトークンの両方の 展開を抑制するわけです). \protect による保護を有効にするためには,上記の例からわかるように \protect の定義を適切に管理することになり,(すでにお気づきのように) \protected@edef を用いるというのは \protect の管理を(LaTeX に) 行ってもらうためのひとつの方法,というわけです.
この書き込みへの返事: