我正在使用 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}
\\
但是,如果我将行分隔符移到循环内部(从而实现每次循环迭代一行的最终目标) ,文档将无法编译\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}