Der folgende Code kann nicht kompiliert werden:
\documentclass{article}
\makeatletter
\newcommand{\foo}{xyzzy}
\@ifdefinable{xfoo}{\relax}
\makeatother
\begin{document}
...
\end{document}
Genauer gesagt schlägt es mit dem folgenden Fehler fehl:
LaTeX Error: Command \foo already defined.
Or name \end... illegal, see p.192 of the manual.
Dies liegt im Wesentlichen an der Art und Weise \@ifdefinable
der internen Umsetzung.
Frage.Gibt es eine gute Problemumgehung, die kein Umbenennen \foo
oder Ersetzen \@ifdefinable
durch einen anderen Befehl erfordert? (In meiner tatsächlichen Situation \foo
wird es von einem Paket bereitgestellt und \@ifdefinable
von einem anderen Paket verwendet.)
Antwort1
Das Argument \@ifdefinable
sollte eine Steuersequenz und keine Zeichenfolge sein. Der Fehler ist unbegründet, da \@ifdefinable
das erste Zeichen in der Zeichenfolgenform des Arguments entfernt wird, vorausgesetzt, es handelt sich um einen Backslash.
Das sollten Sie tun
\@ifdefinable{\xfoo}{...}
Sie verwechseln dies möglicherweise mit \@ifundefined
: Wenn Sie sehen möchten, ob \foo
undefiniert ist (oder \relax
), ist der Test
\@ifundefined{foo}{code for undefined}{code for defined}
Dies ist in der Tat ein Fehler in aliasctr.sty
, wo Zeile 59 ist
59 \@ifdefinable{c@#1}{%
und es sollte
59 \expandafter\@ifdefinable\csname c@#1\endcsname{%