在 beamer(tikz 和 overlay)中向数学表达式的一部分添加形状(正方形、圆形等)

在 beamer(tikz 和 overlay)中向数学表达式的一部分添加形状(正方形、圆形等)

这可能是一个微不足道的问题,我看到过类似的问题,但由于某种原因,我没能解决它。

考虑这张幻灯片

\documentclass{beamer}
\usefonttheme[onlymath]{serif}
\setbeamercovered{transparent}
\mode<presentation> {
\usetheme{Boadilla}
}
\begin{document}
\begin{frame}
\begin{align*}
y = ax + b
\end{align*}
\end{frame}
\end{document}

我们希望首先看到表达式,然后通过在其上添加一个彩色方块来突出显示 ax。

我们该怎么做?这是一个非常接近但又复杂的问题和答案这里但我无法使用它。

答案1

编辑: 哎呀,我忘记了其他形状...现在添加:

tikzmark库:

\documentclass{beamer}
\mode<presentation> 
{
\usetheme{Boadilla}
}
\usepackage{tikz}
\usetikzlibrary{shapes,
                tikzmark}
\tikzset{every tikzmarknode/.style={%
        draw=red, semithick, inner sep=2pt}
        }

\begin{document}
\begin{frame}
With circle
\[
y  = \tikzmarknode[circle]{n1}{ax} + b\ ,
\]
ellipse
\[
y  = \tikzmarknode[ellipse]{n1}{ax} + b\ ,
\]
rectangle shape:
\[
y  = \tikzmarknode[rectangle]{n1}{ax} + b\ ,
\]
and rectange wit rounded corners:
\[
y  = \tikzmarknode[rectangle, rounded corners]{n1}{ax} + b
\]
\end{frame}
\end{document}

在此处输入图片描述

附录: 为了揭示方程中突出显示的元素,可以使用\alt命令(来自 beamer),如 @Unknown 在其评论中所建议的那样,为了揭示方程序列,可以使用\onslide命令,如下面的 MWE 中所做的那样

\documentclass{beamer}
\mode<presentation>
{
\usetheme{Boadilla}
}
\usepackage{tikz}
\usetikzlibrary{shapes,
                tikzmark}
\tikzset{every tikzmarknode/.style={%
        draw=red, semithick, inner sep=2pt},
        ALT/.style = {opacity=0,text opacity=1},
        }
\newcommand\mystrut[1]{\rule{0pt}{#1}}

\begin{document}

\begin{frame}
With circle
\[
y  = \alt<2>{\tikzmarknode[circle]{n1}{ax}}
            {\tikzmarknode[circle, ALT]{n1}{ax}} + b\, ,
\]
\onslide<3->{
some text followed by next equation which for highlight use ellipse
\[
y  = \mystrut{2.7ex}
     \alt<4>{ax^2 + \tikzmarknode[ellipse]{n1}{bx}}
             {ax^2 + \tikzmarknode[ellipse, ALT]{n1}{ax}} + c\, ,
\]
            }
\onslide<5->{
and test with rectangle shape:
\[
y  = \sum_{a=1}^n
     \alt<6>{\tikzmarknode[rectangle]{n1}{ax}}
             {\tikzmarknode[rectangle, draw=white]{n1}{ax}} + b\, ,
\]
            }
\end{frame}
\end{document}

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

当顺序地出现未被发现的项时,在下一个等式中:

\documentclass{beamer}
\mode<presentation>
{
\usetheme{Boadilla}
}
\usepackage{tikz}
\usetikzlibrary{shapes,
                tikzmark}
\tikzset{every tikzmarknode/.style={%
        draw=red, semithick, inner sep=2pt},
        ALT/.style = {opacity=0,text opacity=1},
        }
\newcommand\mystrut[1]{\rule{0pt}{#1}}

\begin{document}
\begin{frame}
    \begin{align*}
y  & = \alt<2>{\tikzmarknode[circle]{n1}{a^2x}}
              {\tikzmarknode[circle, ALT]{n1}{a^2x}} + bx + c\, ,    \\
\onslide<3->{
  & = \mystrut{2.7ex}
      \alt<4>{ax^2 + \tikzmarknode[ellipse]{n2}{bx}}
              {ax^2 + \tikzmarknode[ellipse, ALT]{n2}{ax}} + c\, ,   \\
              }
\onslide<5->{
  & = \mystrut{2.7ex}
      \alt<6>{ax^2 + bx + \tikzmarknode[rectangle]{n3}{c}}
              {ax^2 + bx + \tikzmarknode[rectangle, ALT]{n3}{c}}\, ,
              }   
    \end{align*}
\end{frame}
\end{document}

在此处输入图片描述

笔记:为了正确定位框架内容,MWE 必须至少编译两次。

编辑: 感谢@Andrew Stacey(见下文评论),MWE 现在可以正常工作。正如他所建议的,上面的代码现在更改\alt<4->{...}\alt<4>{...}(和 处相同\alt<6 ...)。

答案2

您可以使用tikz为了那个原因

\documentclass{beamer}
\usepackage{tikz}
\usefonttheme[onlymath]{serif}
\setbeamercovered{transparent}
\mode<presentation> {
\usetheme{Boadilla}
}
\begin{document}
\begin{frame}
\begin{align*}
y = 
\tikz\node[draw=red, inner sep=6pt, circle, overlay, shift={(6pt,2pt)}]{};
ax + b
\end{align*}
\end{frame}
\end{document}

在此处输入图片描述

通过更改,您可以增加或减少直径。例如,inner sep为了改变形状,用circle其他东西替换。rectangle

在此处输入图片描述

形状列表可以在手册中找到71.2 预定义形状

答案3

我只想强调一下与间距相关的一些内容。这应该被视为对上述解决方案的扩展评论。

为了避免在切换框架时术语跳转,有必要考虑事物如何影响间距,特别是任何突出显示路径的线宽。

为了理解这一点,有必要深入研究内边界和外边界是什么,以及它们如何与线宽相互作用。节点的边界被认为是一个矩形,它位于inner sep节点内容的自然边界之外(水平和垂直方向的inner sep和都outer sep可以设置为不同的值,但这并不重要,所以我在这里忽略它)。如果绘制了节点,那么这就是使用的路径(其他形状有调整,但它们都从内矩形开始,所以我在这里再次忽略它)。但是,路径是按厚度绘制的,并且这个厚度在“完美”路径的两侧等距分布,因此绘制的节点具有明显的尺寸比实际尺寸略大(线宽的一半)。 的outer sep设计就是为了处理这个问题,因为它被添加到节点设置中可能与节点外部相关的部分(即锚点)。默认情况下,设置outer sep为当前线宽的一半。因此,如果更改了绘图命令的线宽,则节点的大小将在帧之间发生变化。还有一个更复杂的问题,即当 TikZ 告诉 TeX 绘图有多大时,它会根据节点是否绘制使用不同的计算。如果没有绘制,则使用确切的路径,但如果绘制,则将其放大线宽的一半。因此,尽管 可能outer sep设置正确,但如果节点未绘制,则不会产生正确的效果。不过,事实证明,TikZ 有点聪明,因此如果边界未绘制,则会将 设置为outer sep0pt而不是线宽的一半)。这可用于校正 ,inner sep以便无论是否绘制节点,节点始终具有正确的大小。

因此,关键问题是:等式看起来是否应该像不加任何修饰地写下来一样,还是应该保留空间用于突出显示?

如果装饰是覆盖,tikzmarknode则不使用样式,然后添加突出显示。这个fit库在这里真的很有用。

如果装饰是内联的,则将样式选项添加到tikzmarknode但确保影响其大小的所有选项都是总是存在(特别是线宽)。因此,只需在框架之间更改draw(或fill)命令即可。

下面是一个示例,展示了各种组合以及跳跃效果。

% Flush left all equations to make width changes more evident
\PassOptionsToPackage{fleqn}{amsmath}
\documentclass{beamer}
%\url{https://tex.stackexchange.com/q/646378/86}
\usefonttheme[onlymath]{serif}

\usepackage{tikz}

% tikzmark for positioning,
% fit for adding adornments to existing nodes
\usetikzlibrary{
  tikzmark,
  fit
}

%\setbeamercovered{transparent}
\mode<presentation> {
\usetheme{Boadilla}
}

\tikzset{
  % Beamer-aware styles
  only/.code args={<#1>#2}{%
    \only<#1>{\pgfkeysalso{#2}} 
  },
  temporal/.code args={<#1>#2#3#4}{%
    \temporal<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}{\pgfkeysalso{#4}} % 
  },
  alt/.code args={<#1>#2#3}{%
    \alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} %
  },
  % Shortcut for the  style
  surround/.style={
    draw=#1,
    rectangle,
    line width=3mm,
    % If draw is none, then TikZ sets the outer x/y seps to 0pt
    % meaning that this increases the inner x/y seps by half the line width
    % If draw is not none then the default outer seps are half the
    % line width so the inner seps are 2mm
    inner xsep=2mm + .5\pgflinewidth - \pgfkeysvalueof{/pgf/outer xsep},
    inner ysep=2mm + .5\pgflinewidth - \pgfkeysvalueof{/pgf/outer ysep},
    outer sep=auto
  },
  highlight/.style={
    only=<5>{surround=none},
    % braces needed as there's a comma in the overlay specification
    only={<2,6>{surround=red}}
  },
}

% Alignment marker to make the changes obvious
\NewDocumentCommand\Marker{ O{.3333} }{%
  \tikz[overlay] \draw[line width=.5pt] (0,.5ex) +(0,#1) -- +(0,-#1) +(-.1,#1) -- +(.1,#1) +(-.1,-#1) -- +(.1,-#1);%
}

\begin{document}
\begin{frame}<1-6>[t] % top-aligned to show vertical jumping
\begin{align*}
y & = ax + b \Marker \\
y &= \tikzmarknode[highlight]{ax-mark}{ax} + b \Marker \\
\end{align*}

\only<1>{Slide 1: no decoration, equations are perfectly aligned}
\only<2>{Slide 2: decoration on the tikzmarknode, adds space so that decoration does not overlap other elements}
\only<3>{Slide 3: as slide 1}
\only<4>{Slide 4: decoration added after, equations are perfectly aligned, decoration may overlap other elements}
\only<5>{Slide 5: no decoration, but outer sep adjusted so that space is reserved for decoration}
\only<6>{Slide 6: as slide 2, showing no jump from slide 5}

% Overlaid highlighting visible on slide 4
\tikz[overlay, remember picture]
\node[fit=(ax-mark),only=<4>{surround=red}] {};
\end{frame}
\end{document}

以下是上述内容的扁平版本:

突出显示等式中的项,显示各种间距选项

注意:我假设你想要突出的术语与其他人所用的术语一致。如果你想突出填充那么由于填充路径没有宽度,许多间距调整问题就会消失。但这又带来了额外的考虑,即填充区域应该在文本后面还是文本前面。如果你想考虑这一点,请发表评论进行澄清。

答案4

您可以使用该hf-tikz包:

\documentclass{beamer}
\usefonttheme[onlymath]{serif}
\setbeamercovered{transparent}
\mode<presentation> {
\usetheme{Boadilla}
}

\usepackage[beamer]{hf-tikz}

\begin{document}
\begin{frame}
\begin{align*}
y = \tikzmarkin<2->{a}ax\tikzmarkend{a} + b
\end{align*}
\end{frame}
\end{document}

在此处输入图片描述

相关内容