假设我定义一个\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}
,其中A
,B
和C
代表三部分。如果最后一个缺失,它将收到-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,+}$
应该可以工作了。