我正在创建一个相当大的LaTeX
项目,因此我必须使用许多包。这给了我一个错误
No room for a new \dimen \newdimen \MPscratchDim
当我的编辑(Kile)打开文件时supp-pdf.mkii
,指向以下行
\newdimen\MPscratchDim % will be assigned global
通过网络搜索,我发现这可能是由于加载了太多包而发生的,正如没有空间容纳新的\dimen
通过 egreg。
我确实加载了,etex
现在一切正常。我etex
在 CTAN 上搜索以了解这个特定包的作用,但我无法理解发生了什么。正如 CTAN 所述
该软件包支持 LATEX 文档使用 e-TEX 提供的许多扩展;特别是它修改 LATEX 的寄存器分配宏来利用扩展寄存器范围
我相信这些大胆的话语给出了答案,但我不明白为什么会有有限的寄存器分配(我甚至不知道那是什么)包裹怎么能延长这寄存器范围。
任何关于这方面的想法都将非常有教育意义!
答案1
更新
最近的 LaTeX 内核已经包含了大部分的内容etex
,因此现在不太可能需要加载它。
原始答案
TeX 由 Knuth 设计,具有各种寄存器,可用 8 位数字(即从 0 到 255)寻址。寄存器类型
\count
\dimen
\skip
\muskip
\toks
\insert
\box
让我们考虑一下\dimen
寄存器,对于其他寄存器,分配机制是类似的。每个寄存器都可以通过其编号寻址,例如
\dimen34=42pt
\kern\dimen34
是设置\dimen
寄存器或检索其值的合法示例。但是,通过编号调用寄存器是一个问题,因为包无法相互协作。因此所有格式都提供了一个分配机制:一说
\newdimen\foo
TeX 会进行设置,这样就\foo
相当于\dimen<n>
调用<n>
不需要知道。请注意,这\newdimen
不是一个有文档记录的 LaTeX 命令,但它有文档记录,source2e
并且在编写包时非常有用。
TeX/LaTeX 会跟踪每种寄存器类型的最新分配编号;由于最大编号为 255,因此当命令\newdimen
达到限制时,可怕的
No room for a new \dimen
出现错误消息。这有点复杂,因为\insert
寄存器的分配从 254 开始向下,并且每个寄存器\newinsert
也分配相同编号的\count
、和寄存器,因此上限通常小于 255,但这不是主要问题。\dimen
\skip
\box
如果达到了极限,我们就无能为力了:我们被迫装载更少的包裹或采取一些卑鄙的手段,而这些手段几乎肯定会在以后给我们带来麻烦。
为了解决几年前 PicTeX 发布时出现的这个问题,我们准备了一个不同的 TeX 实现,它定义了 32768 个寄存器。这是 e-TeX 的一部分,它被纳入了pdftex
我们在文档上运行 LaTeX 时使用的引擎中。
但是,LaTeX 的内核并没有被修改,因为除了错误修复之外,它基本上是冻结的。更改分配机制可能会破坏在假设每种类型只有 256 个寄存器可用的情况下编写的文档或包。
该etex
包修改了分配机制;当\newdimen
发出No room for a new \dimen
错误消息时,它会跳到 255 之外并分配寄存器号 256 并从那里继续前进。
下面是一个模拟,我们假设\newdimen\foo
分配最后可用的 8 位槽,并且\newdimen\baz
需要增加到 15 位;在日志文件中,你会发现
\foo=\dimen233
Normal \dimen register pool exhausted, switching to extended pool.
\baz=\dimen256
只要你\usepackage{etex}
的序言中有的话。
为什么 233 排在最后?因为 LaTeX 会将\insert
254 到 234 分类,它们与边注、脚注、图表等相关。
答案2
经典 TeX 有 256 个寄存器(例如,LaTeX 中分配的 count 和 dimen 寄存器\newcounter
) 。\newlength
多年来,LaTeX 格式一直使用扩展的 etex(或 pdf(e)tex 引擎而不是经典的 TeX,因此实际上有 32768 个寄存器可用。但是出于兼容性原因(或固执,或冷漠,取决于您的观点),将名称分配给内部寄存器编号的默认 latex 宏尚未更新,因此仍然只允许数字 0-255。因此,如果您加载 etex 包(或使用当前构建的 lualatex 和 xelatex 格式,它们使用类似的扩展分配),宏将更改为使用不同的范围。
请注意,etex 默认处于活动状态,您可以使用\numexpr
或计数寄存器(例如)\count1000
,只是它\newcount
不“知道”您可以这样做,因此不会分配超过 255 的寄存器。
更新
从 2015 年起,LaTeX 版本会检测它们是否在 etex(或 xetex 或 luatex)上运行,并默认使用完整的扩展寄存器范围。因此,该etex
包通常不应与新文档一起使用。
答案3
运行texdoc etex
后,您将获得 eTeX 的文档。两个不错的新功能是\dimexpr
和\numexpr
。可用的计数器、维度等不再是 256 个,而是 2^{15} 个。
ε-TEX 将 TEX 的 count、dimen、skip、muskip、box 和 token 寄存器的数量从 256 个增加到 32768 个。
eTeX
是除原始 TeX 之外所有程序的默认引擎。要激活eTeX
扩展,必须包含\usepackage{etex}