¿Cómo aplicar opciones de color al contenido de los nodos TikZ cuando el contenido incluye \sbox{}\usebox{}?

¿Cómo aplicar opciones de color al contenido de los nodos TikZ cuando el contenido incluye \sbox{}\usebox{}?

Gracias a Sašo Živanović por ayudarme a identificar el problema que surge como resultado de intentar aplicar opciones como blueo text=bluea nodos dentroBosqueárboles que incluyen torniquetes de latorniquetepaquete.

Normalmente, si aplico una opción de color, como bluea un nodo TikZ, el contenido del nodo se colorea, ya sea texto o matemáticas.

Sin embargo, si el nodo incluye un torniquete proporcionado por eltorniquetepaquete, entonces la coloración sólo afecta al contenido antes y después del torniquete. El torniquete en sí no se ve afectado.

Si uso text=blue, solo se colorea el contenido anterior al torniquete. Ni el torniquete ni nada posterior se ve afectado.

Fuera del tikzpictureentorno, sin embargo, los torniquetes se colorean normalmente, junto con el texto o las matemáticas que los rodean.

Por ejemplo,

{\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$};  }

produce

azul y negro

Sašo Živanović ha establecido que la cuestión aquí no es específica de los torniquetes, sino que se aplica a cualquier contenido que se utilice \sbox{}de manera similar. Por ejemplo:

\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.};}

produce

guardar cajas en azul y negro

Esta pregunta, con el que también estoy en deuda con Sašo Živanović por dirigirme, parece estar relacionado.

Supongo, por la discusión allí, que \sbox{}se ejecuta antes de la opción blueo text=bluese aplica al contenido del nodo, de modo que el color activo en el momento en que se guarda el cuadro no es sensible a las opciones aplicadas al nodo.

¿Es esto correcto? ¿Es el efecto evitable? ¿Y por qué hace text=bluealgo diferente? ¿No debería \sbox{}limitarse el efecto de the a su grupo, de modo que incluso si su contenido permanece negro, el siguiente contenido debería tener el color apropiado?

MWE completo:

\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}

Respuesta1

Esto parece ser una falla en la compatibilidad con el color pgf que no establece el color actual tal como lo entiende el látex.

\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}

produce un registro de

> \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...

? 

mostrando que cuando \color{blue}se usó, \current@colores (el pdf de) azul sin embargo en el node[blue]caso, aunque el texto es azul, \current@colores (el pdf de) negro.

Esto es importante ya que \sboxno "conoce" el estado de la pila de colores mantenida por el servidor de pdf o el controlador dvi; simplemente establece el color del texto guardado.\current@color

El \resetcurrentcolorcomando en realidad no establece el color (emite no \specialo \pdfliteral), simplemente lo redefine \current@colorpara usar el color del trazo establecido por última vez por PGF.

ingrese la descripción de la imagen aquí

información relacionada