增强记忆力

增强记忆力

我正在处理一个大约 4000 页的文档,每页至少有 30 幅图形。需要大量切换字体,并且要为不同的字符涂上不同的颜色。我可以限制输出的页面,这样就可以成功编译。我使用的是 MikTex 64 位,但在尝试通过 texLive 时也发现了同样的问题。

然而,当我尝试将页数增加到一定数量以上时,LuaLaTex 退出并显示:

! TeX capacity exceeded, sorry [number of strings=493869].
<argument> ...ter {\reserved@b Pianos/256px/F/Piano_482.png} 
                                                  \ifeof \@inputcheck \else ...

l.33572 ...m]{{Pianos/256px/F/Piano_482.png}}F ♮3}
                                                   & \textcolor{F-Lt}{F} &  ...

 47374 words of node memory still in use:
   972 hlist, 276 vlist, 615 rule, 1 adjust, 7 disc, 276 local_par, 7 dir, 4 ma
th, 1376 glue, 30 kern, 388 penalty, 96 unset, 596 glyph, 16 align_record, 3318
 attribute, 142 glue_spec, 1660 attribute_list, 14 temp, 1 align_stack, 4 if_st
ack, 1 pdf_dest, 3 pdf_action, 412 pdf_colorstack, 26 pdf_setmatrix, 26 pdf_sav
e, 26 pdf_restore nodes
   avail lists: 1:1,2:32136,3:1080,4:450,5:513,6:468,7:9915,8:39,9:4238,10:45,1
1:507
!  ==> Fatal error occurred, no output PDF file produced!
SyncTeX written on document.synctex.gz.
Transcript written on document.log.

我无法真正发布 MWE,因为我认为故障主要来自包含数千次图像。我正尝试将命令行选项传递lualatex-extra-mem-top=50000000

我也尝试编辑我的 textmf 文件,但它似乎并没有真正改变字符串的魔法数字 (493869)。我还运行了 64 位版本的二进制文件,因为我读到它可以帮助内存分配,但它实际上并没有改变任何东西。

答案1

LuaTeX 使用动态内存分配作为主内存,因此 texmf.cnf即使您将其设置为 luatex 而不是 pdftex,您使用的设置也不会产生任何效果。

然而它仍然从经典 tex 继承了一些固定数组的用法,包括字符串的数量。

这会产生您所述的错误(请注意,这是一个无限循环,因此依赖在出现错误情况时终止。

\documentclass{article}

\begin{document}

\loop
\iftrue
\advance\count0 1
\expandafter\def\csname zzz\the\count0\endcsname{}
\repeat
\end{document}

这产生了

LaTeX2e <2019-10-01> patch level 3

luaotfload | main : initialization completed in 2.242 seconds
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/size10.clo)) (./cc372.aux)
! TeX capacity exceeded, sorry [number of strings=493861].

您可以通过如下调用来增加字符串的数量(或通过编辑 texmf.cnf)

$ max_strings=1000000 lualatex cc372
This is LuaTeX, Version 1.10.0 (TeX Live 2019) 
 restricted system commands enabled.
(./cc372.tex
LaTeX2e <2019-10-01> patch level 3

luaotfload | main : initialization completed in 2.141 seconds
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/size10.clo)) (./cc372.aux)
! TeX capacity exceeded, sorry [hash size=665536].
<recently read> \endcsname 

现在您看到它没有用完字符串,但已经溢出了哈希表,这可以类似地增加。您需要迭代您的实际文档以增加所需的任何内容。

在这里,如果我将哈希表的大小增加到足够大,它需要几秒钟才能运行,但最终会再次用完字符串:

$ max_strings=1000000 hash_extra=1000000 lualatex cc372
This is LuaTeX, Version 1.10.0 (TeX Live 2019) 
 restricted system commands enabled.
(./cc372.tex
LaTeX2e <2019-10-01> patch level 3

luaotfload | main : initialization completed in 2.187 seconds
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/size10.clo)) (./cc372.aux)
! TeX capacity exceeded, sorry [number of strings=993861].

答案2

编辑lualatex.ini以使用 David Carlisle 建议的值,然后重建格式就成功了。我很高兴。

我的lualatex.ini文件:

main_memory=12000000
pool_size=4250000
max_strings=8000000
hash_extra=1000000

为了找到路径,我打开了 MikTeX 控制台,然后转到“设置”>“目录”>“(然后是标有配置的文件夹)。打开该文件夹,然后./miktex/config/lualatex.ini从那里开始。谢谢!

相关内容