Contornar linhas para desenhar nós na floresta de pacotes

Contornar linhas para desenhar nós na floresta de pacotes

Estou tentando criar uma árvore usando o pacote florestal, onde os nós folha estão todos na mesma camada.

No entanto, as linhas que ligam os nós mais altos atravessam outros nós. Existe alguma maneira de evitar isso com este pacote?

Aqui está o trecho de código relevante:

\begin{forest}    
    where n children=0{tier=word}{}    
    [equation, %for tree={parent anchor=south, child anchor=north}    
        [VARIABLE[y]]    
        [{=}]    
        [expression    
            [additionOrSubtraction    
                [multiplicationOrDivision    
                    [atom[VARIABLE[x]]]    
                ]    
                [{*}]    
                [atom    
                    [{(}]    
                    [expression    
                        [additionOrSubtraction    
                            [multiplicationOrDivision    
                                [atom[INTEGER[2]]]    
                            ]    
                            [{+}]    
                            [multiplicationOrDivision    
                                [atom[INTEGER[3]]]    
                                [{*}]    
                                [atom[VARIABLE[x]]]    
                            ]    
                        ]    
                    ]    
                    [{)}]    
                ]    
            ]    
        ]    
    ]        
\end{forest}

E aqui está uma imagem disso: E aqui está uma imagem do problema

Responder1

Primeiro configurei os caminhos para usar arestas ortogonais (descritas na edge pathseção página 33 do manual florestal. Teoricamente também seria possível usar caminhos curvos, mas acho que isso levaria exponencialmente mais tempo.

Em seguida, aumentei a distância entre as crianças aumentando o s sepvalor (descrito na página 32 do manual) caso a caso. Em alguns níveis, 10mm eram suficientes, mas em outros, 20mm eram necessários.

Eu não tinha certeza se você substituiria "multiplicationOrDivision" e strings semelhantes por talvez símbolos ou ícones (o que eu recomendaria - ou permitiria quebras de linha nessas strings), então fiz apenas uma rápida aproximação das distâncias. É claro que para publicação significa que eles ainda precisariam ser ajustados.

Infelizmente, a imagem cresceu um pouco de tamanho. Talvez a sidewaysfigureou a \resizeboxpossa se adequar ao contexto que você precisa?

Resultado:A árvore de Koltak

Código:

 \documentclass{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}for tree={% 
    edge path={\noexpand\path[\forestoption{edge}] (!u.parent anchor) -- +(0,-\baselineskip) -| (.child anchor)\forestoption{edge label};}},
    where n children=0{tier=word}{}    
    [equation, s sep=15mm %for tree={parent anchor=south, child anchor=north}    
        [VARIABLE[y]]    
        [{=}]    
        [expression    
            [additionOrSubtraction, s sep=20mm
                [multiplicationOrDivision
                    [atom[VARIABLE[x]]]    
                ]    
                [{*}]    
                [atom, s sep=20mm
                    [{(}]    
                    [expression    
                        [additionOrSubtraction, s sep=20mm
                            [multiplicationOrDivision    
                                [atom[INTEGER[2]]]    
                            ]    
                            [{+}]    
                            [multiplicationOrDivision, s sep=10mm  
                                [atom[INTEGER[3]]]    
                                [{*}]    
                                [atom[VARIABLE[x]]]    
                            ]    
                        ]    
                    ]    
                    [{)}]    
                ]    
            ]    
        ]    
    ]        
\end{forest}
\end{document}

Responder2

Se as bordas quadradas forem aceitáveis, elas provavelmente formarão a árvore mais bonita, como sugere.

No entanto, não há necessidade de configurar isso manualmente, pois o Forest atual fornece forked edgesem sua edgesbiblioteca.

\usepackage[edges,linguistics]{forest}

e no preâmbulo da árvore

  forked edges,

Eu também recomendaria fit=bandevitar a necessidade de mudar as coisas manualmente ou descobrir as dimensões corretas por tentativa e erro.

  for tree={%
    fit=band,
  },

Definir inner xsep=0pta última camada para todos os nós também pode ajudar.

  where n children=0{%
    tier=word,
  }{%
    inner xsep=0pt,
  },

Também dividi ...Or...em nós multilinhas. Não sei se isso é aceitável para seu uso ou não, mas torna o diagrama mais gerenciável.

Eu recomendo configurar algumas macros: uma para adição/subtração e outra para multiplicação/divisão. Isso permitirá que você experimente diferentes opções simplesmente modificando as definições de macro comuns no preâmbulo.

Por exemplo:

\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}

e algo para os asteriscos - eles deveriam estar centralizados e não no topo? Você pode considerar o uso do modo matemático para a última camada de nós.

\newcommand*\asthere{\textasteriskcentered}

Então a especificação da árvore

  [equation
    [VARIABLE[y]]
    [{=}]
    [expression
      [\addorsub
        [\multordiv
          [atom
            [VARIABLE
              [x]
            ]
          ]
        ]
        [\asthere]
        [atom
          [{(}]
          [expression
            [\addorsub
              [\multordiv
                [atom
                  [INTEGER
                    [2]
                  ]
                ]
              ]
              [{+}]
              [\multordiv
                [atom
                  [INTEGER
                    [3]
                  ]
                ]
                [\asthere]
                [atom
                  [VARIABLE
                    [x]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]

produz algo razoavelmente limpo e, se não muito compacto, pelo menos muito mais contido.

árvore mais contida

Código completo:

\documentclass[border=5pt,tikz,multi]{standalone}
\usepackage[edges,linguistics]{forest}
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
\newcommand*\asthere{\textasteriskcentered}
\begin{document}
\begin{forest}
  where n children=0{%
    tier=word,
  }{%
    inner xsep=0pt,
  },
  for tree={%
    fit=band,
  },
  forked edges,
  [equation
    [VARIABLE[y]]
    [{=}]
    [expression
      [\addorsub
        [\multordiv
          [atom
            [VARIABLE
              [x]
            ]
          ]
        ]
        [\asthere]
        [atom
          [{(}]
          [expression
            [\addorsub
              [\multordiv
                [atom
                  [INTEGER
                    [2]
                  ]
                ]
              ]
              [{+}]
              [\multordiv
                [atom
                  [INTEGER
                    [3]
                  ]
                ]
                [\asthere]
                [atom
                  [VARIABLE
                    [x]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

informação relacionada