使用 \pgfplotsinvokeforeach 在节点矩阵中创建行

使用 \pgfplotsinvokeforeach 在节点矩阵中创建行

我正在使用 pgfplots 包处理一组复杂的图形。作为图形的一部分,我希望能够创建一个节点矩阵,其中使用调用\pgfplotsinvokeforeach或类似的循环命令添加行。下面给出了一个最小工作示例,它实现了非常接近我想要的东西。

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.17, filter discard warning=false}

\usetikzlibrary{matrix}

\newcommand{\MakeMatrix}[1]{%
  \matrix (myMatrix) [ matrix of nodes ]
  {
     A \\
    \pgfplotsinvokeforeach{#1}{
      ##1
    } \\
  };
}

\begin{document}

\begin{tikzpicture}
  \MakeMatrix{B,C,D,E,F}
\end{tikzpicture}

\end{document}

输出如下所示: 编译的 LaTeX 输出

\\但是,如果我将行分隔符移到循环内部(从而实现每次循环迭代一行的最终目标) ,文档将无法编译\pgfplotsinvokeforeach。我想知道这是否可以通过\pgfplotsinvokeforeach(理想的)或类似的循环方法实现。

答案1

我改编了一个解决方案通过 \foreach 构建表格内容. 下面是最小工作示例。

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.17, filter discard warning=false}

\usepackage{tikz}
\usetikzlibrary{matrix}

\newcommand*{\MyTempTableTokens}{}%
\makeatletter
  \newtoks\@tabtoks
  %%% assignments to \@tabtoks must be global, because they are done in \foreach
  \newcommand\AddTableTokens[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
  \newcommand\eAddTableTokens[1]{%
    \edef\MyTempTableTokens{#1}%
    \expandafter\AddTableTokens\expandafter{\MyTempTableTokens}%
    }
  %%% variable should always be operated on always locally or always globally
  \newcommand*\ResetTableTokens{\global\@tabtoks{}}
  \newcommand*\PrintTableTokens{\the\@tabtoks}
\makeatother

\newcommand{\MakeMatrix}[1]{%

  \ResetTableTokens
  \pgfplotsinvokeforeach{#1}{
     \eAddTableTokens{ ##1 \\ }
  }

  \matrix (myMatrix) [ matrix of nodes ] {
    A \\
    \PrintTableTokens
  };
}

\begin{document}

\begin{tikzpicture}
  \MakeMatrix{B,C,D,E,F}
\end{tikzpicture}

\end{document}

输出如下所示: 编译的 LaTeX 输出

相关内容