我想创建一个可以接受任意数量参数的新命令,并将它们连接起来。例如,
\foo{a}{b}{c}
将给我\left[a,\ b,\ c\right]
,但应该适用于任意数量的变量,而不仅仅是 3 个。
谢谢!
答案1
我坚信这样的语法\foo{a,b,c}
比提议的语法要简单得多\foo{a}{b}{c}
,特别是当您有三个以上的项目时。
您只需要转换输入即可获得您想要的内容,这是 TeX 的工作。
有多种方法可以做到这一点,从为手头的任务烹饪到使用预定义的工具。
我不会使用“反斜杠空格”,因为它会增加太宽的空格,但这是您的选择,您只需\,
在下面的代码中用“反斜杠空格”替换即可。
\documentclass{article}
\usepackage{mathtools} % for \DeclarePairedDelimiterX
\ExplSyntaxOn
\DeclarePairedDelimiterX{\foo}[1]{[}{]}
{
\fuzzylumpkins_foo:n { #1 }
}
\clist_new:N \l__fuzzylumpkins_foo_clist
\cs_new_protected:Nn \fuzzylumpkins_foo:n
{
\clist_set:Nn \l__fuzzylumpkins_foo_clist { #1 }
\clist_use:Nn \l__fuzzylumpkins_foo_clist { ,\, }
}
\ExplSyntaxOff
\begin{document}
$\foo{a,b,c}$ $\foo[\big]{a,b,c,d,e,f}$
\bigskip
$\foo*{\dfrac{1}{2},\sqrt{2},x-y}$
\bigskip
$\displaystyle\foo[\bigg]{\sum_{k}a_k,\int f(x)\,dx}$
$\displaystyle\foo*{\sum_{k}a_k,\int f(x)\,dx}$
\end{document}
请注意,我避免添加\left
和\right
,因为它实际上并没有按您的想法执行。最好像第二个示例一样手动指定大小,并且仅在真正必要时才使用自动调整大小。
比较第四和第五个例子,我认为第四个例子看起来好得多。
答案2
“凡事都可行,但不都有益处。”哥林多前书 10:23
这将是一种奇怪的语法,但它肯定是可行的:你想要做的是查看下一个字符并查看它是否是,{
如果是,我们抓住一个参数,否则,我们关闭列表。
以下是一些未经测试的代码:
\makeatletter
\def\foo#1{\left[#1\next@foo}
\def\continue@foo#1{
,#1\next@foo
}
\def\next@foo{\@ifnextchar\bgroup\continue@foo\@endfoo}
\def\end@foo{\right]}
\makeatother
这会要求所有参数(第一个除外)都括在括号中。
答案3
使用单个参数列表格式传递列表似乎更容易。下面是使用etoolbox
的列表处理能力:
\documentclass{article}
\usepackage{etoolbox}
% https://tex.stackexchange.com/a/89187/5764
\newcommand{\foo}[2][,\ ]{%
\def\itemdelim{\def\itemdelim{#1}}% Item delimiter delayed by one cycle
\renewcommand*{\do}[1]{\itemdelim##1}% How each item is processed
\left[\docsvlist{#2}\right]}% Process CSV list
\begin{document}
$\left[ a, b, c \right]$
$\left[ a,\ b,\ c \right]$
$\foo{a, b, c}$
$\foo{a,b,c}$
\end{document}