マクロツイーター

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

指定のコードの和文トークンを得る方法

以前の記事で用いた「\lowercase トリック」は、「整数値をその符号値をもつ文字トークンに変換する」ための常套手段である。


{\lccode`?=〈整数n〉\lowercase{\gdef\token{?}}}

単純に「符号値 n の文字を出力したい」のであれば \char〈n〉 で事足りる。しかし「符号値 n の文字トークン」が欲しい場合もある(例えば \write の引数や \csname の中身に入れる、等)。この場合には \char は役に立たない。また \chardef\token=〈n〉 で定義される \token は特殊な「\chardef トークン」と呼ばれるものでこれも文字トークンではない。こういう時に上記のコードが使われる。\lowercase を展開すると、引数の \gdef\token{?} の中の ? は「符号値 n の文字トークン」に置き換わって、これが所望のトークンとなっているのである。上記コードではマクロ \token に格納したが、直接そのトークンを用いて何らかの処理を行う場合もある。なお、\lowercase で変換された文字トークンのカテゴリコードは変換前のもの(この場合は〈?〉なので 12)を引き継ぐことに注意。

以上の機構を敢えてサブルーチンにまとめると以下のようになる。


% \getchartoken \制御綴{<整数ch>}
% 符号値が ch、カテゴリコードが 12 の文字トークンに展開されるマクロ
% として \制御綴 を(ローカルに)定義する。
\begingroup \catcode`\?=12
\gdef\getchartoken#1#2{%
\begingroup \lccode`\?=#2\relax
\lowercase{\endgroup \def#1{?}}}
\endgroup

(#1 への定義をローカルにする(\gdef を使わない)ために \endgroup を少し変な位置に置いている。)

さてここからが本題である。pTeX和文トークンにおいて同様のサブルーチンを作るにはどうしたらいいか。pTeX では和文文字トークンはカテゴリーコードを持たないので、以下のような仕様になる。この \getjchartoken の実装方法を考えてみてほしい。


% \getjchartoken \制御綴{<整数ch>}
% 内部漢字コードの値が ch の和文文字トークンに展開されるマクロ
% として \制御綴 を(ローカルに)定義する。

答えは 30 日後!(本当か?)