我需要为自然语言绘制句法树。问题是我需要所有叶子都是平行的。其他节点如何相对于同一深度的其他节点进行排序并不重要。在实际使用中,你会在纸张底部放一个句子,横向和横向都很好。根节点在另一侧,因此树使用整个页面。有没有可以做到这一点的软件包的建议?
编辑:我认为,只要可以使用整个页面,任何树形包都可以使用。
答案1
这不是语言文献中常见的树的表示方式,因此没有一个常规的树绘制包(qtree
和tikz-qtree
) 默认执行此操作。
具体来说,语言学文献中绘制树的方式是,终端节点是不是画在同一水平线上(即单词沿着基线,树从那里向上生长)。因此,以一棵简单的树为例约翰认为他爱玛丽,我们可以使用来tikz-qtree
轻松绘制树:
\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\begin{document}
\Tree [.S [.NP John ]
[.VP [.V\0 thinks ]
[.S [.NP he ]
[.VP [.V\0 loves ] [.NP Mary ]]]]]
\end{document}
请注意,树的终端节点不与基线沿线的其他终端节点对齐。这在语言学文献中很正常,尽管在教学生如何手工绘制树时,我们经常从将所有单词排列在底部开始(即与树中最低的单词处于同一级别)。
2023 年更新
这个答案是在 2011 年写的,当时forest
还不存在。对于大多数用途来说,forest
这是目前最好的软件包,而且正如另一个答案所示,在基线上对齐节点很容易。我推荐那个答案反而。
一种新的解决方案tikz-qtree
从 1.2 版开始,tikz-qtree
现在有一种简单的方法可以让终端节点排列起来,尽管选择值需要一些手动计算。键frontier
允许您使用参数指定终端节点的位置distance from root
。因此,在上面的例子中,我们可以将其设置distance from root
为 5 厘米,终端节点将排列起来。这个值需要为每棵树单独更改。
\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\begin{document}
\begin{tikzpicture}[frontier/.style={distance from root=5cm}]
\Tree [.S [.NP John ]
[.VP [.V\0 thinks ]
[.S [.NP he ]
[.VP [.V\0 loves ] [.NP Mary ]]]]]
\end{tikzpicture}
\end{document}
另一个简单的解决方案
作为上述关键解决方案的替代方案frontier
,公斤使用常规 TikZ 方法的非常简单的答案也可以使用来应用tikz-qtree
。 所需的只是在树中插入额外的括号以制作虚拟节点。 因此,您只需执行以下操作即可:
\begin{tikzpicture}
\Tree [.S [.NP [[[ John ]]] ]
[.VP [.V\0 [[ thinks ]] ]
[.S [.NP [ he ] ]
[.VP [.V\0 loves ] [.NP Mary ]]]]]
\end{tikzpicture}
上面的树和这棵树之间的唯一区别是,终端被括在了额外的括号中:约翰,两个想一个他。对于偶尔出现的树,这可能是实现您想要的一种简单方法。
使用一个旧的解决方案xyling
这xyling
包也有办法做到这一点,尽管它的树绘制输入方法要麻烦得多。以下是使用格式化的同一棵树xyling
:(我把这部分答案留给后人;tikz-qtree
答案真的要简单得多。)
% compile with latex + dvips
\documentclass{article}
\usepackage{xyling}
\begin{document}
\Tree{ & \K{S}\B{dl}\B{dr}\\
\K{NP}\B{d} & & \K{VP}\B{dl}\B{dr}\\
\B[6]{d} & \K{V}\B{d} & & \K{S}\B{dl}\B{dr}\\
\B[6]{d} & \B[6]{d}& \K{NP}\B{d} & & \K{VP}\B{dl}\B{dr}\\
\B[6]{d} & \B[6]{d}&\B[6]{d} & \K{V}\B{d} & & \K{NP}\B{d}\\
John & thinks & he & loves & & Mary }
\end{document}
基本上,xyling
设置一种表格网格来绘制树。这允许您将所有终端节点放在网格的最下一行,然后在其上方的空单元格中添加显式分支,直至其非终端节点。由于默认分支绘制命令假定节点标签,因此您需要使用该\B
命令的可选参数来提高额外分支的起点。值6
似乎可以完成足够的工作。
xyling
使用 Postscript 特殊功能,无法与 一起使用pdflatex
,因此您需要使用 编译此文件。latex+dvips+ps2pdf
文档解释了如何修改样式文件来更改这一点(我不知道为什么它不是一个包选项。)事实上,鉴于现在大部分包都支持 pdf,因此xy
修改样式文件以使用或xy-ling
会很简单。pdflatex
latex+dvips
答案2
为了完整性,forest
应该包括极其强大的软件包;):
\documentclass[tikz,border=10pt,multi]{standalone}
\usepackage[linguistics]{forest}
\newcommand*\primary{\textsuperscript{0}}
\begin{document}
\begin{forest}
for tree={
where n children=0{tier=terminal}{},
}
[S
[NP
[John
]
]
[VP
[V\primary
[thinks
]
]
[S
[NP
[he
]
]
[VP
[V\primary
[loves
]
]
[NP
[Mary
]
]
]
]
]
]
\end{forest}
\end{document}
tier
正在做保持最终节点对齐的工作。where n children=0{}{}
正在将其应用于终端节点(没有子节点)。
如果您只有早期版本的 Forest(v.2 之前)并且无法更新,则您将需要此代码:
\documentclass[standalone, border=5pt]{standalone}
\usepackage{forest}
\newcommand*\primary{\textsuperscript{0}}
\begin{document}
\begin{forest}
for tree={
where n children=0{tier=terminal}{},
parent anchor=south,
child anchor=north,
}
[S
[NP
[John
]
]
[VP
[V\primary
[thinks
]
]
[S
[NP
[he
]
]
[VP
[V\primary
[loves
]
]
[NP
[Mary
]
]
]
]
]
]
\end{forest}
\end{document}
答案3
答案4
只要您不逐个调整节点高度,这在 tikz 中实际上很容易实现。 (因此,在同一棵树中混合多行和单行节点会破坏这一点)。(参见注释。)只需添加额外的子节点:
\begin{tikzpicture}
[sibling distance=2.5cm,level distance=1.2cm,edge from parent path={(\tikzparentnode.south) --
(\tikzchildnode.north)}, inner sep=1.5pt]
\node {S}
child {node {NP}
child {child {child {child {node {\textit{John}}}}}}}
child {node {VP}
child {node {V}
child {child {child {node {\textit{thinks}}}}}}
child {node {S}
child {node {NP}
child {child {node {\textit{he}}}}}
child {node {VP}
child {node {V}
child {node {\textit{loves}}}}
child {node {NP}
child {node {\textit{Mary}}}}}}};
\end{tikzpicture}