
我正在嘗試創建一個互動的圖表,很像 EPUB 中使用的圖表去書店:
我所說的「互動」是指使用者控制事件何時被觸發。例如,動畫並不是我所說的互動性,因為無論使用者做什麼,它們都會發生。 (當然,在每個動作之間,我們可以有一個動畫。)
坦白說,我不知道 TikZ 是否可以做到這一點。是嗎?也許有一種方法可以將 HTML 和 JS 注入 TikZ 中?
這是一個包含 3 步棋的圍棋棋盤的最小示例,其想法是讓 TikZ 添加某種用於來回移動的 UI,然後相應地顯示每個棋步 — 不需要播放按鈕 —:
\documentclass{article}
\usepackage{tikz}
\newlength{\step}
\begin{document}
\begin{tikzpicture}
\setlength{\step}{\dimexpr 10cm / 18 \relax}
\draw[step=\step] (0, 0) grid (10, 10);
\draw[draw = white, fill = black, line width = 0.1mm]
(2 * 10cm / 18, 3 * 10cm / 18)
circle [radius = 0.2575cm]
node[color = white] {1};
\draw[draw = black, fill = white, line width = 0.1mm]
(3 * 10cm / 18, 3 * 10cm / 18)
circle [radius = 0.2575cm]
node[color = black] {2};
\draw[draw = white, fill = black, line width = 0.1mm]
(4 * 10cm / 18, 3 * 10cm / 18)
circle [radius = 0.2575cm]
node[color = white] {3};
\end{tikzpicture}
\end{document}
答案1
學分也應該去亞歷克斯G。感謝他提供的很棒的
animate
包裹。而這個\playgo
命令也是來自於他的這個想法郵政(\uncover
命令)。
animateinline
這是一個使用from package 的範例animate
。它可以在 Adobe Reader 和 Foxit Reader 中運行(它似乎不適用於 VS Code 的 PDF 檢視器):
\documentclass{article}
\usepackage{tikz}
\usepackage{animate}
\newlength{\step}
\setlength{\step}{\dimexpr 10cm / 18 \relax}
\newcommand\playgo[3]{\ifnum#1<#2\phantom{#3}\else#3\fi}
\begin{document}
\begin{animateinline}[step,controls=step]{1}
\multiframe{4}{i=0+1}{
\begin{tikzpicture}[x=\step,y=\step]
%create the board
\draw[step=1] (0, 0) grid (18, 18);
%setup black
\foreach \bloc in {{2,4},{3,4},{4,4},{5,4},{6,5},{7,6}}{
\filldraw[line width = 0.1mm] (\bloc) circle [radius = 0.2575cm];
}
%setup white
\foreach \wloc in {{2,6},{3,6},{4,6},{5,6},{6,6},{7,7}}{
\filldraw[fill=white,line width = 0.1mm] (\wloc) circle [radius = 0.2575cm];
}
%play the go-game start from black
\foreach \stepnum/\loc in {1/{8,7},2/{8,8},3/{9,8}}{
\playgo{\i}{\stepnum}{\filldraw[fill={\ifodd\stepnum black\else white\fi},line width = 0.1mm] (\loc) circle [radius = 0.2575cm] node [color = \ifodd\stepnum white\else black\fi] {\stepnum};}
}
\end{tikzpicture}
}
\end{animateinline}
\end{document}
這個動畫是這樣控制的:
更新:新增顯示的進度條和精美的顏色。
\documentclass{article}
\usepackage{tikz}
\usepackage{animate}
\newlength{\step}
\setlength{\step}{\dimexpr 10cm / 18 \relax}
\newcommand\playgo[3]{\ifnum#1<#2\phantom{#3}\else#3\fi}
\newcounter{totalsteps}
\setcounter{totalsteps}{3}
\begin{document}
{\centering
\begin{animateinline}[step,controls=step]{1}
\multiframe{\numexpr\value{totalsteps}+1}{i=0+1}{
\begin{tikzpicture}[x=\step,y=\step]
%create the board
\fill [brown!30] (-0.5,-0.5) rectangle (18.5,18.5);
\draw[step=1] (0, 0) grid (18, 18);
\draw [line width=2pt] (0,0) rectangle (18,18);
\foreach \sloc in
{{3,3},{3,9},{3,15},{9,3},{9,9},{9,15},{15,3},{15,9},{15,15}}{\filldraw (\sloc) circle [radius=1.5pt];}
%add progress bar
\draw [rounded corners=3pt,blue!20] (5,-0.85) rectangle (13,-1.15);
\fill [rounded corners=3pt,blue] (5,-0.85) rectangle ++(\i*13/\value{totalsteps}-\i*5/\value{totalsteps} ,-0.3);
\filldraw [blue] (5,-0.85) ++ (\i*13/\value{totalsteps}-\i*5/\value{totalsteps} ,-0.15) circle [radius=5pt];
%setup black
\foreach \bloc in {{2,4},{3,4},{4,4},{5,4},{6,5},{7,6}}{
\filldraw[line width = 0.1mm] (\bloc) circle [radius = 0.2575cm];
}
%setup white
\foreach \wloc in {{2,6},{3,6},{4,6},{5,6},{6,6},{7,7}}{
\filldraw[fill=white,line width = 0.1mm] (\wloc) circle [radius = 0.2575cm];
}
%play the go-game start from black
\foreach \stepnum/\loc in {1/{8,7},2/{8,8},3/{9,8}}{
\playgo{\i}{\stepnum}{\filldraw[fill={\ifodd\stepnum black\else white\fi},line width = 0.1mm] (\loc) circle [radius = 0.2575cm] node [color = \ifodd\stepnum white\else black\fi] {\stepnum};}
}
\end{tikzpicture}
}
\end{animateinline}\par}
\end{document}
答案2
我使用 TikZ 和 animate 包製作了以下動畫:
經典的方法是在文件中製作逐幀圖片.tex
,對於基於某種演算法的數學或圖形,您可以使用循環,這是完美的,但在這種情況下,我製作了一個逐幀文件,我將其命名為Go-game.tex
\documentclass[tikz, border=30mm]{standalone}
\usetikzlibrary{fadings}
\definecolor{backcol}{HTML}{8b5a16}
\definecolor{wood}{HTML}{5d2f03}
\definecolor{gwhite}{HTML}{ecefe9}
\definecolor{gblack}{HTML}{221d1d}
\newcommand{\white}[1]{
\begin{scope}[shift={#1}]
\shade[top color=gwhite, bottom color=white] (0,0)circle(0.95);
\end{scope}
}
\newcommand{\black}[1]{
\begin{scope}[shift={#1}]
\shade[top color=gblack, bottom color=black] (0,0)circle(0.95);
\end{scope}
}
\begin{document}
\pagecolor{backcol}
\color{wood}
\foreach\i in {0, 10, 20, ..., 100}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}In order to take over the white goishi we need};
\end{tikzpicture}
}
\foreach\i in {90, 80,..., 0}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}In order to take over the white goishi we need};
\end{tikzpicture}
}
\foreach\i in {0, 10, 20, ..., 100}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}To surround them using the black goishi};
\end{tikzpicture}
}
\foreach\i in {90, 80, 70, ..., 0}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}To surround them using the black goishi};
\end{tikzpicture}
}
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\end{tikzpicture}
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\end{tikzpicture}
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\end{tikzpicture}
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\end{tikzpicture}
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\black{(4,8)}
\end{tikzpicture}
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\black{(4,8)}
\black{(2,6)}
\end{tikzpicture}
\foreach\i in {90, 80, 70, ...,0}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\begin{scope}[opacity=\i/100]
\white{(4,4)}
\white{(4,6)}
\end{scope}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\black{(4,8)}
\black{(2,6)}
\end{tikzpicture}
}
\end{document}
編譯您的文件,Go-game.pdf
我們將使用它來為我們的框架添加動畫:
\documentclass[tikz, border=40mm]{standalone}
\usepackage{animate}
\begin{document}
\animategraphics[controls=all, loop]{15}{Go-game}{}{}
\end{document}
是的,在那之後你應該很高興得到你的動畫。