使用不同数量参数创建元组的新命令

使用不同数量参数创建元组的新命令

我想创建一个可以接受任意数量参数的新命令,并将它们连接起来。例如, \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}

相关内容