\pgfplotsforeachungrouped:如何转义 & 和 \\

\pgfplotsforeachungrouped:如何转义 & 和 \\

免责声明:我才刚刚开始学习 LaTeX,所以请耐心等待。

问题:我使用了很多这样的矩阵

矩阵

我绝对不喜欢手动编码。明显的解决方案是使用嵌套的 for 循环,如下所示:

\begin{equation}
A =
\begin{bmatrix}
\pgfplotsforeachungrouped \m in {1,...,3}
{
  \pgfplotsforeachungrouped \n in {1,...,3}
  {
    a_{\m,\n} &
  } \\
}
\end{bmatrix}
\end{equation}

(我的想法\pgfplotsforeachungrouped来自这个答案)不幸的是,存在两个问题:

  1. 和标记破坏了编译过程,&导致\\pdfLaTeX 出现一堆Undefined control sequence错误。
  2. 即使这可行,我仍然需要一种方法来在最后一次迭代中禁用这些标记,否则我最终会得到一个空列和一个空行。(或者甚至更糟,因为最后一个空行不包含适当数量的&')。

如果有适当的方法来构建这样的矩阵就足够了,尽管我仍然很好奇在 for 循环内是否可以进行 if 分支。

答案1

像往常一样,问题在于时间:循环不能在一个单元格中开始而在另一个单元格中结束。

这是一个expl3实现。

\documentclass{article}
\usepackage{amsmath,bm}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\symbolicmatrix}{O{#2}mm}
 {% #1 = optional number of rows (default square)
  % #2 = number of columns
  % #3 = symbol to repeat
  \scumcoder_matrix:nnn { #1 } { #2 } { #3 }
 }

\tl_new:N \l__scumcoder_matrix_body_tl

\cs_new_protected:Nn \scumcoder_matrix:nnn
 {
  \tl_clear:N \l__scumcoder_matrix_body_tl
  \int_step_inline:nnnn { 1 } { 1 } { #1 }
   {
    \int_step_inline:nnnn { 1 } { 1 } { #2 - 1 }
     {
      \tl_put_right:Nn \l__scumcoder_matrix_body_tl { #3\sb{##1 ####1} & }
     }
    \tl_put_right:Nn \l__scumcoder_matrix_body_tl { #3\sb{##1 #2} \\ }
   }
  \begin{bmatrix}
  \tl_use:N \l__scumcoder_matrix_body_tl
  \end{bmatrix}
 }

\ExplSyntaxOff

\begin{document}

\[
\frac{d}{dt}
\begin{bmatrix}
\bm{\varepsilon} \\
\dot{\bm{\varepsilon}} \\
\bm{\rho}
\end{bmatrix}
=
\symbolicmatrix{3}{\mathbf{F}}
\begin{bmatrix}
\bm{\varepsilon} \\
\dot{\bm{\varepsilon}} \\
\bm{\rho}
\end{bmatrix}
\]

\[
\symbolicmatrix[2]{4}{a}
\]

\end{document}

在此处输入图片描述

答案2

正如经常发生的那样,这是一个教科书式的例子,XY问题:我询问的是 pgf 循环,但我真正需要的是矩阵生成。

两年半后,我发现恰当的回答我的(错误)问题:physics包裹。

\begin{equation*}
\mqty{\xmat*{F}{3}{3}}
\end{equation*}

在此处输入图片描述


[UPD 2023-11-19] 现在我痛苦地迁走来自此包。如果您正在阅读此文并考虑跟随我的脚步,请不要。

相关内容