当内容包含 \sbox{}\usebox{} 时,如何将颜色选项应用于 TikZ 节点的内容?

当内容包含 \sbox{}\usebox{} 时,如何将颜色选项应用于 TikZ 节点的内容?

感谢 Sašo Živanović 帮助我识别问题,该问题是由于我尝试将诸如bluetext=blue等选项应用于森林树木,包括旋转栅门旋转闸门包裹。

通常,如果我将颜色选项应用于blueTikZ 节点,则节点的内容会被着色,无论是文本还是数学。

但是,如果节点包括由旋转闸门包装,则颜色只会影响旋转门前后的内容。旋转门本身不受影响。

如果我使用text=blue,则只有旋转门之前的内容会被着色。旋转门及其之后的内容均不受影响。

然而,在tikzpicture环境之外,旋转栅门以及周围的文字或数学符号都是正常颜色的。

例如,

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

生产

蓝色和黑色

Sašo Živanović 已确定,此处的问题并非特定于旋转闸门,而是适用于\sbox{}以类似方式使用的任何内容。例如:

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

生产

蓝色和黑色的保存盒

这个问题,我也非常感谢 Sašo Živanović 对我的指导,这似乎与此相关。

我从那里的讨论猜测是\sbox{}在选项之前执行的blue或者text=blue应用于节点内容,这样保存框时的活动颜色对应用于节点的选项不敏感。

这是正确的吗?这种效果可以避免吗?为什么会text=blue有所不同?效果不应该\sbox{}仅限于其组,这样即使其内容保持黑色,后面的内容也应该适当着色?

完成 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}

答案1

这似乎是 pgf 颜色支持的一个缺陷,它没有设置 latex 能够理解的当前颜色。

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

产生一个日志

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

? 

显示当\color{blue}使用时,\current@colorpdf 是蓝色的,但是在这种node[blue]情况下,虽然文本是蓝色的,但\current@colorpdf 是黑色的。

这很重要,因为它\sbox不知道 pdf 后端或 dvi 驱动程序维护的颜色堆栈的状态,它只是将保存的文本的颜色设置为\current@color

\resetcurrentcolor命令实际上并没有设置颜色(它发出否\special\pdfliteral),它只是重新定义\current@color为使用 PGF 最后设置的描边颜色。

在此处输入图片描述

相关内容