有没有一种简单的方法可以让 beamer 中的环境主体block
周围有一个框架,而不是背景颜色?我尝试将一个放在\fbox
块内,但它只是从幻灯片的侧面划掉了...我尝试将 fbox 放在块环境之外,但看起来非常丑陋。
理想情况下,我希望通过定义一个 beamer 模板\setbeamertemplate{blocks}{framed}
或类似的东西来实现这一点。这样,列内的颜色主题和块就可以很好地工作。
我查了一下的定义beamercolorbox
,但它并不漂亮......
答案1
经过一番认真的整理,beamerbaseboxes.aux
我终于得到了以下[framed]
用于 beamer 框的模板。为了更容易理解,我将代码分成几个块,并在其中添加一些注释。您可能希望将一些部分移动到 .sty 文件中。
一切都始于
\documentclass{beamer}
接下来,我从中取出代码\beamerboxesrounded
,删除阴影部分,稍微更改了绘图命令并更改了一些\vskip
s。首先,这会设置一些颜色。然后它在小页面中设置标题(保存到框中)。然后它在标题周围绘制。最后,它为主要内容启动一个小页面。其余代码将所有内容粘合在一起。
\makeatletter
\newcommand\beamerboxesframed[2][]{%
\global\let\beamer@firstlineitemizeunskip=\relax%
\vbox\bgroup%
\setkeys{beamerboxes}{upper=block title,lower=block body,width=\textwidth}%
\setkeys{beamerboxes}{#1}%
{%
\usebeamercolor{\bmb@lower}%
\globalcolorstrue%
\colorlet{lower.bg}{bg}%
}%
{%
\usebeamercolor{\bmb@upper}%
\globalcolorstrue%
\colorlet{upper.bg}{bg}%
}%
%
% Typeset head
%
\vskip4bp
\setbox\bmb@box=\hbox{%
\begin{minipage}[b]{\bmb@width}%
\usebeamercolor[fg]{\bmb@upper}%
#2%
\end{minipage}}%
\ifdim\wd\bmb@box=0pt%
\setbox\bmb@box=\hbox{}%
\ht\bmb@box=0pt%
\bmb@prevheight=-4.5pt%
\else%
\wd\bmb@box=\bmb@width%
\bmb@temp=\dp\bmb@box%
\ifdim\bmb@temp<1.5pt%
\bmb@temp=1.5pt%
\fi%
\setbox\bmb@box=\hbox{\raise\bmb@temp\hbox{\box\bmb@box}}%
\dp\bmb@box=0pt%
\bmb@prevheight=\ht\bmb@box%
\fi%
\bmb@temp=\bmb@width%
\bmb@dima=\bmb@temp\advance\bmb@dima by2.2bp%
\bmb@dimb=\bmb@temp\advance\bmb@dimb by4bp%
\hbox{%
\begin{pgfpicture}{0bp}{+-\ht\bmb@box}{0bp}{+-\ht\bmb@box}
\ifdim\wd\bmb@box=0pt%
\color{lower.bg}%
\else%
\color{upper.bg}%
\fi%
\pgfpathqmoveto{-4bp}{-1bp}
\pgfpathqcurveto{-4bp}{1.2bp}{-2.2bp}{3bp}{0bp}{3bp}
\pgfpathlineto{\pgfpoint{\bmb@temp}{3bp}}
\pgfpathcurveto%
{\pgfpoint{\bmb@dima}{3bp}}%
{\pgfpoint{\bmb@dimb}{1.2bp}}%
{\pgfpoint{\bmb@dimb}{-1bp}}%
\bmb@dima=-\ht\bmb@box%
\advance\bmb@dima by-2pt%
\pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}}
\pgfpathlineto{\pgfpoint{-4bp}{\bmb@dima}}
\pgfpathclose
\pgfsetstrokecolor{black}\pgfusepath{stroke, fill}
\end{pgfpicture}%
\copy\bmb@box%
}%
\nointerlineskip%
\ifdim\wd\bmb@box=0pt
\else
\vskip2.4pt%
\fi%
\nointerlineskip%
\setbox\bmb@colorbox=\hbox{{\pgfpicturetrue\pgfsetcolor{lower.bg}}}%
\setbox\bmb@box=\hbox\bgroup\begin{minipage}[b]{\bmb@width}%
\vskip2pt%
\usebeamercolor[fg]{\bmb@lower}%
\colorlet{beamerstructure}{upper.bg}%
\colorlet{structure}{upper.bg}%
%\color{.}%
}
end 命令结束\minipage
内容并在其周围画一条线(不在顶部画)。我再次删除了阴影的所有代码并稍微更改了绘图代码。
\def\endbeamerboxesframed{%
\end{minipage}\egroup%
\wd\bmb@box=\bmb@width%
\bmb@temp=\dp\bmb@box%
\advance\bmb@temp by.5pt%
\setbox\bmb@box=\hbox{\raise\bmb@temp\hbox{\box\bmb@box}}%
\dp\bmb@box=0pt%
\bmb@temp=\wd\bmb@box%
\bmb@dima=\bmb@temp\advance\bmb@dima by2.2bp%
\bmb@dimb=\bmb@temp\advance\bmb@dimb by4bp%
\hbox{%
\begin{pgfpicture}{0bp}{0bp}{0bp}{0bp}
\unhbox\bmb@colorbox%
\pgfpathmoveto{\pgfpoint{-4bp}{\ht\bmb@box}}
\pgfpathlineto{\pgfpoint{-4bp}{1bp}}
\pgfpathqcurveto{-4bp}{-1.2bp}{-2.2bp}{-3bp}{0bp}{-3bp}
\pgfpathlineto{\pgfpoint{\the\bmb@temp}{-3bp}}
\pgfpathcurveto%
{\pgfpoint{\the\bmb@dima}{-3bp}}%
{\pgfpoint{\the\bmb@dimb}{-1.2bp}}%
{\pgfpoint{\the\bmb@dimb}{1bp}}%
{
\bmb@dima=\ht\bmb@box%
\pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}}
\pgfsetstrokecolor{black}\pgfusepath{stroke, fill}
}
\end{pgfpicture}%
\box\bmb@box%
}%
\vskip2bp%
\egroup% of \vbox\bgroup
}
\makeatother
定义了执行实际绘图工作的命令后,我们需要设置模板。以下代码几乎逐字逐句地来自beamerbaseauxtemplates.sty
,只是更改rounded
为framed
并删除shadow=false
。如果您愿意,还可以删除\vskip\smallskipamount
(因为框更轻,它们可能可以放得更近一些)
\defbeamertemplateparent{blocks}[framed]{block begin,block end,%
block alerted begin,block alerted end,%
block example begin,block example end}[1][]
{[#1]}
\defbeamertemplate{block begin}{framed}[1][]
{
\par\vskip\medskipamount%
\begin{beamerboxesframed}[upper=block title,lower=block body,#1]%
{\raggedright\usebeamerfont*{block title}\insertblocktitle}%
\raggedright%
\usebeamerfont{block body}%
}
\defbeamertemplate{block end}{framed}[1][]
{\end{beamerboxesframed}\vskip\smallskipamount}
\defbeamertemplate{block alerted begin}{framed}[1][]
{
\par\vskip\medskipamount%
\begin{beamerboxesframed}[upper=block title alerted,lower=block body alerted,#1]%
{\raggedright\usebeamerfont*{block title alerted}\insertblocktitle}%
\raggedright%
\usebeamerfont{block body alerted}%
}%
\defbeamertemplate{block alerted end}{framed}[1][]
{\end{beamerboxesframed}\vskip\smallskipamount}
\defbeamertemplate{block example begin}{framed}[1][]
{
\par\vskip\medskipamount%
\begin{beamerboxesframed}[upper=block title example,lower=block body example,#1]
{\raggedright\usebeamerfont*{block title example}\insertblocktitle}%
\raggedright%
\usebeamerfont{block body alerted}%
}%
\defbeamertemplate{block example end}{framed}[1][]
{\end{beamerboxesframed}\vskip\smallskipamount}
现在我们只需要选择模板
\setbeamertemplate{blocks}[framed]
您可能需要更改一些样式(取决于您的主题,默认样式可能看起来不错)。以下是我用于示例图像的样式。
\setbeamercolor{block title}{fg=black,bg=gray!40}
\setbeamercolor{block body}{fg=black,bg=gray!10}
\setbeamercolor{block title alerted}{fg=red,bg=gray!40}
\setbeamercolor{block title example}{fg=black,bg=green!20}
\setbeamercolor{block body example}{fg=black,bg=green!5}
\setbeamerfont{block title}{series=\bfseries}
一个例子:
\begin{document}
\begin{frame}
\begin{block}{title}
test
a second line
\end{block}
\begin{block}{}
test without title
\end{block}
\begin{alertblock}{title}
test
\end{alertblock}
\begin{Example}
test
\end{Example}
\end{frame}
\end{document}
答案2
摘自 CTAN 列表公告(2011 年 12 月)
彩色盒子为带有标题行的彩色和框架文本框提供环境。可选地,可以将这样的框分成上部和下部。包 tcolorbox 可用于设置 LaTeX 示例,其中框的一部分显示源代码,另一部分显示输出。另一个常见用例是设置定理。该包支持保存和重用源代码和文本部分。
接下来是使用 beamer 内部的示例
\documentclass{beamer}
\usepackage[listings,theorems]{tcolorbox}
\begin{document}
\begin{frame}[fragile]
\begin{tcolorbox}[colback=blue!5,colframe=blue!75!black,title=My title]
My box with my title.
\end{tcolorbox}
\begin{tcblisting}{colback=red!5,colframe=red!75!black}
\begin{tcolorbox}[colback=blue!5,colframe=blue!75!black,title=My title]
My box with my title.
\end{tcolorbox}
\end{tcblisting}
\end{frame}
\end{document}
更新:
我玩得更多一些tcolorbox
,也读过手动的,所以我发现可以使用TiKZ .styles.
这种方式很容易创建参数组(选项)并重用它们。下一个代码尝试重现 Caramdir 的示例。
\documentclass{beamer}
\usepackage{tcolorbox}
% These options will be applied to all `tcolorboxes`
\tcbset{%
noparskip,
colback=gray!10, %background color of the box
colframe=gray!40, %color of frame and title background
coltext=black, %color of body text
coltitle=black, %color of title text
fonttitle=\bfseries,
alerted/.style={coltitle=red,
colframe=gray!40},
example/.style={coltitle=black,
colframe=green!20,
colback=green!5},
}
\begin{document}
\begin{frame}
\begin{tcolorbox}[title=title]
test
a second line
\end{tcolorbox}
\begin{tcolorbox}
test without title.
\end{tcolorbox}
\begin{tcolorbox}[alerted,title=title]
test
\end{tcolorbox}
\begin{tcolorbox}[example,title=Example]
test
\end{tcolorbox}
\end{frame}
\end{document}
结果如下图所示。使用 Caramdir 的解决方案,框架边框始终为黑色,并且与标题背景颜色不同。tcolorbox
框架边框和标题背景使用相同的颜色。我认为skins
库(参见手册)可以解决这个问题(?)。
答案3
我借鉴了@Caramdir 和@Ignasi 的想法和答案,用 创建了一个块模板tcolorbox
。将以下代码添加到您的 beamer 主题文件(例如beamerthemeFramedBoxes.sty
):
\usepackage{tcolorbox}
\defbeamertemplateparent{blocks}[framed]{block begin,block end}[1][]
{[#1]}
\defbeamertemplate{block begin}{framed}[1][]
{
\begin{tcolorbox}[%
colback=white,%
colframe=gray, arc=0mm]%
{\vskip\smallskipamount%
\raggedright\usebeamerfont*{block title}%
\usebeamercolor[fg]{title}\insertblocktitle}%
\vskip\smallskipamount%
\raggedright%
\usebeamerfont{block body}%
}
\defbeamertemplate{block end}{framed}[1][] {\end{tcolorbox}}
\setbeamertemplate{blocks}[framed]
这将创建一个具有框架边框的块模板framed
。它不会创建警报和示例块模板,也不会使用 beamer 的背景颜色,也不会正确设置标题。但如果真的需要,所有这些都可以轻松实现。
答案4
您可以使用新的 tcolorbox 内部主题(https://www.ctan.org/pkg/beamertheme-tcolorbox) 作为起点并为其添加边界线:
\documentclass{beamer}
\usetheme{Warsaw}
\useinnertheme{tcolorbox}
\makeatletter
\tcbset{
boxrule=1pt,
borderline={1.5pt}{0pt}{beamer@tcb@titlebg},
}
\makeatother
\begin{document}
\begin{frame}
\begin{block}{title}
content...
\end{block}
\end{frame}
\end{document}