(前回の続き)
レジスタ使用状況マップ
TeX エンジンが有するレジスタ(count、dimen、skip、box、muskip、toks)が LaTeX においてどういう用途で用いられているかを表にまとめてみた。
“基本領域(番号 0〜255)”については、plain TeX と LaTeX で共通になっていて、また新カーネルでも全く変更されていない。
番号 | count | dimen/skip | box | muskip/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〜254 | insert用 | 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 番以降)”の使用は以下のようになっている。
番号 | count | dimen/skip | box | muskip/toks |
256 | 割当済mark番号 | 割当用 | 割当用 | 割当用 |
257 | 割当済charclass番号 | 〃 | 〃 | 〃 |
258〜265 | (割当ルーチン用予約) | 〃 | 〃 | 〃 |
266〜(F-1) | 割当用 | 〃 | 〃 | 〃 |
F〜M | extrafloat用 | 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
である。
参考として、他の資源については以下のようになっている。
資源 | 全範囲 | “割当用” |
---|---|---|
read | 0〜15 | 0〜15 |
write | 0〜15 | 0〜15 |
fam | 0〜15/255※1 | 4〜15/255※1 |
language | 0〜255 | 1〜255 |
charclass | 0〜255 | 4〜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)の文字。