在宏中自动使用 \cr 或 & (对于矩阵)?

在宏中自动使用 \cr 或 & (对于矩阵)?

我正在尝试编写一个宏来抽象矩阵的不同可能表示。特别是,我们正在改变是否要将特定矩阵表示为列向量或行向量。我希望做类似以下的事情:

\documentclass{article}

\usepackage{amsmath,pgffor}


\newcommand\Hor[1]{\begin{pmatrix}\foreach \n [count=\ni] in {#1} {\ifnum \ni=1 \n \else &\n \fi}\end{pmatrix}}
\newcommand\Ver[1]{\begin{pmatrix}\foreach \n [count=\ni] in {#1} {\ifnum \ni=1 \n \else \cr\n \fi}\end{pmatrix}}

\begin{document}

\section*{Some things that work}

\[
\begin{pmatrix}
 1 & 2 & 3
\end{pmatrix}
\]

\[
\begin{pmatrix}
  1 \cr 2 \cr 3
\end{pmatrix}
\]

\section*{Some things that don't}

\[
\Hor{1,2,3}
\]

\[
\Ver{1,2,3}
\]

\end{document}

具体来说,我希望能够有一个在行矩阵和列矩阵之间切换的宏,因此使用\foreach而不是仅在参数中使用&s 或s。\cr

这看起来应该很容易...我遗漏了什么?

答案1

正如 Henri 在评论中所说,\foreach循环是分组的,因此它不太适合这种类型的应用程序。您可以使用expl3's在 的每个项目之间\seq_use:Nn <seq var> {<thing>}添加:<thing><seq var>

\documentclass{article}

\usepackage{amsmath,xparse}

\ExplSyntaxOn
\seq_new:N \l_trevion_tmp_seq
\NewDocumentCommand \Hor { m }
  { \trevion_pmatrix:nn {#1} { & } } % Use main command with arg and &
\NewDocumentCommand \Ver { m }
  { \trevion_pmatrix:nn {#1} { \\ } } % Use main command with arg and \\
\cs_new_protected:Npn \trevion_pmatrix:nn #1 #2
  {
    % Split the argument at each comma, and store in the seq var
    \seq_set_from_clist:Nn \l_trevion_tmp_seq {#1}
    \begin{pmatrix}
      % Use the seq var with #2 (& or \\) between each pair of items
      \seq_use:Nn \l_trevion_tmp_seq {#2}
    \end{pmatrix}
  }
\ExplSyntaxOff

\begin{document}

\section*{Some things that work}

\[
\begin{pmatrix}
 1 & 2 & 3
\end{pmatrix}
\]

\[
\begin{pmatrix}
  1 \cr 2 \cr 3
\end{pmatrix}
\]

\section*{Some things that don't}

\[
\Hor{1,2,3}
\]

\[
\Ver{1,2,3}
\]

\end{document}

在此处输入图片描述

答案2

如果使用命令作为分隔符则会更容易,因为不需要循环。

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath,pgffor}


\newcommand\Hor[1]{{\def\,{&}\begin{pmatrix}#1\end{pmatrix}}}
\newcommand\Ver[1]{{\def\,{\\}\begin{pmatrix}#1\end{pmatrix}}}

\begin{document}

\[
\Hor{1\,2\,3}
\]

\[
\Ver{1\,2\,3}
\]

\end{document}

相关内容