我正在尝试使用以下代码将一forest
棵树定位在框架的中心。特别是,树包含-overlay 规范。这使得或类似的“外部化”方法不太可取。beamer
beamer
\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
嵌套tikzpicture
s 通常是一个非常糟糕的想法,最好避免。在非常简单的情况下,它可能会起作用,但它是不可预测的,并且很容易以各种奇怪而奇妙的方式中断。一般建议是:不要这样做。
如果你只想将树居中或不需要使用覆盖规范,请参阅 简单案例 下面是两种更直接的方法。(一种方法是使用列将树居中。另一种方法是覆盖树,将其放置在框架的中心,而不管其他内容如何,但不能与覆盖规范一起使用。)
复杂情况
仅当您需要使用覆盖规范的树覆盖在框架上(而不管其他内容如何)时才使用此方法。此方法在我极少的测试中有效。
买者自负...
如下所示,将树保存到框中允许它在 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}