我正在整理来自世界各地的歌曲。我在具有 16GB RAM 的 Windows 11 上使用 lualatex 中的 fontspec 和 Tex Live。我通过使用 Visual Basic Code 中的 latex-workshop 配方或直接使用命令提示符(通过 .cmd 脚本)以各种方式编译文档。
我最近注意到,该文档目前长度不到 400 页(包括许多用于占位符部分的空白页),无法再编译。我收到以下错误:
c:/Program Files/FontBase/Fonts reserve/Edwin.otf><c:/Windows/Fonts/cambriaz.ttf><c:/Program Files/FontBase/Fonts reserve/NotoSans-BoldItalic.otf><c:/Program Files/FontBase/Fonts reserve/NotoSerif-BoldItalic.otf><c:/Program Files/FontBase/Fonts reserve/ScheherazadeNew-Regular.ttf><c:/Windows/Fonts/cambriab.ttf><c:/Program Files/FontBase/Fonts reserve/NotoSerif-Bold.otf><c:/Windows/Fonts/cambria.ttc><c:/Program Files/FontBase/Fonts reserve/NotoSerif-SemiBold.otf><c:/Windows/Fonts/cambriai.ttf><c:/Program Files/FontBase/Fonts reserve/NotoSans-Italic.otf><c:/Program Files/FontBase/Fonts reserve/NotoSans-Bold.otf>fatal: memory exhausted (xmalloc of 59925144 bytes).
我怀疑罪魁祸首是文档中的字体数量。主要字体是 Noto Serif 和 Noto Sans。我注意到,如果我注释掉包含 2 个日文汉字字符的段落(并在脚注中包含 4 个字符),从而完全从文档中删除日文,文档就可以编译。除了日文(Source Han Serif),文档目前还有大约 20 个中文字符(Source Han Serif)和一些阿拉伯字母(Sheherazade)。我还使用了一些字体用于特殊用途,例如 Cambria 用于打印一些在 Noto 中看起来不太好的符号,以及 Edwin 用于文本内的音乐符号。
本文档使用了以下软件包。我强烈怀疑它们是导致该问题的第二大因素:
Lyluatex — 所有乐谱均使用包含 \lilypondfile[insert=fullpage] 命令的环境插入。我注意到,通过注释掉几首歌曲,文档就可以编译。[编辑:这不太可能是原因。我现在直接使用 lilypond 编译乐谱,并使用 \includepdf 导入它们。问题仍然存在。因此,我已从此帖子中删除了 lilypond 标签]- Biber — 如果我删除所有辅助文件并只运行 lualatex 而不运行 biber,文档就会编译。具体来说,通过不运行 biber(从而生成包含 4 个汉字字符来源的脚注和参考书目),我可以编译文档,而无需注释掉包含 2 个汉字字符的段落的文本。
我隐约觉得以下因素也可能导致了这个问题,尽管我无法建立实验(如上所述)来明确指出它们是原因:
- nomencl 和索引(使用 makeindex 编译);
worldflags(注意,文档中提到它占用大量内存)[编辑:我现在添加了一些代码,以便可以打开和关闭此包。关闭它没有什么区别];- 整个文档的交叉引用;
使用 pgfplots 制作的插图(我知道 pgfplots 占用大量内存,但是注释掉该插图从未使文档可编译);[编辑:经过思考,这似乎也不是原因]- 一个自定义命令,通过测量 lrbox 内容的宽度并将其与页面宽度进行比较来确定歌词是否应打印在一列还是两列中。
我搜索了我的 Tex Live 目录,查找所有包含“xmalloc”的文档。我只找到了几个 PDF 文档,但都无法说明它是什么。
如果有人能就以下任何问题为我提供启发,我将不胜感激,因为它们将帮助我决定该项目是否可行或注定会失败(考虑到我迄今为止所做的只是我设想的最终产品的一小部分):
- 上述哪些问题最有可能导致内存耗尽?有哪些问题可以排除?
- 什么是 xmalloc?它是一种特定形式的内存吗?如果是,它可以扩展吗?
- 扩展 lualatex 的内存通常是否有助于解决这个问题?如果可以,该怎么做(我尝试使用 '--max-strings=5000000' 调用 lualatex,但无济于事)?
- 有没有办法精确检查使用了多少内存(例如,按包或按页面细分)?
- 更一般地说,文档是否可能因为大小而导致内存耗尽,或者内存耗尽几乎总是由于命令编写不当造成的?
在此先向所有能够提供帮助的人表示衷心的感谢。
答案1
这可能是一个半解决方案,但我已经设法通过切换到 xelatex 来编译整个文档(我现在可以自由地这样做,因为我不再使用 lyluatex)。
现在这样就行了。感谢 Max Chernoff 和 Ulrike Fischer 建议使用 64 位二进制文件。我最终让它们工作了(或者至少我认为如此)。在这种情况下,它们似乎没有什么不同,但我相信它们将来会派上用场。
如果有人对我最初的问题有任何想法,我仍然会感谢您的见解。