
Gostaria de definir um estilo de nó TikZ que defina a forma do nó rectangle split
e 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 \pgfnodeparttwobox
compilar, 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 node
que age de maneira semelhante, node contents
mas 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
Responder2
Usando node contents
você poderia ter node contents={Achtung\nodepart{two}#1}
no estilo, e usar como achtung={Falling rocks}
. Conforme observado nos comentários, usar node contents
significa 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}
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}