tikz-qtree에서 이동 화살표를 지붕으로 그리는 더 효율적인 방법

tikz-qtree에서 이동 화살표를 지붕으로 그리는 더 효율적인 방법

언어학에서 구문적 표현을 그릴 때 내부 구조가 관련 없는 단위를 나타내기 위해 삼각형을 사용하는 경우가 많습니다. 이는 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하나 이상의 이름이 필요한 경우).

또한 다른 노드에 상대적인 노드를 제공할 가능성도 있습니다(실제로 구문의 일반적인 경우입니다 !). 이 예에서 우리는 up로 이동한 다음 last 자식으로 이동하고 로 이어지는 2두 번째 자식의 첫 번째 자식으로 이동합니다 .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}

산출

여기에 이미지 설명을 입력하세요

관련 정보