尝试回答如何在右下角添加脚注并设置背景颜色(仅限页面)&更改时间背景颜色我想计算 beamercolorbox
宽度,wd=\pagewidth-\beamer@sidebarwidth
但如果失败,即使使用\usepackage{calc}
。你知道原因吗?
接下来您有一个示例来测试它。第一个解决方案(使用calc
)不起作用,第二个和第三个(使用\addtolength
和 pgf-calc 库)起作用。
\documentclass[14pt]{beamer}
\usetheme{Berkeley}
\usepackage{calc}
\begin{document}
\begin{frame}
% wd=5cm-1cm does not work
\begin{beamercolorbox}[wd=5cm-1cm]{sidebar}
First box
\end{beamercolorbox}
\newlength{\mylength}
\setlength{\mylength}{5cm}
\addtolength{\mylength}{-1cm}
\begin{beamercolorbox}[wd=\mylength]{sidebar}
First box
\end{beamercolorbox}
\pgfmathsetmacro{\lengthb}{5-1}
\begin{beamercolorbox}[wd=\lengthb cm]{sidebar}
First box
\end{beamercolorbox}
\end{frame}
\end{document}
答案1
正在过滤的类似 PGF 的密钥是否参数是一个维度或一个计算,否则分支类型在时间上出现得较晚。因此beamer
,从某种意义上说,它早于pgfkeys
工作方式,我们不应该期望选项具有太多的灵活性,因为它们非常深奥,这可能是首先开发它们的beamer
原因。pgfkeys
在这种情况下,密钥按字面意思获取参数并尝试将其传递给 dimen,但会5cm
导致 TeX 停止扫描,并且会-1cm
打印出悬空部分。一种可能的解决方案是确保 dimen 计算通过以下方式得以保留:电子特克斯扩展\dimexpr...\relax
(手册第 3.5 节)。
\begin{beamercolorbox}[wd=\dimpexr5cm-1cm\relax]{sidebar}
First box
\end{beamercolorbox}
答案2
失败的原因wd=5cm-1cm
如下:
内部5cm-1cm
直接存储在宏中\beamer@colbox@wd
,稍后用于将其设置\hsize
为:
\hsize=\beamer@colbox@wd
PGFmath 或 永远都不能calc
交互。对于后者,需要调用\setlength
,因此
\usepackage{etoolbox}
\expandafter\patchcmd\csname\string\beamercolorbox\endcsname
{\hsize=\beamer@colbox@wd}
{\setlength\hsize{\beamer@colbox@wd}}
{}{}
会做。
为了使其与 PGFmath 配合使用,我们可以替换为
\expandafter\patchcmd\csname\string\beamercolorbox\endcsname
{\hsize=\beamer@colbox@wd}
{\pgfmathsetlength\hsize{\beamer@colbox@wd}}
{}{}
用其替换 LaTeX(和calc
)将使得可以在密钥中使用任何 PGFmath 选项。\setlength
\pgfmathsetlength
wd
这两种解决方案对于圆角框(rounded=true
)都将失败,因为\beamer@colbox@wd
再次使用了宏,我们可以通过修复或的另一个出现来解决这个\beamer@colbox@wd
问题\bmb@width
。
wd
重新定义键以便立即评估值可能会更容易:
\define@key{beamercolbox}{wd}{\pgfmathsetlengthmacro\beamer@colbox@wd{#1}}
或者,calc
例如
\define@key{beamercolbox}{wd}{\setlength\pgfutil@tempdima{#1}% any "temp" is okay
\edef\beamer@colbox@wd{\the\pgfutil@tempdima}}
显然,如果您想使用其他键,也需要对其进行此操作;在beamercolbox
命名空间中还有ht
、dp
和。如果您经常使用这些计算,那么这可能是值得的(并且最好询问开发人员);否则请使用已经讨论过的解决方案。leftskip
rightskip
\dimexpr