Evitar líneas para dibujar sobre nodos en el bosque de paquetes

Evitar líneas para dibujar sobre nodos en el bosque de paquetes

Estoy intentando crear un árbol usando el paquete forestal, donde los nodos hoja están todos en el mismo nivel.

Sin embargo, las líneas que unen los nodos superiores atraviesan otros nodos. ¿Hay alguna forma de evitar esto con este paquete?

Aquí está el fragmento 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}

Y aquí tenéis una imagen de ello: Y aquí una imagen del problema.

Respuesta1

Primero configuré los caminos para usar bordes ortogonales (descritos en la edge pathsección, página 33 del manual forestal. En teoría, también sería posible usar caminos curvos, pero creo que esto llevaría exponencialmente más tiempo.

A continuación, amplié la distancia entre niños aumentando el s sepvalor (descrito en la página 32 del manual) caso por caso. En algunos niveles, 10 mm fueron suficientes, pero en otros, 20 mm fueron necesarios.

No estaba seguro de si reemplazaría "multiplicationOrDivision" y cadenas similares con quizás símbolos o íconos (lo cual recomendaría, o permitiría saltos de línea dentro de estas cadenas), así que solo hice una rápida aproximación de las distancias. Por supuesto, para su publicación significa que aún sería necesario ajustarlos.

Desafortunadamente, la imagen ha aumentado un poco de tamaño. ¿Quizás a sidewaysfigureo a \resizeboxpodrían adaptarse al contexto que necesitas?

Resultado:El árbol 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}

Respuesta2

Si los bordes cuadrados son aceptables, probablemente darán lugar al árbol más limpio, como se sugiere.

Sin embargo, no es necesario configurar esto manualmente como lo proporciona Forest actual forked edgesen su edgesbiblioteca.

\usepackage[edges,linguistics]{forest}

y en el preámbulo del árbol

  forked edges,

También recomendaría fit=bandque evite la necesidad de cambiar las cosas manualmente o determinar las dimensiones correctas mediante prueba y error.

  for tree={%
    fit=band,
  },

También puede ser útil configurar inner xsep=0pttodos los nodos excepto el último nivel.

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

También los he dividido ...Or...en nodos multilínea. No sé si esto es aceptable para su uso o no, pero crea un diagrama más manejable.

Recomiendo configurar un par de macros: una para suma/resta y otra para multiplicación/división. Esto le permitirá experimentar con diferentes opciones simplemente modificando las definiciones de macro comunes en el preámbulo.

Por ejemplo:

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

y algo para los asteriscos: ¿deberían estar centrados en lugar de en la parte superior? Es posible que desee considerar el uso del modo matemático para el último nivel de nodos.

\newcommand*\asthere{\textasteriskcentered}

Entonces la especificación del árbol

  [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]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]

produce algo razonablemente limpio y, si no del todo compacto, al menos mucho más contenido.

árbol más contenido

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}

información relacionada