自定义命令的参数是否以逗号分隔列表?

自定义命令的参数是否以逗号分隔列表?

考虑以下命令:

 \newcommand{\vektor}[3]{\left(\negthinspace\begin{smallmatrix}#1\\#2\\#3    \end{rsmallmatrix}
 \right)}

我可以像使用它一样

$\vektor{1}{2}{3}$

现在我的问题是是否可以重新定义命令,使得参数是逗号分隔的列表,这样我可以写:

$\vektor{1,2,3}$

答案1

\def如果您不介意将参数放在非括号的分隔符内,那么使用 可以轻松完成此类操作。

\documentclass{minimal}
\usepackage{amsmath}
\def\vektor(#1,#2,#3) {\left(\negthinspace\begin{smallmatrix}#1\\#2\\#3 \end{smallmatrix} \right)}
\begin{document}
\[ \vektor(a,b,c) \]
\end{document}

显然,如果用大括号代替圆括号,上述情况就会出现严重错误。

编辑

请参阅 Ryan Reich 的回答(或 Aditya 的评论)以了解允许您使用大括号的巧妙修改。

答案2

\def如果您使用两个步骤将 Ian Thompson 的代码隐藏在另一个宏中,那么您也可以使用括号来完成此操作。

\documentclass{minimal}
\usepackage{amsmath}
\def\vektor#1{\innervector(#1)}
\def\innervector(#1,#2,#3) {\left(\negthinspace\begin{smallmatrix}#1\\#2\\#3 \end{smallmatrix} \right)}
\begin{document}
\[ \vektor{a,b,c} \]
\end{document}

答案3

事后想想。你可以使用可变数量的参数和不同的行或列分隔符使其更加通用

\documentclass{article}
\usepackage{amsmath}
\makeatletter

\newcommand\myvector[2][\\]{%
    \global\def\my@delim{#1}%
    \left(\negthinspace\begin{smallmatrix}
        \my@vector #2,\relax\noexpand\@eolst%
    \end{smallmatrix}\right)}

\def\my@vector #1,#2\@eolst{%
   \ifx\relax#2\relax
      #1
   \else
      #1\my@delim
      \my@vector #2\@eolst%
   \fi}

\makeatother
\begin{document}
$x   = \myvector{1,2,3,:}$ and
$x^T = \myvector[,&]{1,2,3,...}$
\end{document}

这将使

在此处输入图片描述

答案4

\documentclass[a4paper]{article}
\usepackage{amsmath} % for smallmatrix

\begingroup\lccode`~=`,
  \lowercase{\endgroup\def\vekcomma{\mathcode`\,=\string"8000 \def~{\\}}}
\newcommand\vektor[1]{\left(\vekcomma
  \!\begin{smallmatrix}
  #1
  \end{smallmatrix}\!\right)}

\begin{document}
$a,b\vektor{a,b,c,d}\vektor{x,y,z}$
\end{document}

您不必局限于三个部分。该a,b部分旨在表明在参数之外使用逗号\vektor是允许的。

事实是\left-\right组成一个组,这很重要,因为这可以确保对逗号的更改\mathcode仅限于该位置。特殊的数学代码"8000意味着逗号的行为类似于活动字符;活动逗号的定义以间接方式给出,以免与作为活动字符的其他可能含义相冲突。

相关内容