以下程式碼無法編譯:
\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{%