
Я уже довольно давно использую стиль "красивые пустые узлы" из руководства по лесам для деревьев. Сегодня я обновил пакет, и теперь он выдает ошибку (хотя вывод, похоже, все еще работает). Минимальный пример:
\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}