使用 \vspace* 测量方程的高度,而不是使用 vphantom

使用 \vspace* 测量方程的高度,而不是使用 vphantom

在 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}

相关内容