答案1
这里有三种方法可以做到这一点。前两种方法允许圆圈内的树与主树不同。第三种方法使用 TikZspy
库来创建较大树的快照,在这种情况下,圆圈内的树必然与主树相同。
用一个\savebox
迄今为止,最简单的方法是将较小的树保存在 a 中\savebox
,然后将其作为树旁边的单独节点添加:
\documentclass{article}
\usepackage[linguistics]{forest}
\usetikzlibrary{positioning}
\newsavebox{\mysubtree}
\savebox{\mysubtree}{
\begin{forest}
[CP [C] [TP [T] [vP]]]
\end{forest}
}
\begin{document}
\begin{forest}
[CP [C ] [TP,name=TP [DP] [T' [T ][vP [DP ][v' [v] [VP [V ] [DP ]]]]]]]
\node[draw,red,thick,circle,right=1cm of TP] (savedTree) {\usebox{\mysubtree}};
\draw[->,red,thick] (TP) -- (savedTree);
\end{forest}
\end{document}
使用tikzmark
包
一个类似但稍微复杂一点的方法是使用 TikZfit
库(由 加载forest
)制作一组圆形节点,然后使用 tikzmark
包连接两棵树。这至少需要两次编译才能正常工作,因为它使用了该[remember picture]
功能。它还需要一些手动计算来定位树木,这似乎不太实用。
\documentclass{article}
\usepackage[linguistics]{forest}
\usetikzlibrary{tikzmark}
\begin{document}
\begin{forest}
[CP [C ] [\subnode{TP}{TP} [DP] [T' [T ][vP [DP ][v' [v] [VP [V ] [DP ]]]]]]]
\end{forest}
\begin{forest}
[CP,name=CP [C] [TP [T] [vP,name=vP,]]]
\node[draw,red,thick,circle,fit=(CP) (vP),remember picture] (subTree) {};
\end{forest}
\begin{tikzpicture}[overlay,remember picture]
\draw[->,red,thick,] ($(pic cs:TP)+(.5,0)$) -- ($(pic cs:subTree)+(-3.75,-1)$);
\end{tikzpicture}
\end{document}
使用spy
库
第三种方法允许您简单地放大树的一部分。这意味着圆圈内的树不能与主树不同,因此可能没那么有用,但是为了完整性,我在这里包括了它。由于默认样式spy
在监视的节点和监视者所在的节点周围都放置了一个圆圈,所以我制作了一种新样式,删除了主树中监视部分周围的圆圈。
\documentclass{article}
\usepackage[linguistics]{forest}
\usetikzlibrary{spy}
\tikzset{spy using no node/.style=
{spy scope = {
every spy on node/.style={circle},
every spy in node/.style={draw,circle,red,thick},
spy connection path={\draw[thick,red,->] (tikzspyonnode) -- (tikzspyinnode);},
#1
}
}}
\begin{document}
\begin{tikzpicture}[spy using no node = {magnification=1,size=3.5cm},connect spies]
\begin{forest}
[CP [C ] [TP,name=TP [DP] [T' [T ][vP [DP ][v' [v] [VP [V ] [DP ]]]]]]]
\spy on (TP) in node at ($(TP)+(.5cm,0cm)$);
\end{forest}
\end{tikzpicture}
\end{document}