the same is possible with the listing environment
\documentclass{article}
\usepackage{fancyvrb,caption,floatrow}
\DeclareNewFloatType{example}{placement=t,%within=section,
fileext=exa,name=Example}
\captionsetup[example]{font=sf,labelfont=bf,skip=\smallskipamount}
\newenvironment{Example}[2]
{\VerbatimEnvironment
\captionof{example}{#2}\ifx\relax#1\relax\else\label{#1}\fi%
\begin{Verbatim}[numbers=left,fontsize=\scriptsize, stepnumber=3,
frame=lines,framerule=0.4mm]}
{\end{Verbatim}}
\begin{document}
\begin{Example}{TheLabel}{The caption}
foo
bar
\end{Example}
\begin{Example}{}{Another caption}
foo
bar
baz
\end{Example}
See Example~\ref{TheLabel}
\end{document}
\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.
Best Answer
You can use
tcolorbox
withlistings
package seemlessly. There by one can combine the advantages and features of both. Here is an example.