
저는 tikz를 사용하여 비머로 일종의 Ceasar 암호 애니메이션을 만들고 있습니다.
원하는 것을 얻을 수 있지만 tikz에 능숙하지 않기 때문에 컴파일 속도가 매우 느리기 때문에 결과가 다소 이상합니다. 많은 문서가 포함된 큰 문서 내에서 속도가 엄청나게 느려지기 때문에 이는 상당히 단점입니다.
내 코드는 다음과 같습니다 (음, 작은 작업 예)
\documentclass{beamer}
\usetheme{Berkeley}
\usepackage{graphicx}
\usepackage{ifthen}
\usepackage{tikz}
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt={#1{}{invisible}}},
alt/.code args={<#1>#2#3}{\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}
},
}
\begin{document}
\begin{frame}
\centering
\begin{tikzpicture}[scale=0.3, every node/.style={scale=0.3}]
\pgfmathsetmacro{\alphsize}{26}
\pgfmathsetmacro{\ang}{360/\alphsize}
\pgfmathsetmacro{\d}{3}
\pgfmathsetmacro{\op}{98 + \ang/2 - 1.2}
\pgfmathsetmacro{\e}{\ang + \ang*\d}
\pgfmathsetmacro{\ep}{\op + \ang*\d}
\foreach \x in {0,\ang,...,360} {\draw[gray] (\x:8em) -- (\x:12em);}
\foreach \x [count=\xi] in {A,...,Z} {
\node[rotate=\ang - \ang*\xi,visible on=<1>] at (\op - \ang*\xi:11em) {{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<2>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{T}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<3>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{E}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<4>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{L}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<5>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{E}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<6>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{P}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<7>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{H}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<8>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{O}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<9>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{N}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<10>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{E}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\e - \ang*\xi,visible on=<1>] at (\ep - \ang*\xi:9em) {{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<2>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{W}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<3>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{H}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<4>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{O}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<5>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{H}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<6>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{S}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<7>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{K}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<8>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{R}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<9>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{Q}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<10>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{H}}{\color{red}\large \x}{\large \x}};
}
\draw[thick] (0cm,0cm) circle(12em);
\draw[gray] (0cm,0cm) circle(10em);
\draw[thick] (0cm,0cm) circle(8em);
\end{tikzpicture}
\bigskip
\centering
\begin{tikzpicture}[every node/.style={scale=0.6}]
\draw[step=1em,gray,thin] (0em,0em) grid (9em,2em);
\node at (0.5em,1.5em) {\textcolor<2> {green}T};
\node at (1.5em,1.5em) {\textcolor<3> {green}E};
\node at (2.5em,1.5em) {\textcolor<4> {green}L};
\node at (3.5em,1.5em) {\textcolor<5> {green}E};
\node at (4.5em,1.5em) {\textcolor<6> {green}P};
\node at (5.5em,1.5em) {\textcolor<7> {green}H};
\node at (6.5em,1.5em) {\textcolor<8> {green}O};
\node at (7.5em,1.5em) {\textcolor<9> {green}N};
\node at (8.5em,1.5em) {\textcolor<10>{green}E};
\node[visible on=<2->] at (0.5em,0.5em) {\textcolor<2> {red}W};
\node[visible on=<3->] at (1.5em,0.5em) {\textcolor<3> {red}H};
\node[visible on=<4->] at (2.5em,0.5em) {\textcolor<4> {red}O};
\node[visible on=<5->] at (3.5em,0.5em) {\textcolor<5> {red}H};
\node[visible on=<6->] at (4.5em,0.5em) {\textcolor<6> {red}S};
\node[visible on=<7->] at (5.5em,0.5em) {\textcolor<7> {red}K};
\node[visible on=<8->] at (6.5em,0.5em) {\textcolor<8> {red}R};
\node[visible on=<9->] at (7.5em,0.5em) {\textcolor<9> {red}Q};
\node[visible on=<10->] at (8.5em,0.5em) {\textcolor<10>{red}H};
\end{tikzpicture}
\end{frame}
\end{document}
문제는 위와 동일한 결과를 얻고 더 빠르게 컴파일할 수 있는 더 현명한 방법이 있습니까?입니다.
답변1
코드 속도를 크게 저하시킬 수 있는 주요 문제는 없습니다. 많은 수의 복잡한 TikZ 사진을 다시 컴파일하는 것은 매우 귀찮을 수 있으므로 external
TikZ가 사진을 저장하고 가능하면 재사용하도록 하는 라이브러리가 있습니다. 이는 다음과 같이 수행됩니다.
\usetikzlibrary{external}
\tikzexternalize
편집하다: @brad가 댓글에서 제안한 것처럼 \tikzexternalize[prefix=tikz/]
임시 TikZ 사진용 폴더를 설정하려면 을 사용하는 것이 유리할 수 있습니다.
비머 \only
구성을 사용하고 있으므로 예상대로 작동하지 않고 첫 번째 프레임만 렌더링됩니다. 그러나 "해킹"이 있습니다.
전체
tikzpicture
환경 을\only<m-M>
어디에m
있는지 감싸십시오.최소한의그리고M
는최대\only
명령 에 의해 참조되는 프레임 번호이내에틱즈픽쳐.
[visible on=<m-M>]
옵션은 명령어와 "동등" 하므로 \only
이렇게 사용하시면 됩니다.
\only<1-10>{%
\begin{tikzpicture}
\node[visible on=<1>] {};
% ...
\node[visible on=<10>] {};
\end{tikzpicture}
}
나는 귀하의 코드에 대해 이것을 시도했으며 두 번째 (및 그 이후) 컴파일 시간은 다음과 같습니다.많이낮추다.
보다비머와 함께 tikz 외부 기능 사용 \전용더 많은 정보를 위해서.
전체 코드:
\documentclass{beamer}
\usetheme{Berkeley}
\usepackage{graphicx}
\usepackage{ifthen}
\usepackage{tikz}
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt={#1{}{invisible}}},
alt/.code args={<#1>#2#3}{\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}
},
}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\begin{frame}
\centering
\only<1-10>{%
\begin{tikzpicture}[scale=0.3, every node/.style={scale=0.3}]
\pgfmathsetmacro{\alphsize}{26}
\pgfmathsetmacro{\ang}{360/\alphsize}
\pgfmathsetmacro{\d}{3}
\pgfmathsetmacro{\op}{98 + \ang/2 - 1.2}
\pgfmathsetmacro{\e}{\ang + \ang*\d}
\pgfmathsetmacro{\ep}{\op + \ang*\d}
\foreach \x in {0,\ang,...,360} {\draw[gray] (\x:8em) -- (\x:12em);}
\foreach \x [count=\xi] in {A,...,Z} {
\node[rotate=\ang - \ang*\xi,visible on=<1>] at (\op - \ang*\xi:11em) {{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<2>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{T}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<3>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{E}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<4>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{L}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<5>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{E}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<6>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{P}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<7>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{H}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<8>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{O}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<9>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{N}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\ang - \ang*\xi,visible on=<10>] at (\op - \ang*\xi:11em) {\ifthenelse{\equal{\x}{E}}{\color{green}\Large \x}{\Large \x}};
\node[rotate=\e - \ang*\xi,visible on=<1>] at (\ep - \ang*\xi:9em) {{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<2>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{W}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<3>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{H}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<4>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{O}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<5>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{H}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<6>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{S}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<7>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{K}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<8>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{R}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<9>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{Q}}{\color{red}\large \x}{\large \x}};
\node[rotate=\e - \ang*\xi,visible on=<10>] at (\ep - \ang*\xi:9em) {\ifthenelse{\equal{\x}{H}}{\color{red}\large \x}{\large \x}};
}
\draw[thick] (0cm,0cm) circle(12em);
\draw[gray] (0cm,0cm) circle(10em);
\draw[thick] (0cm,0cm) circle(8em);
\end{tikzpicture}
}
\bigskip
\centering
\only<1-10>{%
\begin{tikzpicture}[every node/.style={scale=0.6}]
\draw[step=1em,gray,thin] (0em,0em) grid (9em,2em);
\node at (0.5em,1.5em) {\textcolor<2> {green}T};
\node at (1.5em,1.5em) {\textcolor<3> {green}E};
\node at (2.5em,1.5em) {\textcolor<4> {green}L};
\node at (3.5em,1.5em) {\textcolor<5> {green}E};
\node at (4.5em,1.5em) {\textcolor<6> {green}P};
\node at (5.5em,1.5em) {\textcolor<7> {green}H};
\node at (6.5em,1.5em) {\textcolor<8> {green}O};
\node at (7.5em,1.5em) {\textcolor<9> {green}N};
\node at (8.5em,1.5em) {\textcolor<10>{green}E};
\node[visible on=<2->] at (0.5em,0.5em) {\textcolor<2> {red}W};
\node[visible on=<3->] at (1.5em,0.5em) {\textcolor<3> {red}H};
\node[visible on=<4->] at (2.5em,0.5em) {\textcolor<4> {red}O};
\node[visible on=<5->] at (3.5em,0.5em) {\textcolor<5> {red}H};
\node[visible on=<6->] at (4.5em,0.5em) {\textcolor<6> {red}S};
\node[visible on=<7->] at (5.5em,0.5em) {\textcolor<7> {red}K};
\node[visible on=<8->] at (6.5em,0.5em) {\textcolor<8> {red}R};
\node[visible on=<9->] at (7.5em,0.5em) {\textcolor<9> {red}Q};
\node[visible on=<10->] at (8.5em,0.5em) {\textcolor<10>{red}H};
\end{tikzpicture}
}
\end{frame}
\end{document}