マクロツイーター

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

XeTeX がアレ過ぎて TeX 芸に支障が出ている件

XeTeX においては BMP 外の文字でも BMP の文字と全く同様に扱える。まあ当然である。

% XeLaTeX文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{IPAexMincho}
\begin{document}
𠮟% U+20B9F
\end{document}

BMP 外の文字をアクティブにすることもできる。まあ当然である。

% XeLaTeX文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{IPAexMincho}
\begin{document}
\catcode`𠮟=13
\def𠮟{(゚Д゚)ゴルァ!!}
𠮟
\end{document}

で、この状況で、文字に \scantokens を被せても結果は全く変わらない。まあ当然……

% XeLaTeX文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{IPAexMincho}
\begin{document}
\catcode`𠮟=13
\def𠮟{(゚Д゚)ゴルァ!!}
\scantokens{𠮟}
\end{document}

うまくいかない! (゚Д゚)ゴルァ!!

またアレが怪しいので調べてみる。

% XeLaTeX文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\begin{document}
\def\what#1#2#3:{\typeout{(\number`#1, \number`#2)}}
\what 𠮟.:
\scantokens{\what 𠮟.:}
\end{document}
(134047, 46)
(55362, 57247)

うわぁ……やっぱりサロゲートペアの符号値のトークンに分裂している……。((さっきの〈𠮟〉をアクティブにした例の場合、一旦符号値が 55362(= U+D842)と 57247(= U+DF9F)の 2 つのトークンに分裂して、これらの値はアクティブでないため(つまり \catcode55362 は 12 である)アクティブ化が無視されたような動作をする。どういうわけか“実際に出力する”ときにはこの 2 つの“文字”の列はまた〈𠮟〉に戻っているのである。))