beamer、\vfill 和 itemize

beamer、\vfill 和 itemize

我想在某些框架中将文本放置在投影仪幻灯片的右下角。我创建了一个命令,通过 放置此文本\vfill\hfill。在普通类(如文章)中,它可以完美运行。但对于投影仪,\vfill似乎没有标准行为。

比较以下 MWE 中的第 1 帧和第 2 帧

\documentclass[handout]{beamer}

\def\position#1#2{\vfill\hfill #1-#2}
\begin{document}

\begin{frame}
\begin{itemize}\item a
\item a
\item a
\end{itemize}
\position{2}{2}
\end{frame}

\begin{frame}
\begin{itemize}\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\end{itemize}
\position{2}{2}
\end{frame}
\end{document}

任何想法?

答案1

我同意 @egreg 的观点,这似乎不是实现你意图的正确方法。我认为 @Peter Grill 的答案是更好的选择。无论如何,如果你坚持,以下是我的建议。

Beamer 使用\vfill来垂直对齐幻灯片。您可以这样想:\vfill幻灯片内容上方有一个 ,下方还有一个。因此,粗略地说,\vfill您引入的 仅使用幻灯片垂直未使用空间的三分之一。

要使用所有这些空间,您需要下一级 TeX 胶水拉伸:

\def\position#1#2{\vskip 0pt plus 1filll\hfill #1-#2}

这样一来,幻灯片的顶部和底部就没有空间了,但这可能就是您想要的。

答案2

根据beamer手册,您可以使用该textpos包将内容绝对定位在页面上:

12.8 绝对定位文本和图形

通常,beamer 使用 TEX 的常规排版机制来定位页面上的文本和图形。在某些情况下,您可能希望某个文本或图形出现在绝对指定的页面位置。这意味着该位置是相对于幻灯片的左上角指定的。该包textpos提供了几个用于绝对定位文本的命令,它与 beamer 一起工作。使用此包时,您通常必须指定选项overlay和可能absolute

在此处输入图片描述

代码:

\documentclass[handout]{beamer}

\usepackage[absolute,overlay]{textpos}

\newcommand*{\XOffsetFromBottomRight}{-2.0em}%
\newcommand*{\YOffsetFromBottomRight}{2.0ex}%
\newcommand*{\BottomRightText}[2]{%
    \par%
    \begin{textblock*}{5.0cm}(\dimexpr\textwidth-\XOffsetFromBottomRight\relax,\dimexpr\textheight-\YOffsetFromBottomRight\relax)
        #1-#2%
    \end{textblock*}%
}%

\begin{document}
\begin{frame}
\begin{itemize}\item a
\item a
\item a
\end{itemize}
\BottomRightText{2}{1}
\end{frame}

\begin{frame}
\begin{itemize}\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\end{itemize}
\BottomRightText{2}{2}
\end{frame}
\end{document}

答案3

\vspace{\stretch{100}}    

会做这样的事:

\vfill
(幻灯片的上半部分)
\vfill\vfill...\vfill(那\vspace{\stretch{100}}部分)
(幻灯片的下半部分)
\vfill

因此几乎可以模拟预期的\vfill结果。

现在,你可以只更改 \position 命令的定义,如下所示

\def\position#1#2{\vspace{\stretch{100}}\hfill #1-#2}

或者定义自己的 \myvfill 供 BEAMER 使用

\def\myvfill{\vspace{\stretch{100}}}
\def\position#1#2{\myvfill\hfill #1-#2}

答案4

事实上,如果您使用s可伸缩框架,则可以将您的宏与投影仪一起使用(\vfill如果您希望您的框架居中,则可能在开始时使用):

\documentclass[handout]{beamer}

\def\position#1#2{\vfill\hfill #1-#2}
\begin{document}

\begin{frame}[s]
\begin{itemize}
\item a
\item a
\item a
\end{itemize}
\position{2}{2}
\end{frame}

\begin{frame}[s]
\vfill
\begin{itemize}
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\end{itemize}
\position{2}{2}
\end{frame}
\end{document}

不过就我个人而言,我认为如果将文本附加到框架底部某些已经存在的元素上会更容易,navigation symbols例如footline

\documentclass[
  handout
]{beamer}

\newcommand{\position}[2]{
  \addtobeamertemplate{navigation symbols}{}{{\color{black}\normalsize #1-#2}}
}

\begin{document}

\begingroup
\position{2}{2}
\begin{frame}
\begin{itemize}
\item a
\item a
\item a
\end{itemize}

\end{frame}

\begin{frame}
\begin{itemize}
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\item a
\end{itemize}
\end{frame}
\endgroup
\end{document}

相关内容