Как применить параметры цвета к содержимому узлов TikZ, если содержимое включает \sbox{}\usebox{}?

Как применить параметры цвета к содержимому узлов TikZ, если содержимое включает \sbox{}\usebox{}?

Спасибо Сашо Живановичу за помощь в выявлении проблемы, которая возникает в результате моей попытки применить такие параметры, как 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.

введите описание изображения здесь

Связанный контент