是不是只有我才这么认为,或者这有点不合逻辑
\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