素敵な空のノードが forest 2.0 によって壊れてしまいましたか?

素敵な空のノードが forest 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={...}現在のノードは走査されないためです。 この場合、現在のノードは座標形状を取得するため、これは違いを生じません。 正確に (古い)動作を得るには、 とします。 また、次のマイナー リリースに key を含めることを約束します... 今まで、それを持つことが理にかなっている場合があることに気付いていませんでした。for siblingsfor 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}

より良い空のノード?

関連情報