これが解けたら TeX 芸人 3 級相当。
plain TeX または LaTeX(ToL) において以下の要件を満たすマクロ
\letargswapped
を実装せよ。
\macroA
を2つの区切り無し引数を取るマクロとする。この時、\let\argswapped\macroB\macroA
を実行すると、\macroB
も2つの区切り無し引数を取るマクロとなり、しかも、\macroA{<引数1>}{<引数2>}
を一回展開したトークン列と\macroB{<引数2>}{<引数1>}
を一回展開したトークン列は(<引数1>
や<引数2>
の内容に関わらず)常に一致する。\macroA
のマクロに\long
、\outer
、\protected
お属性は付いていないと仮定する。\macroA
は非標準的なカテゴリコードをもつ文字トークン((例えば、カテゴリコード 13 の〈Z
〉等。))が含まれうる。- ただし、
\letargswapped
の定義は LaTeX の\makeatletter
のカテゴリコードで行われると仮定してよい。
実行例。tcargswapped.sty に \letargswapped
の実装が書いてあるとする。
% plain TeX \catcode`\@=11 \input tcargswapped.sty \catcode`\@=12 \def\Frac#1#2{{#1\over#2}} \letargswapped\RFrac\Frac $$\RFrac{13}{42}$$ %==>分数「13分の42」が出力される \edef\hogeA#1#2{#1\string~#2\noexpand~} \letargswapped\hogeB\hogeA \expandafter\def\expandafter\expA\expandafter{\hogeA^?} \expandafter\def\expandafter\expB\expandafter{\hogeB?^} % \expA も \expB も ^[7]~[12]?[12]~[13] となるはず \ifx\expA\expB\else\errmessage{Oops}\fi %==> エラーなし