LaTeX 中的多态宏?

LaTeX 中的多态宏?

是否可以定义两个宏,它们使用相同的命令,但需要的参数数量不同?然后,根据用户提供的参数数量,使用其中一个。以下是示例:

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

在此处输入图片描述

相关内容