\csname 消除错误

\csname 消除错误

\csname如果尚未定义控制序列,则似乎会自动定义该控制序列。下面的代码创建了一个文档,其中创建了“ab c”;交换\csname行和\foo行会产生错误。我原本以为\csname如果与未定义的控制序列一起使用,只会产生错误,但事实却似乎将序列定义为空的?

\documentclass{article}
\begin{document}
a
\csname foo\endcsname
b
\foo
c
\end{document}

它在 pdflatex 和 lualatex 中的行为完全相同,除了一些语法差异外,在 pdftex 和 luatex 中也会发生相同的行为。这是预期的行为吗(如果是,记录在哪里),我该如何解决它?

答案1

不,其工作原理\csname与你所想象的不同。

如果控制序列\foo已定义,\csname foo\endcsname则将等同于\foo

否则,\csname foo\endcsname将(本地)定义\foo为等同于\relax并按此进行处理。

相关引文摘自“TeX by Topic”(第 131 页):

在此处输入图片描述

你可以做

\ifcsname foo\endcsname\csname foo\endcsname\else\ERROR\fi

以获得您想要的行为。

相关内容