\input 的最大嵌套深度是多少?

\input 的最大嵌套深度是多少?

大型文档最好分成多个文件。使用\input允许嵌套多个文件。

\input关于嵌套深度的技术限制是什么?

我在网上或其他地方搜索都没有找到任何线索TX.sx

答案1

嵌套输入文件的最大数量限制为 127。tex.web包含:

@<Check the ``constant'' values for consistency@>=
bad:=0;
...
if max_in_open>=128 then bad:=6;

因此,此限制被硬编码到源中,并被 pdfTeX、LuaTeX 和 XeTeX 继承。

第二个限制是 TeX Live 的(环境)变量max_in_open.texmf.cnf将其设置为 15:

max_in_open = 15        % simultaneous input files and error insertions,

MiKTeX 的默认值为 50,已使用 MiKTeX-pdfTeX 2.9.5670 (1.40.16) 进行测试。

此值可以增加到 127,例如对于 bash shell:

max_in_open=127 tex test

在 TeX Live 中可以设置更高的值,然后在运行时尝试使用它们时会出现错误消息。MiKTeX 在 TeX 运行开始时就会发出抱怨:

tex.exe: Bad parameter value.
tex.exe: Data: max_in_open

当达到限制时,TeX 错误消息(TeX Live)是:

! TeX capacity exceeded, sorry [text input levels=127].

下面是纯 TeX 格式的简短测试文件。它会读取自身,直到\maxinputlevel到达(或发生错误)。

% test.tex
\def\maxinputlevel{150}
\ifx\inputlevel\undefined
  \csname newcount\endcsname\inputlevel
  \inputlevel=0
\fi
\advance\inputlevel 1
\immediate\write16{Input level: \the\inputlevel}
\def\maxinputlevel{150}
\ifnum\inputlevel < \maxinputlevel\relax
  \input \jobname
\fi
\end

实际上,即使对于复杂的文档,也很难达到这些级别。请参见以下示例,它为每个部分级别消耗一个输入级别,甚至更多:

  1. 主要工作文件。
  2. 部分
  3. 章节
  4. 部分
  5. 子部分
  6. 子节
  7. 段落
  8. 分段
  9. 数字
  10. 子图
  11. 一些 TikZ 绘图
  12. 任何

仍剩下一些输入级别。

出现错误最可能的原因是 TeX 代码中存在错误,例如某些无限嵌套循环。

答案2

该限制在模块 328 中说明tex.web

在此处输入图片描述

模块 11 将此最大值设置为 6

在此处输入图片描述

但是,每个实现都可以修改此限制;在 TeX Live 中,相关行texmf.cnf是第 747 行

max_in_open = 15        % simultaneous input files and error insertions, 

的模块 14tex.web告诉我们最大值是 127:

在此处输入图片描述

因此,如果您需要一个特定的应用程序,其中必须同时打开超过 15 个文件进行输入,则可以在运行时或在顶层texmf.cnf文件中更改该值。

此日志文件是通过调用递归执行的文件获得的,\input在修改相关变量的值时不会因错误而停止

max_in_open=32 pdflatex test

这是日志,显示我们可以到达深度 15 以上(在本例中为 18)。

This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2016/02/01>
Babel <3.9q> and hyphenation patterns for 81 language(s) loaded.
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/size10.clo)) (./test.aux)
(./1.tex (./2.tex (./3.tex (./4.tex (./5.tex (./6.tex (./7.tex (./8.tex
(./9.tex (./10.tex (./11.tex (./12.tex (./13.tex (./14.tex (./15.tex (./16.tex
(./17.tex (./18.tex)))))))))))))))))) [1{/usr/local/texlive/2015/texmf-var/font
s/map/pdftex/updmap/pdftex.map}] (./test.aux) )</usr/local/texlive/2015/texmf-d
ist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on test.pdf (1 page, 9731 bytes).
Transcript written on test.log.

如果使用标准值调用,同一个文件会阻塞:

This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2016/02/01>
Babel <3.9q> and hyphenation patterns for 81 language(s) loaded.
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/size10.clo)) (./test.aux)
(./1.tex (./2.tex (./3.tex (./4.tex (./5.tex (./6.tex (./7.tex (./8.tex
(./9.tex (./10.tex (./11.tex (./12.tex (./13.tex (./14.tex
! TeX capacity exceeded, sorry [text input levels=15].

相关内容