为什么 beamercolorbox 宽度的计算操作不起作用?

为什么 beamercolorbox 宽度的计算操作不起作用?

尝试回答如何在右下角添加脚注并设置背景颜色(仅限页面)&更改时间背景颜色我想计算 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\pgfmathsetlengthwd

这两种解决方案对于圆角框(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命名空间中还有htdp和。如果您经常使用这些计算,那么这可能是值得的(并且最好询问开发人员);否则请使用已经讨论过的解决方案。leftskiprightskip\dimexpr

相关内容