Wie kann man die Füllfarbe eines (mehrteiligen) Knotens von seinem Inhalt abhängig machen?

Wie kann man die Füllfarbe eines (mehrteiligen) Knotens von seinem Inhalt abhängig machen?

Im folgenden MWE möchte ich die Füll- und Textfarbe je nach Inhalt einer Zelle ändern, auf die gleiche Weise, wie ich es schaffe, die Textfarbe für diesen bestimmten Zellinhalt zu ändern:

\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}

was gibt

Bildbeschreibung hier eingeben

Im oberen Bild hätte ich die Farbe der ersten Zeile gern in „Blaugrün!60!Schwarz!“ und unten, wie sie jetzt ist. Die Textfarbe in den Zellen (außer in der ersten) soll dieselbe Farbe haben wie die Farbe der Zeilen.

Antwort1

Wenn ich Ihre Frage richtig verstehe, können Sie einen Stil ifstrequalmit vier Argumenten definieren {str1}{str2}{style if equal}{style if not}und ihn dann in Ihrem okvirCode verwenden, beispielsweise im folgenden:

\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}

Bildbeschreibung hier eingeben

Notiz:Innerhalb des Stils können Sie und Stile ifstrequalverwenden, um separate Stile für die beiden Teile festzulegen und so Ihr Inneres zu vermeiden .every one node partevery two node part\ifstrequalnode contents

verwandte Informationen