森林 v2

森林 v2

当使用包 forest 在树中水平对齐终端节点时,我尝试使用“nice empty nodes”选项时遇到问题,该选项可确保未标记的节点连接(此问题与这个):

\documentclass{article}

\usepackage{forest}

\forestset{
 sn edges/.style={for tree={parent anchor=south, child anchor=north}},
 rectangle tree/.style={
 draw tree stage/.style={
 for root'={
   draw tree box=0,
   draw tree,
   TeX={\tikz{\node {\box0};}},
   }}},
   nice empty nodes/.style={
 for tree={calign=fixed edge angles},
 delay={where content={}{shape=coordinate,for parent={for children=   
{anchor=north}}}{}}
 }
 }

\begin{document}

\noindent Terminal nodes aligned on one line:

\begin{forest}  baseline, sn edges, rectangle tree, where n 
children=0{tier=word}{},

 [VP$_1$,   [read] [NP$_1$,  [the] [ [note] [PP$_1$ [on the table, 
triangle]]]]] 

\end{forest}

\ \\
This doesn't play nice with nice `nice empty nodes':

\begin{forest}  baseline, sn edges, rectangle tree, where n 
children=0{tier=word}{},

 [VP$_1$, nice empty nodes,  [read] [NP$_1$,  [the] [ [note] [PP$_1$ [on the    
table, triangle]]]]] 

\end{forest}


\end{document}

输出:

示例树

我怎样才能解决这个问题?

答案1

这是一个我认为非常接近您想要的解决方案。它并不完美,但至少对我来说很难看到缺陷。而不是nice empty nodessn edges,这使用是pretty nice empty nodes因为空节点并不完全好,但它们非常接近。

这个答案有两个版本。第一个是针对森林。第二个适用于版本 1。如果您使用此代码,请务必选择适当的版本,因为两者都不能同时适用于该包的两个版本。


森林 v2

而不是shape=coordinate,我们设置inner sep=0pt。然后我们改变edge path以便child anchor=children。这避免了一条边的末端和下一条边的起点之间的微小间隙。我们还为树设置了parent anchor=childrencalign=fixed edge angles,但关键的是,我们不使用 ,child anchor=parent这会导致事情变得一团糟。(我不确定为什么,但确实如此。)

[对于向南生长的树,parent锚点为north,锚点childrensouth。但是,如果你改变生长方向,这些锚点也会相应地进行调整。因此,这些锚点比版本 1 中要求的硬编码方向更灵活。]

这意味着线条不是相当当有一个空节点时,它们是直的。但它们几乎是直的。

结果如下:

相当不错的空节点 2

以下是完整的示例:

\documentclass[tikz,border=10pt,multi]{standalone}
\usepackage{forest}
\useforestlibrary{linguistics}
\standaloneenv{forest}
\forestset{
  rectangle tree/.style={
    draw tree stage/.style={
      for root'={
        draw tree box=0,
        draw tree,
        TeX={
          \tikz{\node {\box0};}
        },
      }
    }
  },
  pretty nice empty nodes/.style={
    for tree={
      calign=fixed edge angles,
      parent anchor=children,
      delay={if content={}{
          inner sep=0pt,
          edge path={\noexpand\path [\forestoption{edge}] (!u.parent anchor) -- (.children)\forestoption{edge label};}
        }{}}
    }
  }
}
\begin{document}
\begin{forest}
 baseline,
 rectangle tree,
 where n children=0{
   tier=word
 }{},
 pretty nice empty nodes
 [VP$_1$
   [read]
   [NP$_1$,
     [the]
     [
       [note]
       [PP$_1$
         [on the table, roof]
       ]
     ]
    ]
  ]
\end{forest}
\end{document}

森林 v1

而不是shape=coordinate,我们设置inner sep=0pt。然后我们改变edge path以便child anchor=south。这避免了一条边的末端和下一条边的起点之间的微小间隙。我们还为树设置了parent anchor=southcalign=fixed edge angles,但关键的是,我们不使用 ,child anchor=north这会导致事情变得一团糟。(我不确定为什么,但确实如此。)

这意味着线条不是相当当有一个空节点时,它们是直的。但它们几乎是直的。

结果如下:

非常好的空节点

以下是完整的示例:

\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\standaloneenv{forest}
\forestset{
  rectangle tree/.style={
    draw tree stage/.style={
      for root'={
        draw tree box=0,
        draw tree,
        TeX={
          \tikz{\node {\box0};}
        },
      }
    }
  },
  pretty nice empty nodes/.style={
    for tree={
      calign=fixed edge angles,
      parent anchor=south,
      delay={if content={}{
          inner sep=0pt,
          edge path={\noexpand\path [\forestoption{edge}] (!u.parent anchor) -- (.south)\forestoption{edge label};}
        }{}}
    }
  }
}
\begin{document}
\begin{forest}
 baseline,
 rectangle tree,
 where n children=0{
   tier=word
 }{},
 pretty nice empty nodes
 [VP$_1$
   [read]
   [NP$_1$,
     [the]
     [
       [note]
       [PP$_1$
         [on the table, triangle]
       ]
     ]
    ]
  ]
\end{forest}
\end{document}

相关内容