Adicione uma parte de nó com estilo TikZ

Adicione uma parte de nó com estilo TikZ

Gostaria de definir um estilo de nó TikZ que defina a forma do nó rectangle splite adicione automaticamente uma primeira parte com conteúdo definido pelo estilo. O texto normal do nó aparece na segunda parte. Existe uma maneira de fazer isso ou algo semelhante a isso?

Comportamento desejado

Código:

\node[achtung] at (1, 2) {Falling rocks};

Saída:

( Achtung | Falling rocks )

Tentativas

eu tentei

achtung/.append style={
  execute at begin node={Achtung\nodepart{two}},
  rectangle split,
  rectangle split horizontal,
  rectangle split parts=2
}

e versões mais sofisticadas, como

achtung/.append style={
  execute at begin node={Achtung\protect\nodepart{two}\protect\begingroup},
  execute at end node={\protect\endgroup},
  rectangle split,
  rectangle split horizontal,
  rectangle split parts=2,
  every one node part/.style={
    execute at begin node={},
    execute at end node={}
  },
  every two node part/.style={
    execute at begin node={},
    execute at end node={}
  }
}

Todos eles levam a um "Extra }, or forgotten \\endgroup.\n\\pgfutil@reserved@c ->\\egroup \n"erro.

Versões que usam \pgfnodeparttwoboxcompilar, mas não apresentam o comportamento desejado.

Exemplo mínimo que não funciona

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\tikzset{
  achtung/.append style={
    execute at begin node={Achtung\nodepart{two}}, % remove this line to compile successfully
    rectangle split,
    rectangle split horizontal,
    rectangle split parts=2,
    draw
  }
}

\begin{document}
\begin{tikzpicture}
\node[achtung] {Falling rocks};
\end{tikzpicture}
\end{document}

Responder1

O gancho execute at begin nodeé simplesmente muito cedo para brincar com nodeparts. Realmente não há gancho apropriado para usar aqui. Poderíamos tentar usar indevidamente uma das outras macros que serão executadas logo no início – elas lidam com alinhamentos horizontais e imagens TikZ aninhadas (?) –…

Mas, em vez de mexer com eles e criar incompatibilidades, adicionarei nosso próprio gancho, print at begin nodeque age de maneira semelhante, node contentsmas em vez de substituí-lo, simplesmente prefixa o que está entre {e }.

(Este gancho iránãoser redefinido para quando uma imagem TikZ fizer parte do conteúdo do nó, mas raramente é uma boa ideia fazer isso em primeiro lugar.)

Código

\documentclass[tikz]{standalone}
%\documentclass{article}
%\usepackage{tikz}

\ExplSyntaxOn \makeatletter
\tl_replace_once:Nnn \tikz@do@fig
  { \ignorespaces }
  { \pgfkeysvalueof{/tikz/print~at~begin~node} \ignorespaces }
\makeatother \ExplSyntaxOff
\pgfkeyssetvalue{/tikz/print at begin node}{}

\usetikzlibrary{shapes.multipart}
\tikzset{
  achtung/.append style={
    print at begin node = Achtung \nodepart{two},
    rectangle split, rectangle split horizontal, rectangle split parts=2, draw}}
\tikzset{
  gnutcha/.append style={
    print at begin node = \nodepart{two} Achtung \nodepart{one},
    rectangle split, rectangle split horizontal, rectangle split parts=2, draw}}
\begin{document}
\tikz \node[achtung]            {Falling rocks}
       node[gnutcha] at (0, -1) {Falling rocks};

\tikz \node[achtung]            {Falling rocks \nodepart{text} You're not the }
       node[achtung] at (0, -1) {Falling rocks \nodepart{one}    boss of me.  };
\end{document}

Saída

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Responder2

Usando node contentsvocê poderia ter node contents={Achtung\nodepart{two}#1}no estilo, e usar como achtung={Falling rocks}. Conforme observado nos comentários, usar node contentssignifica que você não pode fazer \node [..] at (x,y)..., mas \node at (x,y) [...]funciona.

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\tikzset{
  achtung/.append style={
    rectangle split,
    rectangle split horizontal,
    rectangle split parts=2,
    draw,
    node contents={Achtung\nodepart{two}#1}
  },
  achtung/.default=
}

\begin{document}
\begin{tikzpicture}
\node[achtung={Falling rocks}];
\end{tikzpicture}
\end{document}

Imagem de saída: [Achtung | Pedras caindo]

Responder3

Com um comando?

EDIT: com o comentário de Alan Munn Adicionando a posição do nó como parâmetro e a D(){}especificação para o parâmetro #2

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\NewDocumentCommand{\mynode}{ O{achtung} d() m }{
\IfNoValueTF{#2}
    {\path node[#1,right]{#1\nodepart{two}#3};}
    {\path (#2) node[#1,right]{#1\nodepart{two}#3};}
}
\tikzset{
    achtung/.style={
        rectangle split,
        rectangle split horizontal,
        rectangle split parts=2,
        draw,
    }
}
\begin{document}
\begin{tikzpicture}
\draw[help lines](0,0)grid(3,2);
\mynode[achtung] (2,1) {Falling rocks}
\mynode (0,0) {achtung is the default style}
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

informação relacionada