これが解けたら 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 %==> エラーなし