マクロツイーター

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

レジスタを大量に確保する話

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-8Unicode 「入力」はできる(これは LaTeX に依存しない)のだが、フォントは 8 ビット(実質は 7 ビット)の Computer Modern のままだから、8 ビット LaTeX と同じ方法でしか「出力」ができない。「ちゃんと XeTeX や LuaTeX に対応した LaTeX」になるためには fontspec を読み込む必要があるわけである。