- TeX芸人の知らない#の挙動 (hak7a3が書き残す何か)
「コレが気になって眠れない」という人が出てこないように解決しておこう。
実験してみる
% '[' '(' をグループ開始文字にする
\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.
すなわち、一般的なマクロパラメタのマッチ規則に従い、カテゴリコードが一致しても文字コードの異なるトークン同士はマッチしない、ということである。