
State tree structure (STS)
s são algum tipo especial de diagrama, pertencem à state chart
família s.
Um típico STS
pode ser descrito abaixo:
O número de ramificações, rótulos de estado e símbolos de cruz ou união podem ser formados em qualquer estrutura arbitrária, conforme a intenção do designer.
Talvez tikz-trees
fosse uma aproximação, mas pelo que verifiquei não achei que fosse capaz de gerar algo parecido com a figura, em geral.
Existe alguma biblioteca especializada para algum tipo de coisa TikZ
?!
Responder1
Aqui está uma versão que define um estilo Forest, state tree
para formatar árvores deste tipo. As suposições, com base no exemplo, são que
- as crianças devem estar espalhadas uniformemente;
- o primeiro e o último filho devem estar equidistantes dos pais;
- as bordas devem ser desenhadas apenas para o primeiro e o último filho;
- o conteúdo dos nós deve ser composto em modo matemático.
O estilo pode ser modificado se um ou mais destes pressupostos necessitarem de alteração.
Aqui está o código da árvore, que é uma ligeira adaptação deIgnasi's:
\begin{forest}
state tree,
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}]
[x_{112}]
]
[\times]
[x_{12}
[x_{121}]
[\dot{\cup}]
[x_{122}]
]
]
[\dot{\cup}]
[x_2]
[\dot{\cup}]
[x_3
[x_{31}]
[\dot{\cup}]
[x_{32}]
[\dot{\cup}]
[x_{33}]
]
]
\end{forest}
state tree
define o estilo. O resto é automático, então não há necessidade de no edge
etc.
Isso produz o seguinte resultado:
Código completo:
\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage{forest}
% ateb: addaswyd o ateb Ignasi: https://tex.stackexchange.com/a/351690/
\forestset{%
state tree/.style={%
for tree={
math content,
parent anchor=children,
child anchor=parent,
tier/.option=level,
calign=center,
},
where={>On>{n children}{2}}{
for nodewalk={
filter={children}{>On=!On=!&{n}{1}{n'}{1}}
}{no edge}
}{},
before computing xy={
where={isodd(n_children)}{
tempdima/.process={OOOw3+d{!n=1.s}{!n'=1.s}{n children}{(##2-##1)/(##3-1)}},
tempdimb/.option={!n=1.s},
for children={
s/.process={RROw3+d{tempdima}{tempdimb}{n}{##2+(##1*(##3-1))}}
},
}{},
},
},
}
\begin{document}
\begin{forest}
state tree,
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}]
[x_{112}]
]
[\times]
[x_{12}
[x_{121}]
[\dot{\cup}]
[x_{122}]
]
]
[\dot{\cup}]
[x_2]
[\dot{\cup}]
[x_3
[x_{31}]
[\dot{\cup}]
[x_{32}]
[\dot{\cup}]
[x_{33}]
]
]
\end{forest}
\end{document}
Responder2
você também pode tentar forest
, embora eu não saiba como distribuir corretamente alguns filhos:
\documentclass [multi=forest, border=2mm]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}, no edge]
[x_{112}]]
[\times, no edge]
[x_{12}
[x_{121}]
[\dot{\cup}, no edge]
[x_{122}]]]
[\dot{\cup}, no edge]
[x_2, no edge]
[\dot{\cup}, no edge]
[x_3
[x_{31}]
[\dot{\cup}, no edge]
[x_{32}, no edge]
[\dot{\cup}, no edge]
[x_{33}]]]
\end{forest}
\end{document}
Atualização: com sugestão do JLDiaz, o resultado fica melhor, ainda não perfeito, mas melhor.
\documentclass [multi=forest, border=2mm]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}, no edge]
[x_{112}]]
[\null, no edge] %<-------------
[\times, no edge]
[x_{12}
[x_{121}]
[\dot{\cup}, no edge]
[x_{122}]]]
[\null, no edge] %<-------------
[\dot{\cup}, no edge]
[x_2, no edge]
[\dot{\cup}, no edge]
[x_3
[x_{31}]
[\dot{\cup}, no edge]
[x_{32}, no edge]
[\dot{\cup}, no edge]
[x_{33}]]]
\end{forest}
\end{document}
Responder3
Uma primeira tentativa seria a seguinte. Não tenho muita experiência em desenhar árvores, então talvez haja uma maneira melhor de fazer isso. Porém, o ponto chave é a colocação dos nós entre os filhos, e a calc
biblioteca é perfeita para isso:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\rootname{root}
\newcommand{\stnode}[3]{\node at ($(#1)!0.5!(#2)$) { #3 }}
\newcommand{\stnodec}[3]{\node at ($(#1.center)!0.5!(#2.center)$) { #3 }}
\newcommand{\stnoderootc}[3]{\node at ($(\rootname-#1.center)!0.5!(\rootname-#2.center)$) { #3 }}
\begin{document}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 3cm},
level 2/.style = {sibling distance = 2cm}
]
\node (root) { $x_0$ }
child { node { $x_1$ }
child { node { $x_3$ } }
child { node { $x_4$ } }
}
child { node { $x_2$ }
child { node { $x_5$ } }
child { node { $x_6$ } }
}
;
place the annotation nodes between the children
\stnode{root-1.center}{root-2.center}{$\times$};
\stnodec{root-1-1}{root-1-2}{$\times$};
\stnoderootc{2-1}{2-2}{$\times$};
\end{tikzpicture}
\end{document}
Você pode usar uma das três macros ( \stnode
, \stnodec
(center), \stnoderootc
(nó raiz automático, centro)) para colocar os nós de anotação. O nome raiz deve ser redefinido para representar o nome real do nó raiz. Para máxima flexibilidade, basta usar \stnode
.
Os argumentos são #1:primeiro nó, #2: segundo nó, #3: texto do nó.
Obviamente, os respectivos nós devem ter o mesmo posicionamento y, ainda funcionará se não for o caso, mas parecerá estranho.