如何利用可选参数来实现灵活的向量大小?

如何利用可选参数来实现灵活的向量大小?

我已经创建了一个宏来创建 的大小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}

相关内容