Wie wende ich Farboptionen auf den Inhalt von TikZ-Knoten an, wenn der Inhalt \sbox{}\usebox{} enthält?

Wie wende ich Farboptionen auf den Inhalt von TikZ-Knoten an, wenn der Inhalt \sbox{}\usebox{} enthält?

Vielen Dank an Sašo Živanović für die Hilfe bei der Identifizierung des Problems, das entsteht, wenn ich versuche, Optionen wie blueoder text=blueauf Knoten innerhalb von anzuwendenWaldBäume, darunter Drehkreuze aus demDrehkreuzPaket.

blueNormalerweise 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 tikzpictureUmgebung 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

blau und schwarz

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

Sparboxen in Blau und Schwarz

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 blueoder text=blueauf 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=blueetwas 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 \sboxden 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 \resetcurrentcolorBefehl legt die Farbe nicht wirklich fest (er gibt kein \specialoder aus \pdfliteral), sondern definiert sie lediglich neu, \current@colorum die Strichfarbe zu verwenden, die zuletzt von PGF festgelegt wurde.

Bildbeschreibung hier eingeben

verwandte Informationen