マクロツイーター

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

きょうの XeTeX (1) : \XeTeXfirstfontchar、\XeTeXlastfontchar

XeTeX において絶対覚えておくべきプリミティブ 2 つ。

  • \XeTeXfirstfontchar<フォント> :[整数パラメタ・読取専用] 指定のフォントでサポートする文字符号値の最小値。
  • \XeTeXlastfontchar<フォント> :[整数パラメタ・読取専用] 指定のフォントでサポートする文字符号値の最大値。

ここで、<フォント> に指定できるものは以前に紹介した \iffontchar の場合と同じである。TeX on LaTeX では \font(現在有効なフォント)だけ知っておけばいいであろう。

ちょうどその記事では、plain XeTeX を使って「フォントに存在する全部の文字(全グリフではない)を出力する」例が載っている。

% plain XeTeX 文書
\font\target="IPAex明朝"
\newcount\uc
\noindent \target
\uc=0 \loop
  \iffontchar\font\uc \char\uc \hskip0pt plus1pt\relax \fi
  \advance\uc1
\ifnum\uc<"30000 \repeat
\bye

このコードでは調べる文字符号値の範囲を 0〜"2FFFF に限っている。“IPAex明朝”ではこれで十分だが、もし「任意のフォントを対象としたい」のであればこれでは十分ではない。この場合、常に Unicode の全範囲(0〜"10FFFF)にするのでも構わないが、\XeTeXfirstfontchar\XeTeXlastfontchar を利用すると無駄な部分の探索を省くことができる。

% plain XeTeX 文書
\font\target="IPAex明朝"
\newcount\uc
\noindent \target
\uc=\XeTeXfirstfontchar\font \loop
  \iffontchar\font\uc \char\uc \hskip0pt plus1pt\relax \fi
\ifnum\uc<\XeTeXlastfontchar\font
  \advance\uc1
\repeat
\bye

ところで、このプリミティブが何故「絶対覚えておくべき」かというと、

マニュアルに載ってない

からである。多分、単に書き忘れているだけだと思う。