感谢 Sašo Živanović 帮助我识别问题,该问题是由于我尝试将诸如blue
或text=blue
等选项应用于森林树木,包括旋转栅门旋转闸门包裹。
通常,如果我将颜色选项应用于blue
TikZ 节点,则节点的内容会被着色,无论是文本还是数学。
但是,如果节点包括由旋转闸门包装,则颜色只会影响旋转门前后的内容。旋转门本身不受影响。
如果我使用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@color
pdf 是蓝色的,但是在这种node[blue]
情况下,虽然文本是蓝色的,但\current@color
pdf 是黑色的。
这很重要,因为它\sbox
不知道 pdf 后端或 dvi 驱动程序维护的颜色堆栈的状态,它只是将保存的文本的颜色设置为\current@color
该\resetcurrentcolor
命令实际上并没有设置颜色(它发出否\special
或\pdfliteral
),它只是重新定义\current@color
为使用 PGF 最后设置的描边颜色。