
Tengo problemas para conectar un nodo dentro de un forest
diagrama 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í:
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 X
nodo con el abc
nodo. 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 \tikzmark
dentro de un forest
árbol es que se trata de tikzpicture
entornos 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, tikzmark
prevé \subnode{}
tales casos.
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
Esto resuelve el problema.
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 forest
entorno o \Forest
macro. 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 forest
entorno 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: