以下代码无法编译:
\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{%