将图像设置为 Beamer 中所有可用空间(不与其他元素重叠)

将图像设置为 Beamer 中所有可用空间(不与其他元素重叠)

我希望图片尽可能占据beamer演示文稿中的内容区域,但不与标题、侧边栏或页脚重叠。我该如何实现?

\includegraphics下面的代码给出了使用和设置宽度和高度时出错的示例\textwidth——\textheight如果您尝试这样做,您会发现底部的页脚被覆盖了。

当然,人们可以做类似的事情height=0.9\textheight,但如果改变主题,那就很烦人,而且不是特别强大......我正在寻找一个更优雅的解决方案。

\documentclass{beamer}
\mode<presentation>{
  \usetheme{Marburg}
}
\usepackage[utf8x]{inputenc}

\begin{document}
\begin{frame}{Header}{Sub title}
  \includegraphics[width=\textwidth,height=\textheight]{tmp.jpg}
\end{frame}
\end{document}

答案1

以下代码演示了如何包含全尺寸图像。要自定义它,只需将其更改image.jpg为要显示的图片的文件名即可。如果您使用的beamer主题没有侧边栏(例如默认主题,,,Ilmenau... AnnArbor),请更改\sidebarthemetrue\sidebarthemefalse

\documentclass{beamer}

\usetheme{Marburg}
\setbeamertemplate{navigation symbols}{}

\newif\ifsidebartheme
\sidebarthemetrue

\newdimen\contentheight
\newdimen\contentwidth
\newdimen\contentleft
\newdimen\contentbottom
\makeatletter
\newcommand*{\calculatespace}{%
\contentheight=\paperheight%
\ifx\beamer@frametitle\@empty%
    \setbox\@tempboxa=\box\voidb@x%
  \else%
    \setbox\@tempboxa=\vbox{%
      \vbox{}%
      {\parskip0pt\usebeamertemplate***{frametitle}}%
    }%
    \ifsidebartheme%
      \advance\contentheight by-1em%
    \fi%
  \fi%
\advance\contentheight by-\ht\@tempboxa%
\advance\contentheight by-\dp\@tempboxa%
\advance\contentheight by-\beamer@frametopskip%
\ifbeamer@plainframe%
\contentbottom=0pt%
\else%
\advance\contentheight by-\headheight%
\advance\contentheight by\headdp%
\advance\contentheight by-\footheight%
\advance\contentheight by4pt%
\contentbottom=\footheight%
\advance\contentbottom by-4pt%
\fi%
\contentwidth=\paperwidth%
\ifbeamer@plainframe%
\contentleft=0pt%
\else%
\advance\contentwidth by-\beamer@rightsidebar%
\advance\contentwidth by-\beamer@leftsidebar\relax%
\contentleft=\beamer@leftsidebar%
\fi%
}
\makeatother

\begin{document}
{
\setbeamertemplate{background canvas}{%
\calculatespace%
\begin{pgfpicture}
    \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{\paperwidth}{\paperheight}}
    \ifbeamercolorempty[bg]{background canvas}{}{\color{bg}\pgfusepath{fill}}
    \pgftext[at=\pgfpoint{\contentleft+0.5\contentwidth}{\contentbottom+0.5\contentheight}]{\includegraphics[width=\contentwidth,height=\contentheight]{image.jpg}}
\end{pgfpicture}%
}
\begin{frame}{Header}{Sub title}
Frame content
\end{frame}
}
\end{document}

结果:

输出结果:全尺寸图像

(所用图片由 Steve Peter 提供,可在以下网址下载http://www.tug.org/publicity/wallpaper/


代码解释:

1. 计算内容可用空间

这些尺寸将保存可用的高度和宽度以及内容相对于页面左下角的绝对位置(当有左侧边栏或脚注时这是必需的):

\newdimen\contentheight
\newdimen\contentwidth
\newdimen\contentleft
\newdimen\contentbottom

带有侧边栏的主题(例如)需要进行一些额外的处理,因为模板定义中Marburg存在会扭曲计算的内容:\vskip-1emframetitle

\newif\ifsidebartheme
\sidebarthemetrue

\calculatespace是计算上面定义的所有长度的核心部分:

\makeatletter
\newcommand*{\calculatespace}{%

\paperheight我们从框架标题和副标题的高度开始并减去它们(代码改编自beamerbaseframe.sty,第 114-129 行):

\contentheight=\paperheight%
\ifx\beamer@frametitle\@empty%
    \setbox\@tempboxa=\box\voidb@x%
  \else%
    \setbox\@tempboxa=\vbox{%
      \vbox{}%
      {\parskip0pt\usebeamertemplate***{frametitle}}%
    }%
    \ifsidebartheme%
      \advance\contentheight by-1em%
    \fi%
  \fi%
\advance\contentheight by-\ht\@tempboxa%
\advance\contentheight by-\dp\@tempboxa%
\advance\contentheight by-\beamer@frametopskip%

如果它是一个普通框架,这就是必须考虑的全部内容。否则,还要减去头线和脚线的高度(参见beamerbaseframecomponents.sty第 161-182 页):

\ifbeamer@plainframe%
\contentbottom=0pt%
\else%
\advance\contentheight by-\headheight%
\advance\contentheight by\headdp%
\advance\contentheight by-\footheight%
\advance\contentheight by4pt%
\contentbottom=\footheight%
\advance\contentbottom by-4pt%
\fi%

像这样,我们计算了\contentheight和。要获得内容宽度,如果它不是普通框架,则\contentbottom必须从中减去侧边栏的宽度( ,第 80-85 行):\paperwidthbeamerbaseframesize.sty

\contentwidth=\paperwidth%
\ifbeamer@plainframe%
\contentleft=0pt%
\else%
\advance\contentwidth by-\beamer@rightsidebar%
\advance\contentwidth by-\beamer@leftsidebar\relax%
\contentleft=\beamer@leftsidebar%
\fi%

2. 显示图像

我们现在有一个宏\calculatespace来计算所有必要的尺寸。它必须为每个帧单独调用,因为尺寸可能会根据您是否使用标题和副标题而改变。图像的包含在模板中完成background canvas。它被缩放到可用的全宽和高并放置在内容空间的中间:

\setbeamertemplate{background canvas}{%
\calculatespace%
\begin{pgfpicture}
    \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{\paperwidth}{\paperheight}}
    \ifbeamercolorempty[bg]{background canvas}{}{\color{bg}\pgfusepath{fill}}
    \pgftext[at=\pgfpoint{\contentleft+0.5\contentwidth}{\contentbottom+0.5\contentheight}]{\includegraphics[width=\contentwidth,height=\contentheight]{image.jpg}}
\end{pgfpicture}%
}

如果您不想让图像失真,只需将其keepaspectratio作为可选参数添加即可\includegraphics

相关内容