
ツリー ダイアグラム内のノードを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
接続するのではなく、線はどこにもつながっていません。接続が内部で機能することを示すために、X
abc
どちらか図またはテキストには、矢印もたくさん描きました。
\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 サポートのため)正常にコンパイルできるはずです。