
Ich versuche, einen Knoten in geschweiften Klammern {} zu definieren:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.CP \node(y){here}; [.C$'$ C [.TP \edge[roof]; {Some text \node(x){here};} ]]]
\end{tikzpicture}
\end{document}
Ich muss den Knoten x innerhalb der {}-Umgebung definieren, da ich möchte, dass tikz-qtree die Zeichenfolge „Hier ist ein Text“ als einzelne Einheit behandelt. Wenn ich das Semikolon jedoch nach der ersten oder zweiten schließenden Klammer setze, funktioniert es nicht.
Antwort1
Da der Text innerhalb des überdachten Knotens intern selbst ein Knoten ist und Sie Knoten nicht in Knoten einbetten können, müssen Sie dieses Problem auf eine etwas andere Weise angehen. Die Grundidee besteht darin, den übergeordneten Knoten des überdachten Knotens stattdessen zum benannten Knoten zu machen. Wenn Sie dann beispielsweise einen Pfeil von jedem der Knoten anzeigen möchten, müssen Sie den Startpunkt des Pfeils relativ zum übergeordneten Knoten versetzen. Hier ist ein Beispiel:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.CP \node(y){here}; [.C$'$ C [.\node(x){TP}; \edge[roof]; {Some text here} ]]]
\draw [->] (x.south)++(.9,-1) to[out=-90,in=-90,looseness=2] (y.south);
\end{tikzpicture}
\end{document}
Eine alternative (und vielleicht etwas einfachere) Methode besteht darin, den Dachtext selbst als Knoten zu definieren und dann einfach den [xshift]
Parameter zu verwenden, um den Startpunkt des Pfeils an die gewünschte Stelle zu verschieben:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.CP \node(y){here}; [.C$'$ C [.TP \edge[roof]; \node(x){Some text here}; ]]]
\draw [->] ([xshift=2.5em]x.south) to[out=-90,in=-90,looseness=2] (y.south);
\end{tikzpicture}
\end{document}
Antwort2
Nur für den Fall, dass es jemandem entgangen ist: forest
Beim Zeichnen von Bäumen bevorzuge ich dies.
Diese Lösung erfordert keine manuelle Wiederholung des Wortes „hier“ oder eine manuelle Anpassung der Position des Pfeilanfangs. Sie basiert auf einem Beispiel von Seite 20 des Handbuchs, obwohl ich es vielleicht ein wenig verstümmelt habe.
triangle
wird für das Dach verwendet- Es wird ein Stil
move={}{}
definiert, der zwei Argumente annimmt: Das erste gibt den Knoten an, in den der Inhalt kopiert werden soll; das zweite gibt zusätzlichen Text an, der dem aktuellen Knoten hinzugefügt werden soll.
Ich gehe davon aus, dass Sie dies möglicherweise nicht genau tun möchten, daher dient dies eher zur Veranschaulichung als als gebrauchsfertige Lösung. In dem von Ihnen angegebenen Beispiel würden Sie Folgendes eingeben move={<specification of target node>}{Some text}
und den Inhalt des Quellknotens als angeben here
.
Der Quellknoten würde dann letztendlich enthalten Some text here
, der Zielknoten würde letztendlich enthalten here
und ein Pfeil würde zwischen einem Punkt direkt darunter here
im Quellknoten und einem Punkt direkt darunter here
im Zielknoten gezeichnet.
Ich habe einen „relativen Node Walk“ verwendet, um den Zielknoten anzugeben. Sie können jedoch genauso gut , name=target
zu Ihrem Zielknoten hinzufügen und dann einfach setzen move={target}{Some text}
, was in den meisten Fällen wahrscheinlich einfacher ist. Ich habe diese Alternative als kommentierten Code im Baum hinzugefügt, um die Idee zu demonstrieren.
\documentclass[tikz,border=5pt]{standalone}
\usepackage{forest}
\begin{document}
\newlength{\sourcetextaddwidth}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
fit=rectangle
},
move/.style n args=2{% page 20 of forest manual
before typesetting nodes={
TeX={
\settowidth{\sourcetextaddwidth}{#2}
},
#1.content={##1},
content={#2 ##1},
tikz={
\draw[->] (.south) +(.5\sourcetextaddwidth,0) to [out=south west, in=south] (#1);
},
},
},
[CP
[this is the target node to which text will be moved%, name=target
]
[C$'$
[C
]
[TP
[here, triangle, move={!r1}{Some text}% move={target}{Some text}
]
]
]
]
\end{forest}
\end{document}