
Ich habe Probleme, einen Knoten innerhalb eines forest
Baumdiagramms mit einem beliebigen Text außerhalb davon zu verbinden.
MWE:
\documentclass[12pt,paper=a4]{scrartcl}
\usepackage[linguistics]{forest}
\usetikzlibrary{positioning}
% cf. http://tex.stackexchange.com/a/1912/60686
\tikzstyle{na} = [shape=rectangle,inner sep=0pt,text depth=0pt]
\begin{document}
\begin{forest}
[A, name=A
[B]
[C
[X, name=X]
[Y]
]
]
\draw[-latex,dotted] (A) to[out=west,in=west] (X);
\end{forest}
\tikzstyle{every picture}+=[remember picture]
\tikz\node[na](lorem){Lorem}; ipsum \tikz\node[na](abc){dolor}; sit \tikz\node[na](amet){amet};.
\begin{tikzpicture}[overlay]
\draw (X) to (abc);
\draw[-latex] (lorem) to[out=south,in=south] (amet);
\end{tikzpicture}
\end{document}
Das Ergebnis des obigen Codes sieht leider so aus:
Mit anderen Worten, tikz kann den Knoten scheinbar nicht finden X
, also verläuft die Linie einfach ins Nichts, anstatt den X
Knoten mit dem abc
Knoten zu verbinden. Um zu zeigen, dass das Verbinden von Dingen innerhalb von funktioniertentwederDas DiagrammoderIm Text habe ich auch dort eine Reihe von Pfeilen gezeichnet.
Wenn Sie die Zeile \tikzstyle{every picture}+=[remember picture]
oben einfügen \begin{forest}
, werden die verschiedenen Inhaltsfelder und Zeichnungen auf unterschiedlichen Seiten angezeigt.
Antwort1
Das Problem bei der Verwendung \tikzmark
innerhalb eines forest
Baums besteht darin, dass Sie Umgebungen verschachteln tikzpicture
. Dies funktioniert gelegentlich, man sollte sich aber nie darauf verlassen und es sollte immer vermieden werden (es sei denn, Sie wissen wirklich, was Sie tun, und sind zufrieden damit, alle winzigen Teile zu behalten, wenn es kaputtgeht).
Glücklicherweise ist für solche Fälle tikzmark
vorgesorgt .\subnode{}
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
Dadurch wird das Problem gelöst.
Dabei ist zu beachten, dass Forest ein spezielles Koordinatensystem verwendet forest cs
. Sie können jedoch nur innerhalb einer forest
Umgebung oder \Forest
eines Makros darauf zugreifen. Dies scheint auch dann zuzutreffen, wenn das mit einem Sternchen versehene Makro \Forest*
verwendet wird, mit dem Sie auf Knoten außerhalb der aktuellen Gruppe zugreifen können, z. B. von innerhalbein anderer forest
Umgebung oder Forest[*]
Makro.
Vollständiger Code:
\documentclass{article}
\usepackage[linguistics]{forest}
\usetikzlibrary{tikzmark,arrows.meta}
\begin{document}
\begin{forest}
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
\draw [-Latex,dotted] (A) to[out=west,in=west] (X);
\end{forest}
Lo\tikzmark{lorem}rem ipsum do\tikzmark{abc}lor sit am\tikzmark{amet}et.
\begin{tikzpicture}[remember picture, overlay]
\draw [-Latex, red] (x) [out=-75, in=110]to ([yshift=1.5ex]{pic cs:abc});
\draw [-Latex] ({pic cs:lorem}) to[out=south,in=south] ({pic cs:amet});
\end{tikzpicture}
\end{document}
Antwort2
OK, der Vollständigkeit halber, das ist meine eigene Verbesserung gegenüberhilfreiche Antwort von cfrunter Berücksichtigung der Problemumgehung imKommentare zu einer vorherigen Frage zum grundsätzlich gleichen Thema von Stefan Müller. Der dort genannte und hier eingesetzte Workaround wird leider nur grundsätzlich angedeutet, jedoch nicht mit einem Beispiel versehen.
\documentclass{scrartcl}
\usepackage[linguistics]{forest}
\usetikzlibrary{positioning, tikzmark, arrows.meta}
% WORKAROUND:
% Definition copied from /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf-via-dvi.def
% Compare https://tex.stackexchange.com/q/229500 and comments!
\makeatletter
\def\pgfsys@hboxsynced#1{%
{%
\pgfsys@beginscope%
\setbox\pgf@hbox=\hbox{%
\hskip\pgf@pt@x%
\raise\pgf@pt@y\hbox{%
\pgf@pt@x=0pt%
\pgf@pt@y=0pt%
\special{pdf: content q}%
\pgflowlevelsynccm%
\pgfsys@invoke{q -1 0 0 -1 0 0 cm}%
\special{pdf: content -1 0 0 -1 0 0 cm q}% translate to original coordinate system
\pgfsys@invoke{0 J [] 0 d}% reset line cap and dash
\wd#1=0pt%
\ht#1=0pt%
\dp#1=0pt%
\box#1%
\pgfsys@invoke{n Q Q Q}%
}%
\hss%
}%
\wd\pgf@hbox=0pt%
\ht\pgf@hbox=0pt%
\dp\pgf@hbox=0pt%
\pgfsys@hbox\pgf@hbox%
\pgfsys@endscope%
}%
}
\makeatother
\begin{document}
\begin{forest}
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
\draw [-Latex,dotted] (A) to[out=west,in=west] (X);
\end{forest}
Lo\tikzmark{lorem}rem ipsum do\tikzmark{abc}lor sit am\tikzmark{amet}et.
\begin{tikzpicture}[remember picture, overlay]
\draw [-Latex, red] (x) [out=-75, in=110]to ([yshift=1.5ex]{pic cs:abc});
\draw [-Latex] ({pic cs:lorem}) to[out=south,in=south] ({pic cs:amet});
\end{tikzpicture}
\end{document}
xelatex
Dies sollte (für Unicode-Unterstützung) unter TeXLive 2016 erfolgreich kompiliert werden :