我似乎經常遇到容量問題,每次都提高限制。該網站上有幾個與這些相關的問題。然而,似乎有一些相互矛盾的訊息,並且沒有一個地方可以證明這一點。全部這些限制是詳細的。
主要問題:
所以,我正在尋找的是
- 變數名稱
- 預設值.
- 絕對可以設定的最大值。
- 我可以採取哪些措施來盡量減少這些使用。每個容量限制的注意事項是什麼?
我所知道的設定是在日誌文件末尾報告的設定:
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
。
範例其他變數:
從戴維斯·卡萊爾的評論來看,還有extra_mem_top
和extra_mem_bot
that 也可以使用。但是,這是否允許更大的words of memory
,或者這些是否與報告中的其他容量限制之一相關。再說一次,我可以將這些設定的最大值是多少?
可能要做和不要做的事:
這裡列出了我關於最小化使用的一些問題,因此也許這些可以在每個變數的「做」和「不做」中涵蓋。
使用
\def\foo{xxx}
而不是更好\newcommand*{\foo}{xxx}
。我可以在 TeX 之外執行重複巨集名稱的檢查。具有大量字元的巨集名稱是否會增加其中某些字元的使用量?
例如,
\expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx}
在容量重新升級方面確實存在任何問題。對我來說,映射到一些較短的字串會更好,dir1/dir1/long-file-name
例如ZXyw
節省這些限制。是的,可讀性丟失了,但我可以自動執行此替換。重複的文字是否會導致限制的使用增加:以下哪一項更好:
\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}
\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 容量超出(如果在使用巨集後刪除 %))。
參考:
- TeX/LaTeX 中新宏或指令的數量是否有限制列出此處提到的變數並提供測試案例。然而,他特別關注基於宏數量的限制。
- (La)TeX 記憶體使用的組成部分是一個很好的參考,所以也許可以將這些答案添加到那裡,並將其作為重複項關閉?
答案1
使用 \def\foo{xxx} 取代 \newcommand*{\foo}{xxx} 是否更好。我可以在 TeX 之外執行重複巨集名稱的檢查。
不,同樣的事情
例如, \expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx} 在容量方面是否有任何問題。
理論上是的,csname 必須儲存在某個地方,因此這會佔用 39884661 個字串字元中的 2524840 個字串字符
但你大概只會減少 20 個左右的字符,所以與 39884661 沒有太大區別
以下哪一個會更好:
再一次,第一個使用了更多,因為它定義了另一個 csname ( \path
),它從
103471 multiletter control sequences out of 15000+600000
但你還遠遠沒有達到這個極限
不再需要巨集後,\undefing 是否有助於解決這些限制?
\begin{document}
是的,這就是為什麼乳膠在散列條目中刪除大量命令沒有被回收(多字母命令的數量),但用於保存定義的主記憶體被回收。
答案2
許多年前,我曾就「TeX 容量超出」問題進行過一次演講,其中包含一些背景資訊、根本原因以及如何避免這些問題的可能性。
演講的第一部分發表於《Die TeXnische Komödie》1995/3 期,第 22 頁。
第 24 頁有一個表格,其中包含所有(標準 TeX.web)溢出錯誤訊息、關聯的 TeX.web 參數和參數設定。
缺點:(1) 演講和論文僅採用德語,(2) 我沒有足夠的時間來完成該系列文章,包括第二部分和第三部分中的所有剩餘主題,(3) 它基於標準 TeX。 web2c“bigTeX”版本,沒有 e-TeX、pdfTeX、XeTeX、LuaTeX 和類似的擴展變體。