fancyvrb 的背景颜色

fancyvrb 的背景颜色

由于我不清楚的原因,fancyvrb 没有背景选项。但是,它所基于的 minted 包有一个,这意味着添加它应该不太难。

相关代码minted.sty可能是

\newenvironment{minted@colorbg}[1]{
  \def\minted@bgcol{#1}
  \noindent
  \begin{lrbox}{\minted@bgbox}
  \begin{minipage}{\linewidth-2\fboxsep}}
 {\end{minipage}
  \end{lrbox}%
  \colorbox{\minted@bgcol}{\usebox{\minted@bgbox}}}

我对这段代码的作用只有一个粗略的想法,但我认为它正在定义选项bgcolor

两个都如何改变 \framebox 的背景颜色?, 和Verbatim 中的背景颜色看起来相关,但不要回答这个问题,至少不要按照我希望的方式。

我还发现http://groups.google.com/group/latexusersgroup/browse_thread/thread/c8c2e5dd1e9ff5cf,其代码如下

\documentclass{report}
\usepackage{fancybox, fancyvrb, calc}
\usepackage[svgnames]{xcolor}

\newenvironment{colframe}{%
  \begin{Sbox}
    \begin{minipage}
      {\columnwidth-\leftmargin-\rightmargin-2\fboxsep-2\fboxrule-4pt}
    }{%
    \end{minipage}
  \end{Sbox}
  \begin{center}
    \fcolorbox{black}{LightSteelBlue}{\TheSbox}
  \end{center}
}

\begin{document}  
  \begin{colframe}
    \begin{Verbatim}[frame=single]
      auto eth0
    \end{Verbatim}
  \end{colframe}
\end{document}

由于某种原因,这会产生一条围绕框的双线,但大致符合我的要求。我更喜欢使用像mintedhas 这样的 bgcolor 选项,这样就可以执行类似以下代码的操作。我花了一些时间摆弄它,但很快意识到我不知道自己在做什么。也许有一天我会学会如何用 LaTeX 编程,但可能不会是今天。谢谢。

\documentclass{article}
\usepackage{xcolor}
\definecolor{bg}{rgb}{0.95, 0.95, 0.95}
\usepackage{minted} % syntax coloring.
\newminted{c}{frame=single, bgcolor=bg}
\begin{document}
\begin{ccode*}{}
for(int i=0; i< 5; i++)
    x[i];
\end{ccode*}
\end{document}

答案1

\documentclass[border=2]{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{fancyvrb}


\makeatletter
\newif\ifFV@bgcolor
\newbox\FV@bgbox
\define@key{FV}{bgcolor}{\FV@bgcolortrue\def\FV@bgcolor{#1}}

\def\FV@BeginVBox{%
  \leavevmode\ifFV@bgcolor\setbox\FV@bgbox=\fi
  \hbox\ifx\FV@boxwidth\relax\else to\FV@boxwidth\fi\bgroup
  \ifcase\FV@baseline\vbox\or\vtop\or$\vcenter\fi\bgroup}
\def\FV@EndVBox{\egroup\ifmmode$\fi\hfil\egroup
  \ifFV@bgcolor\colorbox{\FV@bgcolor}{\box\FV@bgbox}\fi}
\makeatother

\begin{document}
\begin{BVerbatim}[bgcolor=LightSteelBlue]
abc
def
\end{BVerbatim}
\end{document}

结果如下:

在此处输入图片描述

添加选项以BVerbatim获得固定宽度而不是最小宽度。

将代码改为

\makeatletter
\newif\ifFV@bgcolor
\newbox\FV@bgbox
\define@key{FV}{bgcolor}{\FV@bgcolortrue\def\FV@bgcolor{#1}}
\define@key{FV}{framecolor}{\FV@bgcolortrue\def\FV@framecolor{#1}}
\def\FV@framecolor{white}

\def\FV@BeginVBox{%
  \leavevmode\ifFV@bgcolor\setbox\FV@bgbox=\fi
  \hbox\ifx\FV@boxwidth\relax\else to\FV@boxwidth\fi\bgroup
  \ifcase\FV@baseline\vbox\or\vtop\or$\vcenter\fi\bgroup}
\def\FV@EndVBox{\egroup\ifmmode$\fi\hfil\egroup
  \ifFV@bgcolor\fcolorbox{\FV@framecolor}{\FV@bgcolor}{\box\FV@bgbox}\fi}
\makeatother

获取新键framecolor(默认白色,因此没有框架):

\begin{BVerbatim}[bgcolor=LightSteelBlue,framecolor=black]
abc
def
\end{BVerbatim}

代码注释

让我们看一下添加背景颜色的代码(框架颜色的扩展非常相似)。

我为家庭添加了一个条件(\ifFV@bgcolor)和一个盒子寄存器(\FV@bgbox)以及一个密钥FV;当用户说时bgcolor=somecolor,条件将设置为真并somecolor存储在中\FV@bgcolor

然后我重新定义\FV@BeginVBox负责启动BVerbatim环境的框;它的定义以

\leavevmode\hbox...

所以我要做的就是把它改成

\leavevmode\ifFV@bgcolor\setbox\FV@bgbox=\fi\hbox...

这样,当条件为真时,框就会存储在我们的新寄存器中,而不是立即排版。

现在结束部分:\FV@EndVBox通常以

...\hfil\egroup}

这里\egroup关闭了\hbox构造;如果条件为真,则不会排版框,因此我将其改为

...\hfil\egroup
\ifFV@bgcolor\colorbox{\FV@bgcolor}{\box\FV@bgbox}\fi}

它将把框排版到适当颜色的背景上。

答案2

这不是对你的问题的完整回答,只是一种摆脱双框架的方法。要摆脱“内部”框架,只需删除环境[frame=single]的可选参数Verbatim,即使用

\begin{Verbatim}

代替

\begin{Verbatim}[frame=single]

要摆脱“外部”框架,\fcolorbox只需替换为\colorbox

\colorbox{LightSteelBlue}{\TheSbox}

在这种情况下,您还应该更改小页面宽度的计算,因为您不需要减去框架的厚度。没有双框架的完整代码将如下所示:

\documentclass{report}
\usepackage{fancybox, fancyvrb, calc}
\usepackage[svgnames]{xcolor}

\newenvironment{colframe}{%
  \begin{Sbox}
    \begin{minipage}
      {\columnwidth-\leftmargin-\rightmargin-4pt}
    }{%
    \end{minipage}
  \end{Sbox}
  \begin{center}
    \colorbox{LightSteelBlue}{\TheSbox}
  \end{center}
}

\begin{document}  
  \begin{colframe}
    \begin{Verbatim}
      auto eth0
    \end{Verbatim}
  \end{colframe}
\end{document}

这将创建:

逐字周围的彩色框

相关内容