有没有办法在 latex 中以算法方式编写方程语法?假设我想在方程中写入 N 点 DFT 矩阵,那么如果我以两个变量 m 和 n 的形式指定 NxN 矩阵的每个条目,是否可行。
这意味着如果我可以在某处指定 N 的值,那么将为该固定 n 生成 NxN DFT 矩阵的代码?我知道这需要在传统的 latex 编辑器之外完成。
示例:假设在一个教程中,我想插入一个 5x5 单位矩阵,因此我将使用 pmatrix 选项,然后手动插入 25 个值,但是,如果第二天我想显示 3x3 矩阵,那么我将不得不手动删除 16 个条目。但请注意,这里的参数 5 和 3 完全指定了我要编写的代码,那么是否有智能的东西可以在我指定参数后自动生成单位矩阵的代码?
谢谢
答案1
你是指这样的吗?
您可以定义适当的函数,如下所示,其中#1
和#2
分别表示行和列索引。这里expl3
使用语法来定义其中的几个,但您可以使用任何您喜欢的。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\generatematrix}{O{p}mm}
{% #1 = optional delimiters, default p
% #2 = function
% #3 = matrix size
\begin{#1matrix}
\kutsit_generatematrix:nn { #2 } { #3 }
\end{#1matrix}
}
\NewDocumentCommand{\definefunction}{mm}
{% #1 = function name
% #2 = action
\kutsit_generatematrix_function:nn { #1 } { #2 }
}
\tl_new:N \l__kutsit_generatematrix_body_tl
\cs_new_protected:Nn \kutsit_generatematrix:nn
{
\tl_clear:N \l__kutsit_generatematrix_body_tl
\int_step_inline:nn { #2 }
{% ##1 is the row index
\int_step_inline:nn { #2 }
{% ####1 is the column index
\tl_put_right:Nn \l__kutsit_generatematrix_body_tl
{
\use:c { kutsit_generatematrix_#1:nn } { ##1 } { ####1 }
}
\tl_put_right:Nx \l__kutsit_generatematrix_body_tl
{
\int_compare:nTF { ####1 = #2 } { \exp_not:N \\ } { & }
}
}
}
\tl_use:N \l__kutsit_generatematrix_body_tl
}
\cs_new_protected:Nn \kutsit_generatematrix_function:nn
{
\cs_new_protected:cn { kutsit_generatematrix_#1:nn } { #2 }
}
\definefunction{identity}{ \int_compare:nTF { #1 = #2 } { 1 } { 0 } }
\definefunction{hilbert}{ \frac{1}{\int_eval:n { #1 + #2 } } }
\ExplSyntaxOff
\begin{document}
\[
\generatematrix{identity}{3}\quad
\generatematrix[b]{identity}{5}
\]
\[
\renewcommand{\arraystretch}{1.5}
\generatematrix{hilbert}{4}
\]
\end{document}