LaTeX 上で大量のレジスタを確保するパッケージを作ったとする。例えば、以下の「パッケージ」はただ単に 1000 個の整数レジスタを無駄遣いしている。
[spendthrift.sty]
\@tempcnta=0
\@whilenum\@tempcnta<1000 \do{%
\newcount\xx@trash
\advance\@tempcnta1
}
これを e- でない(レジスタが 256 個しかない)LaTeX(というと今は platex しかないね)で読み込むと当然「レジスタが足りない」のエラーになる。
[test.tex]
\documentclass{article}
\usepakcage{spendthrift}
\begin{document}
\end{document}
(platex test.tex を実行すると次のエラーが出る)
! No room for a new \count .
\ch@ck ...\else \errmessage {No room for a new #3}
\fi
l.5 }
しかし、欧文の LaTeX(つまり latex コマンド)は pdfTeX エンジンで、レジスタは 32768 個もあるから大丈夫のはずである。ところが実際に「latex test.tex
」を実行すると、なんと同じエラーが発生する!
(latex test.tex を実行すると次のエラーが出る)
! No room for a new \count .
\ch@ck ...\else \errmessage {No room for a new #3}
\fi
l.5 }
「何だ、レジスタの備蓄は十分にあるなんてデマた!」と怒ってはいけない。ちゃんとレジスタは 32768 個ある。
\count30000=50000 % platex ではエラーだが latex では通る
では大量にあるはずのレジスタが使えない原因は何か。答えは「LaTeX はそのままでは e-TeX の拡張機能に対応していない」からである。
確かに LaTeX のパッケージ(\usepackage
するもの)には e-TeX の拡張機能を利用または要求するものがあるが、LaTeX2e(のカーネル)の仕様は、TeX の仕様と同様「凍結」されている。レジスタの割当を行っているのは LaTeX の内部命令であり、そこの仕様がレジスタ 256 個を前提としているため、大量の追加のレジスタが使えないのである。
では、32768 個のレジスタを使えるようにするにはどうすればよいか。これは「カーネルを e-TeX に対応させる」パッケージ etex を読み込むという方法が与えられている。つまり以下のようにすればエラーは出ないし、きちんと 1000 個のレジスタが無駄遣いされるようになる。
\documentclass{article}
\usepakcage{etex}
\usepakcage{spendthrift}
\begin{document}
\end{document}
仕様が凍結されているという理由により、「LaTeX 自体はデフォルトでは拡張エンジンに対応しない」という性質は XeTeX や LuaTeX にも当てはまる。標準の article クラス等を用いて何のパッケージも読み込まない場合、確かに UTF-8 で Unicode 「入力」はできる(これは LaTeX に依存しない)のだが、フォントは 8 ビット(実質は 7 ビット)の Computer Modern のままだから、8 ビット LaTeX と同じ方法でしか「出力」ができない。「ちゃんと XeTeX や LuaTeX に対応した LaTeX」になるためには fontspec を読み込む必要があるわけである。