Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I'm trying to define a environment for code listings wrapped in a shadowbox and centered in the line. Using this code, I can generate the kind of output that I want:

\documentclass[twocolumn]{article}
\usepackage{listings}
\usepackage{fancybox}
\usepackage{lipsum}
\begin{document}
\lipsum[4]
\begin{center}
  \shadowbox{%
    \begin{lstlisting}[gobble=6]
      line of code
      line of code
    \end{lstlisting}%
  }
\end{center}
\lipsum[4]
\end{document}

This produces output like this:

code listing in a shadowbox in a center environment

My problem arises when trying to abstract this into an environment. I've seen the some related questions:

  • How to center a listing? The answer in this question suggests using tabular environment to center the listing, which works, but in the present case, the shadowbox serves the same purpose (being just big enough to hold the listing).
  • How to center a lstlisting In this question the tabular technique doesn't work, but the answer shows how to save the contents of the listing in an Sbox (from fancybox) and set it in a parbox in a centerline.
  • adjustbox and lstnewenvironment This question actually involves creating frames around listings, and seems to be the most relevant to my question. The answer depends on adjustbox, which supports a simple frame, but not the shadowbox from fancybox.
  • Why does pdfLaTeX fail when I try to use `begin{lstlisting}` inside a user-defined environment? The answer here points out that it's tough to define environments in which verbatim-like environments will appear, and so it's best to use lstnewenvironment.

Based on these approaches, I've gotten as far as unsuccessfully trying to use lstnewenvironment. Just trying to get a centered listing, as below, fails (error message follows):

\documentclass[twocolumn]{article}

\usepackage{listings}
\usepackage{fancybox}
\usepackage{lipsum}
\usepackage{adjustbox}

\lstnewenvironment{CenteredShadowboxListing}[1][]{%
  \begin{center}%
    \lstset{#1}%
  }{%
  \end{center}%
}

\begin{document}
\lipsum[4]
\begin{CenteredShadowboxListing}[gobble=2]
  line of code
  line of code
\end{CenteredShadowboxListing}
\lipsum[4]
\end{document}

This fails with the error:

! File ended while scanning use of \lst@BOLGobble@.
<inserted text> 
                \par 
<*> mwe.tex

How can I define an environment that includes a code listing, puts a shadowbox around it, and centers the box?

share|improve this question
add comment

1 Answer

up vote 4 down vote accepted

Here is a proposal using tcolorbox. Colors, shadows, etc. can be adjusted to your liking. You may replace style=tcblatex by any listings setting you want to have as default for your environment.

\documentclass[twocolumn]{article}

\usepackage{lipsum}
\usepackage[most]{tcolorbox}    

\newenvironment{CenteredShadowboxListing}[1][]{%
  \tcbset{listing options={style=tcblatex,#1}}\tcbwritetemp}%
  {\endtcbwritetemp%
  \tcbox[enhanced,arc=0pt,outer arc=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
  boxrule=0.6pt,drop fuzzy shadow,before=\begin{center},after=\end{center}]%
  {\tcbusetemplisting}}

\begin{document}
\lipsum[4]
\begin{CenteredShadowboxListing}
line of code
line of code
\end{CenteredShadowboxListing}
\lipsum[4]
\end{document}

enter image description here

UPDATE: With tcolorbox version 2.41 of 2013/07/23, the code to typset the example above can be written more compact with the same result:

\documentclass[twocolumn]{article}

\usepackage{lipsum}
\usepackage[most]{tcolorbox}% version 2.41 or newer

\newtcblisting{CenteredShadowboxListing}[1][]{%
  listing options={style=tcblatex,#1},hbox,listing only,
  enhanced,arc=0pt,outer arc=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
  boxrule=0.6pt,drop fuzzy shadow,before=\begin{center},after=\end{center}}

\begin{document}
\lipsum[4]
\begin{CenteredShadowboxListing}
line of code
line of code
\end{CenteredShadowboxListing}
\lipsum[4]
\end{document}
share|improve this answer
    
This is very nice. I haven't used tcolorbox before, so it's a nice addition to the toolbox. It seems similar to fancybox's Sbox/TheSbox, and to adjustbox that works with a bgroup/egroup pair. The answer stands on its own and doesn't really need to be updated, but do you have any reference for why tcolorbox's box can hold a listing while the other package's boxes fail? –  Joshua Taylor Jul 18 '13 at 20:29
    
Actually, while I like the look of the result, I'm having both some trouble understanding it, and getting it to work. What version of tcolorbox are you using? I'm using the version from TeXLive 2012, and most is an unknown option for tcolorbox. If I remove the most option, then I get the error that ! Undefined control sequence. <argument> \tcbusetemplisting. Finally, I don't see where in the code you provided that the listings package is getting used. Is the code you posted a complete working example? –  Joshua Taylor Jul 18 '13 at 20:46
    
The tcolorbox manual explains that \tcbusetemplisting sets the content written to the temporary file tcbwritetemp as a listing. To use this, the example also needs \tcbuselibrary{listings}. The manual also shows that most is a library shorthand for loading all the libraries except documentation. Even so, when I remove the most package option and instead to \tcbuselibrary{most}, I get the error "Package pgfkeys Error: I do not know the key '/tcb/library/most' and I am going to ignore it." –  Joshua Taylor Jul 18 '13 at 21:06
    
Of course, reading through the manual and poking in the source, I see that you're the author, so you probably know all this, some of these comments are for anyone else who comes along and finds this answer. Is the trick just that I need a later version of tcolorbox? –  Joshua Taylor Jul 18 '13 at 21:06
    
@JoshuaTaylor: Sun is rising up in Europe and I see that you were busy while I was asleep ;-) First of all, the given proposal is a complete working example. But you need a recent version of tcolorbox; at least v2.31. The current one is v2.40 which I recommend, see How do I update my TeX distribution?. Updating will remove all problems. –  Thomas F. Sturm Jul 19 '13 at 6:09
show 3 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.