我有一个定义如下的命令
\documentclass{article}
\makeatletter%
\newcommand{\@withstar}[3]{We have star #1, #2, #3}
\newcommand{\@withoutstar}[3]{We have #1, #2, #3}
\DeclareRobustCommand\mycmd{%
\@ifnextchar *%
{\@firstoftwo{\@withstar}} %
{\@withoutstar}
}%
\makeatother%
\begin{document}
\mycmd{first}{second}{and third}
\mycmd*{first}{second}{and third}
\end{document}
我想定义另一个命令,它只传递下一个字符\mycmd
并设置特定的参数。类似于
\newcommand\newcmd[1]{\mycmd\nextchar{first}{,second}}
然后我可以这样称呼它
\newcmd{and third}
或者
\newcmd*{and third}
@ifnextchar
我知道我可以在 的定义中重复测试下一个字符(使用) \newcmd
,但如果可能的话我想避免这样做,因为在我的实际情况中\mycmd
测试许多字符,而不仅仅是 *。
答案1
就像是
\def\newcmd#1#{\mycmd#1{first}{,second}}
#1
将是\newcmd
和之间的所有标记,{
其将为空或*
在您的示例中。
答案2
没有代码重复,xparse
也没有辅助宏:
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\mycmd}{smmm}{%
\IfBooleanTF{#1}
{We have star #2, #3, #4}
{We have #2, #3, #4}%
}
\NewDocumentCommand{\newcmd}{sm}{%
\IfBooleanTF{#1}{\mycmd*}{\mycmd}{first}{second}{#2}%
}
\begin{document}
\mycmd{first}{second}{and third}
\mycmd*{first}{second}{and third}
\newcmd{and third}
\newcmd*{and third}
\end{document}