Я хочу объявить 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}
который производит
Два вопроса:
- Почему эти поля показаны разными цветами?
- Знаете ли вы лучший способ использования цветов проектора в определениях 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}