如何获取投影仪中图像和标题之间的具体距离?

如何获取投影仪中图像和标题之间的具体距离?

1pt我正在尝试将中的图片下方的标题设置为beamer。如果我设置\abovecaptionskip为 ,0pt图片和标题之间仍然有间隙。这是因为\baselineskip大于字体大小(默认10pt/ 12pt)。我可以通过使用 caption 包来实现零距离,如以下 MWE 所示:

\documentclass{beamer}
\usepackage[compatibility=false]{caption}
\captionsetup{skip=0pt}
\begin{document}
\begin{frame}
  \begin{figure}
    \centering
    \textcolor{yellow}{\vrule width \linewidth height .5\textheight depth 0pt\relax}
    \caption{Caption}
  \end{figure}
\end{frame}
\end{document}

你注意到了compatibility=false吗?这不是一个好习惯!caption新版本不支持修改 beamer 字幕。

问题是:如何在不使用任何不受支持的包的情况下获取投影仪中图像和标题之间的特定距离?就我而言,具体距离是1pt

beamer如果有一个不带任何额外软件包的唯一解决方案那就太好了。

答案1

另一种选择,不需要计算。您可以在内部\beamer@makecaption命令的定义中取消标题前的行间跳过,这实际上是对标题进行排版。原始定义(在beamerbaselocalstructure.sty)是

\long\def\beamer@makecaption#1#2{%
  \def\insertcaptionname{\csname#1name\endcsname}%
  \def\insertcaptionnumber{\csname the#1\endcsname}%
  \def\insertcaption{#2}%
  \nobreak\vskip\abovecaptionskip\nobreak
  \sbox\@tempboxa{\usebeamertemplate**{caption}}%
  \ifdim \wd\@tempboxa >\hsize
    \usebeamertemplate**{caption}\par
  \else
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \fi
  \nobreak\vskip\belowcaptionskip\nobreak
  }

因此您可以\nointerlineskip在第一个之后插入\nobreak,例如

\documentclass{beamer}

\makeatletter
\long\def\beamer@makecaption#1#2{%
  \def\insertcaptionname{\csname#1name\endcsname}%
  \def\insertcaptionnumber{\csname the#1\endcsname}%
  \def\insertcaption{#2}%
  \nobreak\nointerlineskip\vskip\abovecaptionskip\nobreak
  \sbox\@tempboxa{\usebeamertemplate**{caption}}%
  \ifdim \wd\@tempboxa >\hsize
    \usebeamertemplate**{caption}\par
  \else
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \fi
  \nobreak\vskip\belowcaptionskip\nobreak
  }
\makeatother

\begin{document}

\begin{frame}
\setlength\abovecaptionskip{0pt}
\begin{figure}
\rule{3cm}{1cm}
\caption{Test with \texttt{0pt} and some more text so the caption will span more than one line}
\end{figure}
\setlength\abovecaptionskip{1pt}
\begin{figure}
\rule{3cm}{1cm}
\caption{Test with \texttt{1pt} and some more text so the caption will span more than one line}
\end{figure}
\setlength\abovecaptionskip{10pt}
\begin{figure}
\rule{3cm}{1cm}
\caption{Test with \texttt{10pt} and some more text so the caption will span more than one line}
\end{figure}
\end{frame}

\end{document}

在此处输入图片描述

或者您可以修补命令以引入简化代码的更改,如下例所示:

\usepackage{etoolbox}
\makeatletter
\patchcmd{\beamer@makecaption}
  {\nobreak}
  {\nobreak\nointerlineskip}
  {}
  {}
\makeatother

答案2

如果您只在标题中包含文本,则最大高度应为\figurename(或\tablename,如果是表格)。因此,\figurename在一个框中捕获(例如\captionsavebox)并测量其高度可以让您调整\abovecaptionskip以完全满足您的需求:

在此处输入图片描述

\documentclass{beamer}

\newsavebox{\captionsavebox}
\savebox{\captionsavebox}{\figurename}

\begin{document}

\begin{frame}
  \begin{figure}
    \centering
    \textcolor{yellow}{\vrule width \linewidth height .5\textheight depth 0pt\relax}
    \caption{Caption}
  \end{figure}
\end{frame}

\setlength{\abovecaptionskip}{\dimexpr-\baselineskip+\ht\captionsavebox+1pt}

\begin{frame}
  \begin{figure}
    \centering
    \textcolor{yellow}{\vrule width \linewidth height .5\textheight depth 0pt\relax}
    \caption{Caption}
  \end{figure}
\end{frame}

\end{document}

设置\captionbeamer非常类似于常规字幕。以下是“制作字幕”宏(来自beamerbaselocalstructure.sty):

\long\def\beamer@makecaption#1#2{%
  \def\insertcaptionname{\csname#1name\endcsname}%
  \def\insertcaptionnumber{\csname the#1\endcsname}%
  \def\insertcaption{#2}%
  \nobreak\vskip\abovecaptionskip\nobreak
  \sbox\@tempboxa{\usebeamertemplate**{caption}}%
  \ifdim \wd\@tempboxa >\hsize
    \usebeamertemplate**{caption}\par
  \else
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \fi
  \nobreak\vskip\belowcaptionskip\nobreak}

相关内容