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