![自动将图形放入 Beamer 幻灯片的剩余空间](https://linux22.com/image/317619/%E8%87%AA%E5%8A%A8%E5%B0%86%E5%9B%BE%E5%BD%A2%E6%94%BE%E5%85%A5%20Beamer%20%E5%B9%BB%E7%81%AF%E7%89%87%E7%9A%84%E5%89%A9%E4%BD%99%E7%A9%BA%E9%97%B4.png)
我想在演示文稿的某个部分(幻灯片的开头、中间或结尾)放置一个图形。我希望将图形调整为可用空间的高度,同时保持纵横比不变。我该怎么做?
假设我有这要放入幻灯片中的图像。我有以下最小示例:
\documentclass{beamer}
\usepackage{graphicx}
\usepackage[pangram]{blindtext}
\usetheme{Pittsburgh}
\begin{document}
\begin{frame}
\frametitle{Something}
\blindenumerate[2]
\centering
\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{2000px-If-then-else-control-flow-graph.svg.png}
\end{frame}
\begin{frame}
\frametitle{Something}
\blindenumerate[2]
\centering
\includegraphics[width=\textwidth,height=.5\textheight,keepaspectratio]{2000px-If-then-else-control-flow-graph.svg.png}
\blinddescription[2]
\end{frame}
\begin{frame}
\frametitle{Something}
\blindenumerate[6]
\centering
\includegraphics[width=\textwidth,height=.5\textheight,keepaspectratio]{2000px-If-then-else-control-flow-graph.svg.png}
\blinddescription[2]
\end{frame}
\end{document}
我希望这个图形能够在可用空间内自动调整,而无需手动更改高度(即.5\textheight
)。 可以吗?
答案1
一种方法是定义一个新命令,该命令将图像之前的框架内容、图像的文件名以及(可选)图像之后的任何框架内容作为参数。为了能够按自然顺序指定这些内容,我使用xparse
's\NewDocumentCommand
来定义
\fitimage{<content before>}{<image file name>}[<content after>]
此命令计算包含第一个和第三个参数 ( ) 的段落框的总高度。然后,它通过从该高度减去并进行一些调整\fitotherht
来计算图像的适当最大高度 ( ) ,以便为框架头部和脚部的垂直间距以及框架内不同内容群集之间的一些空间留出空间。\fitimageht
\textheight
代码:
\documentclass{beamer}
\usepackage[pangram]{blindtext}
\usetheme{Pittsburgh}
\usepackage{xparse,calc}
\newlength\fitimageht
\newlength\fitotherht
\newsavebox\fitimagebox
\NewDocumentCommand \fitimage { m m O {} }{%
\sbox\fitimagebox{%
\parbox{\textwidth}{%
#1\par
#3
}%
}%
\settototalheight{\fitotherht}{%
\usebox\fitimagebox
}%
\setlength\fitimageht{\textheight}%
\addtolength\fitimageht{-\fitotherht-\topskip-\footskip-3\baselineskip}%
#1\par
\centering
\includegraphics[width=\textwidth,height=\fitimageht,keepaspectratio]{#2}\par
#3}
\begin{document}
\begin{frame}
\fitimage{%
\frametitle{Something}
\blindenumerate[2]
}{2000px-If-then-else-control-flow-graph}
\end{frame}
\begin{frame}
\fitimage{%
\frametitle{Something}
\blindenumerate[2]%
}{2000px-If-then-else-control-flow-graph}[%
\blinddescription[2]
]
\end{frame}
\begin{frame}
\fitimage{%
\frametitle{Something}
\blindenumerate[6]%
}{2000px-If-then-else-control-flow-graph}[%
\blinddescription[2]
]
\end{frame}
\end{document}
重要的是,所有框架内容都应包含在命令的参数中。因此,这不适用于过于脆弱的内容。(例如,我认为逐字代码就不起作用。)但对于普通文本、框架标题等,它似乎做得不错。如果我选择的间距不符合您的口味,您可以根据\fitimageht
需要减去更多或更少的值,轻松调整值。
根据日志文件,这不会导致任何坏箱。
答案2
下面的代码展示了使用tcolorbox
包及其space to
选项。
space to = macro
保存(经过多次编译:两次或更多次)macro
框内容自然高度与框强制高度之间的差值。此差值可用于修复图形高度填充,这样,所有可用空间都可用。
由于这种 tcolorboxes 需要固定高度,而且我不知道如何自动计算它,因此我使用了height=.8\textheight
。
然后像这样的声明
\begin{tcolorbox}[enhanced,height=.8\textheight, space to=\myspace]
...
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\end{tcolorbox}
将构建一个具有高度的 tcolorbox .8\textheight
,并将存储可用的垂直空间,\myspace
用于固定图形大小。
下面的代码显示了一些默认示例tcolorboxes
,以及一些blankest
创建类似常规文本的框的样式的示例:
\documentclass{beamer}
\usepackage[pangram]{blindtext}
\usetheme{Pittsburgh}
\usepackage[most]{tcolorbox}
\newtcolorbox{myfitbox}[1][]{
enhanced,
height=.8\textheight,
space to=\myspace,
#1}
\begin{document}
\begin{frame}
\frametitle{Something}
\begin{myfitbox}
\blindenumerate[2]
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\end{myfitbox}
\end{frame}
\begin{frame}
\frametitle{Something}
\begin{myfitbox}
\blindenumerate[2]
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\blinddescription[2]
\end{myfitbox}
\end{frame}
\begin{frame}
\frametitle{Something}
\begin{myfitbox}
\blindenumerate[6]
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\blinddescription[2]
\end{myfitbox}
\end{frame}
\begin{frame}
\frametitle{Something}
\begin{myfitbox}[blankest]
\blindenumerate[2]
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\end{myfitbox}
\end{frame}
\begin{frame}
\frametitle{Something}
\begin{myfitbox}[blankest]
\blindenumerate[2]
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\blinddescription[2]
\end{myfitbox}
\end{frame}
\begin{frame}
\frametitle{Something}
\begin{myfitbox}[blankest]
\blindenumerate[6]
{\par\centering\includegraphics[height=\myspace]{example-image}\par}
\blinddescription[2]
\end{myfitbox}
\end{frame}
\end{document}