Как сделать так, чтобы цвет заливки (многокомпонентного) узла зависел от его содержимого?

Как сделать так, чтобы цвет заливки (многокомпонентного) узла зависел от его содержимого?

В следующем примере 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}

который дает

введите описание изображения здесь

На верхнем изображении я хотел бы иметь цвет первой строки в `teal!60!black! а в нижней - как сейчас. Цвет текста в ячейках (кроме первой) я хотел бы иметь тот же цвет, что и цвет строк.

решение1

Если я правильно понял ваш вопрос, вы можете определить стиль ifstrequalс четырьмя аргументами {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стиля вы можете использовать every one node partи every two node partстили, чтобы задать отдельные стили для двух частей и избежать вашего \ifstrequalвнутреннего node contents.

Связанный контент