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

(事前に分からないcsnameに対して)その定義を作成するための古典的なTeXの方法は次のとおりです。

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

そしてする章がない場合に定義します(定義方法は次のとおり\chapterです)。\relax\@ifundefined


2018 年以降の LaTex リリースでは、 の定義が\@ifundefined変更され、\relax以前は定義されていなかった場合、テストされたコマンドが として定義されなくなったことに注意してください。

関連情報