我想定义一个排版列向量的命令。
对于一个向量,我可以有类似的东西:
\left(
\begin{array}{c}
a\\
b\\
\end{array}
\right)
我希望命令能够生成这样的向量,无论是 2 个还是 3 个参数。\colvec{a}{b}{c}
应该生成与上面相同的向量,但多一个条目,其中\colvec{a}{b}
将生成上面的向量。我该怎么做?我尝试过重载命令名称,但那是不可能的。
答案1
请注意,向量周围有额外的空间。您可能应该使用类似(pmatrix
是包的一部分amsmath
)的东西
\begin{pmatrix}a\\b\end{pmatrix}
标准 LaTeX\newcommand
提供了一种拥有单个可选参数的方法。
\newcommand*\colvec[3][]{
\begin{pmatrix}\ifx\relax#1\relax\else#1\\\fi#2\\#3\end{pmatrix}
}
\colvec[a]{b}{c}
请注意,如果您想要三个元素或者两个元素,则必须使用\colvec{a}{b}
。
更新
根据您在评论中的请求,这里有一个根据第一个参数传递的数字获取任意数量元素的函数。
\newcount\colveccount
\newcommand*\colvec[1]{
\global\colveccount#1
\begin{pmatrix}
\colvecnext
}
\def\colvecnext#1{
#1
\global\advance\colveccount-1
\ifnum\colveccount>0
\\
\expandafter\colvecnext
\else
\end{pmatrix}
\fi
}
您可以完全按照自己的需要使用它\colvec{5}{a}{b}{c}{d}{e}
。
答案2
这是一种更“TeX”的方法。行数是任意的。列默认右对齐,但也可以是 c 或 l:
\documentclass{article}
\makeatletter
\newcommand{\Spvek}[2][r]{%
\gdef\@VORNE{1}
\left(\hskip-\arraycolsep%
\begin{array}{#1}\vekSp@lten{#2}\end{array}%
\hskip-\arraycolsep\right)}
\def\vekSp@lten#1{\xvekSp@lten#1;vekL@stLine;}
\def\vekL@stLine{vekL@stLine}
\def\xvekSp@lten#1;{\def\temp{#1}%
\ifx\temp\vekL@stLine
\else
\ifnum\@VORNE=1\gdef\@VORNE{0}
\else\@arraycr\fi%
#1%
\expandafter\xvekSp@lten
\fi}
\makeatother
\begin{document}
\[
\Spvek{1;-2} \quad \Spvek[l]{1;-2;3}\quad \Spvek[c]{1;-2;-3}\quad\Spvek{1;2;-3;4}
\]
\end{document}
输出将是:
答案3
我想补充一下 Peter B 上面关于 \Spvek 的解决方案。是的,这是一种更“TeX”的方法,但纯“TeX”方法只有两行:
\def\spvec#1{\left(\vcenter{\halign{\hfil$##$\hfil\cr \spvecA#1;;}}\right)}
\def\spvecA#1;{\if;#1;\else #1\cr \expandafter \spvecA \fi}
$\spvec{1;2;3} + \spvec{1;2;-3;4} + \spvec{1;2}$
该解决方案也适用于 LaTeX,因为这里只使用了 TeX 原语。
答案4
这是我的类似 KISS 的解决方案(它只是一个包装pmatrix
,amsmath
灵感来自Garrys 的回答):
\newcommand{\myvec}[1]{\ensuremath{\begin{pmatrix}#1\end{pmatrix}}}
用法:
\myvec{x\\y\\z}
好处是,您不需要指定元素数量或其他任何内容。您只需使用 添加更多元素即可。与使用环境本身\\
相比,它在 tex 文件中看起来也更整洁。pmatrix
您还可以将其用于行向量:
\myvec{a&b&c}
(为了完成:显然,矩阵也有效\myvec{a&b \\ c&d}
:)