Отформатируйте определенные конечные узлы и удалите линии между ними и их родителями, используя лес

Отформатируйте определенные конечные узлы и удалите линии между ними и их родителями, используя лес

При использовании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}

влияние изменений на наборное дерево

Связанный контент