高效利用 \writes

高效利用 \writes

我目前正在尝试使用 LaTeX 编写我的论文,并遇到了这个老! No room for a new \write .问题。经过一番谷歌搜索,似乎解决这个问题的唯一方法是重新构建文档以最大限度地减少写入次数。

为此,我一直在查看,.log以找出它们都被使用的地方。以下是包含 的行所得到的结果write

\write18 enabled.
(/usr/local/texlive/2010/texmf-dist/tex/latex/rvwrite/rvwrite.sty
Package: rvwrite 2010/08/25 1.2 enhanced write registers (CVR)
Package rvwrite Warning: ****************************************
(rvwrite)                Package rvwrite v,1.2 loaded
(rvwrite)                [enhanced write registers (CVR)]
(rvwrite)                ****************************************.
\rvtwrite=\write3
\openout3 = `thesis-write.tex'.
\@glossaryfile=\write4
\@outemp=\write5
\verbatim@out=\write6
runsystem(echo 'write18-test-20114121256'>"thesis.w18")...executed.
\w@pgf@writea=\write7
\tikzexternal@outfile=\write8
\glswrite=\write9
\glo@main@file=\write10
\FV@OutFile=\write11
\@outlinefile=\write12
\tikzexternal@dep@file=\write13
\tikzexternal@outmakefile=\write14
\tf@tdo=\write15

\write0\write1和去哪儿\write2了?它们的使用是否受到了某种限制?

我使用的是标准软件包:algorithm2e、、、/ 、。其中一些软件包似乎占用了大量的资源。已声明、listings和。和由其他软件包加载,它们分别声明和。最严重的问题似乎是 PGF/TikZ 占用了四次写入。glossariespgftikzempglossaries\write4\write9\write10verbatimfancyvrb\write6\write11

当 LaTeX 尝试构建目录列表时,我的编译会中断。我想制作一个目录,即图片、表格、列表和算法的列表。目前还没有足够的写入来执行此操作。有人能给我一些建议,告诉我如何控制\write这些软件包的过度消耗吗?

人们如何在有如此多限制的情况下使用 LaTeX 制作出可观的文档?我假设我能够制作出包含目录、4 个列表、索引、词汇表和参考书目的 7 章文档,这是否不合理?或者这超出了 LaTeX 的资源限制?

答案1

不幸的是,TeX 中只有 16 个输出寄存器,而 eTeX 没有扩展这个数字。:-(

输出寄存器 0、1 和 2 已被 (La)TeX 本身使用,例如用于文件.log并始终打开,因此您在文件中看不到它们.log

遗憾的是,即使您可能不使用逐字写入功能,和 也会分别占用一个写入寄存器。如果您确定这些寄存器从未使用过,则可以将写入寄存器计数器调回,以便下次重新分配这些寄存器。这可以通过 来完成,moreverb因为下一个要分配的写入寄存器存储在 中。fancyvrb\advance\count17 by -1\count17

此外,PGF/TikZ 本身仅占用一个寄存器。其他三个由库占用external。我假设您使用它来加速编译,这在最终编译运行中很重要。您可以在写入过程中禁用 List Of X'es,然后在要编译“最终”版本时禁用此库。此库的一个很好的替代方案是类standalone和包(由我编写),您可以将 TikZ 图片放在外部文件中,这些文件可以作为源包含并编译为 PDF 图像,然后包含。即将推出的版本将允许在两者之间即时切换。它不使用任何写入寄存器。(我真的必须推动发布......)

答案2

morewrites – 始终有空间容纳新的写入流

该软件包旨在解决“没有空间容纳新的 \write”错误,该错误发生在用户或用户的软件包使用 \newwrite 分配了过多的流时(TeX 在其代码中内置了固定的最大数量 - 16 个这样的流)。该软件包与与写入文件相关的 TeX 基本命令挂钩;它应该在文档的软件包加载序列的开头附近加载。

http://www.ctan.org/pkg/morewrites

答案3

请注意,'mode=list and make' 中的 TikZ 外部库(您似乎使用了它)将动态 (!) 分配比默认的 'mode=convert with system call' 更多的写入寄存器。因此,消除 'list and make' 功能将自动释放至少一个寄存器。

如果您在 tikz 图像中不使用 \label 或 \ref,您也可以使用“\tikzexternalize[aux in dpth=false]”来取消对 \label 和 \ref 的支持。这将释放另一个写入寄存器(如果我没记错的话,pgf 2.10 也会按需分配它)。

我刚刚对 PGF CVS 做了一些更改,这些更改允许对外部化使用的写入寄存器进行更多控制。现在,如果可能的话,图像外部化过程使用的寄存器是按需分配的。此外,新版本有一个键“\tikzexternalize[disable dependency files]”,它禁用 .dep 文件依赖项的生成——释放一个寄存器,但代价是如果数据文件发生变化,就无法再重新制作图形。

我希望这会有所帮助——至少在将来。

答案4

morewrites确实可以消除错误! No room for a new \write,但它破坏了目录和所有“* 列表”。我最终改用了scrwfile(with \usepackage{scrwfile})。

相关内容