![投影仪幻灯片上的 tikz 动画 - 居中和改进](https://linux22.com/image/477757/%E6%8A%95%E5%BD%B1%E4%BB%AA%E5%B9%BB%E7%81%AF%E7%89%87%E4%B8%8A%E7%9A%84%20tikz%20%E5%8A%A8%E7%94%BB%20-%20%E5%B1%85%E4%B8%AD%E5%92%8C%E6%94%B9%E8%BF%9B.png)
下面的代码动画了 4 个简单、几乎相同的过程,可能很多人都很熟悉。每次它都会将完成的图片添加到顶部的列表中。
我的主要问题是居中 - 我无法让离子($n^+i$
节点)保持居中 - 水平和垂直方向都是如此。在整个动画过程中它根本不应该移动 - 现在它“跳来跳去”。我设法通过偏移整个图片来伪造水平居中 - 垂直方向仍然有一个小跳跃。这就是为什么我必须将trimbox
这些数字添加到上部列表中。我很确定这不是最好的解决方案。这个:如何使用特定节点将 tikzpicture 在 beamer 框架中水平居中?让我充满希望,但并没有阻止动画过程中的“扭动”。
其他挑剔之处 - 我可以只循环图形列表的一部分吗?我这样做的方式似乎是复制粘贴。我尝试过使用图形列表和第一个图形宏,但使用了\firstfig,\figlist
换行符foreach
。
这是我的第一个这样的项目 - 我既不熟悉 Latex 也不熟悉 PGF 语言 - 因此欢迎提出任何建议,包括风格或方法方面。
\documentclass[hideothersubsections]{beamer}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{calc}
\usepackage{fp}
\usepackage{adjustbox}
\tikzset{%
pics/globCoord/.style={%
code={%
\coordinate(offset) at (3.5cm, -1cm);%
\coordinate(dir) at (1em, -1em);%
\coordinate(rdir) at (1em, 1em);%
\path (dir) +(rdir) coordinate(turn);%
}%
},%
pics/pathCoord/.style n args={2}{%
code={%
\ifnum#2=0%
\coordinate(start) at (offset);%
\coordinate(end) at ($ (start) + #1*(dir) $);%
\coordinate(direction) (dir);%
\else%
\coordinate(start) at ($ (offset) + #1*(dir) + (turn) $);%
\coordinate(end) at ($ (start) + #2*(rdir) $);%
\coordinate(direction) (rdir);%
\fi;%
}%
},%
pics/elec/.style n args={2}{%
code={%
\pic{pathCoord={#1}{#2}};
\draw[thick, decorate, draw=black, decoration={aspect=0},->] (start) -- (end);%
\draw[thick] ($ (end)+ 0.5*(direction)$) circle(0.7071em) node {\small$e^-$};%
}%
},%
pics/ph/.style n args={2}{%
code={%
\pic{pathCoord={#1}{#2}};%
\draw[thick, decorate, draw=black, decoration={coil,aspect=0},->] (start) -- (end);%
}%
},%
pics/ion/.style n args={2}{%
code={%
\draw[thick] ($ (offset) + (dir) + #1*(dir) $) circle(1.414em) node {#2};%
}%
}%
}
\newcommand{\phion}[6]{%
\begin{tikzpicture}%
\pic{globCoord};%
\ifnum#1>#2%
\pic{ion={#2}{$n^{+#6}$}};%
\pic{#3={#2}{0}};%
\FPeval{\d}{clip(#1-#2)}%
\pic{#4={#2}{\d}};%
\else%
\pic{ion={#2}{$n^{+#5}$}};%
\pic{#3={#1}{0}};%
\fi;%
\end{tikzpicture}%
}
\newcommand{\moves}{4}
\FPeval{\DM}{clip(2*\moves)}
\newcommand{\pics}{2}
\def\raisealign{5pt}
\newcommand{\figlist}{ph/elec/i/i-1,elec/ph/i/i+1,ph/elec/i+1/i,elec/ph/i-1/i}
\newcommand{\pfiglist}{elec/ph/i/i+1,ph/elec/i+1/i,elec/ph/i-1/i}
\begin{document}
\foreach \first/\last/\from/\to [count=\pic from 0] in \figlist {
\begin{frame}[t]{The ionized population}
\raisebox{\raisealign}{Processes: }
\ifnum\pic=0
\else
\raisebox{\raisealign}{-}\scalebox{0.2}{\trimbox{3cm 0cm 1cm 0cm}{\phion{\DM}{\moves}{ph}{elec}{i}{i-1}}}
\ifnum \pic>1
\foreach \first/\last/\from/\to [count=\current from 2] in \pfiglist {
\if\to i \raisebox{\raisealign}{+} \else \raisebox{\raisealign}{-}\fi
\scalebox{0.2}{\trimbox{3cm 0cm 1cm 0cm}{\phion{\DM}{\moves}{\first}{\last}{\from}{\to}}}
\ifnum\current=\pic \breakforeach \else\fi
}
\else\fi
\fi
\\
\foreach \td in {0,...,\DM} {
\only<\td>{
\phion{\td}{\moves}{\first}{\last}{\from}{\to}
}
}
\end{frame}
}
\begin{frame}[t]{The ionized population}
\raisebox{\raisealign}{Processes: }
\ifnum\pic=0
\else
\raisebox{\raisealign}{-}\scalebox{0.2}{\trimbox{3cm 0cm 1cm 0cm}{\phion{\DM}{\moves}{ph}{elec}{i}{i-1}}}
\ifnum \pic>1
\foreach \first/\last/\from/\to in \pfiglist {
\if\to i \raisebox{\raisealign}{+} \else \raisebox{\raisealign}{-}\fi
\scalebox{0.2}{\trimbox{3cm 0cm 1cm 0cm}{\phion{\DM}{\moves}{\first}{\last}{\from}{\to}}}
}
\else\fi
\fi
\vfill
\begin{equation*}
\dot{n}_i=-(\frac{\mathcal{L}_i}{4\pi R^2}+R_i n_e)n_i+\frac{\mathcal{L}_{i-1}}{4\pi R^2} n_{i-1}+R_{i+1}n_e n_{i+1}
\end{equation*}
\vfill
\end{frame}
\end{document}