是否可以定义两个宏,它们使用相同的命令,但需要的参数数量不同?然后,根据用户提供的参数数量,使用其中一个。以下是示例:
\newcommand{\com}[1]{\text{com}({#1},r_{#1})}
\newcommand{\com}[2]{\text{com}({#1},{#2})}
答案1
以下是可能有效的方法。您可以在单个强制参数中预期和/或处理任意数量的条目。每个条目都可以通过适当的
\clist_item:Nn \l_tmpa_clist {item number goes here}
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\mycommand{m}{
\int_case:nnTF {\clist_count:n{#1}}{
% if a single item, do stuff with it
{1}{you~entered~\clist_item:nn {#1} {1}}
% if two items, do stuff with them
{2}{you~entered~\clist_item:nn {#1}{1}~and~\clist_item:nn{#1}{2}}
% if more items etc.
}
{} % <-if any of the cases above match, do this, here nothing
{\msg_error:nn {mycommand}{wrong~number~of~arguments~to~mycommand}}%<- if no cases match, do something, here issue an error.
}
\ExplSyntaxOff
\begin{document}
\mycommand{blue}
\mycommand{blue,green}
\mycommand{blue,green,yellow}
\end{document}
答案2
不,但是你可以
\NewDocumentCommand{\com}{mo}{%
\operatorname{com}(#1,\IfNoValueTF{#2}{r_{#1}}{#2})%
}
并调用
\com{x}
或者
\com{x}[y]
如果r_
在任何一种情况下都应该使用,定义可以更简单
\NewDocumentCommand{\com}{mO{#1}}{%
\operatorname{com}(#1,r_{#2})%
}
事实上,它是有可能。是否要打破 LaTeX 的所有语法惯例并准备好不时得到奇怪的输出取决于你。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\com}{}
{
\peek_regex_replace_once:nn
{ ( \{ [^\}]* \} )* } % search all braced groups
{ \c{lorenzo_com:n} \{\0\} } % pass them as single argument to \lorenzo_com:n
}
\cs_new_protected:Nn \lorenzo_com:n
{
\operatorname{com}
\int_case:nnF { \tl_count:n { #1 } }
{
{0}{}
{1}{\__lorenzo_com:n #1}
}
{\__lorenzo_com:nn #1}
}
\cs_new_protected:Nn \__lorenzo_com:n { (#1,r\sb{#1}) }
\cs_new_protected:Nn \__lorenzo_com:nn { (#1,#2) }
\ExplSyntaxOff
\begin{document}
$\com{x}+y$
$\com{x}{y}+z$
$\com{x} {y}+z$
$\com{x}{y}{z}+u$
\end{document}