Hinzufügen von Knoten außerhalb eines Baums und Zeichnen von Pfeilen zu ihnen mit tikz-qtree und tikz

Hinzufügen von Knoten außerhalb eines Baums und Zeichnen von Pfeilen zu ihnen mit tikz-qtree und tikz

Ich versuche ein Bild zu zeichnen, das den Satz erklären soll

dass er das Lied wird singen müssen

dass er das Lied singen muss

Die Idee ist, den Satz aufzuschreiben und den Baum aus dem untenstehenden Code zu haben, der die Dominanzbeziehungen zeigt, also welches Verb welches andere Verb dominiert. Direkt rechts von singen möchte ich einen zusätzlichen Knoten für müssen haben und links davon einen für haben und links von haben einen für wird. Die Verben, die in den Bäumen stehen, sollten mit Pfeilen mit diesen Knoten verbunden sein. Ist das möglich? Ich habe etwas probiert (siehe Code), aber die neuen Knoten kommen nicht auf derselben Grundlinie heraus wie singen.

Vielleicht muss ich alles irgendwie anders neu zeichnen?

    \documentclass{article}

\usepackage{tikz-qtree}

\begin{document}

\begin{tikzpicture}
\Tree [.wird
          [.haben
              [.muessen singen ] ] ] \node[anchor=east]{muessen}; 
\end{tikzpicture}

\end{document}

So sollte es aussehen:

Bildbeschreibung hier eingeben

Antwort1

Eine einfache Idee: Setzen Sie Ihren Satz in ein matrix of nodes. Diese Art von Tikz-Objekt weist jedem seiner Bestandteile automatisch einen Namen zu. Im folgenden Beispiel habe ich die Matrix genannt M, daher heißen die Elemente der ersten (und einzigen) Zeile M-1-1, M-1-2und so weiter. So können Sie ganz einfach weitere Wörter hinzufügen M-1-7und die Verbindungen herstellen:

\usetikzlibrary{matrix, positioning}
\begin{tikzpicture}[shorten >=1mm]
\matrix[name=M, matrix of nodes, inner sep=0pt, column sep=1ex]{
  dass & er & das & Lied & wird & haben & singen & m\"ussen \\
};

\node [anchor=base, above=2em of M-1-7.base]  (mussen) {m\"ussen};
\node [anchor=base, above=2em of mussen.base] (haben)  {haben};
\node [anchor=base, above=2em of haben.base]  (wird)   {wird};
\draw[->] (wird)   to[out=180,in=90] (M-1-5);
\draw[->] (haben)  to[out=180,in=90] (M-1-6);
\draw[->] (mussen) to[out=0,in=90]   (M-1-8);
\draw (wird) --(haben) -- (mussen) -- (M-1-7);
\end{tikzpicture}

Ergebnis

Antwort2

Hm, ein Baum sieht nicht richtig aus. Was ist mit Ketten?

Wir installieren zwei Ketten:

  1. Kette sentencegeht nach rechts, sentence going base right,
  2. Kette verbsgeht hoch, verbs going above.

An der sentenceKette platzieren wir einfach die Teile daß er das Lied, wird, haben, singen, können, für Elemente die einen Umlaut oder ein Eszett haben, vergeben wir einsicherName ohne sie (es gibt möglicherweise andere Lösungen, aber diese würden den Zugriff auf diese Knoten erschweren). Wenn wir \Namein der \foreachSchleife kein a angeben \Item, wird einfach der Text verwendet.

Der horizontale Knotenabstand .3333emwird so eingestellt, dass die Knoten wie in einem Satz platziert werden, dazu setzen wir auch den inner xsepund den outer xsepauf Null. Sie können dieses Verhalten überprüfen, indem Sie einen weiteren Knoten so platzieren, dass er sich mit dem Satz überlappt:

\node[anchor=text] at (sentence-begin.text) {da\ss\space er das Lied wird haben singen k\"onnen};

Der vertikale Teil von node distance, 1.5\baselineskip, wird zufällig gewählt, die inner ysepist halb so groß wie die Standardgröße. Die outer ysepist ebenfalls auf Null gesetzt (wir haben keine gezeichneten Knoten).

Die Knoten der vertikalen Kette werden automatisch durch die joinOption (die den Stil verwendet every join) verbunden. Die Verbindungen zu den Knoten im Satz werden ebenfalls in der zweiten Schleife hergestellt.

Der spezielle arc and lineStil sorgt dafür, dass die Bögen die Größe eines Viertelkreises mit dem größtmöglichen Radius haben. Es arc and line maximumkann jedoch ein optionaler Wert zugewiesen werden.

Wenn wir arc and line maximumeinen sehr kleinen Wert festlegen, sagen wir 6pt(den Standardwert für rounded corners), können wir einen einfachen -|Pfad mit den abgerundeten Ecken nachahmen. Die calcBibliothek und das let … inZeug sind nicht nötig.
Wenn arc and line maximumwir auf Null setzen, erhalten wir den einfachen -|Pfad mit scharfen Ecken. Wie oben brauchen wir calcdiese Berechnungen nicht.

Mir persönlich gefällt die blaue Variante mit kleinem rounded cornersRadius besser.

Code

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{chains,calc}
\tikzset{
  /pgf/arc and line maximum/.initial=+1000pt,
  arc and line/.style={
    to path={
      let
        \p{@end}=(\tikztotarget.north),
        \p{@aux1}=($(\tikztostart)-(\p{@end})$),
        \p{@start}=(node cs: name=\tikztostart, anchor={\x{@aux1} < 0pt ? +0 : +180}),
        \n{@aux2}={min(\pgfkeysvalueof{/pgf/arc and line maximum},abs(\x{@start}-\x{@end}),abs(\y{@start}-\y{@end})-.1pt))}
      in
      { [rounded corners=\n{@aux2}] -| (\tikztotarget) }
    }},
  special curve 0/.style={draw,->,arc and line},
  special curve 1/.style={
    special curve 0,
    arc and line maximum=+6pt},
  special curve 2/.style={
    special curve 0,
    arc and line maximum=+0pt},
  every sentence and verb node/.style={
    inner ysep=+.1667em,
    outer ysep=+0pt},
  sentence node/.style={
    every sentence and verb node,
    inner xsep=+0pt,
    outer xsep=+0pt,
    on chain=#1},
  sentence node/.default=sentence,
  verb node/.style={
    every sentence and verb node,
    on grid,
    text depth=+0pt,
    join,
    on chain=#1},
  verb node/.default=verbs
}
\begin{document}
\begin{tikzpicture}[
  node distance=1.5\baselineskip and width(" ")*1pt,
  start chain=sentence going base right,
  start chain=verbs going above,
  every join/.style={draw}
]
\foreach \Item/\Name in {da\ss\space er das Lied/dass,wird,haben,singen,k\"onnen/konnen}
  \node [sentence node, alias=s-\Name] {\Item};
\chainin[on chain=verbs] (s-singen);
\foreach \Item/\Name in {k\"onnen/konnen,haben,wird} {
  \node [verb node, alias=v-\Name] {\Item}
    edge[special curve 2,green] (s-\Name)
    edge[special curve 1,blue]  (s-\Name)
    edge[special curve 0]       (s-\Name);
}
\end{tikzpicture}
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Antwort3

Wenn Sie \usetikzlibrary{positioning}, können Sie Knoten in Bezug auf andere Knoten definieren. Wenn Sie also Knoten innerhalb des Baums definieren, können Sie Knoten außerhalb des Baums relativ zu den Knoten innerhalb des Baums positionieren. Das bedeutet, dass Sie mit dem Abstand manuell herumspielen müssen, aber es bietet eine Lösung. Hier ist ein MWE, das für Sie funktionieren sollte:

Aktualisieren: Wie @Qrrbrbirlbel in den Kommentaren anmerkt, bringt das „g“ in „singen“ die vertikale Ausrichtung der Knoten zueinander durcheinander. Dies wurde unten behoben, indem und verwendet wurden, base leftum base rightdie Knoten zueinander auszurichten.

\documentclass{article}

\usepackage{qtree}
\usepackage{tikz}
\usepackage{tikz-qtree,tikz-qtree-compat}
\tikzset{every tree node/.style={align=center, anchor=north}}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}

\Tree [.\node(1){wird};
          [.\node(2){haben};
              [.\node(3){m\"{u}ssen}; \node(4){singen}; ] ] ]

\node(5)[base left=1.9cm of 4]{dass er das Lied};
\node(6)[base left=1.1cm of 4]{wird};
\node(7)[base left=.1cm of 4]{haben};
\node(8)[base right=.1cm of 4]{m\"{u}ssen};
\draw[->] (1)..controls +(west:1) and +(north:1)..(6);
\draw[->] (2)..controls +(west:1) and +(north:1)..(7);
\draw[->] (3)..controls +(east:1) and +(north:1)..(8);

\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen