\@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

Но это примитив e-tex, добавленный через несколько лет после определения LaTeX \@ifundefined.

Классический способ TeX сделать такое определение (для csname, которое вы заранее не знаете) —

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

и чтоделаетопределить \chapter, чтобы быть \relaxв случае отсутствия главы (и как это \@ifundefinedопределено).


Обратите внимание, что в версиях LaTex с 2018 года определение \@ifundefinedбыло изменено таким образом, что теперь оно больше не определяет тестируемую команду как , \relaxесли ранее она была неопределена.

Связанный контент