![使用投影机叠加森林生成的树木](https://linux22.com/image/266921/%E4%BD%BF%E7%94%A8%E6%8A%95%E5%BD%B1%E6%9C%BA%E5%8F%A0%E5%8A%A0%E6%A3%AE%E6%9E%97%E7%94%9F%E6%88%90%E7%9A%84%E6%A0%91%E6%9C%A8.png)
我正在使用forest
Sašo Živanović 的包来在beamer
幻灯片上创建一棵宽树。
以前,我使用的是qtree
。但由于可以更轻松地自动排列节点并避免重叠,我已改用forest
。但是,使用 ,qtree
我能够通过我在 中找到的宏来管理叠加层思维导图 tikzpicture 在 beamer 中 (逐步显示)
和
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
}
遗憾的是,这对包不起作用forest
。它确实删除了 TikZ 节点姿态(例如在树节点周围绘制的椭圆),但节点文本在所有幻灯片以及子树和边缘中都可见。
那么,有没有办法将beamer
覆盖与forest
包一起使用,以便通过动画逐步使树的子树部分可见?
编辑
好的,这是我的不同情况的 MWE。
请注意,使用 TikZ 也是我希望使用该forest
包获得的结果。在我的代码中,树的深度要大得多,使用兄弟距离和左参数并不好玩,所以我决定使用forest
自动格式化节点的方法。
\documentclass[english, ucs, xcolor={table, dvipsnames}]{beamer}
\usepackage[english, ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{shapes}
% Different tree drawing packages
\usepackage{qtree}
\usepackage{forest}
\setbeamertemplate{navigation symbols}{} %Remove navigation bar
% Being able to set beamer visibility for child nodes in a tree graph
% Daniel's code:
% https://tex.stackexchange.com/questions/55806/tikzpicture-in-beamer/55827#55827
% Use with child [color=.., visible on=<1->]
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
}
\begin{document}
% tikz
\begin{frame}{tikz}
\begin{tikzpicture}\scriptsize
\tikzset{every node/.style={draw,ellipse}, sibling distance=40mm}
\node {Picture root}
child{node[fill=yellow]{First level class}
child[visible on=<2->]{node[fill=gray]{subcategorized}}
child[visible on=<2->]{node{another subcategory}
child{node[fill=gray]{last node division}}
child{node[fill=gray]{in two classes}}
}
}
child {node[fill=gray]{Another long category}};
\end{tikzpicture}
\end{frame}
% forest
\begin{frame}[plain]{Same with forest}
\begin{forest} baseline, for tree={draw,ellipse,align=center}
[Picture root
[First level class,fill=yellow
[subcategorized,fill=gray,visible on=<2->]
[another subcategory,visible on=<2->
[last node division,fill=gray]
[in two classes,fill=gray]
]
]
[Another long category,fill=gray]
]
\end{forest}
\end{frame}
% And qtree
\begin{frame}{And qtree}
\begin{tikzpicture}[sibling distance=100mm, every node/.style={draw,ellipse}]
\Tree [.\node{Picture root};
[.\node{First level class};\onslide<2->
[.\node{subcategorized}; ]
[.\node{another subcategory};
[.\node{last node division}; ]
[.\node{in two classes}; ]
]
]
[.\onslide<1->\node{Another long category}; ]
]
\end{tikzpicture}
\end{frame}
\end{document}
产生的结果如下:
答案1
我定义了一个/forest/visible on
选项,将其参数传递给
/tikz/visible on
影响实际节点,- 和(这就是我们需要树中的一个选项的
/forest/edge
原因)。visible on
/forest
我假设您还希望所有后续子项(及其边)都是不可见的,这就是我们实际使用for tree
(即子树)的原因。
其他有用的选项有for children
,,for descendants
...;请参阅手册的第 3.3.6 节传播器forest
以供参考。
在此示例中,我们可以在和的父节点的选项中使用/forest
样式。(您可以重新定义/添加各种样式,以便隐藏visible on
for children
subcategorized
another subcategory
- 仅限当前节点(及其边),
- 仅限当前节点的子节点(及其边),以及
- 当前节点及其子节点(以及它的和/或它们的边)。
代码
\documentclass[xcolor={table, dvipsnames}]{beamer}
\usepackage{forest}
\setbeamertemplate{navigation symbols}{} %Remove navigation bar
\tikzset{
invisible/.style={opacity=0,text opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
}
\forestset{
visible on/.style={
for tree={
/tikz/visible on={#1},
edge+={/tikz/visible on={#1}}}}}
\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{forest} baseline, for tree={draw,ellipse,align=center}
[Picture root
[First level class,fill=yellow,for children={visible on=<2->}
[subcategorized,fill=gray]
[another subcategory
[last node division,fill=gray]
[in two classes,fill=gray]
]
]
[Another long category,fill=gray]
]
\end{forest}
\end{frame}
\end{document}