投影仪幻灯片上的 tikz 动画 - 居中和改进

投影仪幻灯片上的 tikz 动画 - 居中和改进

下面的代码动画了 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}

相关内容