为矩阵定义新的命令快捷方式

为矩阵定义新的命令快捷方式

目前,我可以创建一个命令快捷方式,根据给定的固定数量的参数生成矩阵。例如,命令

\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}
}

相关内容