
forest
我在將樹狀圖內部的節點與其外部的任意文字連接起來時遇到問題。
微量元素:
\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}
這應該在 TeXLive 2016 下成功編譯xelatex
(對於 Unicode 支援):