我想知道是否有任何方法可以在 LaTeX 中迭代定义矩阵?例如,假设我想编写以下矩阵:
当然,我可以使用 bmatrix 环境手动编写此矩阵,但为了便于论证,如果示例大得多,手动添加每个条目会很麻烦,该怎么办?那么最好能够使用宏定义矩阵(为清楚起见,使用伪代码语法):
#the matrix is size [m,n]
mymatrix = []
for i in range(m)
for j in range(n)
mymatrix[i,j] = \frac{G}{r^{2}_{i,j}}
endfor
endfor
不幸的是,虽然我以前用过 LaTeX,但我从未使用过宏,所以我不知道从哪里开始做这样的事情,或者是否有可能。我重新发布了这个问题,因为我之前在 stack overflow 上发布过它,但没有得到任何评论。
谢谢您的帮助!
答案1
答案2
一个相当通用的矩阵生成宏:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse,xfp}
\ExplSyntaxOn
\NewDocumentCommand{\generatematrix}{O{b}mmmO{0pt}}
{% #1 = fence (default b)
% #2 = n. of rows
% #3 = n. of cols
% #4 = entry template
% #5 = extra spacing
\sandalwood_matrix_generate:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
}
\tl_new:N \l__sandalwood_matrix_body_tl
\cs_new_protected:Nn \sandalwood_matrix_generate:nnnnn
{
\group_begin:
\cs_set_protected:Nn \__sandalwood_matrix_entry:nn { #4 }
\tl_clear:N \l__sandalwood_matrix_body_tl
% generate the first m-1 rows, with the possible extra spacing in between
\int_step_inline:nn { #2 - 1 }
{
% the first object in a row gobbles a spurious &
\tl_put_right:Nn \l__sandalwood_matrix_body_tl { \use_none:n }
% fill the row
\int_step_inline:nn { #3 }
{
\tl_put_right:Nn \l__sandalwood_matrix_body_tl
{
& \__sandalwood_matrix_entry:nn { ##1 } { ####1 }
}
}
% add the extra spacing at the end of a row
\tl_put_right:Nn \l__sandalwood_matrix_body_tl { \\ \noalign{\vspace{#5}} }
}
% fill the last row
\tl_put_right:Nn \l__sandalwood_matrix_body_tl { \use_none:n }
\int_step_inline:nn { #3 }
{
\tl_put_right:Nn \l__sandalwood_matrix_body_tl
{
& \__sandalwood_matrix_entry:nn { #2 } { ##1 }
}
}
\begin{#1matrix}
\tl_use:N \l__sandalwood_matrix_body_tl
\end{#1matrix}
\group_end:
}
\ExplSyntaxOff
\newcommand{\hilbertmatrix}[1]{%
\generatematrix{#1}{#1}{\frac{1}{\inteval{##1+##2-1}}}[1ex]%
}
\begin{document}
\[
\generatematrix{5}{5}{\dfrac{G}{r_{#1#2}^2}}[1ex]=
\generatematrix[v]{6}{4}{a_{#1,#2}}+\hilbertmatrix{4}
\]
\end{document}
前导可选参数(默认b
)用于以标准amsmath
方式说明栅栏的形状。尾随的强制参数应为长度(行之间的额外空间)。
的第三个强制参数\generatematrix
是模板,其中#1
表示行索引和#2
列索引。我添加了如何根据定义宏来\generatematrix
说明如果我们在定义中使用它,我们需要将它们转换为##1
和##2
。
我知道这些操作毫无意义。