[Tex/LaTex] Define a macro for inserting a \begin \end listings block

listingsmacros

Can you define a macro that would take a listings code as a parameter and insert it inside a \begin{lstlistings} \end{lstlistings} block?

My idea is something like this:

\def\blist#1{\begin{lstlisting} #1 \end{lstlisting}}

so I could just write

\blist{ "this code is inside listings block" }

Best Answer

At first an input such as

\blist{<statement>
  <statement>
  <statement>
  <statement>}

can seem more appealing than

\begin{lstlisting}[<options>]
<statement>
<statement>
<statement>
<statement>
\end{lstlisting}

but eventually it doesn't reveal such. For one thing: \end{lstlisting} is much more evident in the input than a single brace.

Besides, there are technical reasons why the "macro with argument" is difficult to implement for lstlisting: this environment is pretty much like verbatim (but does more complicated things) and so it can't go inside the argument to another command, if you want that it treats correctly all the characters which are special to LaTeX (braces, #, $ and %, in particular).

A good text editor can help, but also listings features: if you want to give particular options for typesetting chunks of code, you can define a new environment:

\lstnewenvironment{blist}[1][]
  {\lstset{<common options>,#1}}
  {}

and then

\begin{blist}
<statement>
<statement>
<statement>
<statement>
\end{blist}

will be typeset applying the <common options>. Not very harder to type and good for marking your input and making it easy to find the chunks of code that use that common setting. You can also add "local options" by saying

\begin{blist}[<local options>]