我经常使用 \addplot 创建图,并使用大量可选参数,这使得很难保持代码的一致性。我有几个重复的绘图样式,因此我尝试实现一个新的宏,可以像这样使用:
\newaddplot[style=mystyle1,draw=red]{mydatafile.txt};
我想保留原始 \addplot 函数的结构和键,并添加新键。我下面的方法使用 pgfkeys 来解析 \newaddplot 的键值对,处理我的新键,并将其余部分传递给 \newaddplot 内的 \addplot 命令。MWE 使用“draw”和“offset”作为现有键和新键的示例。
\documentclass{standalone}
\usepackage[english]{babel}
\usepackage{pgfplots,pgfkeys}\pgfplotsset{compat=newest}
\begin{document}%
\newcommand\offset{0}
\pgfkeys{
/newaddplot/.is family, /newaddplot,
default/.style = {offset=0},
offset/.code = {\renewcommand\offset{#1}},
.unknown/.code={
\let\currname\pgfkeyscurrentname
\let\currval\pgfkeyscurrentvalue
\ifx#1\pgfkeysnovalue
\pgfqkeys{/pgfplots}{remainingkeys/.append style/.expand once={\currname}}
\else
\pgfqkeys{/pgfplots}{remainingkeys/.append style/.expand twice={\expandafter\currname\expandafter=\currval}}
\fi
}}
\newcommand\newaddplot[1][]{
\pgfqkeys{/pgfplots}{remainingkeys/.style={}}% reset remainingkeys
% \pgfplotsextra{ %uncomment here ...
\pgfkeys{/newaddplot,default,#1}%set default values and parse key-value pairs
% } % ... and here fixes colors but ignores offset
\addplot[/pgfplots/remainingkeys] coordinates {(0,0+\offset)(1,1+\offset)} % use parsed keys for plot
}
\begin{tikzpicture}
\begin{axis}
\newaddplot[draw=red,ultra thick,offset=1];
\newaddplot[draw=blue,dashed];
\end{axis}
\end{tikzpicture}
\end{document}
问题是最后一个 \newaddplot 的属性用于所有图(此处 draw=blue,dashed)。经过一番研究,我发现这是因为“轴内的任何绘图命令都需要推迟到轴完成为止”(pgfplotsmanual 第 8.3 章)。使用 \pgfplotsextra(取消注释 MWE 中的两行)会使用之前指定的所有属性,即第一个图中的“超厚”也应用于第二个图。此外,偏移不再起作用。
我如何确保按键只影响相应的情节?
答案1
我想到了一个解决方案,但我无法判断这是否是解决问题的“好方法”。欢迎提出意见。
我没有将未知的键附加到 /pgfplots/remainingkeys,而是使用计数器为每个 \newaddplot 定义单独的样式
诀窍是确保在 pgfplots 开始扫描 \addplot 之前扩展计数器。详细信息可在此处找到
http://www.mrunix.de/forums/archive/index.php/t-75727.html
在 Christian Feuersänger 的回答中。
以下是代码:
\documentclass{standalone}
\usepackage[english]{babel}
\usepackage{pgfplots,pgfkeys}\pgfplotsset{compat=newest}
\begin{document}%
\newcommand\offset{0}
\newcounter{newaddplotcounter}
\pgfkeys{
/newaddplot/.is family, /newaddplot,
default/.style = {offset=0,draw=red},
offset/.code = {\renewcommand\offset{#1}},
.unknown/.code={
\let\currname\pgfkeyscurrentname
\let\currval\pgfkeyscurrentvalue
\ifx#1\pgfkeysnovalue
\pgfqkeys{/pgfplots}{newaddplotstyle no \thenewaddplotcounter/.append style/.expand once={\currname}}
\else
\pgfqkeys{/pgfplots}{newaddplotstyle no \thenewaddplotcounter/.append style/.expand twice={\expandafter\currname\expandafter=\currval}}
\fi
}}
\newcommand\newaddplot[1][]{
\stepcounter{newaddplotcounter}
\pgfkeys{/newaddplot,default,#1}%set default valuse and parse key-value pairs
\edef\TEMP{\noexpand\addplot[newaddplotstyle no \thenewaddplotcounter] coordinates {(0,0+\offset)(1,1+\offset)}} % use parsed keys for plot
%\show\TEMP
\TEMP
}
\begin{tikzpicture}
\begin{axis}
\setcounter{newaddplotcounter}{-1}
\newaddplot[offset=1];
\newaddplot[offset=.5,ultra thick,dashed,draw=green];
\newaddplot[dashed,draw=red];
\end{axis}
\end{tikzpicture}
\end{document}
结果如下: