在 beamer 中,我经常想制作一个内置组件。一个复杂的版本是,当我想要从 开始<expr>
,然后构建一个下支撑 时\underbrace{<expr>}_{foo}
。如果幻灯片垂直居中,然后我使用\only<1>{...}
,然后\only<2->{...}
,那么我会看到等式中出现跳跃,因为高度显示的方程的underbrace
较大。
一种解决方案是将 放在\vphantom{...}
中\only<1>{...}
,但这要求我将较大的表达式(例如,带有下括号)从 复制\only<2->{...foo...}
到第一个 中\only<1>{... \vphantom{foo}...}
。这是一个相当丑陋的解决方案,因为我的代码通常大小增加了一倍。
我更喜欢一种方法,即测量高度.aux
并在第二次编译(或第三次,我不介意)中使用这些高度,而不是简单地使用\vspace*{\heightfoo}
。
有什么想法吗?
以下是 MWE:
\[
\hat w = \arg\min_{w}
\only<1>{\frac 1 m \sum_{i=1}^{m} f(w) \vphantom{ \underbrace{\frac 1 m \sum_{i=1}^{m} f(w)}_{L(w)}}}%
\only<2->{\underbrace{\frac 1 m \sum_{i=1}^{m} f(w)}_{L(w)}}
\]
答案1
以下代码使\underbrace
和\overbrace
可感知叠加,并使用在和其他地方\alt<os>{<default>}{<alternative>}
打印。因此,在和其他地方设置(对于 类似)。<default>
<os>
<alternative>
\underbrace<os>{<stuff>}_{<label>}
\underbrace{<stuff>}_{<label>}
<os>
\vphantom{\underbrace{<stuff>}_{<label>}}<stuff>
\overbrace
\documentclass{beamer}
\usepackage{xparse,letltxmacro}
\LetLtxMacro\oldunderbrace\underbrace
\LetLtxMacro\oldoverbrace\overbrace
\RenewDocumentCommand{\underbrace}{d<> m e{_^}}{%
\alt<#1>%
{\oldunderbrace{#2}_{\IfValueT{#3}{#3}}^{\IfValueT{#4}{#4}}}%
{\vphantom{\oldunderbrace{#2}_{\IfValueT{#3}{#3}}^{\IfValueT{#4}{#4}}}#2}%
}%
\RenewDocumentCommand{\overbrace}{d<> m e{_^}}{%
\alt<#1>%
{\oldoverbrace{#2}_{\IfValueT{#3}{#3}}^{\IfValueT{#4}{#4}}}%
{\vphantom{\oldoverbrace{#2}_{\IfValueT{#3}{#3}}^{\IfValueT{#4}{#4}}}#2}%
}%
\begin{document}
\begin{frame}
\[
\hat w = \arg\min_w
\underbrace<2->{\frac{1}{m} \sum_{i = 1}^{m} f(w)}_{L(w)}
\]
\end{frame}
\end{document}