使用投影机叠加森林生成的树木

使用投影机叠加森林生成的树木

我正在使用forestSaš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}

产生的结果如下:

TikZ 标准、森林和 qtree

答案1

我定义了一个/forest/visible on选项,将其参数传递给

  • /tikz/visible on影响实际节点,
  • 和(这就是我们需要树中的一个选项的/forest/edge原因)。visible on/forest

我假设您还希望所有后续子项(及其边)都是不可见的,这就是我们实际使用for tree(即子树)的原因。

其他有用的选项有for children,,for descendants...;请参阅手册的第 3.3.6 节传播器forest以供参考。

在此示例中,我们可以在和的父节点的选项中使用/forest样式。(您可以重新定义/添加各种样式,以便隐藏visible onfor childrensubcategorizedanother 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}

输出

在此处输入图片描述

相关内容