在另一棵树旁边创建一棵浮动树

在另一棵树旁边创建一棵浮动树

我想在这棵树的一个圆圈内画一棵较小的子树,如下方式: 在此处输入图片描述

有没有我可以使用的代码来做到这一点(我正在使用森林)?非常感谢!

答案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}

\savebox 代码的输出

使用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}

tikzmark 代码的输出

使用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}

间谍代码的输出

相关内容