Desenhe a conexão entre o nó no diagrama da árvore florestal e algo fora dele

Desenhe a conexão entre o nó no diagrama da árvore florestal e algo fora dele

Estou tendo problemas para conectar um nó dentro de um forestdiagrama 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:

insira a descrição da imagem aqui

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 Xnó ao abcnó. 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 \tikzmarkdentro de uma forestárvore é que você está aninhando tikzpictureambientes, 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, tikzmarkprevê \subnode{}tais casos.

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

Isso resolve o problema.

nó a nó, texto a texto nó a texto

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 forestambiente ou \Forestmacro. 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 forestambiente 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:

Compilação de MWE com definição de solução alternativa

informação relacionada