无需拉伸垂直空间的 Beamer 演示

无需拉伸垂直空间的 Beamer 演示

目前我正在更新和扩展我的 beamer 主题。因此我也想解决一个有时很烦人的间距问题。

考虑以下例子:

\documentclass[t]{beamer}
%
\newcommand{\testcontent}[2]{%
    \frametitle{Frame #2}
    Text\medskip\par
    Itemize:%
    \begin{itemize}
    \item a%
    \item b%
    \item c%
    \end{itemize}
    \begin{figure}
    \framebox(300,#1){Height = #1 units}%
    \end{figure}
}
%
\begin{document}
%
\begin{frame}
\testcontent{150}{1}%
\end{frame}
%
\begin{frame}
\testcontent{50}{2}%
\end{frame}
%
\begin{frame}
\testcontent{150}{3}%
\vspace{0ex plus 1fil minus 1fil}%
\end{frame}
%
\end{document}

该示例创建了以下三个框架。在单独的选项卡中打开它们以查看垂直间距的差异:

第 1 帧第 2 帧第 3 帧

在第一帧中,定义的图形高度迫使 LaTeX 拉伸(收缩)\medskipitemize和的垂直空间figure。与第二帧相比,可以看出这一点,其中图形的高度较小,并且垂直空间没有被拉伸。

因此,我一直在寻找一种解决方案,以避免垂直空间的拉伸,从而避免在框架之间切换时出现文本行跳跃。我发现有人重新定义了相应的长度,使其没有加减粘连,但这在我的情况下不起作用,或者我忘记更改一些长度。

所以我在第三帧中想出了这个\vspace{0ex plus 1fil minus 1fil}命令。这可以避免拉伸其他垂直空间,但如果框架内容不适合框架,则不会发出警告。另一个问题是,我必须手动将此行添加到每个框架末端。我尝试使用\patchcmdfor 来自动执行此操作\beamer@collect@@body,但这也没有用。

现在回答我的问题:

  1. 是否有其他方法可以避免所描述的垂直空间拉伸并拥有独立于框架内容的恒定垂直空间?
  2. 如果没有其他解决方案,那么我在上面第三帧中使用,是否可以将命令自动添加到每个帧末尾?

非常感谢您的帮助。

答案1

对于“内容略有变化的框架”,我不会使用单独的框架,而是使用同一框架的幻灯片。为了在幻灯片之间获得相同的缩小效果,您可以为环境中的最大图形保留所需的空间overlayarea

\documentclass[t]{beamer}

\begin{document}

\begin{frame}
    \frametitle<1>{Frame 1}
    \frametitle<2>{Frame 2}
    Text\medskip\par
    Itemize:%
    \begin{itemize}
    \item a%
    \item b%
    \item c%
    \end{itemize}
    \begin{overlayarea}{300pt}{150pt}
      \begin{figure}
        \only<1>{\framebox(300,150){Height = 150 units}}
        \only<2>{\framebox(300,50){Height = 50 units}}
      \end{figure}
    \end{overlayarea}
\end{frame}

\end{document}

答案2

根据我在此处的回答,以下是答案:https://tex.stackexchange.com/a/389647/120578

\documentclass[t]{beamer}
%
\usepackage{calc}
\newdimen\mycurrentheight
\newdimen\mymaxheight
\newdimen\myspace
\newdimen\zerodimen
\newsavebox{\mybox}

\def\keepHeight#1{
\setbox\mybox\vbox{#1}
\setlength{\mycurrentheight}{\ht\mybox+\dp\mybox}
\addspace{\mycurrentheight}
\usebox{\mybox}
\vskip \myspace
}


\def\addspace#1{
\ifdim\mycurrentheight>#1
\let\mymaxheight=\mycurrentheight
\let\myspace=\zerodimen
\else
\let\myspace=\zerodimen
\advance \myspace by \mymaxheight
\advance \myspace by -\mycurrentheight
\fi
}

\newcommand{\testcontent}[2]{%
    \frametitle{Frame #2}
    Text\medskip\par
    Itemize:%
    \begin{itemize}
    \item a%
    \item b%
    \item c%
    \end{itemize}
    \keepHeight{\begin{figure}
    \framebox(300,#1){Height = #1 units}%
    \end{figure}}
}
%
\begin{document}
%
\begin{frame}
\testcontent{140}{1}%
\end{frame}
%
\begin{frame}
\testcontent{50}{2}%
\end{frame}
%
\begin{frame}
\testcontent{140}{3}%
%\vspace{0ex plus 1fil minus 1fil}%
\end{frame}
%
\end{document}

我不太确定这是否是你真正想要的。我已经创建了命令\keepheight{}并在你的 中使用了它\testcontent

我想我们可以根据您的需要进行操作但我对此并不确定。

试一试!

编辑

在 OP 评论后添加截图:

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

相关内容