Проблемы с определением tcolorbox на основе цветов проектора

Проблемы с определением tcolorbox на основе цветов проектора

Я хочу объявить tcolorboxс цветами на основе текущей цветовой темы, используемой в Beamer.

Я пробовал что-то вроде

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?

решение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

Другой способ воссоздать внешний вид и ощущение блоков Beamer с помощью tcolorbox — использовать новую внутреннюю тему tcolorbox (https://www.ctan.org/pkg/beamertheme-tcolorbox).

Эта тема заменит стандартные блоки Beamer на tcolorboxes, но вы также можете использовать ее для определения своих собственных блоков:

\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}

введите описание изображения здесь

Связанный контент