Лес: Создать фантомный узел, который не занимает места?

Лес: Создать фантомный узел, который не занимает места?

Я хочу создать фантомный узел, который не занимает места в верхней части дерева, для целей выравнивания, чтобы первый помеченный узел дерева совпадал с номером примера. Настроек l sep=0ptявно недостаточно. Что еще мне нужно настроить, чтобы добиться этого?

МВЭ:

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{expex}

\begin{document}

\ex\begin{forest}
[, phantom
    [{Jane is ...}, tier=words]
    [AjP
        [Specifier
            [very, tier=words]
        ]
        [Aj'
            [Aj
                [fond, tier=words]
            ]
            [PP
                [{of Cheetah}, roof, tier=words]
            ]
        ]
    ]
]
\end{forest}\xe

\end{document}

Дерево с пустым верхним узлом, занимающим ненужное пространство

решение1

Я не могу воспроизвести вашу проблему с текущей версией forest. Но с текущей версией вы можете добавить baselineк любому узлу, чтобы сделать этот узел базовой линией дерева.

(Несвязанный лингвистический комментарий: «спецификатор» — это название синтаксической позиции, а не синтаксической категории или узла в дереве, и, как правило, никогда не должен появляться в дереве.)

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{expex}

\begin{document}

\ex
\begin{forest}
[,phantom,
    [{Jane is ...}, tier=words]
    [AjP,baseline
        [Specifier
            [very, tier=words]
        ]
        [Aj'
            [Aj
                [fond, tier=words]
            ]
            [PP
                [{of Cheetah}, roof, tier=words]
            ]
        ]
    ]
]
\end{forest}
\xe

\end{document}

вывод кода

решение2

Вам здесь вообще не нужен phantomкорень. Вам просто нужно удалить ребро для первого потомка и указать выравнивание для корня.

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{expex}

\begin{document}

\ex
\begin{forest}
  where n children=0{tier=words}{}
  [AjP, calign child=2
    [Jane is \dots, no edge]
      [Specifier
          [very]
      ]
      [Aj'
          [Aj
              [fond]
          ]
          [PP
              [of Cheetah, roof]
          ]
      ]
  ]
\end{forest}
\xe

\end{document}

выравнивание без фантома

решение3

До версии 2.0.3 Forest устанавливал базовый узел (узел, якорь которого будет выровнен по базовой линии) всякий раз, когда baselineиспользовался ключ, даже если он использовался на phantomузле, который не был нарисован TikZ. Можно было бы ожидать, что это приведет к ошибке TikZ, но этого не произошло.

После создания узла в TikZ его имя сохраняется даже за пределами группы (полагаю, это можно считать ошибкой), при этом «узел» располагается в (0,0), как здесь:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \node(foo){};
\end{tikzpicture}

\begin{tikzpicture}
  \draw[->] (-1,1) -- (foo.center) -- (1,1);
\end{tikzpicture}

\end{document}

Ошибка сохранения имени узла TikZ

Объедините вышесказанное с тем фактом, что Forest повторно использует имена узлов (корень обычно назван node@2по умолчанию), и вы получите проблему. Если вы установите базовый узел на root (как это делает библиотека лингвистики) и сделаете root фантомным (как это обычно делается для набора параллельных деревьев), TikZ фактически устанавливает базовый узел на y=0. Результат показан в примере OP.

Теперь Forest 2.0.3 (где проблема, вызванная , draw tree methodбыла исправлена) стал умнее и перестал указывать TikZ устанавливать базовый узел на фантомные узлы (точнее, любой узел, который не нарисован). Таким образом, начиная с этой версии, базовая линия больше не устанавливается для параллельных лингвистических деревьев. Результат, как и обещано в руководстве TikZ, заключается в том, что "нижний конец изображения помещается на базовую линию окружающего текста", как в следующем примере. (Узлы drawn, чтобы лучше видеть выравнивание.)

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{gb4e}

\begin{document}
\begin{exe}
\ex\begin{forest}
  for tree=draw
  [,phantom
    [VP[V][DP]]
    [VP[V][DP]]
  ]
\end{forest}
\end{exe}
\end{document}

Вот что мы получаем при компиляции приведенного выше кода с помощью Forest v2.0.3 - v2.1.4.

скомпилировано v2.0.3 - 2.1.4

Чтобы быть абсолютно ясным: я считаю это ожидаемым поведением. Однако это не значит, что этожеланныйповедение ... и вот почему лингвистическая библиотека v2.1.5 пытается быть умнее: грубо говоря, она устанавливает базовую линию на "первый нефантомный узел". В нашем примере это левый VP, поэтому мы получаем:

скомпилировано 2.1.5

(Временное замечание: Forest 2.1.5 уже представлен в CTAN и также доступен наGitHub.)

Теперь, надо признать, в примере OP все это вообще не помогает, так как «первый нефантомный узел» разрешается в Jane is .... Новое базовое значение по умолчанию в лингвистике работает для обычного случая параллельных деревьев; для чего-то необычного просто установите baselineвручную, как рекомендовано вОтвет Алана.

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