![在宏中自动使用 \cr 或 & (对于矩阵)?](https://linux22.com/image/479036/%E5%9C%A8%E5%AE%8F%E4%B8%AD%E8%87%AA%E5%8A%A8%E4%BD%BF%E7%94%A8%20%5Ccr%20%E6%88%96%20%26%20%EF%BC%88%E5%AF%B9%E4%BA%8E%E7%9F%A9%E9%98%B5%EF%BC%89%EF%BC%9F.png)
我正在尝试编写一个宏来抽象矩阵的不同可能表示。特别是,我们正在改变是否要将特定矩阵表示为列向量或行向量。我希望做类似以下的事情:
\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}