Existe alguma biblioteca para desenhar estruturas de árvores de estado no TikZ?

Existe alguma biblioteca para desenhar estruturas de árvores de estado no TikZ?

State tree structure (STS)s são algum tipo especial de diagrama, pertencem à state chartfamília s.

Um típico STSpode ser descrito abaixo:

insira a descrição da imagem aqui

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-treesfosse 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 treepara 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 treedefine o estilo. O resto é automático, então não há necessidade de no edgeetc.

Isso produz o seguinte resultado:

árvore de estado

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}

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

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 calcbiblioteca é 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ó.

O resultado é o seguinte: Resultado

Obviamente, os respectivos nós devem ter o mesmo posicionamento y, ainda funcionará se não for o caso, mas parecerá estranho.

informação relacionada