
Vielen Dank an Sašo Živanović für die Hilfe bei der Identifizierung des Problems, das entsteht, wenn ich versuche, Optionen wie blue
oder text=blue
auf Knoten innerhalb von anzuwendenWaldBäume, darunter Drehkreuze aus demDrehkreuzPaket.
blue
Normalerweise wird der Inhalt des Knotens eingefärbt, wenn ich eine Farboption, beispielsweise auf einen TikZ-Knoten, anwende , egal, ob es sich um Text oder Mathematik handelt.
Wenn der Knoten jedoch ein Drehkreuz enthält, das vomDrehkreuzPaket, dann wirkt sich die Farbgebung nur auf den Inhalt vor und nach dem Drehkreuz aus. Das Drehkreuz selbst ist davon nicht betroffen.
Wenn ich verwende text=blue
, wird nur der Inhalt vor dem Drehkreuz eingefärbt. Weder das Drehkreuz noch irgendetwas danach ist davon betroffen.
Außerhalb der tikzpicture
Umgebung sind Drehkreuze jedoch normal eingefärbt, ebenso wie der sie umgebende Text oder die mathematischen Symbole.
Zum Beispiel,
{\color{blue}
\[
p \leftrightarrow q \sststile{}{} p \rightarrow q
\]
}
\centering
TikZ/blue:
\tikz{\node [blue] {$p \leftrightarrow q \sststile{}{} p \rightarrow q$}; }
TikZ/blue text:
\tikz{\node [text=blue] {$p \leftrightarrow q \sststile{}{} p \rightarrow q$}; }
produziert
Sašo Živanović hat festgestellt, dass das Problem hier nicht nur Drehkreuze betrifft, sondern für alle Inhalte gilt, die \sbox{}
auf ähnliche Weise verwendet werden. Zum Beispiel:
\newsavebox\mybox
{\color{blue} This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.}
\tikz{\node[blue]{This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.};}
produziert
Diese Frage, bei dem ich auch Sašo Živanović für die Regie zu Dank verpflichtet bin, scheint damit verwandt.
Aus der dortigen Diskussion schließe ich, dass dies \sbox{}
vor der Option ausgeführt blue
oder text=blue
auf den Knoteninhalt angewendet wird, sodass die aktive Farbe zum Zeitpunkt des Speicherns der Box nicht auf die auf den Knoten angewendeten Optionen reagiert.
Ist das richtig? Ist der Effekt vermeidbar? Und warum macht es text=blue
etwas anderes? Sollte der Effekt nicht \sbox{}
auf die Gruppe beschränkt sein, sodass, selbst wenn der Inhalt schwarz bleibt, nachfolgender Inhalt entsprechend gefärbt sein sollte?
Komplettes MWE:
\documentclass{article}
\usepackage{turnstile,tikz}
\begin{document}
{\color{blue}
\[
p \leftrightarrow q \sststile{}{} p \rightarrow q
\]
}
\centering
TikZ/blue:
\tikz{\node [blue] {$p \leftrightarrow q \sststile{}{} p \rightarrow q$}; }
TikZ/blue text:
\tikz{\node [text=blue] {$p \leftrightarrow q \sststile{}{} p \rightarrow q$}; }
\newsavebox\mybox
{\color{blue} This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.}
\tikz{\node[blue]{This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.};}
\end{document}
Antwort1
Dies scheint ein Fehler in der PGF-Farbunterstützung zu sein, die die aktuelle Farbe nicht so einstellt, wie es von Latex verstanden wird.
\documentclass{article}
\usepackage{turnstile,tikz}
\makeatletter
\begin{document}
{\color{blue}
\[
p \leftrightarrow q \sststile{}{} p \rightarrow q
\]
}
\centering
TikZ/blue:
\tikz{\node [blue] {$p \leftrightarrow q \sststile{}{} p \rightarrow q$}; }
TikZ/blue text:
\tikz{\node [text=blue] {$p \leftrightarrow q \sststile{}{} p \rightarrow q$}; }
\newsavebox\mybox
{\color{blue} \show\current@color This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.}
\tikz{\node[blue]{\show\current@color\show\pgf@strokecolor@global This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.};}
\edef\foo#1#2#3#4#5{#3}
\def\resetcurrentcolor{\edef\current@color{\expandafter\foo\pgf@strokecolor@global}}
\tikz{\node[blue]{\resetcurrentcolor This is in blue. \sbox{\mybox}{This is in a box.}\usebox{\mybox} This is in blue.};}
\end{document}
erzeugt ein Protokoll von
> \current@color=macro:
->0 0 1 rg 0 0 1 RG.
l.21 {\color{blue} \show\current@color
This is in blue. \sbox{\mybox}{This i...
?
> \current@color=macro:
->0 g 0 G.
l.24 \tikz{\node[blue]{\show\current@color
\show\pgf@strokecolor@global This ...
?
> \pgf@strokecolor@global=macro:
->\xcolor@ {}{0 0 1 rg 0 0 1 RG}{rgb}{0,0,1}.
l.24 ...\current@color\show\pgf@strokecolor@global
This is in blue. \sbox{\m...
?
zeigt, dass, wenn \color{blue}
es verwendet wurde, \current@color
(das PDF für) blau ist, in diesem node[blue]
Fall jedoch, obwohl der Text blau ist, \current@color
(das PDF für) schwarz ist.
Dies ist wichtig, da es \sbox
den Zustand des Farbstapels, der vom PDF-Backend oder DVI-Treiber verwaltet wird, nicht "kennt", sondern nur die Farbe des gespeicherten Textes auf\current@color
Der \resetcurrentcolor
Befehl legt die Farbe nicht wirklich fest (er gibt kein \special
oder aus \pdfliteral
), sondern definiert sie lediglich neu, \current@color
um die Strichfarbe zu verwenden, die zuletzt von PGF festgelegt wurde.