
Estou tendo problemas para conectar um nó dentro de um forest
diagrama de árvore com algum texto arbitrário fora dele.
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}
O resultado do código acima infelizmente é assim:
Em outras palavras, tikz parece não conseguir encontrar o node X
, então a linha simplesmente segue para lugar nenhum em vez de conectar o X
nó ao abc
nó. Para demonstrar que conectar as coisas funciona dentro dequalquero diagramaouo texto, desenhei um monte de setas lá também.
Colocar a linha \tikzstyle{every picture}+=[remember picture]
acima \begin{forest}
faz com que várias caixas de conteúdo e desenhos apareçam em páginas diferentes.
Responder1
O problema de usar \tikzmark
dentro de uma forest
árvore é que você está aninhando tikzpicture
ambientes, o que ocasionalmente funciona, mas nunca deve ser confiável e sempre deve ser evitado (a menos que você realmente saiba o que está fazendo e esteja feliz em manter todas as peças pequenas quando quebra).
Felizmente, tikzmark
prevê \subnode{}
tais casos.
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
Isso resolve o problema.
Uma coisa a lembrar aqui é que Forest usa um sistema de coordenadas especial forest cs
. No entanto, você só pode acessar isso dentro de um forest
ambiente ou \Forest
macro. Isto parece ser verdade mesmo se a macro marcada com estrela \Forest*
for usada, o que lhe permite acessar nós fora do grupo atual, por exemplo, de dentrooutro forest
ambiente ou 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}
Responder2
OK, então, para completar, esta é minha própria melhoria em relaçãoresposta útil do cfr, levando em consideração a solução alternativa nocomentários a uma pergunta anterior sobre basicamente o mesmo tópico de Stefan Müller. A solução alternativa mencionada lá e empregada aqui, infelizmente, é apenas mencionada, basicamente, mas não é dada um exemplo.
\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}
Isto deve ser compilado com sucesso xelatex
(para suporte Unicode) no TeXLive 2016: