高效地将多个参数传递到 \newcommand

高效地将多个参数传递到 \newcommand

假设我定义一个\newcommand具有多个参数的,如本例所示:

\documentclass{article}
\newcommand{\testing}[9]{#1,\ #2,\ #3,\ #4,\ #5,\ #6,\ #7,\ #8,\ #9}

\begin{document}
\title{Test}
\maketitle
\begin{equation}
    \testing{S_1}{S_2}{S_3}{S_4}{S_5}{S_6}{S_7}{S_8}{S_9}
\end{equation}
\end{document}

如果我调用命令\testings,我必须将每个单独的参数放在其自己的花括号内(据我所知)。有没有更有效的方法将这些参数传递给命令\testings?例如,更类似于\testings{S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_8,S_9}

注意:上面的例子很简单。更现实的例子可能是这样的\newcommand{\limset}[3]{\lim_{#1 \rightarrow #2^{#3}}

答案1

更现实的例子可以通过使用设施轻松处理xparse

\NewDocumentCommand{\limset}{>{\SplitArgument{2}{,}}m}{%
  \finallimset#1%
}
\NewDocumentCommand{\finallimset}{mmm}{%
  \lim_{#1\rightarrow #2\IfValueT{#3}{^{#3}}}%
}

完整示例:

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\limset}{>{\SplitArgument{2}{,}}m}{%
  \finallimset#1%
}
\NewDocumentCommand{\finallimset}{mmm}{%
  \lim_{#1\rightarrow #2\IfValueT{#3}{^{#3}}}%
}

\begin{document}

\[
\limset{x,0}f(x)
\qquad
\limset{x,0,+}g(x)
\]

\end{document}

在此处输入图片描述

使用预处理器,\SplitArgument{2}{,}您可以告诉 LaTeX 用逗号拆分参数,最多两个。然后#1实际上会变成{A}{B}{C},其中ABC代表三部分。如果最后一个缺失,它将收到-NoValue-可以用测试的特殊值\IfValueT:如果没有-NoValue-,则执行所述操作,否则忽略它。

然后将拆分参数传递给辅助宏\finallimset,该宏必须具有所述的三个参数。

答案2

\usepackage{xparse}
\NewDocumentCommand \testings { m }
 {
  \clist_set:Nn \l_tmpa_clist { #1 }
  \clist_use:Nn \l_tmpa_clist { ,\ }
 }
\NewDocumentCommand \limset { m }
 {
  \clist_set:Nn \l_tmpa_clist { #1 }
  \lim
  \sb % note \sb rather than _
   {
    \clist_item:Nn \l_tmpa_clist { 1 }
    \to
    \clist_item:Nn \l_tmpa_clist { 2 }
    ^ { \clist_item:Nn \l_tmpa_clist { 3 } }
   }
 }

然后:$\testings{S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_8,S_9,S_{10},S_{11},S_{12}}$$\limset{t,0,+}$应该可以工作了。

相关内容