我想要一个命令,它的名称\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
环境内部。