控制序列\@undefined
在 pgf/tikz 源代码中出现了几次。例如,在文件中<pgf/tikz install dir>/utilities/pgfkeys.code.tex
它出现了两次:
\expandafter\ifx\csname#1\endcsname\relax%
\else%
\expandafter\ifx\csname#1\endcsname\@undefined%
\else\pgfkeys@csname@testtrue%
\fi%
\fi
和
\ifx\foreach\@undefined
但它也出现在其他文件中。
\@undefined
不幸的是,我在 pgf/tikz 源代码中找不到 的定义。可能是我搜索得不够仔细,因为\
和这两个字母@
比较难懂。
- 什么是
\@undefined
在 pgf/tikz 源代码上下文中 - 它是否在 pgf/tikz 源代码的任何地方定义,或者它是一个已知的 TeX 控制序列(或 TeX 的某些扩展,例如 e-TeX),我只是不熟悉?
我已经考虑过这种可能性,即\@undefined
它只是一些被认为未定义的控制序列,其目的是帮助测试其他控制序列是否使用习语定义
\ifx\someControlSequence\@undefined ...
但是,如果这确实是预期用途,那么我就不理解上面的第一个例子,因为表达式
\expandafter\ifx\csname#1\endcsname\@undefined
总是会求值为false
:如果控制序列\csname#1\endcsname
已定义,这一点显而易见,如果未定义,则\csname...\endcsname
构造将把它定义为\relax
(这只是\csname...\endcsname
构造的工作方式 - 参见 TeXbook 第 20 次印刷 1991 年第 40 页上的练习 7.7)。
答案1
\@undefined
是按照惯例从未定义的 csname。打破这一惯例是个坏主意,因为几个核心 latex 命令(包括例如\caption
)都包含测试(例如您展示的测试),这些测试假设它未定义。
所以
\ifx\foreach\@undefined
测试是否\foreach
已定义
\expandafter\ifx\csname#1\endcsname\@undefined%
\else\pgfkeys@csname@testtrue%
\fi%
实际上和
\pgfkeys@csname@testtrue
因为扩展的结果\csname#1\endcsname
永远不会未定义。