下面的代码重新定义了 beamer 的默认块环境,以允许自定义样式。不幸的是,它以某种方式改变了最后一列的水平间距(第三列的规则应该填充剩余空间以匹配顶部规则的右边框)。如果跳过调用,\RenewDocumentEnvironment
一切都会正常。这个空间的原因是什么,如何正确地重新定义块?(部分源代码和这样重新定义它的想法可能来自 SE,但我找不到原始代码)。
\documentclass[english]{beamer}
\usepackage{xparse}
% Save old block environment commands (with LetLtxMacro to support arguments)
\LetLtxMacro\origblock\block
\LetLtxMacro\endorigblock\endblock
% Introduce a new block whose title and body format can be customized
\newenvironment{formattedblock}[3]%
{%
% Force expansion of the second setbeamercolor argument by using edef
\edef\settitleformat{\noexpand\setbeamercolor{block title}{#2}}%
\settitleformat%
\edef\setbodyformat{\noexpand\setbeamercolor{block body}{#3}}%
\setbodyformat%
\begin{origblock}{#1}%
}{%
\end{origblock}%
}
% Reformat ordinary blocks by using this formattedblock config
\RenewDocumentEnvironment{block}{ g }%
{%
\begin{formattedblock}{#1}{bg=blue,fg=white}{bg=gray,fg=black}%
}{%
\end{formattedblock}%
}
\begin{document}
\begin{frame}[t]{}
\rule{\linewidth}{1ex}
\begin{columns}[onlytextwidth,t]
\begin{column}{0.25\linewidth}
\rule{\linewidth}{1ex}
\begin{block}{foo}
bar
\end{block}
\end{column}
\begin{column}{0.25\linewidth}
\rule{\linewidth}{1ex}
\begin{block}{foo}
bar
\end{block}
\end{column}
\begin{column}{0.25\linewidth}
\rule{\linewidth}{1ex}
\begin{block}{foo}
\begin{itemize}
\setbeamertemplate{itemize item}[circle]
\item bar
\end{itemize}
\end{block}
\end{column}
\end{columns}
\end{frame}
\end{document}
以下屏幕截图\RenewDocumentEnvironment
分别显示了一次带有错误的输出(如果启用)和一次不带有空格(和格式)的输出。
编辑#2:
有趣的是,只需使用传统的 beamer 命令对块进行样式设置,就可以产生相同的效果:
\setbeamercolor{block title}{bg=blue,fg=white}
\setbeamercolor{block body}{bg=gray,fg=black}
所以这和环境重新定义完全无关。问题仍然存在:为什么会发生这种情况?
编辑 #3:显然,如果您定义任何背景颜色,beamer 就会这样做。呃。截至 Beamer 3.40,据我所知,手册中没有提到或解释这一点。
答案1
投影仪块周围出现额外空间的最可能原因是它使用了beamercolorbox
withcolsep*=0.75ex
并且设置了一些背景颜色。colsep
手册中的beamercolorbox
选项部分解释了该选项:
colsep*=⟨dimension⟩ 在文本周围设置一个额外的颜色分隔空间,该空间水平方向位于框的外部。这意味着如果框有背景,则该背景将向文本的左侧和右侧突出 ⟨dimension⟩,但 TEX 不会将这个突出的背景考虑在内以进行排版。
因此,如果您不需要背景颜色,只需取消设置bg
值,否则您将必须完全重新定义块环境,如所述这里。