¿Bonitos nodos vacíos rotos por el bosque 2.0?

¿Bonitos nodos vacíos rotos por el bosque 2.0?

He estado usando el estilo "bonitos nodos vacíos" del manual forestal para árboles desde hace bastante tiempo. Hoy actualicé el paquete y ahora arroja un error (aunque el resultado todavía parece funcionar). Ejemplo mínimo:

\documentclass{article}
\usepackage{forest}
\forestset{
nice empty nodes/.style={
    for tree={calign=fixed edge angles},
    delay={where content={}{shape=coordinate,for parent={
                for children={anchor=north}}}{}}
},
}
\begin{document}
\begin{forest}
    [{},nice empty nodes
    [b][
    [c]
    [
    [b] [a]
    ]
    ]
    ]
\end{forest}
\end{document}

Error: "Error del bosque del paquete: nodewalk llegó al nodo no válido; pila: ",árbol,árbol,padre". \end{bosque}"

¿Alguien tiene una idea de cómo solucionar este problema?

Respuesta1

Como señala @cfr,

El problema es que los recorridos por los nodos han cambiado drásticamente y los pasos no válidos ahora provocan errores de forma predeterminada. Debido a que la raíz está vacía, recibe un buen tratamiento de nodos vacíos y el padre falla porque, bueno, no hay ningún padre.

Entonces sí, esto es un error en la definición de nice empty nodes, así que gracias por encontrarlo y señalarlo. No lo entendí porque el único ejemplo nice empty nodesen la documentación no aplica el estilo al nodo raíz, por lo que los documentos se compilaron bien...

La solución es realmente muy simple (y se incluirá en la próxima versión menor), como forestahora tiene el paso siblings.

\documentclass{article}
\usepackage{forest}
\forestset{
nice empty nodes/.style={
    for tree={calign=fixed edge angles},
    delay={where content={}{shape=coordinate,for siblings={anchor=north}}{}}
},
}
\begin{document}
\begin{forest}
    [{},nice empty nodes
    [b][
    [c]
    [
    [b] [a]
    ]
    ]
    ]
\end{forest}
\end{document}

Tenga en cuenta que el for parent={for children={...}}modismo no es exactamente el mismo que for siblings={...}, ya que el nodo actual no se recorre en el for siblingscaso. En nuestro caso, esto no supone ninguna diferencia, ya que el nodo actual adquiere una forma de coordenadas. Para obtener exactamente el for parent={for children={...}}comportamiento (antiguo), digamos for preceding siblings={...},for current and following siblings={...}. Y prometo incluir la clave for current and siblingsen la próxima versión menor... Simplemente no me he dado cuenta hasta ahora de que existe un caso en el que tenerla tiene sentido.

Respuesta2

¿Seguramente un error? No funciona ni siquiera cargando la linguisticsbiblioteca y usando el nice empty nodespreámbulo oficial en un árbol.

Esto es muy poco elegante, pero debería funcionar por ahora. El problema es que los recorridos por los nodos han cambiado drásticamente y los pasos no válidos ahora provocan errores de forma predeterminada. Debido a que la raíz está vacía, recibe nice empty nodestratamiento y for parentfalla porque, bueno, no hay ningún padre. En lugar de deshabilitarlo globalmente, es de esperar que lo deshabilite solo para este recorrido por el nodo. Sin embargo, estoy seguro de que existe un enfoque más eficiente.

\documentclass[tikz]{standalone}
\usepackage{forest}
\forestset{%
  nice empty nodes/.style={%
    for tree={calign=fixed edge angles},
    delay={%
      where content={}{%
        shape=coordinate,
        for nodewalk={%
          Nodewalk={%
            on invalid=fake,
          }{%
            parent,
          }{%
            for children={anchor=north},
          }
        }{},
      }{},
    },
  },
}

\begin{document}
\begin{forest}
  nice empty nodes
  [
    [b]
    [
      [c]
      [
        [b]
        [a]
      ]
    ]
  ]
\end{forest}
\end{document}

¿Nodos vacíos más bonitos?

información relacionada