In TikZ/PGF können wir die aktuelle Linienbreite mit ermitteln \pgflinewidth
. Leider gibt es (soweit ich weiß) keine \pgfstrokecolor
, \pgffillcolor
, \pgfstrokeopacity
und \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 \pgfsetfillcolor
und \pgfsetcolor
den 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}
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 \pgfsetcolor
TikZ dies nicht verwendet, sondern stattdessen \color
verwendet. 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}
Antwort2
Der einfache Weg ist der deklarative Weg: Verwenden Sie pgfkeys
und seinen .style
Handler, um Ihre Einstellungen (Farbe, Linienbreite usw.) zu speichern und sie mehrmals anzuwenden.
\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}