10

I want to put the caption of my listing in the center but I can't do that. Do you have any idea how I could achieve this? The code:

\documentclass{report}
\usepackage{color}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox{gray}{\parbox{\textwidth}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
function <lhs_arguments>=<function_name><rhs_arguments>
  <statements>
endfunction
\end{lstlisting}

\end{document}

migrated from stackoverflow.com Dec 26 '12 at 3:59

This question came from our site for professional and enthusiast programmers.

9

The caption format will be used internally after applying the justification & font setting, and therefore the \colorbox will be centered but not the text inside the \colorbox.

One can fix that by applying the justification setting inside the colorbox (again) using the internal command \caption@hj:

\documentclass{report}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{caption}
\makeatletter
\DeclareCaptionFormat{listing}{%
  \colorbox{gray}{%
    \parbox{\dimexpr \captionwidth-2\fboxsep}{\caption@hj #1#2#3}}}
\makeatother
\captionsetup[lstlisting]{format=listing,font={color=white}}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
function <lhs_arguments>=<function_name><rhs_arguments>
  <statements>
endfunction
\end{lstlisting}

\end{document}

(Please note that I replaced \textwidth with \captionwidth so the margin & width settings will be used here, too.)

But a more naturally way of fixing this is changing the internal code which actually draws the box around the caption, i.e. redefining \caption@parbox:

\documentclass{report}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{caption}[2007/12/23] % needs v3.1f or newer

\makeatletter
\DeclareCaptionOption{boxcolor}{%
  \renewcommand\caption@parbox[2]{%
    \colorbox{#1}{\parbox[b]{\dimexpr ##1-2\fboxsep}{##2}}}}
\makeatother
\captionsetup[lstlisting]{boxcolor=gray,font={color=white}}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
function <lhs_arguments>=<function_name><rhs_arguments>
  <statements>
endfunction
\end{lstlisting}

\end{document}

(Although both \caption@hj and \caption@parbox are not documented this will work with future versions of the caption package, too.)

When using version 3.3 of the caption package this can be realized without using internal commands at all:

\documentclass{report}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{caption}[2013/01/01] % needs v3.3 or newer
\captionsetup[lstlisting]{box=colorbox,boxcolor=gray,font={color=white}}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
function <lhs_arguments>=<function_name><rhs_arguments>
  <statements>
endfunction
\end{lstlisting}

\end{document}

Addendum 2013-01-09: Since the version 3.3 of the caption package is available now the last solution is preferable.

  • Hi Axel, In your last update you mention this should be the preferred solution, however, the caption box is not being centered in the example. Does this mean that the previous solutions is the only way? – omrsin Feb 14 '17 at 19:45
  • @omrsin The output of the three example documents should be the same. And at least it is using my (not up-to-date) TeXlive 2016. What difference exactly do you get? And what exactly do you mean by "caption box is not being centered". In my examples the caption box spans the whole textwidth. – Axel Sommerfeldt Feb 15 '17 at 9:10
  • Yes, your are right. I was also having another problem in my code, that is why it looked different in y case. I was also using xleft/rightmargin and realized that there are some conflicts between the captions and listing packages. – omrsin Feb 15 '17 at 9:55
5

Use the following:

\DeclareCaptionFormat{listing}
  {\colorbox{gray}
     {\parbox{\dimexpr\textwidth-2\fboxsep}{\centering #1#2#3}}}

This not only centres the caption, but ensures that the width of the caption "box" fits exactly within the text block width.

enter image description here

\documentclass{report}
\usepackage{xcolor,listings,caption}% http://ctan.org/pkg/{xcolor,listings,caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}
  {\colorbox{gray}
     {\parbox{\dimexpr\textwidth-2\fboxsep}{\centering #1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
function <lhs_arguments>=<function_name><rhs_arguments>
  <statements>
endfunction
\end{lstlisting}

\end{document}
  • 1
    This solution will not only change "short" captions to be centered, but "long" captions (which does not fit into a single line), too. – Axel Sommerfeldt Dec 26 '12 at 11:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy