Dibujar una conexión entre el nodo en el diagrama de árbol del bosque y algo fuera de él

Dibujar una conexión entre el nodo en el diagrama de árbol del bosque y algo fuera de él

Tengo problemas para conectar un nodo dentro de un forestdiagrama de árbol con texto arbitrario fuera de él.


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}

Desafortunadamente, el resultado del código anterior se ve así:

ingrese la descripción de la imagen aquí

En otras palabras, tikz parece no poder encontrar el nodo X, por lo que la línea simplemente se desvía hacia ninguna parte en lugar de conectar el Xnodo con el abcnodo. Para demostrar que conectar cosas funciona dentro decualquieraEl diagramaoEn el texto, también dibujé un montón de flechas allí.

Poner la línea \tikzstyle{every picture}+=[remember picture]de arriba \begin{forest}hace que los distintos cuadros de contenido y dibujos aparezcan en páginas diferentes.

Respuesta1

El problema con el uso \tikzmarkdentro de un forestárbol es que se trata de tikzpictureentornos de anidación, lo que ocasionalmente funciona pero nunca se debe confiar en él y siempre se debe evitar (a menos que realmente sepas lo que estás haciendo y estés feliz de conservar todas las pequeñas piezas cuando se rompe).

Afortunadamente, tikzmarkprevé \subnode{}tales casos.

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

Esto resuelve el problema.

nodo a nodo texto a texto nodo a texto

Una cosa para recordar aquí es que Forest utiliza un sistema de coordenadas especial forest cs. Sin embargo, sólo puedes acceder a esto dentro de un forestentorno o \Forestmacro. Esto parece ser cierto incluso si \Forest*se utiliza la macro destacada, que le permite acceder a nodos fuera del grupo actual, por ejemplo, desde dentro.otro forestentorno o Forest[*]macro.

Código completo:

\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}

Respuesta2

Bien, para completar, esta es mi propia mejora con respecto aútil respuesta de cfr, teniendo en cuenta la solución alternativa en elcomentarios a una pregunta anterior sobre básicamente el mismo tema de Stefan Müller. Desafortunadamente, la solución alternativa mencionada allí y empleada aquí solo se alude, básicamente, pero no se da un ejemplo de ella.

\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}

Esto debería compilarse correctamente xelatex(para compatibilidad con Unicode) en TeXLive 2016:

Compilación de MWE con definición de solución alternativa

información relacionada