“etex”包到底起什么作用?

“etex”包到底起什么作用?

我正在创建一个相当大的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 会将\insert254 到 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}

相关内容