我收到以下错误信息:
! No room for a new \dimen . \ch@ck ...\else \errmessage {No room for
a new #3}
\fi
我找不到治愈方法。
答案1
这取决于两个原因:
- 包裹太多;
- 编程错误,例如
\newdimen
在命令的定义中说。
在情况 1 中,加载
\usepackage{etex}
就在行后\documentclass
。对于情况 2,请更正定义。
如果你正在加载morefloats
或manyfoot
,则添加
\reserveinserts{28}
加载后即可etex
;这对于满足这些包的需求是必要的。
笔记
这个技巧与插入类的分配机制有关,它使用“高”编号的寄存器;例如,插入类\@mpfootnotes
使用编号为 254 的寄存器,而最后分配的寄存器使用 234。插入类保留类型为 、 、 和 的寄存器\count
,\dimen
当然\skip
,\box
还\insert
保留分配的编号。相反,\newcounter
或等命令\newlength
从 11 开始向上。
当最后分配的计数器或长度对应于数字 233 时,下一个请求将导致(使用普通 LaTeX)消息No room
。通过加载etex
,在这种情况下,系统将分配扩展池中的第一个空闲寄存器,即从 256 到 32767。
包morefloats
和manyfoot
分配了 18 和 10 个插入类;但是,根据加载顺序,这可能会导致冲突;假设在它们之前加载的包分配了\count
最多 220 个寄存器:那么就没有空间容纳新的插入类了。
命令\reserveinserts{28}
通过假装 206 至 233 寄存器是已经占用,因此当最后分配的寄存器为 217 时,对新寄存器的请求将直接进入扩展池。这样,morefloats
并且manyfoot
可以通过占用肯定空闲的插槽安全地进行分配,与包加载顺序无关(分配命令经过方便的修补,不会干扰插入类分配的过程)。
正如 Stephen 在评论中所说,如果morefloats
加载了超过 18 个额外的浮点数(这是默认值),则 的参数应进行相应修改。如果您还使用 ,则\reserveinserts
只需将 的浮点数加 10 即可。morefloats
manyfoot
2015 年发布的 LaTeX 更新
随着 2015 年 1 月 1 日 LaTeX 的发布,扩展分配机制已经融入内核,因此etex
只要使用支持 e-TeX 扩展的引擎,就不再需要加载,过去十年发布的 TeX 发行版应该都是如此。
请注意,不支持此类扩展的旧引擎etex
无论如何都不会接受加载。
morefloats
此外,也不再需要加载,因为新内核提供了命令\extrafloats
,无需发出\reserveinserts
。若要在浮动队列中分配超过默认的 18 个框,请使用\extrafloats{20}
(或您需要的任何数字)。
该包的其他功能etex
(寄存器的本地分配)现在由该包提供elocalloc
。
答案2
这是常见问题解答,答案在https://texfaq.org/FAQ-noroom