LuaLaTeX 中没有空间进行新的写入

LuaLaTeX 中没有空间进行新的写入

这是那些非常大的文档问题之一,我很难生成 MWE。但它与 LuaLaTeX 与 XeLaTeX 中写入流的限制有关。我有一个包含额外索引、额外浮点类型的复杂文档,而 XeLaTex 中可怕的写入流限制一直是主要障碍。

morewrites 包造成了一些困难,所以我决定转向 LuaLaTex - 印象中那里没有写入流限制,最高可达 256。然而令我惊讶的是,当流达到 17 左右时,我得到了完全相同的错误。

下面是 LuaLaTex 编译后对 25000 行日志文件进行 \write 的 grep。我认为这在原则上不是一个限制,那么为什么我在完全相同的 N 下仍然得到这个结果?为了避免产生差异,我也使用了 shell-escape。

 Inserting `luaotfload.rewrite_fontname' at position 4 in `luaotfload.patch_font'.
 \@xs@message=\write3
 \w@pgf@writea=\write4
 \tcb@out=\write5
 \tcb@record@out=\write6
 \forest@copy@out=\write7
 Package pgfplots info on input line 82: Found new luatex: initializing lua commands instead of write18 (shell-escape)
 \@indexfile=\write8
 \js@verbatim@out=\write9
 \@outlinefile=\write10
 \tf@toc=\write11
 \tf@lof=\write12
 \tf@lot=\write13
 \tf@lotreepic=\write14
 [][]\TU/LinLibertine(5)/m/n/12 \immediate\write18{grep -vE "(linkcode55)" steelechaimkids.tex > schaimclean.tex} 
 \tf@exh=\write15
 ./subdocs/templatetikzoddssodds.tex:5269: No room for a new \write .
 []\TU/LinLibertine(0)/m/n/10.95 didn’t add code for ar-rows. this should not be prob-lem to write code for it (some-thing like []\TU/LinLibertine(5)/m/n/10.95 \draw[<->] ([xshift=...] r1c4.north east) -- ([xshift=...] r4c1.south east);) 
 ./subdocs/templateshapepar.tex:39: No room for a new \write .
 \tf@los=\write16
 \tf@tod=\write17
 ./subdocs/templatepgfplots.tex:27: No room for a new \write .
 ./subdocs/templatepgfplots.tex:329: No room for a new \write .
 ./subdocs/templatepgfplots.tex:413: No room for a new \write .
 ./subdocs/templatepgfplots.tex:777: No room for a new \write .
 ./subdocs/templatepgfplots.tex:1943: No room for a new \write .
 ./subdocs/templatepgfplots.tex:1989: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2175: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2189: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2198: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2344: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2729: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2781: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2868: No room for a new \write .
 ./subdocs/templatepgfplots.tex:2991: No room for a new \write .
 ./subdocs/templatepgfplots.tex:3354: No room for a new \write .
 ./subdocs/templatepgfplots.tex:3407: No room for a new \write .
 ./subdocs/templatepgfplots.tex:3481: No room for a new \write .
 ./subdocs/templatepgfplots.tex:3687: No room for a new \write .
 ./subdocs/templatepgfplots.tex:4344: No room for a new \write .
 ./subdocs/templatepgfplots.tex:4503: No room for a new \write .
 ./subdocs/templatepgfplots.tex:4553: No room for a new \write .
 ./subdocs/templatepgfplots.tex:4773: No room for a new \write .
 ./subdocs/templatetkzgraphs.tex:64: No room for a new \write .
 ./subdocs/templatetikzcirstree.tex:1812: No room for a new \write .

答案1

我想我会自己回答这个问题以结束它,以防它对其他人有帮助:

经过广泛搜索,逐一排除问题,结果发现 filecontents 包是罪魁祸首。filecontents 包的功能(某种程度上)被纳入 Lualatex 中。删除该包解决了所有“没有空间进行新写入”问题。

为了保持功能,需要将所有调用替换为

\begin{filecontents*}{filename}
...Content...
\end{filecontents*}

with

\begin{filecontents*}[overwrite]{filename}
...Content...
\end{filecontents*}

无星号的版本也类似。

我认为 LuaLatex 开发人员应该保持向后兼容性(LaTex 的核心优势),方法是将覆盖设为默认,并且如果可能的话,如果加载了不兼容的常用包(但具有相同名称的宏),则在日志中生成错误。虽然我理解 LuaLatex 的基础是打破常规,但这种打破常规只有在绝对必要时才应该进行。除了无意中使用旧数据的风险之外,略有不同的表述也使得维护 LuaLatex 和其他编译器的文档变得困难。filecontents 包可能也应该打补丁,以便在适当的时候加载 Lua 版本。

相关内容