为什么当命令用于重新定义自身时,tex 不会(或不能)产生错误?例如纯文件
\def\bf{\bf}
abc {\bf text}
\bye
只是冻结,不产生任何错误消息。LaTeX 和类似\renewcommand
:
\documentclass{article}
\renewcommand{\textbf}{\textbf}
\begin{document}
abc \textbf{text}
\end{document}
最近我遇到了这个问题,因为一个大型项目由于错误地更改了包含类似行的包文件而停止了编译\renewcommand\foo{ ... \foo ... }
。由于没有产生任何错误,因此花了很长时间才找出问题所在。
\def\foo
我的猜测是,提前扫描或的参数\renewcommand\foo
以获取令牌\foo
是可能的,但从效率上讲不可行。这是正确的吗,还是有其他原因导致没有产生错误?
答案1
tex处于\def\bf{\bf} \bf
循环中,一般情况下无法检测到此类循环(“图灵停机问题”)好消息是,它只给出一个非终止循环,因为它是一个不使用堆栈的尾递归宏。很难偶然写出这样的东西。类似的“无限”循环都会出错
\def\bf{\bf.}\bf
给出! TeX capacity exceeded, sorry [input stack size=10000].
\def\bf{.\bf}\bf
给出! TeX capacity exceeded, sorry [main memory size=5000000].
\def\bf{{\bf}}\bf
给出! TeX capacity exceeded, sorry [grouping levels=255].
因此,自动检测无错误循环的情况将会很困难(即使没有被证明是不可能的:-)