![将图像设置为 Beamer 中所有可用空间(不与其他元素重叠)](https://linux22.com/image/245782/%E5%B0%86%E5%9B%BE%E5%83%8F%E8%AE%BE%E7%BD%AE%E4%B8%BA%20Beamer%20%E4%B8%AD%E6%89%80%E6%9C%89%E5%8F%AF%E7%94%A8%E7%A9%BA%E9%97%B4%EF%BC%88%E4%B8%8D%E4%B8%8E%E5%85%B6%E4%BB%96%E5%85%83%E7%B4%A0%E9%87%8D%E5%8F%A0%EF%BC%89.png)
我希望图片尽可能占据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-1em
frametitle
\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 行):\paperwidth
beamerbaseframesize.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
。