TeX 容量限制摘要

TeX 容量限制摘要

我似乎经常遇到容量问题,每次都会提高限制。这个网站上有几个与此相关的问题。然而,似乎有一些相互矛盾的信息,没有一个地方全部这些限制很详细。

主要问题:

所以我要找的是

  1. 变量名称
  2. 默认值。
  3. 绝对可设置的最大值。
  4. 我可以采取哪些步骤来尽量减少这些使用量。每个容量限制的注意事项是什么。

我所知道的设置是在日志文件末尾报告的设置:

 106477 strings out of 493042
 2524840 string characters out of 39884661
 12363848 words of memory out of 12435455
 103471 multiletter control sequences out of 15000+600000
 197845 words of font info for 228 fonts, out of 8000000 for 9000
 1143 hyphenation exceptions out of 8191
 86i,17n,86p,10523b,3398s stack positions out of 5000i,500n,10000p,200000b,80000s

但可能还有其他未在此处列出的。我目前的问题是,words of memory上面的数字来自我第一次索引。如果我尝试进行第二次运行,那么我会得到TeX Capacity Exceeded

示例其他变量:

从 Davis Carlisle 的评论来看,还有extra_mem_topextra_mem_bot也可以使用。但是,这是否允许更大的words of memory,或者这些是否与报告中的其他容量限制之一有关。同样,我可以将它们设置为最大值是多少?


可能的注意事项:

这里列出了我对尽量减少使用量的一些疑问,也许这些问题可以在每个变量的“可做”和“不可做”中涵盖。

  1. \def\foo{xxx}用代替是否更好\newcommand*{\foo}{xxx}?我可以在 TeX 之外执行重复宏名检查。

  2. 具有大量字符的宏名称是否会增加其中一些的使用?

    例如,\expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx}在容量方面确实存在任何问题。我是否最好映射dir1/dir1/long-file-name到一些较短的字符串,例如ZXyw以节省这些限制。是的,可读性会丧失,但我可以自动进行此替换。

  3. 重复的文本是否会导致限制的使用增加:以下哪项更好:

    \MyMacro{../../../../dirA/dirB/dirC/dirD/file0001.tex}
    \MyMacro{../../../../dirA/dirB/dirC/dirD/file0002.tex}
     ...
    \MyMacro{../../../../dirA/dirB/dirC/dirD/file5000.tex}
    

    或者

    \def\Path{../../../../dirA/dirB/dirC/dirD/}
    \MyMacro{\Path/file0001.tex}
    \MyMacro{\Path/file0002.tex}
     ...
    \MyMacro{\Path/file5000.tex}
    
  4. \undef在不再需要宏之后再使用宏是否有助于解决这些限制?

当然,我可以尝试这些我想到的东西,但也许还有其他事情可以做来减少这些有限的字符串和单词的使用。


不一致示例

  • 在我的/usr/local/texlive/2015/texmf.cnf我有main_memory = 12435455(12.4M),这是规定的最大值latex 给我错误:哎哟---我的内部常量已被破坏。如果我尝试将其仅增加 1,12435456我就会得到Ouch---my internal constants have been clobbered!---case 14。即使sudo vi texmf.cnf按照以下方式执行增加 LaTeX 容量

    然而,Thomas F. Sturm 的解决方案如何扩展 TeX 的“主内存大小”?(pgfplots 内存过载)节目

    100571134 words of memory out of 103000000
    

    因此表明最大值至少为 103M。

    此外,文件中/usr/local/texlive/2015/texmf-dist/web2c/texmf.cnf还有一条注释Memory. Must be less than 8,000,000 total.。这显然是不正确的,因为我可以使用更多内容。


笔记:

  • 我假设kpsewhich texmf.cnf对 Leo Liu 的回答所报告的文件进行的任何更改都将在如何扩展 TeX 的“主内存大小”?(pgfplots 内存过载),对我来说是

    /usr/local/texlive/2015/texmf.cnf
    

    如果有不同的方法来设置其中一些,我也想知道。

  • 我现在的主要问题是索引大量条目和words of memory限制。我不太关心运行时间(在合理范围内),更关心超出这些限制。
  • 我正在使用 TeXLive2015,以防万一。但如果限制取决于分布,那么了解这一点也会很好。
  • 这个问题并不是关于导致超出容量限制的错误情况(比如我的幼稚问题Tex 容量超出范围(如果在使用宏后删除%))。

参考:

答案1

使用 \def\foo{xxx} 而不是 \newcommand*{\foo}{xxx} 是否更好。我可以在 TeX 之外执行重复宏名称检查。

不,结果是一样的

例如,\expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx} 在容量方面是否存在任何问题。

理论上是的,csname 必须存储在某个地方,因此这会占用 39884661 个字符串字符中的 2524840 个

但你可能只会减少 20 个左右的字符,所以 39884661 不会有太大区别

以下哪项更好:

再次略微地,第一个使用了 more,因为它定义了一个 csname( \path),它从中取出一个

 103471 multiletter control sequences out of 15000+600000

但你还远远没有达到那个极限

在不再需要宏之后,\undefing 宏是否有助于解决这些限制?

是的,这就是为什么 latex 删除了大量的命令,因为\begin{document}哈希条目没有被回收(多字母命令的数量),但是用于保存定义的主内存被回收了。

答案2

很多年前,我曾就“TeX 容量超出”问题发表过演讲,其中包含一些背景信息、根本原因以及如何避免这些问题。

演讲的第一部分发表于《Die TeXnische Komödie》1995/3 期,第 22 页及后续页

第 24 页有一个表格,其中包含所有(标准 TeX.web)溢出错误消息、相关的 TeX.web 参数和参数设置。

缺点:(1)演讲和论文都只有德语版本;(2)我没有足够的时间来完成包括第二部分和第三部分中所有剩余主题在内的文章系列;(3)它基于标准 TeX.web 和 web2c“bigTeX”版本,没有 e-TeX、pdfTeX、XeTeX、LuaTeX 和类似的扩展变体。

相关内容