\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}
Here's the result:
Add options to BVerbatim
to have a fixed width instead of the minimum one.
Change the code into
\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
to get a new key framecolor
(default white, so no frame):
\begin{BVerbatim}[bgcolor=LightSteelBlue,framecolor=black]
abc
def
\end{BVerbatim}
Comments on the code
Let's look at the code for adding a background color (the extension for the frame color is very similar).
I add a conditional (\ifFV@bgcolor
) and a box register (\FV@bgbox
) and a key for the FV
family; when the user says bgcolor=somecolor
, the conditional will be set to true and somecolor
is stored in \FV@bgcolor
.
Then I redefine \FV@BeginVBox
which is responsible for starting the box for a BVerbatim
environment; its definition starts with
\leavevmode\hbox...
so what I do is to change it into
\leavevmode\ifFV@bgcolor\setbox\FV@bgbox=\fi\hbox...
In this way, when the conditional is true, the box will be stored in our new register, instead that typeset immediately.
Now the end part: \FV@EndVBox
usually ends with
...\hfil\egroup}
where this \egroup
closes the \hbox
construction; if the conditional is true, this wouldn't typeset the box, so I make it into
...\hfil\egroup
\ifFV@bgcolor\colorbox{\FV@bgcolor}{\box\FV@bgbox}\fi}
which will typeset the box over a suitably colored background.
Given Adobe's appalling record as a proxy for malware, I'd suggest switching your PDF viewer.
Should you decide to do this, and move to PDF XChange Viewer from Tracker Software,
then in the preferences dialogue, on the Customize[sic] UI tab, you can select the background colour you want, with or without a gradient (God forbid!).
Best Answer
For such jobs,
tcolorbox
is more suitable. The advantage here is the box is breakable across pages.In your method, you may better use
environ
package. However, this is not breakable across pages.