PGFPlots:如何将图例条目从宏添加到 foreach 循环中?

PGFPlots:如何将图例条目从宏添加到 foreach 循环中?

我正在制作一个堆积条形图,其中每个图都取自同一文件的不同列,并且我有一个我想在宏中使用的列名列表:

\newcommand\tools{tool1, tool2, tool3, tool4}

然后我使用 foreach 循环添加单个图:

\foreach \tool in \tools {
   \addplot table[x expr=\coordindex, y={\tool}] {file.dat};
}

它完美地工作但后来我想添加一个图例,每个图都有一个条目,但这不起作用:

\begin{axis}[legend entries={\tools}]
% ....
\end{axis}

我得到的却是单身的输入宏中所写的所有工具,包括逗号:

在此处输入图片描述

因此,似乎宏展开得太晚了或类似情况。如果我使用\legend轴中的命令而不是选项,也会发生同样的情况legend entries

我也尝试手动添加循环内的条目\addlegendentry,但它也不起作用:

\foreach \tool in \tools {
   \addplot table[x expr=\coordindex, y={\tool}] {file.dat};
   \addlegendentry{\tool}
}

在这种情况下我收到一个编译错误:

./experiments.tex:74: Undefined control sequence. [    \end{axis}]

那么我如何从\tools宏中获取图例条目?

答案1

尝试这样的操作:

\foreach \tool in \tools {
    \addplot table[x expr=\coordindex, y={\tool}] {file.dat};
    \expandafter\addlegendentry\expandafter{\tool}
}

此错误是由 TikZ 在执行 for 循环之前读取代码的方式引起的。

答案2

确实,版本 1.13(我正在使用的版本,我不知道以前的版本是否也一样)提供了命令\addlegendentryexpanded[<opt>]{<arg>}

因此代码变成:

\foreach \tool in \tools {
    \addplot table[x expr=\coordindex, y={\tool}] {file.dat};
    \addlegendentryexpanded{\tool}
}

请参阅手册第 4.9.4 节pgfplots以供参考。

相关内容