将下一个字符传递给命令

将下一个字符传递给命令

我有一个定义如下的命令

\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}

相关内容