由于我不清楚的原因,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}
由于某种原因,这会产生一条围绕框的双线,但大致符合我的要求。我更喜欢使用像minted
has 这样的 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}
这将创建: