在 pgfplots 循环中使用 \addlegendentry 时出现问题

在 pgfplots 循环中使用 \addlegendentry 时出现问题

我有一些要绘制的光谱,它们是我从西门子X射线工具箱,与 配合良好pgfplots

由于这些是看起来相同的多个文件,我认为我可以使用 for 循环来完成,这也是可行的。

但现在我在添加图例条目时遇到了问题,因为那不起作用。当我使用 with\addlegendentrysiunitx,我无法编译下面的 copde,我收到通知说

\add@accent 的参数有一个额外的 }。

当我不使用siunitx而只是想获取值(下面示例中的注释行)时,这一点变得更加清晰,图例中没有数字,只有一个带帽子的漂亮 k(不知道它叫什么:))。

当我不使用 -loopfor而是手动添加每个图时,它可以工作。但由于在最终图中我必须绘制超过 20 个光谱(都比示例中的光谱大得多),所以我希望在循环中执行此操作,这是理想的。

\documentclass{article}
\usepackage{siunitx}
\usepackage{pgfplots}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\usepackage{filecontents}
\begin{filecontents*}{Xray-Spectrum_040.txt}
9 2.23512e-015
10 2.18948e-009
\end{filecontents*}
\begin{filecontents*}{Xray-Spectrum_046.txt}
9 1.98718e-015
10 1.56485e-009
\end{filecontents*}

\begin{document}
\begin{tikzpicture}
    \begin{axis}
    \foreach \v in {40,46} {
        \addplot table {Xray-Spectrum_0\v.txt};
        \addlegendentry{\v kv}
    }
    \end{axis}
\end{tikzpicture}
\end{document}

有关的

我必须将文件从 重命名为Xray-Spectrum_046kV.txt才能Xray-Spectrum_046.txt使其正常工作。有没有办法让变量在文件名中间进行求值?

答案1

下面的代码可以完成这个工作。对于与宏扩展相关的问题\addlegendentry请参阅此答案:PGFplots foreach 相当于 TikZ 的多个变量,用斜线分隔。对于文件名中的宏,只需留下一个空格即可。

\documentclass{article}
\usepackage{siunitx}
\usepackage{pgfplots}
\usepackage[active,tightpage]{preview}
    \PreviewEnvironment{tikzpicture}
\usepackage{filecontents}

\begin{document}

\begin{filecontents*}{Xray-Spectrum_040kv.txt}
9 2.23512e-015
10 2.18948e-009
\end{filecontents*}

\begin{filecontents*}{Xray-Spectrum_046kv.txt}
9 1.98718e-015
10 1.56485e-009
\end{filecontents*}

\begin{tikzpicture}
    \begin{axis}
    \foreach \v in {40,46} {
        \edef\temp{\noexpand\addlegendentry{\SI{\v}{\kilo\volt}}}
        \addplot table {Xray-Spectrum_0\v kv.txt};
        \temp
    }
    \end{axis}
\end{tikzpicture}
\end{document}

答案2

由于非常奇怪的原因,\foreach里面的语句axis似乎只需要已定义的宏作为参数。您使用的\v是一个重音宏,这“解释”了奇怪的错误消息。

不幸的是,它\SI内部的表现似乎不太好\addlegendentry,因此必须使用 Red 提到的一些技巧。

我建议针对这些情况定义宏,这样至少不会产生令人费解的错误消息。然后,您可以抽象定义命令的方法\addlegendentrySI

\documentclass{article}
\usepackage{siunitx}
\usepackage{pgfplots}
\usepackage{xcolor}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}

\newcommand\xyz{} % in order to use a different macro
\newcommand{\addlegendentrySI}[3][]{%
  \begingroup\edef\x{\endgroup
    \noexpand\addlegendentry{\SI[#1]{#2}{#3}}}\x
}

\begin{document}

\begin{filecontents*}{Xray-Spectrum_040.txt}
9 2.23512e-015
10 2.18948e-009
\end{filecontents*}

\begin{filecontents*}{Xray-Spectrum_046.txt}
9 1.98718e-015
10 1.56485e-009
\end{filecontents*}

\begin{tikzpicture}
\begin{axis}
  \foreach \xyz in {40,46} {
    \addplot table {Xray-Spectrum_0\xyz.txt};
    \addlegendentrySI[color=red]{\xyz}{\kilo\volt}
  }
\end{axis}
\end{tikzpicture}
\end{document}

这肯定比写几\edef\temo{...}行代码更方便。我还添加了color=red选项,只是为了显示可以使用可选参数。

在此处输入图片描述

相关内容