красивые пустые узлы, сломанные лесом 2.0?

красивые пустые узлы, сломанные лесом 2.0?

Я уже довольно давно использую стиль "красивые пустые узлы" из руководства по лесам для деревьев. Сегодня я обновил пакет, и теперь он выдает ошибку (хотя вывод, похоже, все еще работает). Минимальный пример:

\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}

Ошибка: "Ошибка пакета forest: nodewalk перешел к недопустимому узлу; стек: ",tree,tree,parent". \end{forest}"

Есть ли у кого-нибудь идеи, как это исправить?

решение1

Как отмечает @cfr,

Проблема в том, что обходы узлов кардинально изменились, и недействительные шаги теперь вызывают ошибки по умолчанию. Поскольку корень пуст, он получает хорошую обработку пустых узлов, а для родителя происходит сбой, потому что, ну, родителя нет.

Так что да, это ошибка в определении nice empty nodes, так что спасибо, что нашли ее и указали на нее. Я не заметил ее, так как единственный пример nice empty nodesв документации не применяет стиль к корневому узлу, поэтому документация скомпилировалась просто отлично...

Решение на самом деле очень простое (и будет включено в предстоящий дополнительный релиз), так как forestтеперь есть шаг 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}

Обратите внимание, что for parent={for children={...}}идиома не совсем такая же, как for siblings={...}, поскольку текущий узел не проходится в этом for siblingsслучае. В нашем случае это не имеет значения, поскольку текущий узел получает координатную форму. Чтобы получить точно (старое) for parent={for children={...}}поведение, скажем for preceding siblings={...},for current and following siblings={...}. И я обещаю включить ключ for current and siblingsв следующий второстепенный релиз ... Я просто не осознавал до сих пор, что есть случай, когда это имеет смысл.

решение2

Неужели баг? Не работает даже загрузка linguisticsбиблиотеки и использование официального nice empty nodesв преамбуле дерева.

Это очень неэлегантно, но пока должно работать. Проблема в том, что обходы узлов кардинально изменились, и недействительные шаги теперь вызывают ошибки по умолчанию. Поскольку корень пуст, он получает nice empty nodesобработку и for parentтерпит неудачу, потому что, ну, нет родителя. Вместо того, чтобы отключить это глобально, это, надеюсь, отключит это только для этого обхода узла. Однако я уверен, что есть более эффективный подход.

\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}

более приятные пустые узлы?

Связанный контент