我有一些要绘制的光谱,它们是我从西门子X射线工具箱,与 配合良好pgfplots
。
由于这些是看起来相同的多个文件,我认为我可以使用 for 循环来完成,这也是可行的。
但现在我在添加图例条目时遇到了问题,因为那不起作用。当我使用 with\addlegendentry
时siunitx
,我无法编译下面的 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
选项,只是为了显示可以使用可选参数。