答案这里用于forest
在 Beamer 中自下而上显示树的方法效果很好。但它似乎与外部化不兼容。以下示例成功编译(开启--shell-escape
),但生成的 PDF 只有一张幻灯片:显示节点的幻灯片丢失(关键变化是第二行和第三行,即\usepackage[external]{forest}
和tikzexternalize
)。
\documentclass{beamer}
\usepackage[external]{forest}
\tikzexternalize
\tikzset{% set up for transitions using tikz with beamer overlays
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{%
declare toks={no node before}{1},
declare toks={no edge before}{1},
not before/.style={
no node before=#1,
for children={
no edge before=#1,
}
},
bottom up/.style={% based on Qrrbrbirlbel's answer at https://tex.stackexchange.com/a/112895/
/tikz/visible on=<\forestoption{no node before}->,
/tikz/every label/.append style={visible on=<\forestoption{no node before}->},
/tikz/every edge label/.append style={visible on=<\forestoption{no edge before}->},
edge={/tikz/visible on=<\forestoption{no edge before}->},
}
}
\begin{document}
\begin{frame}
\centering
\begin{forest}
/tikz/every label/.append style={text height=1ex, label distance=5pt},
for tree={
circle,
draw,
very thick,
edge={very thick},
s sep+=10pt,
fill=white!25,
minimum size=20pt,
bottom up,
}
[, label=above:{car, bus, cat, dot}, not before=3
[, label=above left:{car, bus}, not before=2
[, label=below:car]
[, label=below:bus]
]
[, label=above right:{cat, dog}, not before=2
[, label=below:cat]
[, label=below:dog]
]
]
\end{forest}
\end{frame}
\end{document}
有没有办法鱼与熊掌兼得?或者投影机覆盖和forest
/或tikz
外部化在深层次上不兼容,导致无法实现?
编辑添加:有趣的是,上面生成的外部化pdf有三页以及相关的叠加过渡。但这些过渡并未反映在主文档中。
答案1
这是一个解决方法。它依赖于驱动程序 - 如上所述,它需要 pdfTeX。
请注意,正如所写,这几乎肯定会弄乱外部化的 Ti钾Z 图片不是森林树。因此,如果担心这一点,可能需要将效果限制在本地使用。
\documentclass{beamer}
\usepackage[external]{forest}
\tikzsetexternalprefix{ffigurau/}
\tikzset{%
/pgf/images/include external/.code={%
\pdfximage{#1.pdf}%
\foreach \i in {1,...,\the\pdflastximagepages}%
{\includegraphics<\i>[page=\i]{#1}}%
},
}
\tikzexternalize
\tikzset{% set up for transitions using tikz with beamer overlays
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{%
declare toks={no node before}{1},
declare toks={no edge before}{1},
not before/.style={
no node before=#1,
for children={
no edge before=#1,
}
},
bottom up/.style={% based on Qrrbrbirlbel's answer at https://tex.stackexchange.com/a/112895/
/tikz/visible on=<\forestoption{no node before}->,
/tikz/every label/.append style={visible on=<\forestoption{no node before}->},
/tikz/every edge label/.append style={visible on=<\forestoption{no edge before}->},
edge={/tikz/visible on=<\forestoption{no edge before}->},
}
}
\begin{document}
\begin{frame}
\centering
\begin{forest}
/tikz/every label/.append style={text height=1ex, label distance=5pt},
for tree={
circle,
draw,
very thick,
edge={very thick},
s sep+=10pt,
fill=white!25,
minimum size=20pt,
bottom up,
}
[, label=above:{car, bus, cat, dot}, not before=3
[, label=above left:{car, bus}, not before=2
[, label=below:car]
[, label=below:bus]
]
[, label=above right:{cat, dog}, not before=2
[, label=below:cat]
[, label=below:dog]
]
]
\end{forest}
\end{frame}
\end{document}
笔记
代码重新定义了用于包含外部图像的命令。
\tikzset{%
/pgf/images/include external/.code={%
\pdfximage{#1.pdf}%
\foreach \i in {1,...,\the\pdflastximagepages}%
{\includegraphics<\i>[page=\i]{#1}}%
},
}
这不是引擎/驱动程序中立的,因为\pdfximage
它并不总是被定义。pdfTeX 定义了它,但其他引擎不会。(我现在无法检查哪个引擎会定义它。显然 TeX 不会定义它,XeTeX 几乎肯定不会定义它,而 LuaTeX 可能现在不会定义它了,即使它曾经定义过。)
\pdfximage{#1.pdf}
设置外部文件。\the\pdflastximagepages
给出 PDF 中的总页数。然后循环遍历页面,包括不同幻灯片上的每一页。为此,它使用 Beamer 修改的语法\includegraphics
,该语法支持叠加规范。
因此外部化本身并没有得到解决:您不会在每张幻灯片中获得一个外部化树。但最终得到的框架或多或少是正确的,因为我们使用 的键一次包含一页\includegraphics
PDF page
。