Zeichnen Sie eine Verbindung zwischen dem Knoten im Waldbaumdiagramm und etwas außerhalb davon

Zeichnen Sie eine Verbindung zwischen dem Knoten im Waldbaumdiagramm und etwas außerhalb davon

Ich habe Probleme, einen Knoten innerhalb eines forestBaumdiagramms 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:

Bildbeschreibung hier eingeben

Mit anderen Worten, tikz kann den Knoten scheinbar nicht finden X, also verläuft die Linie einfach ins Nichts, anstatt den XKnoten mit dem abcKnoten 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 \tikzmarkinnerhalb eines forestBaums 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 tikzmarkvorgesorgt .\subnode{}

  [A, name=A
    [B]
    [C
      [\subnode{x}{X}, name=X]
      [Y]
    ]
  ]

Dadurch wird das Problem gelöst.

Knoten-zu-Knoten Text-zu-Text Knoten-zu-Text

Dabei ist zu beachten, dass Forest ein spezielles Koordinatensystem verwendet forest cs. Sie können jedoch nur innerhalb einer forestUmgebung oder \Foresteines 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 forestUmgebung 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}

xelatexDies sollte (für Unicode-Unterstützung) unter TeXLive 2016 erfolgreich kompiliert werden :

Zusammenstellung von MWE mit Workaround-Definition

verwandte Informationen