Как использовать `\@ifdefinable{xfoo}{...}`, если `\foo` уже определен?

Как использовать `\@ifdefinable{xfoo}{...}`, если `\foo` уже определен?

Следующий код не компилируется:

\documentclass{article}
\makeatletter
\newcommand{\foo}{xyzzy}

\@ifdefinable{xfoo}{\relax}
\makeatother

\begin{document}
...
\end{document}  

Точнее, происходит следующая ошибка:

LaTeX Error: Command \foo already defined.
Or name \end... illegal, see p.192 of the manual.

По сути, это связано с тем, как \@ifdefinableэто реализовано внутри.

Вопрос.Есть ли хорошее решение, не требующее переименования \fooили замены \@ifdefinableна другую команду? (В моей реальной ситуации \fooпредоставляется одним пакетом и \@ifdefinableиспользуется другим пакетом.)

решение1

Аргумент to \@ifdefinableдолжен быть управляющей последовательностью, а не строкой символов. Ошибка ложная из-за того, что \@ifdefinableудаляет первый символ в строковой форме аргумента, предполагая, что это обратная косая черта.

Так что вам следует сделать

\@ifdefinable{\xfoo}{...}

Возможно, вы путаете это с \@ifundefined: если вы хотите узнать, \fooявляется ли undefined (или \relax), тест будет

\@ifundefined{foo}{code for undefined}{code for defined}

Это действительно ошибка в aliasctr.sty, где строка 59

 59       \@ifdefinable{c@#1}{%

и это должно быть

 59       \expandafter\@ifdefinable\csname c@#1\endcsname{%

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