这可能是一个微不足道的问题,我看到过类似的问题,但由于某种原因,我没能解决它。
考虑这张幻灯片
\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 sep
(0pt
而不是线宽的一半)。这可用于校正 ,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}