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-qtreeforest、特別な構文を使用してツリーのノードにアクセスできます!。ノード(!2211)(例では<John>) は、ルート ( TP) の 2 番目の子 ( T') の 2 番目の子 ( vP) の最初の子 ( DP) の最初の子 ( <John>) です。

次に、通常の TikZ キーを使用してノードに名前を付ける可能性が常にありますname(または、alias複数の名前が必要な場合)。

また、別のノードに相対的なノードを指定することも可能です (これは、実際には!構文の一般的なケースです)。この例では、up に移動し、次に ast 子に移動し、そのnd 子のst 子lに移動して につながります。21(!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}

出力

ここに画像の説明を入力してください

関連情報