大型文档最好分成多个文件。使用\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
实际上,即使对于复杂的文档,也很难达到这些级别。请参见以下示例,它为每个部分级别消耗一个输入级别,甚至更多:
- 主要工作文件。
- 部分
- 章节
- 部分
- 子部分
- 子节
- 段落
- 分段
- 数字
- 子图
- 一些 TikZ 绘图
- 任何
仍剩下一些输入级别。
出现错误最可能的原因是 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].