我可以在投影机中使用框架块吗?

我可以在投影机中使用框架块吗?

有没有一种简单的方法可以让 beamer 中的环境主体block周围有一个框架,而不是背景颜色?我尝试将一个放在\fbox块内,但它只是从幻灯片的侧面划掉了...我尝试将 fbox 放在块环境之外,但看起来非常丑陋。

理想情况下,我希望通过定义一个 beamer 模板\setbeamertemplate{blocks}{framed}或类似的东西来实现这一点。这样,列内的颜色主题和块就可以很好地工作。

我查了一下的定义beamercolorbox,但它并不漂亮......

答案1

经过一番认真的整理,beamerbaseboxes.aux我终于得到了以下[framed]用于 beamer 框的模板。为了更容易理解,我将代码分成几个块,并在其中添加一些注释。您可能希望将一些部分移动到 .sty 文件中。

一切都始于

\documentclass{beamer}

接下来,我从中取出代码\beamerboxesrounded,删除阴影部分,稍微更改了绘图命令并更改了一些\vskips。首先,这会设置一些颜色。然后它在小页面中设置标题(保存到框中)。然后它在标题周围绘制。最后,它为主要内容启动一个小页面。其余代码将所有内容粘合在一起。

\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,只是更改roundedframed并删除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}

在此处输入图片描述

相关内容