當使用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
on 父節點和on 子節點的組合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}