自动创建矩阵行和列的命令

自动创建矩阵行和列的命令

我想要一个命令,它的名称\RC(行列),当我使用 \RC{5}{6}(例如)时,它会产生以下输出: 在此处输入图片描述 矩阵元素定义在下面的示例中。

我的最小文件:

\documentclass{article}
\usepackage{mathtools}
\def\ndef#1{\expandafter\def\csname #1\endcsname} 
\def\usageb#1{\csname #1\endcsname}
\ndef{a11}{1}
\ndef{a22}{2}
\ndef{a33}{6}
\ndef{a44}{5}
\ndef{a55}{8}
%Define \RC
\begin{document}
\[
\begin{bmatrix}
\usageb{a11}&~&~&~&~&~\\
~&\usageb{a22}&~&~&~&~\\
~&~&\usageb{a33}&~&~&~\\
~&~&~&\usageb{a44}&~&~\\
~&~&~&~&\usageb{a55}&~
\end{bmatrix}
\]
Now I want to \verb|\RC{5}{6}| make the above structure.
%\RC{5}{6}
\end{document}

谢谢

答案1

这个怎么样?

\documentclass{article}
\usepackage{mathtools}
\usepackage{pgffor}
% Use a special prefix for the stored entries so we are less likely to overwrite any 
% other commands (not that it's very likely there is an existing macro called "\a11"...)
\newcommand\setmatrixentry[1]{\expandafter\def\csname matrixentry@@#1\endcsname}
\newcommand\usematrixentry[3]{%
    \expandafter\ifx\csname matrixentry@@#1#2#3\endcsname\relax\else
        \csname matrixentry@@#1#2#3\endcsname
    \fi
}
% #1 -- name of matrix
% #2 -- number of rows
% #3 -- number of columns
% We accumulate the matrix we are building in temporary variables 
% "\tempmatrix" and "\temprow". Use pgf "\foreach" for iteration.
\newcommand\printmatrix[3]{%
    \gdef\tempmatrix{}%
    \foreach\y in {1,...,#2}{%
        \gdef\temprow{}%
        \foreach \x in {1,...,#3} {%
            \xdef\temprow{%
                \unexpanded\expandafter{\temprow}%
                \ifnum\x=1\relax\else&\fi % Only add an "&" if this isn't the first entry
                \usematrixentry{#1}{\y}{\x}%
            }%
        }%
        \xdef\tempmatrix{%
            \unexpanded\expandafter{\tempmatrix}%
            \unexpanded\expandafter{\temprow}%
            \noexpand\\
        }%
    }%
    \begin{bmatrix}%
    \tempmatrix
    \end{bmatrix}%
}

\begin{document}

\setmatrixentry{a11}{1}
\setmatrixentry{a22}{2}
\setmatrixentry{a33}{6}
\setmatrixentry{a44}{5}
\setmatrixentry{a55}{8}

\[\printmatrix{a}{5}{5}\]

\[\printmatrix{a}{5}{6}\]
\end{document} 

答案2

您可以使用更方便的语法expl3

该命令\definematrix以符号名称和形式为{ij}{x}(1 ≤ i ≤ 9, 1 ≤ j ≤ 9) 的条目列表作为参数。输入顺序无关紧要。

该命令\printmatrix将符号名称(先前定义)、要打印的行数和列数作为参数。未定义的条目将打印空白。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\definematrix}{mm}
 {% #1 = symbolic name
  % #2 = list of entries
  \madadpour_matrix_def:nn { #1 } { #2 }
 }
\NewDocumentCommand{\printmatrix}{mmm}
 {% #1 = symbolic name
  % #2 = rows
  % #3 = columns
  \madadpour_matrix_print:nnn { #1 } { #2 } { #3 }
 }

\tl_new:N \l__madadpour_matrix_body_tl

\cs_generate_variant:Nn \str_case:nnF { nv }

\cs_new_protected:Nn \madadpour_matrix_def:nn
 {
  \tl_clear_new:c { l__madadpour_matrix_#1_tl }
  \tl_set:cn { l__madadpour_matrix_#1_tl } { #2 }
 }

\cs_new_protected:Nn \madadpour_matrix_print:nnn
 {
  \tl_clear:N \l__madadpour_matrix_body_tl
  \int_step_inline:nn { #2 }
   {
    \int_step_inline:nn { #3 }
     {
      \tl_put_right:Nx \l__madadpour_matrix_body_tl
       {
        % don't add & before the first entry
        \int_compare:nF { ####1 = 1 } { & }
        \str_case:nvF { ##1 ####1 } { l__madadpour_matrix_#1_tl } { \madadpour_matrix_empty: }
       }
     }
    \tl_put_right:Nn \l__madadpour_matrix_body_tl { \\ }
   }
  \begin{bmatrix}
  \tl_use:N \l__madadpour_matrix_body_tl
  \end{bmatrix}       
 }

\cs_new_protected:Nn \madadpour_matrix_empty: { \phantom{0} }

\ExplSyntaxOff

\definematrix{a}{
  {11}{1}
  {22}{2}
  {33}{6}
  {44}{5}
  {55}{8}
}

\definematrix{b}{
  {11}{-1}
  {12}{3}
  {21}{2}
  {22}{4}
}

\begin{document}

\[
\printmatrix{a}{5}{6} \qquad \printmatrix{b}{2}{2}
\]

\end{document}

执行。\definematrix命令仅填充一个标记列表变量。\printmatrix我们通过启动两个嵌套循环来填充一个新的标记列表变量:首先在行上循环,然后在列上循环;对于每个位置 (i,j),我们查找是否已设置条目并使用它,否则打​​印一个空白 ( \phantom{0})。同时,在行末&添加单元格之间的分隔符。\\

最后将构建好的token列表输出到bmatrix环境内部。

在此处输入图片描述

相关内容