我已经创建了一个宏来创建 的大小2 x 1
,但我想添加一个可选参数来使其成为2 x 1
,或者3 x 1
取决于您是否选择第三个参数。当前的实现是,
\NewDocumentCommand{\Vector}{ m m}{%
\ensuremath{%
\begin{bmatrix}
#1 \\
#2
\end{bmatrix}
}
}
如何才能实现这一点以便我可以调用\Vector{1}{2}
或\Vector{1}{2}{3}
?
答案1
你可能想做
\NewDocumentCommand{\Vector}{mmo}{%
\begin{bmatrix} #1 \\ #2 \IfValueT{#3}{\\ #3} \end{bmatrix}%
}
但我不确定你真的想要
\Vector{1}{2} \Vector{1}{2}[3]
这在打字稿中很难看清。
\documentclass{article}
\usepackage{amsmath}
\NewDocumentCommand{\Vector}{mmo}{%
\begin{bmatrix} #1 \\ #2 \IfValueT{#3}{\\ #3} \end{bmatrix}%
}
\begin{document}
\[
\Vector{1}{2} \quad \Vector{1}{2}[3]
\]
\end{document}
我发现管理列表要简单得多:
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\Vector}{m}
{
\begin{bmatrix}
\clist_use:nn { #1 } { \\ }
\end{bmatrix}
}
\ExplSyntaxOff
\begin{document}
\[
\Vector{1,2} \quad \Vector{1,2,3} \quad \Vector{1,2,3,4}
\]
\end{document}
如果您不喜欢用逗号作为分隔符而更喜欢用分号,那么您可以按如下方式操作。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\Vector}{m}
{
\begin{bmatrix}
\seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
\seq_use:Nn \l_tmpa_seq { \\ }
\end{bmatrix}
}
\ExplSyntaxOff
\begin{document}
\[
\Vector{1;2} \quad \Vector{1;2;3} \quad \Vector{1;2;3;4}
\]
\end{document}
笔记我删除了\ensuremath
在这种情况下和其他几种情况下没有任何实际用处的内容。这是
我的活动 DUUE(不要使用不必要的 Ensuremath)的一部分。
答案2
您的宏可以打开一个空文件\tmp
,然后测试下一个字符是否{
使用\futurelet
原始字符。如果为真,则读取参数并将其添加到\tmp
。如果为假,则关闭所有参数的读取并\left[\matrix{\tmp}\right]
打印。
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\Vector{\def\tmp{}\futurelet\next\VectorA}
\def\VectorA{\ifx\next\bgroup \expandafter\VectorB \else \expandafter\VectorC\fi}
\def\VectorB#1{\addto\tmp{#1\cr}\futurelet\next\VectorA}
\def\VectorC{\left[\matrix{\tmp}\right]}
test:
$$
\Vector{1}{2}, \Vector{2}{3}{4}, \Vector{4}{5}{6}{7}
$$
答案3
这是一个命令\Vector
,它接受任意数量的条目,这些条目之间用逗号分隔。还有一个可选参数可以更改间距。默认设置为3ex
,即条目基线之间的距离(而不是之间的空间)。更改的值\vecspace
以设置不同的默认值。
用法是\Vector[<spacing>]{a_1, a_2, ..., a_n}
。请参阅下面的代码以了解示例。
\documentclass{article}
\usepackage{tikz,amsmath}
\newcommand{\vecspace}{3ex}
\newcommand{\Vector}[2][\vecspace]{\left[\tikz[baseline]{
\foreach \c[count=\n] in {#2}{\xdef\numb{\n}}
\foreach \c[count=\n] in {#2}{
\node[inner sep=0, anchor=base] at (0,{(\numb/2-\n+.5)*#1}){\c};
}}\right]
}
\begin{document}
\[
\Vector{1,2},\Vector{1,2,3},\Vector{1,2,3,4},\Vector[4ex]{1,2,3,4}
\]
\end{document}