我正在尝试加快我的多 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->
)可以按预期工作,因此可能是一种更通用的解决方案。
奇怪的是,如果透明度包含在\includegraphics
tikz 绘图中,则不正确的行为会有所不同。基于此限制,如果可能需要将具有透明度的图形外部化,则最好避免使用 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}