使用 tikz 外部功能与 beamer \only

使用 tikz 外部功能与 beamer \only

我想\only在激活tikz时使用投影仪external。问题是,投影仪\only会被忽略。(另请参阅 MWE)。

我很乐意缓存图片tikz,因为这肯定会加快编译时间。

\documentclass{beamer}
% main document, called main.tex
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize % activate!
\begin{document}

\begin{frame}
    \begin{tikzpicture}
        \node at (1,1) {test};
        \only<2>{\node at (2,2) {test2};}
    \end{tikzpicture}
\end{frame}

\end{document}

我尝试了当前版本和 cvs 版本(后者更好,因为它使用图像的校验和)。

答案1

问题是,一旦创建了第一个图形,投影仪就变得“盲”了:它不知道必须生成另一张幻灯片才能满足要求\only<2>

我以前遇到过同样的问题...如果我没记错的话,我通过添加解决了它\only<1-2> 大约外部图片:

\documentclass{beamer}
% main document, called main.tex
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize % activate!
\begin{document}

\begin{frame}
    \noindent % create a new paragraph here - otherwise, we might end up with different hspace.
    \only<1-2>{%
        \begin{tikzpicture}
            \node at (1,1) {test};
            \only<2>{\node at (2,2) {test2};}
        \end{tikzpicture}%
    }%
\end{frame}

\end{document}

这将创建两个外部.pdf文件。想法是外部范围<1-2>包含最大幻灯片索引。

另一个解决方案可能是实现对外部 + 投影仪组合的支持。如果有投影仪专家可以告诉我哪个开关将创建进一步图片的需要传达给投影仪,我可以尝试在外部库中将其设置为某些条件。

答案2

这是一个并非最理想的解决方案。它解决了主要问题,但引入了一些次优部分。(希望比我更了解外部化过程的人能够解决这些问题……特别是没有 Feuersängers。)

主要问题是当命令\only<2>{...}引用了图片其余部分未引用的帧时。然后 beamer 必须知道需要一个新的帧。它通过在处理帧的某个版本时设置一个标志来实现这一点,该标志表示“我遇到了一个引用未来幻灯片的叠加规范,因此请继续。”。但是,当在图片内部完成此操作时,只有执行图片的 tex 进程才知道此信息。它不会传达回主进程。主进程只知道那里有一张图片,所以它不知道重新运行该帧。如果它确实重新运行了该帧,它将生成图片的下一个版本:这就是 Christian 的技巧所做的(顺便说一句,它不需要\only<1-2>{...}图片周围;帧上的任何地方都可以;甚至\begin{frame}<1-2>都可以)。所以我们需要找回这些信息。幸运的是,外部库确实产生了一个通信通道:文件.dpth。不幸的是,由于一些内部优化的东西,在处理特定图片时,相关的.dpth其他图片没有被读取。因此,在上面的例子中,我们可以让第一次运行标记需要另一次运行。主 tex 进程得到该标记并进行另一次运行,但当第二个子进程运行时,它不知道需要两次运行,因此会大声抱怨。

可以关闭此优化以确保.dpth文件被读取。更好的解决方案是只进行部分优化,即.dpth读取文件,而将其余部分丢弃。

此解决方案的另一个缺点是,即使图片实际上没有改变,也会生成一张新图片。因此,如果幻灯片 1 和 2 上出现了同一张图片,但幻灯片 3 上发生了变化,那么就会生成 3 个版本。同样,某些向导可能可以使用 md5 来解决这个问题。

最后,出现了一些奇怪的 hspacing 问题:运行两三次即可发现。幸运的是,问题不是累积性的,但可能有些空间没有被 % 掉。

\documentclass{beamer}
% main document, called main.tex
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize % activate!
\makeatletter
\tikzset{
  beamer externalising/.style={%
    execute at end picture={%
      \tikzifexternalizing{%
        \ifbeamer@anotherslide
        \pgfexternalstorecommand{\string\global\string\beamer@anotherslidetrue}%
        \fi
      }{}%
    }%
  },
  external/optimize=false
}
\makeatother
\begin{document}

\begin{frame}
\noindent % create a new paragraph here - otherwise, we might end up
with different hspace.
\begin{tikzpicture}[beamer externalising]
\node at (1,1) {test};
\only<2>{\node at (2,2) {test2};}
\end{tikzpicture}%
\end{frame}

\end{document}

相关内容