引数中で失敗するマクロ

引数中で失敗するマクロ

- Ando Ryoya の投稿
返信数: 1
いつもお世話になっております。環境はTeX Live 2019を使用し、ドライバはupLaTeXを用いています。
次のマクロを適当なプリアンブルとともにテキストファイルに記述し、処理すると発生するエラーに悩まされています.
----------------------------------------------------------------------------------------------

\expandafter\def\csname expandafter \endcsname{hogehoge} % 空白が名前の末尾についたコントロールシークエンスを定義
%%次のマクロは本文中で処理すると期待通りの出力が得られる
\bgroup
\catcode`\{=10
\catcode`\}=10
\catcode`\<=1
\catcode`\>=2
\xdef\temp<expandafter{ }>
\egroup

\meaning\temp %---> macro:->expandafter

\expandafter\meaning\csname \temp\endcsname %---> macro:->hogehoge
%%期待通り!
%%%%マクロの中で実行してみる
\def\test{%
\bgroup
\catcode`\{=10
\catcode`\}=10
\catcode`\<=1
\catcode`\>=2
\xdef\temp<expandafter{ }>
\egroup
}

\test

\meaning\temp %---> macro:<expandafter->

\expandafter\meaning\csname \temp\endcsname % Error!
------------------------------------------------------------------------------------------------
なぜマクロの引数中に記述し、実行した場合はエラーが発生するのでしょうか?もしや\verbの呪い(原理はわかっておりません)と同じ問題に起因するものでしょうか?
最小限の記述で処理した結果のログファイルを添付しておきます。何卒宜しくお願いします。
Ando Ryoya への返信

Re: 引数中で失敗するマクロ

- 前田 一貴 の投稿
\test の定義部を次のようにすればうまくいくでしょう.

\bgroup
\catcode`\{=10
\catcode`\}=10
\catcode`\<=1
\catcode`\>=2
\gdef\test<%
\xdef\temp<expandafter{ }>
>
\egroup

文字のカテゴリコードは,TeX エンジンがファイルからその文字を読み取った時点での設定が適用されます.
つまり,

\def\test{%
\bgroup
\catcode`\{=10
\catcode`\}=10
\catcode`\<=1
\catcode`\>=2
\xdef\temp<expandafter{ }>
\egroup
}

の場合,これを「読み取った時点での」 < や > のカテゴリコードは
12ですので,そのように \test は定義されます.
その後 \test の展開で \catcode`\<=1 が実行されようが,
既に12になっている < のカテゴリコードが変わることはありません.