hf-tikz(無線)

hf-tikz(無線)

我想创建一个 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

但这有两个缺点:

  1. 数学模式设置被遗忘了;这包括样式(显示/文本/脚本/脚本脚本)以及可能由于-在节点中填充二进制符号()而丢失的水平间距。

    (当然,风格问题可以通过\mathpalette/\mathchoice 这仍将为每种样式执行节点创建。如果将所有四个节点命名为相同名称,则只能引用最后一个(scriptscript)节点,该节点可能无论如何都不会排版。当然,我可以为这四个节点中的每一个赋予不同的名称,但稍后引用时必须选择正确的名称。)

  2. 它不能跨越任意边界工作。这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}

输出

在此处输入图片描述

相关内容