如何使“visible on”关键字与森林中的-+覆盖兼容

如何使“visible on”关键字与森林中的-+覆盖兼容

我正在尝试使用visible onQrrbrbirlbel 定义的样式使用自动增量覆盖<-+>。但是,当我这样做时,节点和边分别增加。我把责任归咎于线条

/tikz/visible on={#1},
edge={/tikz/visible on={#1}}

将传递的范围分别应用于边缘和节点。但是,我不知道如何同时向它们发送相同的自动增量。另一种方法可能是减少计数器,但我对 beamer 覆盖不熟悉,不知道要调整哪些部分。

我怎样才能实现这样的努力?

我拿了此代码展示我描述的行为。我试图让树一次出现一个节点(及其对应的边)。

\documentclass{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 children={
      /tikz/visible on={#1},
      edge={/tikz/visible on={#1}}}}}

\begin{document}
\begin{frame}[plain]{Same with forest}
  \begin{forest}
    [VP, calign=last, visible on=<+->
      [{[ajout]}\\\textit{rapidement}, 
      align=center,
      base=top, visible on=<+->, ]
      [VP, calign=first, visible on=<3->, 
        [VP, calign=first, visible on=<2->, 
          [V\\\textit{mange}, align=center,base=top, visible on=<1->, ]
          [{[compl]}\\\textit{une orange}, align=center,base=top, visible on=<1->, ]
        ]
        [{[ajout]}\\\textit{dans la cuisine}, align=center, visible on=<2->,]
      ]
    ]
  \end{forest}

\end{frame}
\end{document}

descendants使用(产生相同结果)查看结果children。请注意节点如何首先出现,然后边开始出现。 在此处输入图片描述

答案1

我不确定您到底想要实现什么,但我了解节点及其边缘同步出现背后的问题。正如 key 文档draw tree(第 3.3.7 节)中所承诺的那样,首先绘制节点,然后绘制边缘,最后绘制额外的 tikz 代码。这种顺序背后的想法是边缘和 tikz 代码应该能够引用任何节点,但显然这会在使用 beamer 的增量叠加规范时产生问题<+->

beamerpauses解决方案。这个想法是在开始绘制边缘之前重置计数器的值。现在,由于forest那里没有提供钩子(嗯......一个想法:)我们必须发挥创造力。

  1. 我们将代码放在根节点beamerpauses内以保存计数器。(在这个特定情况下,在选项处理期间简单地保存它也行得通,但变体更强大,即使树被绘制多次,它也行得通)。node optionsnode options

  2. 我们将代码压缩到beamerpauses将要绘制的第一条边中,从而恢复计数器。一个细节很简单:由于根节点没有边,我们将计数器加一。另一个细节不会自动解决:森林不知道哪条边是第一个将被绘制,因此for first是手动指定的。

这是代码,希望对您有所帮助。

\documentclass{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 children={
      /tikz/visible on={#1},
      edge={/tikz/visible on={#1}}
   % }
  }
}

\begin{document}
\begin{frame}[plain]{Same with forest}
  \begin{forest}
    node options={/utils/exec={\xdef\mybeamerpauses{\thebeamerpauses}}},
    for first={edge={/utils/exec={\setcounter{beamerpauses}{\numexpr1+\mybeamerpauses}}}},
    [VP, calign=last, visible on=<+->
      [{[ajout]}\\\textit{rapidement}, 
      align=center,
      base=top, visible on=<+->, ]
      [VP, calign=first, visible on=<+->, 
        [VP, calign=first, visible on=<+->, 
          [V\\\textit{mange}, align=center,base=top, visible on=<+->, ]
          [{[compl]}\\\textit{une orange}, align=center,base=top, visible on=<+->, ]
        ]
        [{[ajout]}\\\textit{dans la cuisine}, align=center, visible on=<+->,]
      ]
    ]
  \end{forest}

\end{frame}
\end{document}

实际上,由于给出 时没有区别visible on=<+->,因此这里还有一个使用 的较短版本for tree

\documentclass{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 children={
      /tikz/visible on={#1},
      edge={/tikz/visible on={#1}}
   % }
  }
}

\begin{document}
\begin{frame}[plain]{Same with forest}
  \begin{forest}
    node options={/utils/exec={\xdef\mybeamerpauses{\thebeamerpauses}}},
    for first={edge={/utils/exec={\setcounter{beamerpauses}{\numexpr1+\mybeamerpauses}}}},
    for tree={visible on=<+->},
    [VP, calign=last
      [{[ajout]}\\\textit{rapidement}, 
      align=center,
      base=top ]
      [VP, calign=first
        [VP, calign=first
          [V\\\textit{mange}, align=center,base=top ]
          [{[compl]}\\\textit{une orange}, align=center,base=top ]
        ]
        [{[ajout]}\\\textit{dans la cuisine}, align=center]
      ]
    ]
  \end{forest}

\end{frame}
\end{document}

相关内容