我设法通过向一些 tikzpictures 中添加过多的命名坐标来获取容量超出消息,因此开始测试,现在想知道是否可以释放字符串池中不需要的空间。
举个例子:以下文档创建了相当多的(本地!)定义,并使用 pdflatex(TL2016)终止,并显示以下消息
! TeX capacity exceeded, sorry [pool size=6136953].
\__prg_map_2:w ...sname test#1_17156_tl\endcsname
它与 lualatex 一起消失,并显示以下消息
! TeX capacity exceeded, sorry [number of strings=495118].
<recently read> \__int_eval_end:
\documentclass{article}
\usepackage{expl3}
\begin{document}
bb
\ExplSyntaxOn
\int_step_inline:nnnn { 1 } { 1 } {20000}
{
\group_begin:
\int_step_inline:nnnn { 1 } { 1 } {25}
{
\expandafter\def\csname test##1_#1_tl\endcsname{}
}
\group_end:
}
\ExplSyntaxOff
\end{document}
是否可以释放本地定义使用的空间并减少组结束后的字符串数量?或者有没有办法创建真正的本地定义?
注意力我不是在问如何扩大游泳池的大小。我知道如何做。
答案1
是否有可能释放本地定义所使用的空间并减少组结束后的字符串数量?
评论中已经给出了答案:-)。
标准 TeX.web 的答案:不,创建的字符串条目和字符串池中的字符串字符在创建后永远不会被释放。对于最后创建的字符串,只能进行少量优化。因此,“最大字符串数”或“字符串池”将根据 TeX.web 更改文件中的常量溢出。
LuaTeX 的答案(状态 2023 年 1 月):不,因为原则上 LuaTeX 代码使用与 TeX.web 中相同的代码。池大小和最大字符串数的常量被扩大为巨大的常量,但它们仍然是常量和字符串,并且字符串的保留字符永远不会被释放。(参见“源/texk/web2c/luatexdir/tex/stringpool.h”对于 LuaTeX 常量和“源/texk/web2c/luatexdir/tex/stringpool.c”代码见注释中的描述。)
或者有没有办法创建真正的本地定义?
不,如果您创建本地 csname,并且这些 csname 具有完全不同的“名称”。在所有这些情况下,它们都将分配一个新字符串,并在字符串池中为该字符串分配字符。
您可以尝试在所有本地组中始终使用同一组 csname,以尽量减少影响。
或者您可以采用不同的方式将“命名坐标”引用到合理的数字。
(或者有人在 LuaTeX 代码中以完全不同的方式重新实现 TeX 字符串池函数,以更动态的方式分配和释放 LuaTeX 内部字符串。这将需要更大的努力,并且对等价表等产生更多副作用。如果某个用户分配全局定义的“命名坐标”,您将再次遇到同样的问题,因为当本地组关闭时,您无法释放全局定义的 csnames 的字符串。)