# Define a macro for inserting a \begin \end listings block

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" }

-
You can't to that in full generality in any case. The problem is that lstlisting is a (smart) variant of verbatim and such environments can never be the argument to a command. –  egreg Nov 4 '12 at 12:11
I see. And would something like this \def\blist{\begin{lstlisting}} \def\elst{\end{lstlisting}} work? \blist TEXT TEXT \elst gives me an error on \elst –  Dwelle Nov 4 '12 at 12:57
Like verbatim, LaTeX must see an explicit \end{lstlisting} to end the job; so hiding it in a macro is not helpful. –  egreg Nov 4 '12 at 13:14
So, where's the advantage of using \blist{<long series of statements>} instead of the clearer \begin{lstlisting}...\end{lstlisting}? –  egreg Nov 4 '12 at 13:51
@DavidL: Did you know that listings provides an inline version: \lstinline, which works similar to your requested \blist. Alternatively, use \let\blist\lstinline and use \blist. –  Werner Nov 4 '12 at 15:17

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>]

-