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