使用时forest
包来绘制语言语法树,如何才能防止在特定的终端节点和它们的父节点之间画线,同时仍然将它们保持为由forest
/看到的单独“节点” TikZ
,以方便程序格式化?
以下是所需输出的示例(使用我当前的解决方法生成,如下面的 MWE 中所示):
我目前的解决方法包括以下内容,但需要太多的手动干预:
- 我通过创建一个单个节点,然后强制在句法类别(如果存在)和它的词汇实现(如果存在)之间换行,来删除“终端节点”和它的“父节点”之间的行,例如
[DP\\the apple]
。 - 具有词汇项的终端节点会通过使用
xcolor
包着色来手动装饰这些词项(例如[DP\\\textcolor{blue}{the apple}]
。
理想情况下,我希望能够以编程方式在环境中应用类似以下代码forest
:
for tree={
if n children=0{
text=blue
}{},
}
但是,添加上述代码片段会产生以下不必要的输出:
我认为解决方案可能与设置“词汇终端节点”类型有关(即终端节点属于词汇类型,而不是空或句法类别),然后仅将文本修饰应用于该类型的节点。但是,我不确定如何在 中执行此操作forest
,或者这是否是好的/最佳的解决方案。
最小工作示例(当前的解决方法)
\documentclass[a4paper]{article}
% ----- Package Imports -----
\usepackage{amsmath, amssymb, amsthm, mathtools} % Math enhancements
\usepackage{newpxtext, newpxmath} % Palatino fonts (load after amssymb)
\usepackage[svgnames]{xcolor} % Custom colours
%\usepackage[style=ieee]{biblatex} % Bibliography
\usepackage[linguistics]{forest} % Linguistic syntax trees
\begin{document}
\begin{forest}
[CP
[\phantom{X}]
[C'
[C]
[TP
[\phantom{X},name=TP-spec]
[T'
[T\\\textcolor{blue}{$\varnothing_{\text{past}}$},name=TP-head]
[VoiceP
[DP\\\textcolor{blue}{Bill}]
{\draw[->] () to[out=south west,in=west,distance=2cm] (TP-spec);}
[Voice'
[Voice\\\textcolor{blue}{$\varnothing_{\text{active}}$}]
[VP
[DP]
[V'
[V\\{[}FORM preterite{]}\\\textcolor{blue}{ate}]
[DP\\\textcolor{blue}{the apple}]
]
]
]
]
]
]
]
]
\end{forest}
\end{document}
答案1
应用于no edge
节点可防止绘制其父节点的边。
l sep=0
父节点和子节点上的组合l=0
使它们在垂直方向上彼此靠近。
我发现如果我在子项上另外设置inner ysep=0
(这会使类别和词汇内容更加接近),并且用TikZ 的:覆盖 Forest 的align
(将节点内容放在 tabular
环境中,从而创建一些额外的垂直空间),结果会最令人满意。align
\forestset{align/.style={/tikz/align={#1}}}
\documentclass[a4paper]{article}
% ----- Package Imports -----
\usepackage[svgnames]{xcolor} % Custom colours
\usepackage{amsmath, amssymb, amsthm, mathtools} % Math enhancements
\usepackage{newpxtext, newpxmath} % Palatino fonts (load after amssymb)
%\usepackage[style=ieee]{biblatex} % Bibliography
\usepackage[linguistics]{forest} % Linguistic syntax trees
\forestset{align/.style={/tikz/align={#1}}}
\begin{document}
\begin{forest}
for tree={
if n children=1{
l sep=0,
for 1={no edge, l=0, inner ysep=0, blue}
}{},
}
[CP
[\phantom{X}]
[C'
[C]
[TP
[\phantom{X},name=TP-spec]
[T'
[T[$\varnothing_{\text{past}}$,name=TP-head]]
[VoiceP
[DP[Bill]
{\draw[->] () to[out=south west,in=west,distance=2cm] (TP-spec);}
]
[Voice'
[Voice[$\varnothing_{\text{active}}$]]
[VP
[DP]
[V'
[V\\{[}FORM preterite{]}[ate]]
[DP[the apple]]
]
]
]
]
]
]
]
]
\end{forest}
\end{document}