Search code examples
latexlistings

Configure caption on listings environment using multicol (latex)


I want to make a dual column code in latex but with the caption above the two columns. Ex:

  Program 1 : some text here for the caption

1   //col 1              7    //col2
2   void main (void)     8   void foo(void)
3   {                    9   {
4      //just a test    10      int c;
5      return 0;        11      c = 0;
6   }                   12   }

I'm using listings. To accomplish the layout above, I cut in two listings inside one table. There are some problems with this approach, I have to manually divide the code and watch for the result in the PDF.

I'd like to use [multicol=2] option, but with this, the caption stack only on the first column. Does anyone now how to overcome (if possible?)

    Program 1 : some text 7    //col2
    here for the caption  8   void foo(void)
1   //col 1               9   {
2   void main (void)     10      int c;
3   {                    11      c = 0;
4      //just a test     12   }
5      return 0;         
6   }                    

Just below is the non working code

\documentclass{article}
\usepackage{listings}
\usepackage{multicol}
\begin{document}

\lstset{
   language=C,
   breaklines=true,
   prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},
}

\begin{lstlisting}[stepnumber=1,multicols=2,caption=Caption test to confirm that multicol does not like large captions]
void MudaDigito(char val)
{
   if (pos == 0)
   {
     v0 = val;
   }
   if (pos == 1)
   {
     v1 = val;
   }
   if (pos == 2)
   {
     v2 = val;
   }
   if (pos == 3)
   {
     v3 = val;
   }
}
\end{lstlisting}

\end{document}


Solution

  • i had the same problem. I found a solution. It's not clean but it works. Just below is the working code.


    \documentclass{article}
    \usepackage{listings}
    \usepackage{multicol}
    \newcommand{\listingcaption}[1]%
    {%
    \refstepcounter{lstlisting}\hfill%
    Listing \thelstlisting -- #1\hfill%\hfill%
    }%
    \begin{document}
    \lstset{
       language=C,
       breaklines=true,
       prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},
    }
    \listingcaption{Caption test to confirm that multicol does not like large captions\label{list1}}
    \begin{lstlisting}[stepnumber=1,multicols=2]
    void MudaDigito(char val)
    {
       if (pos == 0)
       {
         v0 = val;
       }
       if (pos == 1)
       {
         v1 = val;
       }
       if (pos == 2)
       {
         v2 = val;
       }
       if (pos == 3)
       {
         v3 = val;
       }
    }
    \end{lstlisting}
    See listing \ref{list1}
    \end{document}