マクロツイーター

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

TeX芸人の知らない#{の挙動

「コレが気になって眠れない」という人が出てこないように解決しておこう。

実験してみる

% '[' '(' をグループ開始文字にする
\catcode`\[=1 \catcode`\]=2
\catcode`\(=1 \catcode`\)=2
% '#[' を使ったマクロ定義
\def\testA#1#[\message{#1}]
% '#(' を使ったマクロ定義
\def\testB#1#(\message[#1])
文字列化するとどうなるか

マクロ定義の文字列を表示させてみる。((ここでは \meaning を使ったが、\show を使った場合も(改行付で表示されることを除いて)同じである。))

\message{\meaning\testA}  % macro:#1[->\message {#1}[
\message{\meaning\testB}  % macro:#1(->\message [#1](

このように、パラメタテキストと置換テキストの最後に挿入されるグループ開始文字の文字コードは“定義時に実際に使ったもの”となる。

文字コードの異なるグループ開始文字にマッチするか

以下の結果から解るように、同じ文字コードのグループ開始文字としかマッチしない。

\testA??[] % '??' が表示される
\testB??[] % エラー ! Paragraph ended before \testB was complete.

すなわち、一般的なマクロパラメタのマッチ規則に従い、カテゴリコードが一致しても文字コードの異なるトークン同士はマッチしない、ということである。

まとめ