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
概念的なやり方を次に示します。改善すべき点はたくさんあると思います (色の説明の最後の 2 つの項目だけが必要なのでマクロが少なくなる、適切な展開制御、カスタム マクロ名の可能性) が、時間がありませんでした。ここから進めていただければと思います。
\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}