Tikz 外部带有 Beamer 动画

Tikz 外部带有 Beamer 动画

我正在尝试加快我的多 tikz.tex文件的编译速度。

我发现这个话题并成功应用了该解决方案;不幸的是,它不适用于内部的动画tikzfigure:只有动画的第一个视图才会呈现在最终的 pdf 上。

问题:有没有办法让 tikz external 与 beamer 的动画一起工作?

我用于动画的 tikzset 如下(也可以在 texSE 上找到):

\tikzset{
    invisible/.style={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
    },
}

以下是说明该问题的完整文档:

\documentclass{beamer}
\usepackage{pgfplots}              % handle plots
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{external}
    \tikzexternalize[mode=list and make, prefix=tikz/]
    \tikzset{external/system call={pdflatex \tikzexternalcheckshellescape
        -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}
    } % to let pdflatex work

\tikzset{
    invisible/.style={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
    },
}
\begin{document}

\begin{frame}
    \begin{tikzpicture}
        \node[draw] at (0,0) {auie};
        \pause
        \node[draw] at (1,0) {tsrn};
        \node[draw,visible on=<3->] at (1,1) {vdlj};
    \end{tikzpicture}
\end{frame}
\end{document}

答案1

感谢您的 MWE!以下是一个完全基于这个答案。你会看到第二次编译的时候,外部的图片会被加载,所以编译速度会更快。

\documentclass{beamer}
%\url{https://tex.stackexchange.com/q/119428/86}
\usepackage{tikz}

\usetikzlibrary{external}
\usetikzlibrary{overlay-beamer-styles}

\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@slideinframe}
\tikzset{
  beamer externalizing/.style={%
    execute at end picture={%
      \tikzifexternalizing{%
        \ifbeamer@anotherslide
        \pgfexternalstorecommand{\string\global\string\beamer@anotherslidetrue}%
        \fi
      }{}%
    }%
  },
  external/optimize=false
}
\let\orig@tikzsetnextfilename=\tikzsetnextfilename
\renewcommand\tikzsetnextfilename[1]{\orig@tikzsetnextfilename{#1-\overlaynumber}}
\makeatother

\tikzset{every picture/.style={beamer externalizing}}

\tikzexternalize

\begin{document}

\begin{frame}[t]{\texttt{overlay-beamer-styles} and \texttt{externalize}}
\begin{itemize}
  \item<1-> Image 1
  \item<2-> Image 2
  \item<3-> Image 3
\end{itemize}
  \tikzsetnextfilename{figure}
  \begin{tikzpicture}
    \node (1) {Overlay 1};
    \draw[-latex,visible on={<2->}] (1.east) -- ++ (1,0) node[right] (2) {Overlay 2};
    \draw[-latex,visible on={<3->}] (2.east) -- ++ (1,0) node[right] (3) {Overlay 3};
  \end{tikzpicture}
\end{frame}

\end{document}

在此处输入图片描述

答案2

上一个答案解决了问题中的 MWE,但我的经验是,visible on=<overlay specification>当图形包含透明度时, tikzset 和 overlay-beamer-styles 与 tikzexternalize 不兼容。请注意,即使设置 ,也会发生这种情况opacity=1。但是,使用标准 beamer 覆盖规范(例如\draw<1->)可以按预期工作,因此可能是一种更通用的解决方案。

在此处输入图片描述

奇怪的是,如果透明度包含在\includegraphicstikz 绘图中,则不正确的行为会有所不同。基于此限制,如果可能需要将具有透明度的图形外部化,则最好避免使用 overlay-beamer-styles 格式或“visible on”tikzset。

修改 MWE 以突出显示此问题:

\documentclass{beamer}
%\url{https://tex.stackexchange.com/q/119428/86}
\usepackage{tikz}

\usetikzlibrary{external}
\usetikzlibrary{overlay-beamer-styles}

\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@slideinframe}
\tikzset{
  beamer externalizing/.style={%
    execute at end picture={%
      \tikzifexternalizing{%
        \ifbeamer@anotherslide
        \pgfexternalstorecommand{\string\global\string\beamer@anotherslidetrue}%
        \fi
      }{}%
    }%
  },
  external/optimize=false
}
\let\orig@tikzsetnextfilename=\tikzsetnextfilename
\renewcommand\tikzsetnextfilename[1]{\orig@tikzsetnextfilename{#1-\overlaynumber}}
\makeatother

\tikzset{every picture/.style={beamer externalizing}}

\tikzexternalize

\begin{document}

  \begin{frame}{\texttt{overlay-beamer-styles} and \texttt{externalize}}
    \tikzsetnextfilename{figure0}
    \begin{tikzpicture}
       \node (1) {Overlay 1};
       \draw[-latex,visible on={<2->},opacity=0.5] (1.east) -- ++ (1,0) node[right] (2) {Overlay 2};
       \draw[-latex,visible on={<3->},opacity=1] (2.east) -- ++ (1,0) node[right] (3) {Overlay 3};
    \end{tikzpicture}
  \end{frame}

  \begin{frame}{\texttt{overlay specification} and \texttt{externalize}}
    \tikzsetnextfilename{figure1}
    \begin{tikzpicture}
      \node (1) {Overlay 1};
      \draw<2->[-latex,opacity=0.5] (1.east) -- ++ (1,0) node[right] (2) {Overlay 2};
      \draw<3->[-latex,opacity=1] (2.east) -- ++ (1,0) node[right] (3) {Overlay 3};
    \end{tikzpicture}
  \end{frame}
\end{document}

相关内容