Como aplicar opções de cores ao conteúdo dos nós TikZ quando o conteúdo inclui \sbox{}\usebox{}?

Como aplicar opções de cores ao conteúdo dos nós TikZ quando o conteúdo inclui \sbox{}\usebox{}?

Obrigado a Sašo Živanović por ajudar a identificar o problema que surge como resultado da minha tentativa de aplicar opções como blueou text=bluea nós dentroFlorestaárvores que incluem catracas docatracapacote.

Normalmente, se eu aplicar uma opção de cor como bluea de um nó TikZ, o conteúdo do nó será colorido, seja texto ou matemática.

Contudo, se o nó incluir uma catraca fornecida pelocatracaembalagem, então a coloração afeta apenas o conteúdo antes e depois da catraca. A catraca em si não é afetada.

Se eu usar text=blue, apenas o conteúdo anterior à catraca será colorido. Nem a catraca nem nada depois dela foi afetada.

Fora do tikzpictureambiente, entretanto, as catracas são coloridas normalmente, junto com o texto ou matemática ao redor.

Por exemplo,

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

produz

azul e preto

Sašo Živanović estabeleceu que a questão aqui não é específica das catracas, mas se aplica a qualquer conteúdo que seja utilizado \sbox{}de forma semelhante. Por exemplo:

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

produz

salve caixas em azul e preto

Essa questão, ao qual também estou em dívida com Sašo Živanović por me dirigir, parece relacionado.

Suponho, pela discussão aí, que o \sbox{}é executado antes da opção blueou text=blueé aplicado ao conteúdo do nó, de modo que a cor ativa no ponto em que a caixa é salva não é sensível às opções aplicadas ao nó.

Isso está correto? O efeito é evitável? E por que faz text=bluealgo diferente? O efeito do não deveria \sbox{}ser limitado ao seu grupo, de modo que, mesmo que seu conteúdo permaneça preto, o conteúdo seguinte deveria ser colorido adequadamente?

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}

Responder1

Isto parece ser uma falha no suporte de cores pgf, que não está definindo a cor atual conforme entendida pelo 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}

produz um 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 quando \color{blue}foi usado, \current@coloré (o pdf para) azul, porém no node[blue]caso, embora o texto seja azul, \current@coloré (o pdf para) preto.

Isto é importante porque \sboxnão "sabe" o estado da pilha de cores mantida pelo backend do pdf ou driver dvi, apenas define a cor do texto salvo para\current@color

Na verdade, o \resetcurrentcolorcomando não define a cor (ele emite no \specialou \pdfliteral), apenas redefine \current@colorpara usar a cor do traço conforme definida pela última vez pelo PGF.

insira a descrição da imagem aqui

informação relacionada