在.tex
文件中,有\centerline{\bf A SHORT \error STORY}
,这将导致错误,因为
l.3 \centerline{\bf A SHORT \ERROR STORY}
?
! Emergency stop.
<argument> \bf A SHORT \ERROR
STORY
\centerline #1->\line {\hss #1
\hss }
l.3 \centerline{\bf A SHORT \ERROR STORY}
解释如下TeXbook是
像 \centerline 这样的控制序列在告诉 TEX 查看 #1 之前可能已经定义了像 \ERROR 这样的控制序列。因此 TEX 在扫描参数时不会解释控制序列。
有点难以理解,这句话的意思好像是因为
\centerline
定义了\ERROR
,\centerline
所以不会解释\ERROR
,所以报错。
答案1
否,\ERROR
未定义(这就是产生错误的原因)
注释的要点是,错误是在使用命令时引发的,而不是在扫描参数时引发的。
所以
如果 \centerline
被定义为不使用其参数
\def\centerline#1{oops}
\centerline{....\ERROR}
不是一个错误,同样如果 \centerline
本地定义\ERROR
\def\centerline#1{{\def\ERROR{OK}#1}}
\centerline{....\ERROR}
不是一个错误。
但实际定义确实给出了错误
\centerline{\bf A SHORT \ERROR STORY}`
但上下文不是
\centerline{\bf A SHORT \ERROR
STORY}
因为扫描参数时不会引发错误,所以
<argument> \bf A SHORT \ERROR
STORY
\centerline #1->\line {\hss #1
\hss }
l.3 \centerline{\bf A SHORT \ERROR STORY}
\centerline
因为在扫描整个参数并开始处理替换文本后,错误就被删除了。