В TikZ/PGF мы можем получить текущую ширину линии с помощью \pgflinewidth
. К сожалению, нет (насколько мне известно) \pgfstrokecolor
, \pgffillcolor
, \pgfstrokeopacity
и \pgffillopacity
.
Мой главный вопрос: есть ли способ восстановить текущий цвет отрисовки и заливки?
Я знаю, что последний цвет, установленный\color
может быть восстановленс \colorlet{saved}{.}
, потому что точка представляет последний цвет. И это можно использовать, когда мы напрямую задаем цвет как стиль, как в \draw[red] ...
(см. код).
Я пытался взломать \pgfsetstrokecolor
и каким \pgfsetfillcolor
- \pgfsetcolor
то образом сохранить последний звонок... но безуспешно.
В следующем коде я ищу какой-нибудь трюк, позволяющий сохранить цвета таким образом, чтобы их можно было повторно использовать в другом слое.
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\pgfdeclarelayer{foreground}
\pgfsetlayers{main,foreground}
\begin{document}
\begin{tikzpicture}[green, draw=red, ultra thick, fill=yellow, text=purple]
\filldraw (-.5,-.5) rectangle +(1,1) node[midway]{A};
\pgfmathsetlengthmacro{\savedpgflinewidth}{\pgflinewidth}
\colorlet{saved}{.}
\def\pgfstrokecolor{red} % <- to be replaced by \strokecolorlet
\def\pgffillcolor{yellow} % <- to be replaced by \fillcolorlet
\begin{pgfonlayer}{foreground}
\draw (0,0) rectangle +(1,1) node[midway]{B};
\color{saved} % <- restore the color set by \color{green}
\pgfsetlinewidth{\savedpgflinewidth} % <- restore the line width
\draw (.5,.5) rectangle +(1,1) node[midway]{C};
\pgfsetstrokecolor{\pgfstrokecolor} % <- restore the draw color
\pgfsetfillcolor{\pgffillcolor} % <- restore the fill color
\filldraw (1,1) rectangle +(1,1) node[midway]{D};
\end{pgfonlayer}
\filldraw (1.5,1.5) rectangle +(1,1) node[midway]{E}; % <- line width reset after pgfonlayer !
\end{tikzpicture}
\end{document}
Примечание 1:В следующем коде мы видим, что ширина линии сбрасывается после использования pgfonlayer
. Это ошибка или (документированная) функция?
Заметка 2:Странным образом цвет текста сохраняется при смене слоя, но не другие цвета и не ширина линии.
Заметка 3:У меня такое впечатление, что \pgfsetcolor
TikZ не использует, а \color
использует. Если это так, то почему?
РЕДАКТИРОВАТЬ: Код выше — это просто рабочий пример. Я не хочу решать этот конкретный случай, не восстановив цвета.
решение1
Вот концептуальный способ сделать это. Я думаю, что есть много вещей, которые можно улучшить (меньше макросов, потому что вам нужны только последние два элемента в описании цвета, правильный контроль расширения, возможность пользовательского имени макроса), но у меня не было времени. Я думаю, вы можете продолжить отсюда.
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\makeatletter
\tikzset{get stroke color/.code={%
\expandafter\global% Jump over, now we have \global
\expandafter\let% Jump over now we have \global\let
\expandafter\pgfsavedstrokecolor% Jump we have \global\let\pgf...
\csname\string\color@pgfstrokecolor\endcsname% Finally expand this and put it at the end
}, % \global\let\pgf...{} in expanded form
restore stroke color/.code={\pgf@setstrokecolor#1},
}
\begin{document}
\begin{tikzpicture}[green, draw=yellow!20!blue, ultra thick, fill=yellow, text=purple]
\tikzset{get stroke color}% <-- Gets the drive-dependent low-level desc of y!20!b
\show\pgfsavedstrokecolor% <-- Look at the log
\filldraw (0,0) rectangle +(1,1) node[midway]{A};
\pgfsetstrokecolor{orange} % <-- Change the drawing color to orange
\draw (0.5,0.5) rectangle +(1,1) node[midway]{B}; % <-- Draw something to verify
\tikzset{restore stroke color/.expand once=\pgfsavedstrokecolor} % <-- Restore it back
\draw (1,1) rectangle +(1,1) node[midway]{C}; % <-- Verify
\end{tikzpicture}
\end{document}
решение2
Самый простой способ — декларативный: используйте pgfkeys
и его .style
обработчик для сохранения ваших предпочтений (цвет, толщина линии и т. д.) и применяйте их многократно.
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\pgfdeclarelayer{foreground}
\pgfsetlayers{main,foreground}
\begin{document}
\tikzset{my preferecences/.style={green, draw=red, ultra thick,fill=yellow, text=purple}}
\begin{tikzpicture}[my preferecences]
\filldraw (-.5,-.5) rectangle +(1,1) node[midway]{A};
\begin{pgfonlayer}{foreground}
\begin{scope}[my preferecences]
\draw (0,0) rectangle +(1,1) node[midway]{B};
\draw (.5,.5) rectangle +(1,1) node[midway]{C};
\filldraw (1,1) rectangle +(1,1) node[midway]{D};
\end{scope}
\end{pgfonlayer}
\filldraw (1.5,1.5) rectangle +(1,1) node[midway]{E}; % <- line width reset after pgfonlayer !
\end{tikzpicture}
\end{document}