Следующий код не компилируется:
\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{%