在 for 循环中使用 & 自动创建矩阵

在 for 循环中使用 & 自动创建矩阵

我想创建一个用零填充矩阵的命令。我认为它可以这样工作:

\documentclass{article}
\usepackage{pgfplots} 
\usepackage{amsmath} % Math
\pgfplotsset{compat=1.18}
\NewDocumentCommand{\fillm}{+m +O{0}}{
  \pgfplotsforeachungrouped \i in {0,...,\number\numexpr#1-2} { #2 &}
  #2
}

\begin{document}
 $$\begin{bmatrix} \fillm{5} \end{bmatrix}$$
\end{document}

如果我将 改为&\&代码将执行并生成:[0&0&0&0&0]。太棒了!

但是,我真正的目标是让代码生成:[0 0 0 0 0]。我实际上想使用 &,因为它们将在矩阵环境中用于将零分开。如果我删除\并将其保留为&,我会收到此错误:

Incomplete \ifdim; all text was ignored after line 11.
Extra alignment tab has been changed to \cr.
Extra \fi.
Missing $ inserted.

我尝试做的事可行吗?

答案1

您的问题是,您尝试&在宏中将带有 catcode 4 的标记视为 。如果宏在表项之外处理,则它会起作用。但是您尝试在表的第一个项目中运行宏。那么&在这种情况下,标记具有非常具体的行为:它不仅仅是标记:它立即结束项目数据,并跟随在序言右侧部分声明的标记\halign。例如:

\def\mymacro#1{\message{parameter is "#1"}}

\mymacro &               % prints: parameter is "&"

but:

\halign{a#b&c#d\cr 
   \relax \mymacro & \cr
}                        % prints: parameter is "b"

\relax如果在我的示例中没有,\mymacro则将展开而不将其视为&表项的结尾。这意味着如果\myacro首先出现(忽略空格)并且它完全可以展开,那么您可以使用类别 4 的标记来处理。这是egreg 所示的&情况。\prg_replicate:nn

如果您有一个非完全可扩展的宏,那么您可以先在表外通过宏准备表数据,然后在表内运行准备好的数据。例如:

\newcount\tmpnum
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

\def\zeromatrix#1{\def\matrixbody{0}\tmpnum=1
    \loop \ifnum\tmpnum<#1\relax \addto\matrixbody{&0}\advance\tmpnum by1 \repeat
    \pmatrix{\matrixbody\cr}
}

$$
  \zeromatrix{5}
$$

但是 egreg 展示了更多可用的例子,特别是对于 LaTeX 的使用(但没有解释问题出在哪里)。

答案2

\prg_replicate:nn重复第二个参数中指定的标记的次数(第一个参数中指定的次数)的作业。

该命令\zeromatrix{4}构建一个 4 乘以 4 零矩阵;您可以像 一样添加行数作为可选参数\zeromatrix[2]{4}

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn
\NewDocumentCommand{\zeromatrix}{O{#2}m}
 {
  \begin{bmatrix}
  \prg_replicate:nn { #1 }
   {
    0 \prg_replicate:nn { #2 - 1 } { & 0 } \\
   }
  \end{bmatrix}
 }
\ExplSyntaxOff

\begin{document}

\[
\zeromatrix{3}\quad
\zeromatrix{4}\quad
\zeromatrix[2]{4}
\]

\end{document}

在此处输入图片描述

它甚至可以与\zeromatrix{1}生产

在此处输入图片描述

如果您希望指定行数和列数(如果矩阵不是方阵),则可以将代码更改为

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn
\NewDocumentCommand{\zeromatrix}{mO{#1}}
 {
  \begin{bmatrix}
  \prg_replicate:nn { #1 }
   {
    0 \prg_replicate:nn { #2 - 1 } { & 0 } \\
   }
  \end{bmatrix}
 }
\ExplSyntaxOff

\begin{document}

\[
\zeromatrix{1}\quad
\zeromatrix{3}\quad
\zeromatrix{4}\quad
\zeromatrix{2}[4]
\]

\end{document}

在此处输入图片描述

无论哪种情况,诀窍都是将强制参数的值作为可选参数的默认值。

答案3

供参考。该包nicematrix有以编程方式创建矩阵的命令。

\documentclass{article}
\usepackage{nicematrix}

\begin{document}

$\bAutoNiceMatrix{2-2}{0}$\qquad $\bAutoNiceMatrix{4-4}{0}$

\end{document}

您需要多次编译(因为nicematrix在后台使用 PGF/Tikz 节点)。

上述代码的输出

相关内容