使用 \protect 来概括带星号的命令的定义?

使用 \protect 来概括带星号的命令的定义?

这个答案非常有帮助让我定义了自己的带星号的命令。然而,为了在标题等中使用我的命令,经过一轮奇怪而几乎令人恐惧的想法后,我设法得出了以下内容(MWE):

\documentclass{article}
\makeatletter
\def\testone{\@ifstar\@dothis\@@dothat}
\def\testtwo{\protect\@ifstar\protect\@dothis\protect\@@dothat}
\def\@dothis#1{#1}
\def\@@dothat#1{#1}
\makeatother
\begin{document}
\section{\testone{abc}} % does not work
\testone{abc} % works
\section{\testtwo{abc}} % works
\testtwo{abc} % works
\end{document}

我仍在努力理解TeX的扩展机制,因此,如果能回答为什么我的定义\test...要求这些\protects 在标题中起作用,我将非常感激。谢谢。

答案1

\protect这些地方是错误的。

如果你想让它变得\testtwo健壮,你需要使用

\newcommand{\testtwo}{}% for safety against redefining
\DeclareRobustCommand{\testtwo}{\@ifstar\@dothis\@@dothat}

但使用起来更简单\NewDocumentCommand

\NewDocumentCommand{\test}{sm}{%
  \IfBooleanTF{#1}{% there is a *
    called #1 with *%
  }{% no star
    called #1 without *%
  }%
}

texdoc usrguide欲了解有关 的更多信息\NewDocumentCommand

相关内容