Wie verwende ich `\@ifdefinable{xfoo}{...}`, wenn `\foo` bereits definiert ist?

Wie verwende ich `\@ifdefinable{xfoo}{...}`, wenn `\foo` bereits definiert ist?

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 \@ifdefinableder internen Umsetzung.

Frage.Gibt es eine gute Problemumgehung, die kein Umbenennen \foooder Ersetzen \@ifdefinabledurch einen anderen Befehl erfordert? (In meiner tatsächlichen Situation \foowird es von einem Paket bereitgestellt und \@ifdefinablevon einem anderen Paket verwendet.)

Antwort1

Das Argument \@ifdefinablesollte eine Steuersequenz und keine Zeichenfolge sein. Der Fehler ist unbegründet, da \@ifdefinabledas 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 \fooundefiniert 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{%

verwandte Informationen