
При рисовании синтаксических представлений в лингвистике часто используют треугольник для обозначения единицы, внутренняя структура которой не имеет значения. Это можно сделать с помощью tikz-qtree
команды \edge[roof]; {John}
.
Теперь, иногда мне нужно показать движение такого юнита, внутренняя структура которого не имеет отношения к рассматриваемой точке. Для этого я обычно использую библиотеку positioning
и определяю узел относительно узла над треугольником, вот так:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={align=center, anchor=north}}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\Tree
[.TP
[.\node(DP1-rel){DP}; \edge[roof]; {John} ]
[.T$'$
[.T ]
[.\emph{v}P
[.\node(DP2-rel){DP}; \edge[roof]; {$<$John$>$} ]
[.\emph{v}$'$
[.\emph{v}
[.V \node(V1){likes}; ]
[.\emph{v} ]
]
[.VP
[.V \node(V2){$<$likes$>$}; ]
[.DP \edge[roof]; {Mary} ]
]
]
]
]
]
\node (DP1) [below=1cm of DP1-rel] {};
\node (DP2) [below=1cm of DP2-rel] {};
\draw[->] (DP2)..controls +(south west:1) and +(south:1)..(DP1);
\draw[->] (V2)..controls +(south:1) and +(south:1)..(V1);
\end{tikzpicture}
\end{document}
Есть ли более простой/лучший способ сделать это, при котором мне не придется определять относительный узел каждый раз, когда мне нужно переместить блок, внутренняя структура которого не имеет значения (то есть, чью структуру я представляю треугольником, используя tikz-qtree
команду \edge[roof]; {John}
)?
решение1
Вы можете просто сделать текст крыши узлом. (Я также немного упростил синтаксис стрелки.)
\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\tikzset{every tree node/.style={align=center, anchor=north}}
\begin{document}
\begin{tikzpicture}
\Tree
[.TP
[.DP \edge[roof]; \node (J) {John}; ]
[.T$'$
[.T ]
[.\emph{v}P
[.DP \edge[roof]; \node (Jtrace) {$<$John$>$}; ]
[.\emph{v}$'$
[.\emph{v}
[.V \node(V1){likes}; ]
[.\emph{v} ]
]
[.VP
[.V \node(V2){$<$likes$>$}; ]
[.DP \edge[roof]; {Mary} ]
]
]
]
]
]
\draw[->] (Jtrace) [in=-90,out=-90,looseness=1.5] to (J);
\draw[->] (V2) [in=-90,out=-90] to (V1);
\end{tikzpicture}
\end{document}
решение2
Я не знаю, tikz-qtree
но сforest
, вы можете получить доступ к узлу дерева с помощью специального !
синтаксиса. Узел (!2211)
(в ваших примерах это <John>
), является корнем ( TP
) вторым потомком ( T'
) вторым потомком vP
( DP
) первым потомком ( <John>
).
Затем всегда есть возможность дать узлу имя с помощью обычного ключа TikZ: name
(или alias
если вам нужно больше одного имени).
Также есть возможность задать узел, который является относительным к другому (что на самом деле является общим случаем для синтаксиса !
). В этом примере мы идем к u
p, затем к l
дочернему элементу ast и к дочернему элементу st его 2
nd, 1
что приводит к (!ul21)
.
У каждого есть свои преимущества, в зависимости от того, насколько статичным является дерево. Если вы много перемещаетесь, было бы разумно дать узлам фиксированное имя. Если узел всегда остается относительно фиксированным по отношению к другому узлу, вы можете использовать относительное имя узла. Если узел всегда остается относительно корня, вы можете использовать специальный относительный синтаксис после дерева (т. е. после корневого узла).
В коде ниже я позволил себе определить стиль angled
, который автоматически добавляет <
и >
к своему контенту. Я также использовал другой путь для соединений (который, как мне кажется, выглядит немного лучше, но я не лингвист).
Код
\documentclass[tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{paths.ortho}% http://tex.stackexchange.com/a/110172/16595
\forestset{angled/.style={content/.expanded={$<$\forestov{content}$>$}}}
\begin{document}
\begin{forest} s sep*=3
[TP
[DP, tikz={\draw[blue, ->] () -- node[sloped, above] {\ttfamily !ul21} (!ul21);}
[John, triangle] ]
[T'
[T]
[\emph{v}P
[DP
[John, triangle, angled] ]
[\emph{v}'
[\emph{v}
[V
[likes, name=V1] ]
[\emph{v} ] ]
[VP
[V
[likes, angled, name=V2] ]
[DP
[Mary, triangle] ] ] ] ] ] ]
%
\path[rounded corners, du, -latex] (!2211) edge (!11)
(V2) edge (V1);
\end{forest}
\end{document}