フォレストツリー図のノードとその外側にあるものとの間の接続を描画します

フォレストツリー図のノードとその外側にあるものとの間の接続を描画します

ツリー ダイアグラム内のノードをforestその外側の任意のテキストに接続する際に問題が発生しています。


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}

残念ながら、上記のコードの結果は次のようになります。

ここに画像の説明を入力してください

言い換えると、tikzはノードを見つけられないようで、ノードをノードにX接続するのではなく、線はどこにもつながっていません。接続が内部で機能することを示すために、Xabcどちらかまたはテキストには、矢印もたくさん描きました。

\tikzstyle{every picture}+=[remember picture]上記の行を配置すると、\begin{forest}さまざまなコンテンツ ボックスと図面がすべて異なるページに表示されます。

答え1

\tikzmarkツリー内で使用する場合の問題は、環境forestをネストすることですtikzpicture。これは、ときどきは機能しますが、決して依存すべきではなく、常に避けるべきです (自分が何をしているのかを本当に理解していて、壊れたときに細かい部分をすべて保持することに問題がない限り)。

幸いなことに、そのようなケースにもtikzmark対応できます。\subnode{}

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

これで問題は解決します。

ノードからノード、テキストからテキスト、ノードからテキスト

ここで覚えておくべきことは、Forest は特別な座標系 を使用しているということですforest cs。ただし、これにアクセスできるのはforest環境またはマクロ内のみです。これは、たとえば現在のグループ内から現在のグループ外のノードにアクセスできる\Forest星印の付いたマクロ が使用されている場合でも当てはまるようです。\Forest*別の forest環境またはForest[*]マクロ。

完全なコード:

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

答え2

さて、完全を期すために、これは私自身の改良版ですcfrの役に立つ回答の回避策を考慮して、Stefan Müller による基本的に同じトピックに関する以前の質問へのコメント残念ながら、そこで言及され、ここで採用されている回避策は、基本的にはほのめかされているだけで、例は示されていません。

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

xelatexこれは、TeXLive 2016 で (Unicode サポートのため)正常にコンパイルできるはずです。

回避策の定義を含む MWE のコンパイル

関連情報