问题:

问题:

正如我之前的问题TeX 容量超出(保存大小).txt,我正在生成一个相当大的、.tex和文件的索引.pdf。这个过程已经运行了很长时间,索引的大小不是问题。我添加了逻辑以在索引中插入其他链接,现在即将超出限制string characters

Here is how much of TeX's memory you used:
     134371 strings out of 493308
     9799992 string characters out of 9887816 
     4157963 words of memory out of 5000000
     59945 multiletter control sequences out of 15000+600000
     167812 words of font info for 205 fonts, out of 8000000 for 9000
     959 hyphenation exceptions out of 8191
     87i,12n,83p,10548b,16447s stack positions out of 5000i,500n,10000p,200000b,80000s

在过去的几个月里,我已经多次超出这个范围,并优化了我的大部分代码,但对于进一步优化的地方却没有什么想法了。所以,我试图在我再次陷入困境之前解决这个问题,这似乎迫在眉睫。

作为基准,处理单身的文件结果为:

Here is how much of TeX's memory you used:
     52846 strings out of 493308
     1137494 string characters out of 9887816
     1523413 words of memory out of 5000000
     54776 multiletter control sequences out of 15000+600000
     167812 words of font info for 205 fonts, out of 8000000 for 9000
     959 hyphenation exceptions out of 8191
     87i,11n,83p,10548b,1042s stack positions out of 5000i,500n,10000p,200000b,80000s

笔记:

  • 有时string characters会无缘无故地略微减少。由于我的索引正在处理文件列表,我看不出向此列表添加另一个文件如何可能减少string characters所需的数量,但我见过这种情况发生。

  • 我已经增加pool_size/usr/local/texlive/2013/texmf.cnf

    pool_size=10000000
    
  • 抱歉没有提供 MWE。此过程访问我的文件系统,若要复制它,则需要设置一堆文件。

问题:

  1. 什么是string characters
  2. 应避免使用哪种构造,以及应优先使用哪种构造以尽量减少使用string characters
  3. 有没有办法让我string characters在运行过程中看到使用的数量。如果我能得到这份报告通过宏调用,我可能会缩小主要罪魁祸首的范围。
  4. 增加此限制需要做什么很多更远?

问题 4 的解决方案将是理想的。我不介意花更长时间。目前大约需要 40 分钟来生成 600 页的索引,但即使是一夜之间解决也是可以接受的,因此在运行时间方面还有很大空间。

参考:

答案1

这是池大小:主要是命令名称中使用的字母。通常,您可以在 texmf.cnf 中增加它(除非您达到编译器限制)

% Max number of characters in all strings, including all error messages,
% help texts, font names, control sequences.  These values apply to TeX.
pool_size = 6250000

一个简单的测试文件(纯 pdftex)

\tracingstats1
aaa

\def\a{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
\def\b{\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a}
\count0=0
\loop
\advance\count0 1
\expandafter\def\csname \b \romannumeral\count0 \endcsname{}
\iftrue\repeat

这将不断创建新的 csname,直到填满池子,但似乎我可以在 texmf.cnf 中继续推动它

有效资金池似乎增加到

pool_size = 100000000

产生的错误

! TeX capacity exceeded, sorry [pool size=39921916].
 39921697 string characters out of 39921916

如果我尝试在 texmf.cnf 中进一步增加它,我不会收到任何警告,但报告的大小不会改变。但这大约是您报告的值的 4 倍。

相关内容