我想创建一个用零填充矩阵的命令。我认为它可以这样工作:
\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}
无论哪种情况,诀窍都是将强制参数的值作为可选参数的默认值。