(前回の続き)
レジスタ使用状況マップ
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)の文字。