
Я хочу создать фантомный узел, который не занимает места в верхней части дерева, для целей выравнивания, чтобы первый помеченный узел дерева совпадал с номером примера. Настроек 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}
Объедините вышесказанное с тем фактом, что Forest повторно использует имена узлов (корень обычно назван node@2
по умолчанию), и вы получите проблему. Если вы установите базовый узел на root (как это делает библиотека лингвистики) и сделаете root фантомным (как это обычно делается для набора параллельных деревьев), TikZ фактически устанавливает базовый узел на y=0
. Результат показан в примере OP.
Теперь Forest 2.0.3 (где проблема, вызванная , draw tree method
была исправлена) стал умнее и перестал указывать TikZ устанавливать базовый узел на фантомные узлы (точнее, любой узел, который не нарисован). Таким образом, начиная с этой версии, базовая линия больше не устанавливается для параллельных лингвистических деревьев. Результат, как и обещано в руководстве TikZ, заключается в том, что "нижний конец изображения помещается на базовую линию окружающего текста", как в следующем примере. (Узлы draw
n, чтобы лучше видеть выравнивание.)
\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.1.5 пытается быть умнее: грубо говоря, она устанавливает базовую линию на "первый нефантомный узел". В нашем примере это левый VP, поэтому мы получаем:
(Временное замечание: Forest 2.1.5 уже представлен в CTAN и также доступен наGitHub.)
Теперь, надо признать, в примере OP все это вообще не помогает, так как «первый нефантомный узел» разрешается в Jane is ...
. Новое базовое значение по умолчанию в лингвистике работает для обычного случая параллельных деревьев; для чего-то необычного просто установите baseline
вручную, как рекомендовано вОтвет Алана.