当 `\foo` 已定义时,如何使用 `\@ifdefinable{xfoo}{...}`?

当 `\foo` 已定义时,如何使用 `\@ifdefinable{xfoo}{...}`?

以下代码无法编译:

\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

的参数\@ifdefinable应该是控制序列,而不是字符串。这个错误是虚假的,因为\@ifdefinable删除了参数字符串形式中的第一个字符(假设它是一个反斜杠)。

所以你应该这样做

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

你可能会混淆这一点\@ifundefined:如果你想看看是否\foo未定义(或\relax),测试是

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

这确实是 中的一个错误aliasctr.sty,其中第 59 行是

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

而且应该是

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

相关内容