マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

TeX芸人実力判定問題、その5

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