基于 beamer colors 的 tcolorbox 定义存在问题

基于 beamer colors 的 tcolorbox 定义存在问题

我想tcolorbox根据投影仪中当前使用的颜色主题来声明一种颜色。

我尝试过类似

colbacktitle=\usebeamercolor[bg]{block title alerted}

但它显示错误。因此我使用以下代码进行处理:

\documentclass[t]{beamer}
\usecolortheme{rose}
\usepackage[most]{tcolorbox}

\newtcolorbox{myalertbox}[2][]{%
    code={%
        \usebeamercolor{block title alerted}
        \colorlet{titlebg}{bg}
        \colorlet{titlefg}{fg}
        \usebeamercolor{block body alerted}
        \colorlet{bodybg}{bg}
        \colorlet{bodyfg}{fg}
    },
    colbacktitle=titlebg, 
    coltitle=titlefg, 
    colback=bodybg,
    colupper=bodyfg,
    title=#2,
    boxrule=0pt,
    sharp corners,
    #1
}

\begin{document} 
\begin{frame}{Testing beamer colors in tcolorbox}

\begin{myalertbox}{Alert tcolorbox}
Some text
\end{myalertbox}

\begin{alertblock}{Beamer alert box}
Some text
\end{alertblock}

\end{frame}
\end{document}

产生

在此处输入图片描述

两个问题:

  1. 为什么这些盒子会显示不同的颜色?
  2. 您知道在 tcolorbox 定义中使用 beamer 颜色的更好的方法吗?

答案1

问题在于,背景颜色被定义为警告颜色和背景的混合,例如bg=alerted text.fg!20!bg。这似乎是 的一个问题tcolourbox

作为一种解决方法,在颜色定义中明确使用white(而不是):bg

\documentclass[t]{beamer}
\usecolortheme{rose}
\usepackage[most]{tcolorbox}


\setbeamercolor{block title alerted}{use=alerted text,fg=alerted text.fg,bg=alerted text.fg!20!white}
\setbeamercolor{block body alerted}{parent=normal text,use=block title alerted,bg=block title alerted.bg!50!white}

\newtcolorbox{myalertbox}[2][]{%
    code={%
        \usebeamercolor{block title alerted}
        \colorlet{titlebg}{block title alerted.bg}
        \colorlet{titlefg}{block title alerted.fg}
        \usebeamercolor{block body alerted}
        \colorlet{bodybg}{block body alerted.bg}
        \colorlet{bodyfg}{block body alerted.fg}
    },
    colbacktitle=titlebg, 
    coltitle=titlefg, 
    colback=bodybg,
    colupper=bodyfg,
    title=#2,
    boxrule=0pt,
    sharp corners,
    #1
}

\begin{document} 
\begin{frame}{Testing beamer colors in tcolorbox}

\begin{myalertbox}{Alert tcolorbox}
Some text
\end{myalertbox}

\begin{alertblock}{Beamer alert box}
Some text
\end{alertblock}

\end{frame}
\end{document}

答案2

使用 tcolorbox 复制 beamer 块外观和感觉的另一种方法是使用新的 tcolorbox 内部主题 (https://www.ctan.org/pkg/beamertheme-tcolorbox)。

该主题将用 tcolorboxes 替换标准 beamer 块,但您也可以使用它来定义自己的框:

\documentclass[t]{beamer}
\usecolortheme{rose}
\useinnertheme{tcolorbox}

\makeatletter
\newtcolorbox{myalertbox}[2][]{%
    code={%
      \beamer@tcb@colini[ alerted]
    },
    colback=beamer@tcb@bodybg,
    colbacktitle=beamer@tcb@titlebg,
    coltext=beamer@tcb@bodyfg,
    coltitle=beamer@tcb@titlefg,
    before title={\usebeamerfont{block title alerted}},
    before upper={\usebeamerfont{block body alerted}},    
    title=#2,
    #1
}
\makeatother

\begin{document} 
\begin{frame}{Testing beamer colors in tcolorbox}

\begin{myalertbox}{Alert tcolorbox}
Some text
\end{myalertbox}

\begin{alertblock}{Beamer alert box}
Some text
\end{alertblock}

\end{frame}
\end{document}

在此处输入图片描述

相关内容