我正在制作一个堆积条形图,其中每个图都取自同一文件的不同列,并且我有一个我想在宏中使用的列名列表:
\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
以供参考。