是否可以检测“当前颜色”?(例如在 pgfplot 图中?)

是否可以检测“当前颜色”?(例如在 pgfplot 图中?)

是否有代码可以推断与节点关联的 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}

这将按预期打印出NYNNNY


解释:

  • \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 宏

相关内容