答案1
由于我手边正好有一本 Heim 和 Kratzer 的书,所以你的问题就更加神秘了,因为他们的大多数树都有标签(尽管有些没有标签),而且都是二叉树。下面是使用该forest
软件包绘制的一棵树,供你入门:
我使用了nice empty nodes
样式来允许无标签节点,并pad
为非常小的节点(如1
节点)创建了样式。DPcalign with current
节点的添加使 VP 树变得扁平(没有它,树看起来会很丑陋)。[感谢 cfr 提供该代码。]
\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{pad/.style={minimum width=5em}}
\begin{document}
\begin{forest}nice empty nodes
[S
[ {every linguist} ]
[ [1,pad ] [S [ John ]
[ [T,pad ]
[VP [V\\introduced ]
[DP\\$t_{1}$,calign with current ]
[PP\\{to Mary}]]]]]]
\end{forest}
\end{document}
或者,如果您不介意空节点分支有多直,那么您可以对空节点使用略有不同的定义。这对于非二叉树来说可能更好。(并且不需要在 DP 节点中进行手动修复。)
\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{pad/.style={minimum width=5em},
empty nodes/.style={
delay={where content={}{shape=coordinate,for parent={
for children={anchor=north}}}{}}
}}
\begin{document}
\begin{forest} empty nodes
[S
[ {every linguist} ]
[ [1,pad] [S [ John ]
[ [T,pad]
[VP [V\\introduced, ]
[DP\\$t_{1}$ ]
[PP\\{to Mary}]
]]]]]
\end{forest}
\end{document}
答案2
“更多分支”的含义不明确。你可能是指某些节点需要有 2 个以上的子节点,也可能是指你只需要更多二进制分支。
在第二种情况下,只需使用linguistics
with 库nice empty nodes
就可以为你的树做很多事情。然而,在第一种情况下,nice empty nodes
会引起问题。如果你的树主要是二进制的,就像 AlanMunn 的例子一样,那么在特别指定基础是一个合理的选择。但是,如果分歧太大,你最好nice empty nodes
根本不要在这里使用。
这是艾伦 (Alan) 的例子的改编,它演示了这个问题。
\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[linguistics]{forest}
\forestset{pad/.style={minimum width=5em}}
\begin{document}
\begin{forest}
nice empty nodes
[S
[{every linguist}
]
[
[1, pad
]
[Additional thing]
[Other thing]
[S
[ John
]
[
[T, pad
]
[VP
[V\\introduced
]
[DP\\$t_{1}$, calign with current
]
[PP\\{to Mary}
]
]
]
]
]
]
\end{forest}
\end{document}
在这种情况下,calign with current
没有太大的帮助,因为我们会得到
这里有两个问题。一是子节点数量为偶数,因此没有中间子节点与父节点对齐。二是非二叉树的分支不限于树的终端节点。
在这种情况下,尝试将 设为空节点less ugly
而不是可能会更好nice
。例如,
\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[linguistics]{forest}
\forestset{%
pad/.style={minimum width=5em},
less ugly empty nodes/.style={%
nice empty nodes,
before typesetting nodes={%
where={(n_children())>2}{%
if={isodd(n_children())}{%
for n={int((n_children()+1)/2)}{calign with current},
}{%
for n={int((n_children())/2)}{insert after={[,phantom,calign with current]}},
},
if nodewalk valid={uu}{%
if={(n_children("!u")<3)&&(n_children("!uu")>2)}{!u.calign=midpoint}{},
}{%
if nodewalk valid=u{%
!u.calign=midpoint,
}{},
},
}{},
},
}
}
\begin{document}
\begin{forest}
less ugly empty nodes
[S
[{every linguist}
]
[
[1, pad
]
[Additional\\thing]
[Other\\thing]
[S
[ John
]
[
[T, pad
]
[VP
[V\\introduced
]
[DP\\$t_{1}$
]
[PP\\{to Mary}
]
]
]
]
]
]
\end{forest}
\end{document}
即使树木看上去非常奇怪,效果也不会太糟糕。
\begin{forest}
less ugly empty nodes
[S
[{every linguist}
]
[wants]
[
[1, pad
]
[Additional\\thing]
[Other\\thing]
[S
[ John
]
[
[T, pad
]
[VP
[V\\introduced
]
[DP\\$t_{1}$
]
[PP\\{to Mary}
]
]
]
]
]
[to be
[a]
[philosopher
[every philosopher
[wants]
[
[to]
[be]
[a
[mathematician]
]
]
]
]
]
]
\end{forest}
理想情况下,我猜代码会测试疯狂并自动调整。然而,这个问题的答案需要一个不同的、希望更清晰的问题。