マクロツイーター

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

LaTeX でのレジスタ割当の話(2)

前回の続き)
レジスタ使用状況マップ

TeX エンジンが有するレジスタ(count、dimen、skip、box、muskip、toks)が LaTeX においてどういう用途で用いられているかを表にまとめてみた。

“基本領域(番号 0〜255)”については、plain TeXLaTeX で共通になっていて、また新カーネルでも全く変更されていない。

番号countdimen/skipboxmuskip/toks
0〜9ページ番号クラッチクラッチクラッチ
10割当済count番号割当用割当用割当用
11割当済dimen番号
12割当済skip番号
13割当済muskip番号
14割当済box番号
15割当済toks番号
16割当済read番号
17割当済write番号
18割当済fam番号
19割当済language番号
20割当済insert番号
21\allocationnumber
22定数「−1」(\m@ne)
23〜(I-1)割当用
I〜254insert用insert用insert用
255クラッチ(\count@)クラッチ出力ルーチン用
I\count20(= \ins@count)の値。
  • 「スクラッチ」は \count255(= \count@)、\dimen2(= \dimen@ii) のように割当なしで(“非ユニーク変数”として)使えるレジスタを表す。
  • count の 10〜19 は各種レジスタにおいて「既に割当済のものの最大番号」を保持する。例えば、dimen(\count11)の場合、初期値は 9*1で上限 I−1 まで増加でき、この上限を超えると「レジスタ不足エラー」になる。ただし、新カーネル(かつ e-TeX 拡張あり)の場合は、上限を超えると自動的に 256(拡張領域先頭)に移行する。
  • 先述の通り、単一の insert は「番号が同じ count、dimen、skip、box の 4 種のレジスタのセット」で構成される必要がある。普通に別種のレジスタを割り当てても番号は一致しないため、割当ルーチンでは insert に使うレジスタを特別に「番号の大きいもの」を当てるようにしている。つまり、254 から始めて、253、252、…… を順に使う。\count20(= \ins@count)が割当済の“最小”の番号である。

次に、新カーネルにおける、“拡張領域(256 番以降)”の使用は以下のようになっている。

番号countdimen/skipboxmuskip/toks
256割当済mark番号割当用割当用割当用
257割当済charclass番号
258〜265(割当ルーチン用予約)
266〜(F-1)割当用
FMextrafloat用extrafloat用extrafloat用
F\float@count の値。
M はエンジンで利用可能なレジスタの最大の番号。
  • e-TeX 拡張エンジンの場合、割当ルーチンの管理対象に mark が加わる(\newmark 命令で割当)。さらに XeTeX エンジンでは管理対象に charclass が加わる(\newXeTeXcharclass 命令で割当)。count の 256〜257 は 10〜19 と同様に「割当済の最大の番号」を保持する。258〜265 は将来に管理対象の資源が増えた場合に備えて予約されている。
  • \extrafloats 命令が使用された場合、新たに浮動体用の insert を確保する必要があるが、その際に普通に \newinsert で確保する(この場合 254 以下の番号が返る)のでなく特別に最大番号(M)から降順に確保する処理を行っている。この領域の割当済の最小の番号が \float@count である。

参考として、他の資源については以下のようになっている。

資源全範囲“割当用”
read0〜150〜15
write0〜150〜15
fam0〜15/255※14〜15/255※1
language0〜2551〜255
charclass0〜2554〜255
※1: Omega 拡張、XeTeX、LuaTeX、FAM256 適用の e-(u)pTeX では 255、それ以外では 15。
  • fam(数式ファミリ)について: 0 は本文(非数式)の最も標準的なフォント((句読点に類する記号や英字の演算子\cos 等)は非数式のフォントと合わせるのが通例で、それをファミリ 0 に指定する。))、1 は数式用イタリックのフォント、2 は基本の数式用記号のフォント、3 は基本の大型演算子記号のフォント、のように役割が決まっている。*2
  • language(言語)について: 言語コード 0 は必ず Knuth が定める分綴パターン(hyphen.tex)と分綴例外を用いる、と決まっている。
  • charclass(XeTeX の文字クラス)について: 2 は CJK の開き括弧類、3 は CJK の閉じ括弧類、1 はその他の CJK 文字、0 はその他(非 CJK)の文字。

*1:“割当用”領域先頭の番号(10)から 1 を減じた値。

*2:特に数式ファミリ 2 と 3 は TeX 言語のレベルで特別な役割をもつ。