當 `\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{%

相關內容