При использовании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
дочерний элемент (это еще больше сблизит категорию и лексическое содержимое) и переопределю Forest align
(который помещает содержимое узла в tabular
окружение и тем самым создает дополнительное вертикальное пространство) с помощью TikZ 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}