使用 pdflatex 可以定义的最大宏数量是多少?我以为限制是 35,000 左右,但看起来我已经远远超过了这个数字,而且一切仍然运行良好。这包括:
\newcommand
\def
\csdef
\NewDocumentCommand
- ETC..
对其中的每一个是否有特定的限制或某些全局限制?
背景:
我正在重组我的代码,所以想知道我是否很快就会接近某个限制。
我想做的一件事就是替换类似
\csdef{Property A file1}{abcd}
\csdef{Property B file1}{efgh}
\csdef{Property C file1}{ijkl}
\csdef{Property D file1}{mnop}
类似于
\csdef{Properties file1}{{abcd}{efgh}{ijkl}{mnop}
然后在需要时解析它以提取单个属性,从而减少 4 倍。但是,如果我不是接近极限,那么我可以将这个优化推迟到以后。
参考:
答案1
您可以\tracingstats=1
在文件末尾使用并查看 TeX 内存的使用情况log
。这里提到的参数可以通过编辑texmf.cnf
文件(可能重新生成格式)来放大。
请注意,字符串数量、字符串数据量和多字母控制序列数量均有上限。如果您声明了一个新的多字母控制序列 ( \def\something...
, \let\otherthing...
),则此处提到的所有三个数量都会改变。
内存(主内存)的最大“字数”用于保存有关宏框或宏体的数据。也就是说,如果您声明了一个宏,那么宏体的每个标记都保存在这里。
您建议的优化需要更少的字符串和多字母控制序列,但需要更多的内存字,因为您必须将这些括号保存{..}{..}{..}{..}
到主内存中。
TeX 内存概念很古老:它在执行开始时从操作内存中分配固定长度的数组。这些长度在texmf.cnf
上面提到的参数中声明。并且malloc
操作(从操作内存分配内存)不会在处理文档期间执行。因此,您无法动态使用操作系统提供的全部内存。请注意,luatex 更现代,它在处理过程中对每个字符串数据、主内存和字体内存进行正常的 malloc,但其他参数(字符串数量、多字母控制序列数量)仍然以与古代 TeX 类似的方式固定。
答案2
我现在正在使用 iPad,因此无法轻松检查,但 texmf.cnf 将具有 Tex-live 发行版的最大值(MikTeX 使用不同的配置文件)
关键数字是max_strings
和pool_size
。前者是字符串的总数(包括 TeX 自己的消息,后者是所有字符串的总长度)。MikTeX 将它们设置为 500,000 和 3,250,000。我无法在网上找到当前的 TeX 实时值,但我想它们是可比的,所以您不必担心。
答案3
在文件末尾.log
我发现:
Here is how much of TeX's memory you used:
53726 strings out of 478287
1115535 string characters out of 5846764
1926603 words of memory out of 5000000
70958 multiletter control sequences out of 15000+600000
524031 words of font info for 93 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
140i,10n,134p,1231b,2527s stack positions out of 5000i,500n,10000p,200000b,80000s
[...]
PDF statistics:
129 PDF objects out of 1000 (max. 8388607)
94 compressed objects within 1 object stream
17 named destinations out of 1000 (max. 500000)
32961 words of extra memory for PDF output out of 35830 (max. 10000000)
尝试变体并比较这些值...