Wie speichere ich die aktuelle Farbe in PGF/TikZ?

Wie speichere ich die aktuelle Farbe in PGF/TikZ?

In TikZ/PGF können wir die aktuelle Linienbreite mit ermitteln \pgflinewidth. Leider gibt es (soweit ich weiß) keine \pgfstrokecolor, \pgffillcolor, \pgfstrokeopacityund \pgffillopacity.

Meine Hauptfrage lautet: Gibt es eine Möglichkeit, die aktuelle Zeichnung und Füllfarbe wiederherzustellen?

Ich weiß, dass die letzte Farbe von\color kann wiederhergestellt werdenmit \colorlet{saved}{.}, weil der Punkt die letzte Farbe darstellt. Und dies kann verwendet werden, wenn wir die Farbe direkt als Stil festlegen, wie in \draw[red] ...(siehe Code).

Ich habe versucht \pgfsetstrokecolor, es zu hacken \pgfsetfillcolorund \pgfsetcolorden letzten Anruf irgendwie zu speichern … aber ohne Erfolg.

Im folgenden Code suche ich nach einem Trick, um die Farben so zu speichern, dass ich sie in einer anderen Ebene wiederverwenden kann.

\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}

\pgfdeclarelayer{foreground}
\pgfsetlayers{main,foreground}

\begin{document}
  \begin{tikzpicture}[green, draw=red, ultra thick, fill=yellow, text=purple]
    \filldraw (-.5,-.5) rectangle +(1,1) node[midway]{A};
    \pgfmathsetlengthmacro{\savedpgflinewidth}{\pgflinewidth}
    \colorlet{saved}{.}
    \def\pgfstrokecolor{red} % <- to be replaced by \strokecolorlet
    \def\pgffillcolor{yellow} % <- to be replaced by \fillcolorlet

    \begin{pgfonlayer}{foreground}
      \draw (0,0) rectangle +(1,1) node[midway]{B};
      \color{saved} % <- restore the color set by \color{green}
      \pgfsetlinewidth{\savedpgflinewidth} % <- restore the line width
      \draw (.5,.5) rectangle +(1,1) node[midway]{C};
      \pgfsetstrokecolor{\pgfstrokecolor} % <- restore the draw color
      \pgfsetfillcolor{\pgffillcolor} % <- restore the fill color
      \filldraw (1,1) rectangle +(1,1) node[midway]{D};
    \end{pgfonlayer}

    \filldraw (1.5,1.5) rectangle +(1,1) node[midway]{E}; % <- line width reset after pgfonlayer !
  \end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Anmerkung 1:Im folgenden Code können wir sehen, dass die Linienbreite nach der Verwendung von zurückgesetzt wird pgfonlayer. Handelt es sich hierbei um einen Fehler oder ein (dokumentiertes) Feature?

Anmerkung 2:Auf seltsame Weise übersteht die Textfarbe den Ebenenwechsel, nicht jedoch die anderen Farben und auch nicht die Linienbreite.

Notiz 3:Ich habe den Eindruck, dass \pgfsetcolorTikZ dies nicht verwendet, sondern stattdessen \colorverwendet. Wenn dies der Fall ist, warum?


BEARBEITEN: Der obige Code ist nur ein funktionierendes Beispiel. Ich möchte diesen speziellen Fall nicht lösen, ohne die Farben wiederherzustellen.

Antwort1

Hier ist eine konzeptionelle Vorgehensweise. Ich denke, es gibt viele Dinge, die verbessert werden müssen (weniger Makros, da Sie nur die letzten beiden Elemente in der Farbbeschreibung benötigen, eine ordnungsgemäße Erweiterungskontrolle, die Möglichkeit eines benutzerdefinierten Makronamens), aber ich hatte keine Zeit. Ich denke, Sie können von hier aus weitermachen.

\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\makeatletter
\tikzset{get stroke color/.code={%
    \expandafter\global% Jump over, now we have \global
    \expandafter\let% Jump over now we have \global\let
    \expandafter\pgfsavedstrokecolor% Jump we have \global\let\pgf...
    \csname\string\color@pgfstrokecolor\endcsname% Finally expand this and put it at the end 
    },                                           % \global\let\pgf...{} in expanded form 
    restore stroke color/.code={\pgf@setstrokecolor#1},
}


\begin{document}
  \begin{tikzpicture}[green, draw=yellow!20!blue, ultra thick, fill=yellow, text=purple]
    \tikzset{get stroke color}% <-- Gets the drive-dependent low-level desc of y!20!b
    \show\pgfsavedstrokecolor% <-- Look at the log
    \filldraw (0,0) rectangle +(1,1) node[midway]{A};
    \pgfsetstrokecolor{orange} % <-- Change the drawing color to orange
    \draw (0.5,0.5) rectangle +(1,1) node[midway]{B}; % <-- Draw something to verify
    \tikzset{restore stroke color/.expand once=\pgfsavedstrokecolor} % <-- Restore it back
    \draw (1,1) rectangle +(1,1) node[midway]{C}; % <-- Verify
  \end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Der einfache Weg ist der deklarative Weg: Verwenden Sie pgfkeysund seinen .styleHandler, um Ihre Einstellungen (Farbe, Linienbreite usw.) zu speichern und sie mehrmals anzuwenden.

Bildbeschreibung hier eingeben

\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}

\pgfdeclarelayer{foreground}
\pgfsetlayers{main,foreground}

\begin{document}
\tikzset{my preferecences/.style={green, draw=red, ultra thick,fill=yellow, text=purple}}
\begin{tikzpicture}[my preferecences]
    \filldraw (-.5,-.5) rectangle +(1,1) node[midway]{A};
    \begin{pgfonlayer}{foreground}
      \begin{scope}[my preferecences]
      \draw (0,0) rectangle +(1,1) node[midway]{B};
      \draw (.5,.5) rectangle +(1,1) node[midway]{C};
      \filldraw (1,1) rectangle +(1,1) node[midway]{D};
      \end{scope}
    \end{pgfonlayer}

    \filldraw (1.5,1.5) rectangle +(1,1) node[midway]{E}; % <- line width reset after pgfonlayer !
  \end{tikzpicture}
\end{document}

verwandte Informationen