![是否有已知的方法可以构建创建动态大小数组的宏?](https://linux22.com/image/451704/%E6%98%AF%E5%90%A6%E6%9C%89%E5%B7%B2%E7%9F%A5%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E6%9E%84%E5%BB%BA%E5%88%9B%E5%BB%BA%E5%8A%A8%E6%80%81%E5%A4%A7%E5%B0%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%AE%8F%EF%BC%9F.png)
我希望能够编写一个命令,该命令基本上接受两个参数,即行数和列数,创建一个指定维度的数组,然后允许可变数量的参数作为数组中的条目。
我曾尝试自己使用嵌套条件编写这样的命令,但很快意识到我对 LaTeX 的理解还不够深入,甚至不知道可变参数命令是否可行。因此,我当然还不明白如何构建一个。
这可能是一个愚蠢的任务,但至少我想尝试构建这样的东西或知道为什么它不能完成。
答案1
您确实想说下面这样的话吗?
\makematrix{2}{5}{1}{3}{7}{-1}{2}{0}{-3}{3}{4}{5}
根据你的问题,这应该是你想要的输入样式。也许可以通过使用换行符来改进
\makematrix{2}{5}
{1}{3}{7}{-1}{2}
{0}{-3}{3}{4}{5}
但我不认为这是很大的改进
\begin{bmatrix}
1 & 3 & 7 & -1 & 2 \\
0 & -3 & 3 & 4 & 5
\end{bmatrix}
你?
好的,这不是 CAS 软件使用的风格。我们可以这样做吗?
\makematrix{1,3,7,-1,2;0,-3,3,4,5}
当然如此。可选参数\makematrix
设置分隔符(默认为b
;如果愿意,可以p
默认更改);强制参数包含矩阵条目,行用分号分隔,同一行中的条目用逗号分隔。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makematrix}{O{b}m}
{
\hpecoraro_matrix_make:nn { #1 } { #2 }
}
\seq_new:N \l__hpecoraro_matrix_rows_seq
\cs_new_protected:Nn \hpecoraro_matrix_make:nn
{
\seq_set_split:Nnn \l__hpecoraro_matrix_rows_seq { ; } { #2 }
\begin{#1matrix}
\seq_map_function:NN \l__hpecoraro_matrix_rows_seq \__hpecoraro_matrix_dorow:n
\end{#1matrix}
}
\cs_new_protected:Nn \__hpecoraro_matrix_dorow:n
{
\clist_use:nn { #1 } { & } \\
}
\ExplSyntaxOff
\begin{document}
Brackets
\[
\makematrix{1,3,7,-1,2;0,-3,3,4,5}
\]
Parentheses
\[
\makematrix[p]{1,3,7,-1,2;0,-3,3,4,5}
\]
\end{document}
答案2
这不使用任何宏并且需要用 进行编译knitr
,但是输入起来相对简单,并且具有使 R 矩阵形成任何序列(向量)或数据框非常容易的优点。
Example.Rnw
文件:
\documentclass{article}
\begin{document}
<<echo=F>>=
library(xtable)
@
<<printmatrix,include=FALSE>>=
M <- function(x=c(1,2,3),y=1){
z <- xtableMatharray(matrix(x,nrow=y), digits = 2, auto = F)
print(z)
}
W <- M()
@
Default matrix:
\[A_{1\times 3}=\left[\Sexpr{W}\right]\]
Custom matrices:
<<foo,include=FALSE>>=
W <- M(x=c(1.348,2,3.555,4.7800,5,6,7,8),y=2)
@
\[A_{2\times 4}=\left[\Sexpr{W}\right]\]
<<bah,include=FALSE>>=
W <- M(x=rnorm(25,2,1),y=5)
@
\[A_{5\times 5}=\left[\Sexpr{W}\right]\]
<<baz,include=FALSE>>=
W <- M(x=c("foo","bar","baz","end"),y=2)
@
\[A_{2\times 2}=\left[\Sexpr{W}\right]\]
\end{document}