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 \@ifdefinable
se implementa internamente.
Pregunta.¿Existe una buena solución que no implique cambiar el nombre \foo
o reemplazarlo \@ifdefinable
con un comando diferente? (En mi situación actual, \foo
lo proporciona un paquete y \@ifdefinable
lo utiliza otro paquete).
Respuesta1
El argumento \@ifdefinable
debe ser una secuencia de control, no una cadena de caracteres. El error es falso debido al hecho de que \@ifdefinable
se 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 \foo
no 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{%