¿Cómo usar `\@ifdefinable{xfoo}{...}` cuando `\foo` ya está definido?

¿Cómo usar `\@ifdefinable{xfoo}{...}` cuando `\foo` ya está definido?

El siguiente código no se puede compilar:

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

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

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

Más precisamente, falla con el siguiente error:

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

Esto se debe esencialmente a la forma en que \@ifdefinablese implementa internamente.

Pregunta.¿Existe una buena solución que no implique cambiar el nombre \fooo reemplazarlo \@ifdefinablecon un comando diferente? (En mi situación actual, \foolo proporciona un paquete y \@ifdefinablelo utiliza otro paquete).

Respuesta1

El argumento \@ifdefinabledebe ser una secuencia de control, no una cadena de caracteres. El error es falso debido al hecho de que \@ifdefinablese elimina el primer carácter en la forma encadenada del argumento, asumiendo que es una barra invertida.

Entonces deberías hacer

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

Quizás estés confundiendo esto con \@ifundefined: si quieres ver si \foono está definido (o \relax) la prueba es

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

De hecho, esto es un error en aliasctr.sty, donde la línea 59 es

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

y debería ser

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

información relacionada