更新

更新

这个问题与删除标题和正文之间的 Beamer 块过渡如何禁用 Beamer 中块标题和块主体之间的颜色渐变?但不是这两个问题的重复。

问题于 25.10.22 关闭后进行编辑:这个问题不是重复的 框架标题和顶部功能区之间的自定义颜色因为我在这里问的是为什么这种情况只发生在 CMYK 颜色模型上;链接中的问题只是想解决问题,对原因不感兴趣。下面 David Purton 提供的答案对我来说完全没问题;顺便说一下,David Purton 发布了类似的回复他在这里回答了另一个问题。 结束编辑

让我们考虑以下最小的例子:

\documentclass{beamer}
\usepackage{etoolbox}
\setbeamertemplate{blocks}[rounded][shadow=false]
\definecolor{top}{cmyk}{1,0,0,0}
\colorlet{bottom}{top!10!white}

\BeforeBeginEnvironment{block}{
    \setbeamercolor{block title}{fg=white,bg=top}
    \setbeamercolor{block body}{fg=black, bg=bottom}
}
\AfterEndEnvironment{block}{
 \setbeamercolor{block title}{use=structure,fg=structure.fg,bg=structure.fg!20!bg}
 \setbeamercolor{block body}{parent=normal text,use=block title,bg=block title.bg!50!bg, fg=black}
}

\makeatletter
\pgfdeclareverticalshading[lower.bg,upper.bg]{bmb@transition}{200cm}{%
  color(0pt)=(lower.bg); color(4pt)=(lower.bg); color(4pt)=(upper.bg)}
\makeatother

\begin{document}
\begin{frame}
  \begin{block}{Block}
  Block stuff.
  \end{block}
\end{frame}
\end{document}

它将产生输出: 输出 1

因此,您可能会注意到,块的标题和正文部分(通常显示渐变)之间的过渡线既不是顶部颜色也不是底部颜色,而是介于两者之间。

如果我们将颜色的定义修改top为基于 rgb 的颜色,例如\definecolor{top}{rgb}{1,0,0},那么该方法就可以按预期工作(也就是说,中间看不到不同颜色的线): 输出 2

为什么这种情况只发生在 cmyk 颜色模型上?

答案1

更新

pgf从 3.1.3 版开始支持 CMYK 阴影。因此不再需要使用。(默认情况下,pgf-cmykshadings您仍需要使用来使用 CMYK 阴影。)\RequirePackage[cmyk]{xcolor}


您所看到的情况是因为 PGF 阴影不支持 CMYK。因此,即使您已将顶部和底部颜色指定为 CMYK,它们也会转换为渐变的 RGB。即使您将渐变更改为以相同颜色开始和结束,也会发生这种情况。

更新

现在有一个新的替代方法可以解决这个问题。您可以使用pgf-cmykshadings支持 CMYK 阴影的包pgf。将问题中的 MWE 开头更改为:

\RequirePackage[cmyk]{xcolor}
\RequirePackage{pgf-cmykshadings}
\documentclass{beamer}

必须pgf-cmykshadings先加载beamer才能在 CMYK 中定义阴影。我还加载了xcolor选项cmyk以确保所有颜色都处于相同的 (CMYK) 颜色空间中。

原始答案

您的解决方案是修补\beamerboxesrounded宏,beamerbaseboxes.sty使用实心填充的矩形代替渐变。这可以是任何您喜欢的颜色。在这里,我将其设置为框的底部颜色,就像您的问题一样。

平均能量损失

\documentclass{beamer}
\setbeamertemplate{blocks}[rounded][shadow=false]
\definecolor{top}{cmyk}{1,0,0,0}
\colorlet{bottom}{top!10!white}

\BeforeBeginEnvironment{block}{
    \setbeamercolor{block title}{fg=white,bg=top}
    \setbeamercolor{block body}{fg=black, bg=bottom}
}
\AfterEndEnvironment{block}{
 \setbeamercolor{block title}{use=structure,fg=structure.fg,bg=structure.fg!20!bg}
 \setbeamercolor{block body}{parent=normal text,use=block title,bg=block title.bg!50!bg, fg=black}
}

% patch \beamerboxesrounded from beamerbaseboxes.sty to use solid colour
% instead of gradient
\makeatletter
\usepackage{xpatch}
\xpatchcmd{\beamerboxesrounded}
  {\pgfpathrectangle{\pgfpoint{-4bp}{-1bp}}{\pgfpoint{\bmb@dima}{8bp}}
   \pgfusepath{clip}
   {\pgftransformshift{\pgfpoint{-4bp}{0bp}}\pgftext[left,base]{\pgfuseshading{bmb@transition}}}}
  {\pgfpathrectangle{\pgfpoint{-4bp}{0bp}}{\pgfpoint{\bmb@dima}{4bp}}
   \pgfsetcolor{lower.bg}
   \pgfusepath{fill}}
  {}
  {}
\makeatother

\begin{document}
\begin{frame}
  \begin{block}{Block}
  Block stuff.
  \end{block}
\end{frame}
\end{document}

在此处输入图片描述

相关内容