(複数パーツの) ノードの塗りつぶし色をそのコンテンツに応じて設定するにはどうすればよいですか?

(複数パーツの) ノードの塗りつぶし色をそのコンテンツに応じて設定するにはどうすればよいですか?

次の 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 partevery two node part\ifstrequalnode contents

関連情報