
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:
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-2
und so weiter. So können Sie ganz einfach weitere Wörter hinzufügen M-1-7
und 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}
Antwort2
Hm, ein Baum sieht nicht richtig aus. Was ist mit Ketten?
Wir installieren zwei Ketten:
- Kette
sentence
geht nach rechts,sentence going base right
, - Kette
verbs
geht hoch,verbs going above
.
An der sentence
Kette 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 \Name
in der \foreach
Schleife kein a angeben \Item
, wird einfach der Text verwendet.
Der horizontale Knotenabstand .3333em
wird so eingestellt, dass die Knoten wie in einem Satz platziert werden, dazu setzen wir auch den inner xsep
und den outer xsep
auf 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 ysep
ist halb so groß wie die Standardgröße. Die outer ysep
ist ebenfalls auf Null gesetzt (wir haben keine gezeichneten Knoten).
Die Knoten der vertikalen Kette werden automatisch durch die join
Option (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 line
Stil sorgt dafür, dass die Bögen die Größe eines Viertelkreises mit dem größtmöglichen Radius haben. Es arc and line maximum
kann jedoch ein optionaler Wert zugewiesen werden.
Wenn wir arc and line maximum
einen 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 calc
Bibliothek und das let … in
Zeug sind nicht nötig.
Wenn arc and line maximum
wir auf Null setzen, erhalten wir den einfachen -|
Pfad mit scharfen Ecken. Wie oben brauchen wir calc
diese Berechnungen nicht.
Mir persönlich gefällt die blaue Variante mit kleinem rounded corners
Radius 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
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 left
um base right
die 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}