我想创建一个 GIF 动画,展示两个二项式相乘的过程。每帧必须只显示一对项,每个项都用紧凑、矩形、半透明的彩色区域突出显示。
我的尝试如下。我ovalnode
在这里使用是因为我不知道如何在 PSTricks 中获得更好的节点容器。
\documentclass[mathserif,12pt]{beamer}
\usepackage{pst-node}
\usepackage{amsmath}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{align*}
\PreviewBorder=20pt\relax
\psset{angle=-90,arm=.25,linecolor=red}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{frame}
%===============
\begin{align*}
(\ovalnode{A0}{x}\ovalnode{A1}{{}-x_1})(\ovalnode{B0}{x}\ovalnode{B1}{{}-x_2}) &= \onslide<2->{x^2} \onslide<3->{{-}x_2x} \onslide<4->{{}-x_1x} \onslide<5->{{}+x_1x_2}
\foreach \x in {0,1}{\foreach \y in {0,1}{\only<\the\numexpr2*\x+\y+2\relax>{\ncbar{A\x}{B\y}\nbput[labelsep=2pt]{\times}}}}
\end{align*}
%===============
\end{frame}
\end{document}
我对这个结果不满意,因为间距很糟糕,并且所有节点都一次显示,而不是每帧一对。
你有什么想法可以让它变得更好吗?也欢迎使用 TikZ 的解决方案,但请尽可能简单!
答案1
\documentclass[mathserif,12pt]{beamer}
\usepackage{pst-node}
\usepackage[active,tightpage,displaymath]{preview}
\PreviewBorder=20pt\relax
\psset{angle=-90,arm=.25,linecolor=red}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{frame}
\[
(\ovalnode{A0}{x}
\only<1-3>{\rnode{A1}{-x_1}}%
\only<4,5>{\rnode{A1}{\psovalbox[linecolor=red,fillcolor=red,opacity=0.5,fillstyle=solid]{-x_1}}} )
(\ovalnode{B0}{x}\ovalnode{B1}{{}-x_2}) = \onslide<2->{x^2} \onslide<3->{{-}x_2x} \onslide<4->{{}-x_1x} \onslide<5->{{}+x_1x_2}
\foreach \x in {0,1}{\foreach \y in {0,1}{%
\only<\the\numexpr2*\x+\y+2\relax>{\ncbar{A\x}{B\y}\nbput[labelsep=2pt]{\times}}}}
\]
\end{frame}
\end{document}
一个更复杂的例子,使用\onslide
而不是\only
:
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{libertine}
\usepackage{amsmath}
\usepackage{pst-node}
\newrgbcolor{lila}{0.6 0.2 0.5}
\newrgbcolor{darkyellow}{1 0.9 0}
\def\xstrut{\vphantom{\frac{(A)^1}{(B)^1}}}
\begin{document}
\psset{nodesep=3pt}
\begin{frame}{}{}
\onslide*<1->{Die Bindungsenergie im Tröpfchenmodell setzt sich aus
folgenden Teilen zusammen:}
\begin{itemize}
\item<3->dem \rnode{b}{Oberflächenanteil}
\item<2->Dem \rnode{a}{Volumenanteil},
\medskip
\[
\onslide<2->{E =
\rnode[t]{ae}{\psframebox*[fillcolor=darkyellow,linestyle=none]{\xstrut a_vA}} +}
\onslide<3->{%
\rnode[t]{be}{\psframebox*[fillcolor=lightgray,linestyle=none]{\xstrut -a_fA^{2/3}}} +}
\onslide<4->{%
\rnode[t]{ce}{\psframebox*[fillcolor=green,linestyle=none]{\xstrut -a_c\frac{Z(Z-1)}{A^{1/3}}}} + }
\onslide<5->{%
\rnode[t]{de}{\psframebox*[fillcolor=cyan,linestyle=none]{\xstrut -a_s\frac{(A-2Z)^2}{A}}} + }
\onslide<6->{%
\rnode[t]{ee}{\psframebox*[fillcolor=yellow,linestyle=none]{\xstrut E_p}}}
\] \medskip
\item<4->dem \rnode{c}{Coulomb-Anteil}
\item<5->der \rnode{d}{Symmetrieenergie}
\item<6->sowie einem \rnode{e}{Paarbildungsbeitrag}.
\end{itemize}
\onslide<2->{\nccurve[angleA=-90,angleB=90]{->}{a}{ae}}
\onslide<3->{\nccurve[angleB=45]{->}{b}{be}}
\onslide<4->{\nccurve[angleB=-90]{->}{c}{ce}}
\onslide<5->{\nccurve[angleB=-90]{->}{d}{de}}
\onslide<6->{\nccurve[angleB=-90]{->}{e}{ee}}
\end{frame}
\end{document}
答案2
使用 TikZ,您基本上可以将每个数学内容塞进一个节点中,并在另一个已overlay
编辑且具有选项的TikZ 图片中引用它remember picture
。
但这有两个缺点:
数学模式设置被遗忘了;这包括样式(显示/文本/脚本/脚本脚本)以及可能由于
-
在节点中填充二进制符号()而丢失的水平间距。(当然,风格问题可以通过
\mathpalette
/\mathchoice
但这仍将为每种样式执行节点创建。如果将所有四个节点命名为相同名称,则只能引用最后一个(scriptscript)节点,该节点可能无论如何都不会排版。当然,我可以为这四个节点中的每一个赋予不同的名称,但稍后引用时必须选择正确的名称。)它不能跨越任意边界工作。这
hf-tikz
是一个很好的例子,其中环境中的一列值array
被突出显示并注释。这在一个节点上是不可能实现的。
使用tikzmark
(由 使用的hf-tikz
)允许我们绕过任何数学模式设置,因为内容实际上是在原始环境中排版的。此外,可以在标记出现之前引用它,这使得绘制 TikZ 内容变得容易在后面非 TikZ 的东西(有限,但仍然)。
所有这些的一大缺点是:我们几乎不知道我们想要突出显示的内容的尺寸。(对于单行代码,这可以通过以下方法解决保存\the\fam
)这就是偏移设置存在的原因,hf-tikz
我的hl/…
。有关此主题的更多参考,另请参阅hf-tikz 不会限制方程式。
hf-tikz
(無線)
这hf-tikz
是一个很棒的软件包,但在我看来不太灵活。很难引用绘制的矩形,因为其中一个(未转换)角被保存为 PDF 标记,而另一个(未转换)角是一个节点(!)。
\tikzmarkin{a}
使用和创建的第一个矩形\tikzmarkend{a}
具有角(pic cs:a)
和(a)
。但这些角是应用偏移值之前的角。
我宁愿采用手动方式。
代码
\documentclass[mathserif,12pt]{beamer}
\usepackage[customcolors]{hf-tikz}
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt={#1{}{invisible}}},
alt/.code args={<#1>#2#3}{\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}},
}
\colorlet{tikz@hl@color@a}{blue!30} \colorlet{tikz@hl@color@b}{red!30}
\colorlet{tikz@hl@color@c}{green!75!black!30} \colorlet{tikz@hl@color@d}{orange!30}
\tikzset{
set border color=none,
@set style/.style={#1/.style={set fill color=tikz@hl@color@#1}},
@set style/.list={a,b,c,d},
Fill/.style args={#1/#2}{
path picture={\tikzset{sharp corners}
\path[fill=tikz@hl@color@#1] (path picture bounding box.south west) --
(path picture bounding box.north east)-|(path picture bounding box.south west)
--cycle;
\path[fill=tikz@hl@color@#2] (path picture bounding box.south west) --
(path picture bounding box.north east)|-(path picture bounding box.south west)
--cycle;}}}
\newcommand<>{\tm}[3][]{%
\,\tikzmarkin[#1, visible on={#4}]{#2}#3\tikzmarkend{#2}\,}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{frame}
\begin{align*}
(\tm<1-2,5>[a]{a}{x}-\tm<3-4,5>[b]{b}{x_1})(\tm<1,3,5>[c]{c}{x}-\tm<2,4,5>[d]{d}{x_2})
& = \tm<1,5>[Fill=a/c, above offset=1em]{xx}{x^2}
\uncover<2->{- \tm<2,5>[Fill=a/d]{x2x}{x_2 x}
\uncover<3->{- \tm<3,5>[Fill=b/c]{x1x}{x_1 x}
\uncover<4->{+ \tm<4,5>[Fill=b/d]{x1x2}{x_1 x_2}}}}
\end{align*}
\end{frame}
\end{document}
TikZ(标记)
该解决方案需要
有关如何\ncbar
在 TikZ 中模拟的更多参考,请参阅TikZ 是否有与 PSTricks \ncbar 命令等效的命令?
代码
\documentclass[mathserif,12pt]{beamer}
\usepackage{tikz}\usetikzlibrary{tikzmark,paths.ortho}
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt={#1{}{invisible}}},
alt/.code args={<#1>#2#3}{\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}}}
\colorlet{tikz@hl@color@a}{blue!30}
\colorlet{tikz@hl@color@b}{red!30}
\colorlet{tikz@hl@color@c}{green!75!black!30}
\colorlet{tikz@hl@color@d}{orange!30}
\tikzset{
@set style/.style={#1/.style={fill=tikz@hl@color@#1}}, @set style/.list={a,b,c,d},
Fill/.style args={#1/#2}{
path picture={\tikzset{sharp corners}
\path[fill=tikz@hl@color@#1] (path picture bounding box.south west) --
(path picture bounding box.north east)-|(path picture bounding box.south west)
--cycle;
\path[fill=tikz@hl@color@#2] (path picture bounding box.south west) --
(path picture bounding box.north east)|-(path picture bounding box.south west)
--cycle;}},
hl/left/.initial =+-.1em,
hl/top/.initial =+.75em,
hl/bottom/.initial=+-.3em,
hl/right/.initial =+.1em,
m edge/.style={rounded corners=3pt, draw=none,
to path={
([shift={(\pgfkeysvalueof{/tikz/hl/left},\pgfkeysvalueof{/tikz/hl/top})}]
\tikztostart) rectangle coordinate (#1-m)
([shift={(\pgfkeysvalueof{/tikz/hl/right},\pgfkeysvalueof{/tikz/hl/bottom})}]
\tikztotarget) coordinate (#1-e!) \tikztonodes
}},
udlr/du distance=.25cm,
dudu/.style args={#1:#2:#3}{
insert path={
(#1-m|-#1-e!) du coordinate (#3-aux) (#2-m|-#2-e!)
(#3-aux) du (#3-m|-#3-e!)}}
}
\newcommand<>{\tm}[3][]{%
\tikz[remember picture,overlay]
\path[style/.expanded={\ifx\\#4\\\else visible on={#4}\fi}]% poor man's ifempty
(0,0) edge[m edge/.try={#2}, #1] (pic cs:#2-e);%
#3\pgfmark{#2-e}}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{frame}
\begin{align*}
(\tm<1-2,5>[a]{a}{x}-\tm<3-4,5>[b]{b}{x_1})(\tm<1,3,5>[c]{c}{x}-\tm<2,4,5>[d]{d}{x_2})
& = \tm<1,5>[Fill=a/c, hl/top=1em]{xx}{x^2}
\uncover<2->{- \tm<2,5>[Fill=a/d]{x2x}{x_2 x}
\uncover<3->{- \tm<3,5>[Fill=b/c]{x1x}{x_1 x}
\uncover<4->{+ \tm<4,5>[Fill=b/d]{x1x2}{x_1 x_2}}}}
\begin{tikzpicture}[remember picture, overlay, rounded corners]
\draw<1>[->] [dudu=a:c:xx]; \draw<2>[->] [dudu=a:d:x2x];
\draw<3>[->] [dudu=b:c:x1x]; \draw<4>[->] [dudu=b:d:x1x2];
\end{tikzpicture}
\end{align*}
\end{frame}
\end{document}