我正在创建一个 beamer 主题。作为主题的一部分,我想创建一些具有特定布局的框架模板。其中最简单的是一个静态框架,其中包含一个以普通框架为中心的单个图形。我希望用户能够像这样调用此框架:
\documentclass[presentation]{beamer}
\usetheme{Zion}
\begin{frame}[getoffthestage]{}
\end{frame}
为了实现这一点,我在我的 beamer 样式文件中包含了以下乳胶代码beamerthemeZion.sty
。
\newif\ifbeamer@getoffthestage
\define@key{beamerframe}{getoffthestage}[true]{%
\beamer@plainframetrue\beamer@getoffthestagetrue%
\def\beamer@frametemplate{\beamer@frametemplate@plain}%
\usebeamertemplate*{getoffthestage}}
\beamer@getoffthestagefalse
\defbeamertemplate*{getoffthestage}{}{%
\noindent\begin{minipage}[b][\textheight][c]{\textwidth}%
\hspace*{\fill}%
\includegraphics[height=0.4\paperheight]{logographic}%
\hspace*{\fill}%
\end{minipage}}
我有两个问题:
首先,为什么 getoffthestage 框架的内容放置在幻灯片底部附近?我不得不使用 minipage 来垂直居中图形。
其次,为什么宽度过宽的迷你页面\textwidth
会导致不必要的分页符?当我将宽度设置为 时0.9\textwidth
,所有内容仍保留在一页上。
我猜我把\usebeamertemplate*
命令放错了地方。有没有更好的方法来实现我想要的效果?
答案1
所有麻烦的根源在于你定义的一切都\define@key{beamerframe}{getoffthestage}[true]{...}
没有正确执行前框架开始。因此,当您的代码尝试插入图像等时,框架尚未打开,这会导致奇怪的位置等。
作为一个简单的替代方法,我建议将您的图像添加到另一个 beamertemplate,例如background canvas
或任何您不需要的其他模板:
\documentclass{beamer}
\usepackage{etoolbox}
\BeforeBeginEnvironment{frame}{%
\setbeamertemplate{background canvas}{}%
}
\makeatletter
\define@key{beamerframe}{getoffthestage}[true]{%
\setbeamertemplate{background canvas}{%
\vbox to \paperheight{\vfil\hbox to \paperwidth{\hfil\includegraphics[width=.5\textwidth]{example-grid-100x100bp}\hfil}\vfil}%
}%
}
\makeatother
\begin{document}
\begin{frame}[getoffthestage]
\end{frame}
\begin{frame}
\frametitle{bla}
normal frame
\end{frame}
\end{document}