\@ifundefined 实际上定义了宏吗?

\@ifundefined 实际上定义了宏吗?

是不是只有我才这么认为,或者这有点不合逻辑

\documentclass[a4paper]{article}
\begin{document}
\makeatletter
\@ifundefined{chapter}{}{}
\makeatother
\ifdefined\chapter chapter\else no chapter\fi
\end{document}

返回章节。因此实际上\@ifundefined最终定义了宏(使其等于\relax

答案1

这不是不合逻辑的历史. 你比较了

\ifdefined\chapter chapter\else no chapter\fi

但那是在 LaTeX 定义几年后添加的 e-tex 原语\@ifundefined

进行该定义的经典 TeX 方式(对于您事先不知道的 csname)是

\expandafter\ifx\csname chapter\endcsname\relax no chapter\else chapter\fi

然后定义\chapter\relax无章节的情况(以及如何\@ifundefined定义)。


请注意,在 2018 年及以后的 LaTex 版本中,的定义已被修改,因此如果之前未定义,\@ifundefined它不再将测试的命令定义为。\relax

相关内容