目前,我可以创建一个命令快捷方式,根据给定的固定数量的参数生成矩阵。例如,命令
\newcommand{\MAT}[4]{\begin{bmatrix}
#1 & #2 \\
#3 & #4 \\
\end{bmatrix}
}
生成一个逐行输入参数的矩阵。我的问题是:有没有办法定义一个类似的矩阵,但适用于任何维度,尤其是非方阵?
我希望能够有两个参数来定义矩阵的维度,然后是任意数量的参数,每个条目都沿行添加。类似\MAT{2}{2}{a}{b}{c}{d}
这样的输出 2x2 矩阵,其中包含条目 a、b、c、d 就很好了。
答案1
我认为
\MAT{a,b;c,d}
比...短得多
\MAT{2}{2}{a}{b}{c}{d}
甚至不需要指定行数和列数。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\MAT}{m}
{
\begin{bmatrix}
\__dee_mat_rows:n { #1 }
\end{bmatrix}
}
\cs_new_protected:Nn \__dee_mat_rows:n
{
\seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
\seq_map_function:NN \l_tmpa_seq \__dee_mat_cols:n
}
\cs_new_protected:Nn \__dee_mat_cols:n
{
\clist_use:nn { #1 } { & } \\
}
\ExplSyntaxOff
\begin{document}
\begin{gather*}
\MAT{a,b;c,d} \quad \MAT{a,b,c} \quad \MAT{a;b;c}
\\
\MAT{11,12,13,14,15,16;21,22,23,24,25,26}
\quad
\MAT{11,12;21,22;31,32;41,42}
\end{gather*}
\end{document}
这个想法是在分号处拆分参数。然后我们映射块:每个块都是一个逗号分隔的列表,并&
插入到项目之间;最后一个\\
结束行。
请注意,没有什么可以阻止你输入
\MAT{
11 , 12 , 13 ;
21 , 22 , 23 ;
31 , 32 , 33
}
参数中的逗号或分号周围的空格和换行符(但不是空行)是可选的。
答案2
例如,您的宏\MAT
可以如下所示:
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\newcount\MATcol \newcount\MATitems
\def\MAT#1#2{\def\MATc{#2}\MATcol=#2 \MATitems=#1 \multiply\MATitems by\MATcol
\def\MATbuf{}\MATa}
\def\MATa#1{%
\addto\MATbuf{#1}
\advance\MATcol by-1 \advance\MATitems by-1
\ifnum\MATcol=0 \addto\MATbuf{\cr}\MATcol=\MATc\relax \else \addto\MATbuf{&}\fi
\ifnum\MATitems>0 \expandafter\MATa \else \expandafter\MATb \fi
}
\def\MATb{
\begin{bmatrix}
\MATbuf
\end{bmatrix}
}