是否有代码可以推断与节点关联的 PGF 图的当前颜色?更好的是,是否也可以获得 RGB 分解?
...
addplot coordinates{ (0,0) (1,1) } node{ "get-RGB-color-of-the-00-11-line here" };
...
原因是我有一条pdfmarginpar
注释,并且我希望注释的颜色与绘制的线的颜色(至少大致相同)相匹配。如本 MWE 所示:
\documentclass{article}
\usepackage{pdfmarginpar}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot coordinates {(0, 0)(1, 1)}
node{
node text
\pdfmarginpar[
color={[1 0 1]} % some arbitrary color, GOAL: color="current pgfplot's plot color"
]{note text}
};
\end{axis}
\end{tikzpicture}
\end{document}
(“节点文本”默认具有正确的颜色,而边距则没有。)当然,注释显示为紫色而不是蓝色(在这种情况下由 pgfplot 自动选择的颜色)。
编辑:感谢 @percusse 将所有内容整合在一起,并感谢 @masu 指出底层机制。这是应用于我原始 MWE 的解决方案。
\documentclass{article}
\usepackage{pdfmarginpar}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot coordinates {(0, 0)(1, 1)}
node{
node text
\let\mynotecolor\empty
\extractcolorspecs{.}{\model}{\mycurrentcolor}
\convertcolorspec{\model}{\mycurrentcolor}{rgb}\mycurrentrgb
\foreach \x in \mycurrentrgb{\expandafter\xdef\expandafter\mynotecolor{\mynotecolor\space\x}}
\pdfmarginpar[color={[\mynotecolor]}]{note text}
};
\end{axis}
\end{tikzpicture}
\end{document}
事实上,重新定义\pdfmarginpar
采用当前颜色可能是有意义的:
% if you know how to use \renewcommand please edit this post
\newcommand{\colorpdfmarginpar}[2][]{
\let\mynotecolor\empty
\extractcolorspecs{.}{\model}{\mycurrentcolor}
\convertcolorspec{\model}{\mycurrentcolor}{rgb}\mycurrentrgb
\foreach \x in \mycurrentrgb{\expandafter\xdef\expandafter\mynotecolor{\mynotecolor\space\x}}
\pdfmarginpar[color={[\mynotecolor]}, #1]{#2}
}
(抱歉,我没能使用renewcommand
,似乎我不知道如何使用它。)
然后使用\colorpdfmarginpar
始终(默认)将节点与当前颜色匹配,无论是在 pgfplots 内部还是外部。(颜色仍然可以用显式color
选项覆盖)。
答案1
您实际上可以通过范围获取当前设置[current plot style]
,然后在中记录有关最后一种样式的所需设置cycle list
。 (感谢@masu 修复了此答案先前版本中的错误)
\documentclass{article}
\usepackage{pgfplots,pdfmarginpar}
\pgfplotsset{
compat=1.9,
margin par settings/.style={%}
execute at end plot visualization={%}
\begin{scope}[current plot style]
\pgfextra{%}
\let\mytemp\empty
\extractcolorspecs{.}{\model}{\mycolor}
\convertcolorspec{\model}{\mycolor}{rgb}\tmp
\foreach \x in \tmp{%}
\expandafter\xdef\expandafter\mytemp\expandafter{\mytemp\space\x}
}
}
\end{scope}
},
execute at end plot={%}
\node[draw] at (current plot end) {%}
node text \protect\pdfmarginpar[Open=true,
color={[\mytemp]}
]{note text}%
};
}
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot+[margin par settings] {x^2};
\addplot+[margin par settings] {10+5*cos(deg(x))};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
可能有更好的方法,但这里有一个:
\documentclass{article}
\usepackage{xcolor}
\begin{document}
\colorlet{abc}{green!40!yellow}
\extractcolorspec{.}{\colorcurrent}
\extractcolorspec{abc}{\colortest}
\ifx\colortest\colorcurrent Y\else N\fi
\extractcolorspec{black}{\colortest}
\ifx\colortest\colorcurrent Y\else N\fi
If the model is different, but should be checked.
\definecolor{mycmyk}{cmyk}{0.5,0.3,0.3,0.2}
\definecolor{mycmykblack}{cmyk}{0.0,0.0,0.0,1.0}
\extractcolorspecs{.}{\colorcurrentmodel}{\colorcurrent}
\extractcolorspec{mycmyk}{\colortest}
\ifx\colortest\colorcurrent Y\else N\fi
\extractcolorspecs{mycmyk}{\colortestmodel}{\colortest}
\convertcolorspec{\colortestmodel}{\colortest}{\colorcurrentmodel}{\colortestconverted}
\ifx\colortestconverted\colorcurrent Y\else N\fi
\extractcolorspec{mycmykblack}{\colortest}
\ifx\colortest\colorcurrent Y\else N\fi
\extractcolorspecs{mycmykblack}{\colortestmodel}{\colortest}
\convertcolorspec{\colortestmodel}{\colortest}{\colorcurrentmodel}{\colortestconverted}
\ifx\colortestconverted\colorcurrent Y\else N\fi
\end{document}
这将按预期打印出N
,Y
,N
,N
,N
。Y
解释:
\extractcolorspec
将颜色规范提取#1
为#2
字符串\extractcolorspecs
做类似的事情,但将字符串分为颜色模型(#2
)和定义(#3
)\convertcolorspecs
用于将颜色 (#2
) 从一种颜色模型 (#1
) 转换为另一种颜色模型 (#3
)... 将定义存储在#4
\ifx
用于进行比较.
用于引用当前颜色
编辑xpatch
:使用而不是 来解决您的问题xstring
。
\documentclass{article}
\usepackage{pdfmarginpar}
\usepackage{xcolor}
\usepackage{xpatch}
\begin{document}
{
%print ABC in red, and extract the color
\color{red}ABC\extractcolorspecs{.}{\colorcurrentmodel}{\colorcurrentlocal}
\global\let\colorcurrentglobal\colorcurrentlocal%define global variable?
}
\xpatchcmd{\colorcurrentglobal}{,}{ }{}{}
\xpatchcmd{\colorcurrentglobal}{,}{ }{}{}
\pdfmarginpar[
color={[\colorcurrentglobal]} % some arbitrary color, GOAL: color="currentcolor"
]{text}
\end{document}
相关(如果您想使用xstring
而不是xpatch
):在 edef 中使用 xstring 宏