![使用 \protect 来概括带星号的命令的定义?](https://linux22.com/image/473694/%E4%BD%BF%E7%94%A8%20%5Cprotect%20%E6%9D%A5%E6%A6%82%E6%8B%AC%E5%B8%A6%E6%98%9F%E5%8F%B7%E7%9A%84%E5%91%BD%E4%BB%A4%E7%9A%84%E5%AE%9A%E4%B9%89%EF%BC%9F.png)
这个答案非常有帮助让我定义了自己的带星号的命令。然而,为了在标题等中使用我的命令,经过一轮奇怪而几乎令人恐惧的想法后,我设法得出了以下内容(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...
要求这些\protect
s 在标题中起作用,我将非常感激。谢谢。
答案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
。