![(複数パーツの) ノードの塗りつぶし色をそのコンテンツに応じて設定するにはどうすればよいですか?](https://rvso.com/image/392332/(%E8%A4%87%E6%95%B0%E3%83%91%E3%83%BC%E3%83%84%E3%81%AE)%20%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E5%A1%97%E3%82%8A%E3%81%A4%E3%81%B6%E3%81%97%E8%89%B2%E3%82%92%E3%81%9D%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
次の MWE では、特定のセルのコンテンツのテキストの色を変更するのと同様に、セルのコンテンツに応じて塗りつぶしとテキストの色を変更します。
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{chains, positioning, shapes.multipart}
\usepackage{etoolbox}
\tikzset{HDLC/.style = {
start chain = 1 going left,
okvir/.style n args = {3}{rectangle split, rectangle split parts=2,
text depth=0.5ex, inner sep=1.2pt, outer sep=0mm,
font=\footnotesize\sffamily,
align=center, draw=gray!80,
text width=##1,
text=blue,
%%%%%%%%%%
%if ##3 is I than
rectangle split part fill={teal!60!black,white}, text=teal!60!black,
% else
% rectangle split part fill={cyan!60!black,white}, text=cyan!60!black,
node contents={\nodepart{one}\vphantom{/tip}\textcolor{white}{##2}
\nodepart{two}\vphantom{/tip}\ifstrequal{##2}{tip}
{\textcolor{black!60!red}{\textbf{##3}}}
{##3}
},% end of node contents
},
PP/.style n args = {3}{okvir={##1}{##2}{##3},
on chain=1},
}}
\begin{document}
\begin{tikzpicture}[HDLC, node distance=2mm and 0mm]
\node (a) [PP={7mm}{N\textsubscript{R}}{0}]% should use teal!60!black
node[PP={7mm}{P/F}{P}]
node[PP={7mm}{N\textsubscript{S}}{4}]
node[PP={5mm}{tip}{I}];
\node(b) [PP={7mm}{N\textsubscript{R}}{0}, below=of a]% should use cyan!60!black
node[PP={7mm}{P/F}{P}]
node[PP={7mm}{N\textsubscript{S}}{4}]
node[PP={5mm}{tip}{S}];
\end{tikzpicture}
\end{document}
これにより
上の画像では、最初の行の色を「青緑!60!黒!」にし、下の行は現状のままにしたいと思っています。セル内のテキストの色 (最初の行を除く) は、行の色と同じにしたいと思っています。
答え1
ifstrequal
あなたの質問をよく理解しているのであれば、 4 つの引数を持つスタイルを定義し、次のコードのよう{str1}{str2}{style if equal}{style if not}
にそれを内部で使用することができます。okvir
\documentclass[tikz, margin=7pt]{standalone}
\usetikzlibrary{chains, positioning, shapes.multipart}
\usepackage{etoolbox}
\tikzset{
% ---------
ifstrequal/.code n args={4}{
\ifstrequal{#1}{#2}{\pgfkeysalso{#3}}{\pgfkeysalso{#4}}
},
% ---------
HDLC/.style = {
start chain = 1 going left,
okvir/.style n args = {3}{rectangle split, rectangle split parts=2,
text depth=0.5ex, inner sep=1.2pt, outer sep=0mm,
font=\footnotesize\sffamily,
align=center, draw=gray!80,
text width=##1,
text=blue,
% ---------
ifstrequal={##3}{I}{
rectangle split part fill={teal!60!black,white}, text=teal!60!black
}{
rectangle split part fill={cyan!60!black,white}, text=cyan!60!black
},
% ---------
node contents={
\nodepart{one}\vphantom{/tip}\textcolor{white}{##2}
\nodepart{two}\vphantom{/tip}\ifstrequal{##2}{tip}
{\textcolor{black!60!red}{\textbf{##3}}}
{##3}
},% end of node contents
},
PP/.style n args = {3}{okvir={##1}{##2}{##3},
on chain=1},
}}
\begin{document}
\begin{tikzpicture}[HDLC, node distance=2mm and 0mm]
\node (a) [PP={7mm}{N\textsubscript{R}}{0}]% should use teal!60!black
node[PP={7mm}{P/F}{P}]
node[PP={7mm}{N\textsubscript{S}}{4}]
node[PP={5mm}{tip}{I}];
\node(b) [PP={7mm}{N\textsubscript{R}}{0}, below=of a]% should use cyan!60!black
node[PP={7mm}{P/F}{P}]
node[PP={7mm}{N\textsubscript{S}}{4}]
node[PP={5mm}{tip}{S}];
\end{tikzpicture}
\end{document}
注記:スタイル内では、 とスタイルをifstrequal
使用して2 つの部分に別々のスタイルを設定し、内部を回避できます。every one node part
every two node part
\ifstrequal
node contents