
Спасибо Сашо Живановичу за помощь в выявлении проблемы, которая возникает в результате моей попытки применить такие параметры, как 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$}; }
производит
Сашо Живанович установил, что проблема здесь не специфична для турникетов, а применима к любому контенту, который использует их \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.};}
производит
Этот вопрос, за руководство которым я также благодарен Сашо Живановичу, похоже, имеет к этому отношение.
Из обсуждения я делаю вывод, что \sbox{}
выполняется до параметра blue
или text=blue
применяется к содержимому узла, так что активный цвет в момент сохранения поля не чувствителен к параметрам, примененным к узлу.
Правильно ли это? Можно ли избежать эффекта? И почему делает text=blue
что-то другое? Не должно ли действие \sbox{}
быть ограничено его группой, так что даже если его содержимое остается черным, следующее содержимое должно быть соответствующим образом окрашено?
Полная МВЭ:
\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
не задает цвет (она выдает no \special
или \pdfliteral
), она просто переопределяет его \current@color
, чтобы использовать цвет обводки, который был последний раз установлен PGF.