\@ifundefined realmente define macros?

\@ifundefined realmente define macros?

Sou só eu ou é um pouco ilógico isso

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

retornacapítulo. Então, basicamente \@ifundefined, acaba definindo a macro (tornando-a igual a \relax)

Responder1

Não é ilógico, éhistórico. Você comparou com

\ifdefined\chapter chapter\else no chapter\fi

Mas essa é uma primitiva e-tex adicionada alguns anos depois da definição do LaTeX \@ifundefined.

A maneira clássica do TeX de fazer essa definição (para um csname que você não conhece de antemão) é

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

e essafazdefina \chapterpara estar \relaxno caso sem capítulo (e é como \@ifundefinedé definido).


Observe que nas versões LaTex de 2018 em diante, a definição de \@ifundefinedfoi modificada para que não defina mais o comando testado como sendo \relaxse ele era anteriormente indefinido.

informação relacionada