制作包含和不包含文本节点的混合树

制作包含和不包含文本节点的混合树

我正在使用 TikZ 绘制语言语法树,其中一些节点具有文​​本标签,而一些节点没有。我希望无标签节点的分支以与通向该节点的分支相同的角度继续延伸到右侧子节点(或者进入左侧子节点),以便两个分支以相同的角度形成一条视觉上连续的线。我研究出如何对一个无标签节点执行此操作,为每个子节点使用大量锚点规范的临时解决方案。这不适用于多个无标签节点,而且无论如何这都是一种非常混乱的方法。一定有更好的方法来做到这一点,但我还没有想出来。有什么建议吗?(我正在使用 XeTeX,但我认为这没关系。)

\begin{tikzpicture}[level distance=2em,
            sibling distance=4em,
            parent anchor=south,
            child anchor=north,
            anchor=north,
            align=center,
%           every node/.style={draw}
            ]
\node{DP}
    child {node {Qfr}}
    child {node (dbar) {}
        child[parent anchor=north, anchor=base] {node {D}}
        child[parent anchor=north, anchor=base] {node {ΦP}
            child[parent anchor=south, anchor=north] {node {CP}}
            child[parent anchor=south, anchor=north] {node (phibar) {}
                child[parent anchor=north, anchor=base] {node {Nml}}
                child[parent anchor=north, anchor=south] {node (phibar2) {}
                    child[parent anchor=north, anchor=base] {node {Φ}}
                    child[parent anchor=north, anchor=base] {node {NP}}}}}};
\end{tikzpicture}

上面代码的输出。

答案1

我建议您完全不使用空节点{},而要使用 。为了获得正确的垂直间距,您可以让所有边从 开始parent anchor=center,这将与north空分支的锚点重合(因此您将获得一条连续的线),但位于文本节点的中间。要将线移出文本,您可以text depth为所有节点指定 (这不会对空分支产生影响)。

\begin{document}
\begin{tikzpicture}[
    level distance=2em,
    sibling distance=4em,
    anchor=north,
    parent anchor=center,
    child anchor=north,
    text depth=2.5ex % Use this to define the vertical space between the entering and exiting edge of a text node
]
\node{DP}
    child {node {Qfr}}
    child {
        child {node {D}}
        child {node {$\Phi$P}
            child {node {CP}}
            child {
                child {node {Nml}}
                child {
                    child {node {$\Phi$}}
                    child {node {NP}}}}}};
\end{tikzpicture}

\end{document}

答案2

使用样式(第 52 页,示例 81),您forest通常可以很好地完成此操作nice empty nodes。但是,有时它并不那么简单。您的树就是这样一个例子。尽管如此,还是有可能使树非常完美,以至于我挑战任何人知道树确实不是使用纯粹的形式nice empty nodes而不看代码,放大很多倍或使用其他类型的恶意诡计。

这样做的好处是可以使用非常简洁的括号语法来排版树。

结果如下(忽略字体 - 我不知道问题中使用了什么并且没有尝试模仿它们):

<code>森林</code> 相当不错的空节点

我要称之为相当不错的空节点,我认为,在英国人的意义上是‘相当’;)。

代码如下:

\documentclass[10pt,tikz,border=5pt]{standalone}
\usepackage{forest}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}
\begin{forest}
  for tree={
    calign=fixed edge angles,
    parent anchor=south,
  },
  before typesetting nodes={% page 52: example (81)
    where content={}{% shape=coordinate gives an error if used here but this is *almost* right - it just leaves a little, tiny gap
      text width=.001pt,
      inner sep=0pt,
      before drawing tree={% here we make sure that the tiny gap disappears so only the size is not quite dimensionless
        shape=coordinate,
        typeset node,
      },
      for parent={
        for children={
          anchor=north,
        }
      }
    }{}
  }
  [DP
    [Qfr]
    [
      [D]
      [$\phi$P
        [CP]
        [
          [Nml]
          [
            [$\phi$]
            [NP]
          ]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

答案3

只需使用该tikz-qtree包,除了解决您的问题之外,它还允许您以更简洁的方式输入树。手册中的示例已标记所有节点,但如果您不标记节点,包也会做正确的事情。这是手册中的一个(通过随机删除几个标签进行修改)示例,结果如下:

\Tree [.S [.NP [.Det the ] [.N cat ] ] [ [.V sat ]
[.PP [.P on ] [ [.Det the ] [.N mat ] ] ] ] ]

tikz-qtree 的输出

相关内容