平均能量损失

平均能量损失

我正在尝试使用以下代码将一forest棵树定位在框架的中心。特别是,树包含-overlay 规范。这使得或类似的“外部化”方法不太可取。beamerbeamer\sbox

平均能量损失

\documentclass{beamer}
\usepackage{forest}
\forestset{
  os/.code args={<#1>#2}{\only<#1>{\pgfkeysalso{#2}}} % 'os' short for 'onslide'
}

\begin{document}
\begin{frame}{xx}
\begin{itemize}
  \item text text 
  \item text text
  \item text text
  \item text text
  \item text text
  \item text text
\end{itemize}

\begin{tikzpicture}[remember picture,overlay]
  \node(n)[draw=red,at=(current page.center)]{center}; % just for reference
  \node[draw]at(current page.center){
  \begin{forest}
    [x[x[x][x]][x,os=<2->red]]
  \end{forest}
  };
\end{tikzpicture}
\end{frame}
\end{document}

这是第一次编译后的样子

在此处输入图片描述

到目前为止一切顺利。但是当我再次编译时,树会展开……

在此处输入图片描述

再次编译,它进一步扩展......

在此处输入图片描述

正如@cfr 的评论所暗示的那样,这可能是因为我forest在 a 中嵌套了 a tikzpicture

我希望有人能提供一个解决方案两个都forest树的绝对定位 beamer- 树中的覆盖规范。

答案1

嵌套tikzpictures 通常是一个非常糟糕的想法,最好避免。在非常简单的情况下,它可能会起作用,但它是不可预测的,并且很容易以各种奇怪而奇妙的方式中断。一般建议是:不要这样做。

如果你只想将树居中或不需要使用覆盖规范,请参阅 简单案例 下面是两种更直接的方法。(一种方法是使用列将树居中。另一种方法是覆盖树,将其放置在框架的中心,而不管其他内容如何,​​但不能与覆盖规范一起使用。)

复杂情况

仅当您需要使用覆盖规范的树覆盖在框架上(而不管其他内容如何)时才使用此方法。此方法在我极少的测试中有效。

买者自负...

如下所示,将树保存到框中允许它在 TikZ 节点内使用,因此可以在绝对位置覆盖在框架上。但是,这在覆盖规范中不太适用,因为关键是要在定义框时“按原样”保存框。

但是,我们可以通过修改 Forest 绘制树的方式来模拟这种效果。也就是说,我们可以让 Forest 将绘制的树保存到一个框中,然后将该框排版为 TikZ 节点的内容。因为这是在树排版时即时完成的,所以我们可以以正常方式在树中使用覆盖规范。实际上,Forest 将当前树保存到框中,然后将框放在要求它这样做的每个幻灯片的节点中。

为了实现这一点,我们定义了一种新风格,centre tree当我们想以这种方式处理树时就可以使用这种风格。

  centre tree/.code={%

这种风格修改了draw tree stage,覆盖了 Forest 的默认风格。

    \forestset{%
      draw tree stage/.style={
        for root'={

在绘制树之前,我们指定一个希望 Forest 将树绘制到其中的框。

          draw tree box=0,

现在我们画树 - 但这不会排版任何东西。相反,它会将树保存到框中。

          draw tree,

现在我们实际上通过将盒子拆箱成适当定义的 TikZ 节点来排版树。

          TeX={
            \tikz[overlay,remember picture]{\node [anchor=center] at (current page.center) {\box0};}
          },
        },
      },
    }%
  },

现在,当我们想要一棵树覆盖并居中时,我们可以使用这种新样式。例如,以下是问题中包含的框架的修改版本中的 3 张幻灯片:

  \begin{forest}
    centre tree
    [x
      [x, visible on=<2->
        [x]
        [x]
      ]
      [x, visible on=<3->]
    ]
  \end{forest}

随着树在框架中心逐渐显露出来,这将产生所需的 3 张幻灯片:

增量树

完整代码:

\documentclass{beamer}
\usepackage{forest}
\tikzset{% set up for transitions using tikz with beamer overlays - developed by Daniel (http://tex.stackexchange.com/a/55849/) and, in earlier form, by Matthew Leingang (http://tex.stackexchange.com/a/6155/) and modified for this use, I think by Qrrbrbirlbel (http://tex.stackexchange.com/a/112471/)
  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={% developed by Qrrbrbirlbel (http://tex.stackexchange.com/a/112471/)
    for tree={%
      /tikz/visible on={#1},
      edge={/tikz/visible on={#1}},
    },
  },
  centre tree/.code={%
    \forestset{%
      draw tree stage/.style={
        for root'={
          draw tree box=0,
          draw tree,
          TeX={
            \tikz[overlay,remember picture]{\node [anchor=center] at (current page.center) {\box0};}
          },
        },
      },
    }%
  },
}
\begin{document}
\begin{frame}{xx}
  \begin{itemize}
    \item text text
    \item text text
    \item text text
    \item text text
    \item text text
    \item text text
  \end{itemize}
  \begin{forest}
    centre tree
    [x
      [x, visible on=<2->
        [x]
        [x]
      ]
      [x, visible on=<3->]
    ]
  \end{forest}
\end{frame}
\end{document}

简单案例

如果你只是想将事物置于中心,为什么不直接使用常见的 Beamer 策略之一呢?例如:

\documentclass{beamer}
\usepackage{forest}

\begin{document}
\begin{frame}{xx}
  \begin{columns}
    \begin{column}{.5\textwidth}
      \begin{itemize}
        \item text text
        \item text text
        \item text text
        \item text text
        \item text text
        \item text text
      \end{itemize}
    \end{column}%
    \begin{column}{.5\textwidth}
      \begin{forest}
        [x[x[x][x]][x]]
      \end{forest}
    \end{column}
  \end{columns}
\end{frame}
\end{document}

中心事物

如果你确实需要它位于框架的中心并覆盖其他内容,那么最简单的方法可能是将树保存在一个框中,然后放置该框。例如:

\documentclass{beamer}
\usepackage{forest}

\begin{document}
\newsavebox\myforest
\sbox\myforest{%
  \begin{forest}
    [x[x[x][x]][x]]
  \end{forest}%
}
\begin{frame}{xx}
  \begin{itemize}
    \item text text
    \item text text
    \item text text
    \item text text
    \item text text
    \item text text
  \end{itemize}
  \tikz[overlay,remember picture]{\node [anchor=center] at (current page.center) {\usebox{\myforest}};}
\end{frame}
\end{document}

居中并覆盖的树

或者等待 Sašo Živanović 提供更巧妙的解决方案 ;)。

答案2

我设法通过该包实现了绝对定位textpos,而且这种方法似乎也适用beamer于 Forest 树中应用的叠加效果。不可否认,这种解决方案有些笨拙,所以如果有人能提出更好的解决方案,我将不胜感激。

平均能量损失

\documentclass{beamer}
\usepackage{forest}
\forestset{
  os/.code args={<#1>#2}{\only<#1>{\pgfkeysalso{#2}}} % 'os' short for 'onslide'
}
\usepackage{adjustbox}
\usepackage[absolute,overlay]{textpos}
  \setlength{\TPHorizModule}{\paperwidth}
  \setlength{\TPVertModule}{\paperheight}

\begin{document}
\begin{frame}{xx}
\begin{itemize}
  \item text text 
  \item text text 
\end{itemize}

\begin{textblock}{1}(0,0) 
\centering
\adjustbox{valign=m}{
\begin{forest}
  [x[x[x][x]][x,os=<2->red]]
\end{forest}
}
\adjustbox{valign=m}{\rule{0pt}{\paperheight}}
\end{textblock}
\end{frame}
\end{document}

输出

在此处输入图片描述

相关内容