考虑以下命令:
\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
意味着逗号的行为类似于活动字符;活动逗号的定义以间接方式给出,以免与作为活动字符的其他可能含义相冲突。