将森林外部化与投影机覆盖相结合

将森林外部化与投影机覆盖相结合

答案这里用于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。

请注意,正如所写,这几乎肯定会弄乱外部化的 TiZ 图片不是森林树。因此,如果担心这一点,可能需要将效果限制在本地使用。

\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,该语法支持叠加规范。

因此外部化本身并没有得到解决:您不会在每张幻灯片中获得一个外部化树。但最终得到的框架或多或少是正确的,因为我们使用 的键一次包含一页\includegraphicsPDF page

相关内容