How to center a listing?
I know some strange solutions involving saving the content temporary to a box and then determing the text width.
The simplest solution is to use a tabular environment:
\begin{center}
\begin{tabular}{c}
\begin{lstlisting}[...]
...
\end{lstlisting}
\end{tabular}
\end{center}
However, this doesn't center the caption. Making the caption centering correctly above the listing requires another solution. We have to take the caption out of the listings environment; this is done by a figure (or another floating environment).
Here's a way to center both your listing and the caption:
\documentclass{article}
\usepackage{listings}
\renewcommand{\figurename}{Listing}
% replace figurename with the text that should preceed the caption
\begin{document}
\begin{figure}[thp] % the figure provides the caption
\centering % which should be centered
\caption{Ausgabe des C-Programms}
\begin{tabular}{c} % the tabular makes the listing as small as possible and centers it
\begin{lstlisting}[label={gtt_c_ausgabe}]
a | b | q | u | s | v | t
----------------------------------------
78 | 21 | 1 | | 1 | 1 | -1
21 | 15 | 3 | 1 | -3 | -1 | 4
15 | 6 | 1 | -3 | 4 | 4 | -5
6 | 3 | 2 | 4 | -11 | -5 | 14
3 | | 2 | -11 | 26 | 14 | -33
----------------------------------------
\end{lstlisting}
\end{tabular}
\end{figure}
\end{document}
The lstlisting
package only boxes the contents if it starts in horizontal mode (which is the reason why it boxes the contents in a tabular
).
A solution is to coerce horizontal mode, but there's the added problem of setting the caption, which can be done with the help of \captionof
, persuading LaTeX into thinking this is a listings and not a figure.
In order to have a key-value interface, I set up a new one that intercepts caption
and label
, while it passes every unknown option to \lstset
. The only change is that a short caption should be specified as a value to shortcaption
and not with the
caption=[short caption]{long caption}
format of listings
.
\documentclass{article}
\usepackage{showframe} % just for testing
\usepackage{listings,caption,xparse}
\ExplSyntaxOn
\tl_new:N \l_listings_boxed_options_tl
\keys_define:nn { listings/boxed }
{
caption .tl_set:N = \l_listings_boxed_caption_tl,
shortcaption .tl_set:N = \l_listings_boxed_shortcaption_tl,
label .tl_set:N = \l_listings_boxed_label_tl,
unknown .code:n =
\tl_put_right:NV \l_listings_boxed_options_tl \l_keys_key_tl
\tl_put_right:Nn \l_listings_boxed_options_tl { = #1 , },
}
\box_new:N \l_listings_boxed_box
\lstnewenvironment{blstlisting}[1][]
{
\keys_set:nn { listings/boxed } { #1 }
\exp_args:NV \lstset \l_listings_boxed_options_tl
\hbox_set:Nw \l_listings_boxed_box
}
{
\hbox_set_end:
\cs_set_eq:cc {c@figure} {c@lstlisting}
\tl_set_eq:NN \figurename \lstlistingname
\tl_if_empty:NF \l_listings_boxed_caption_tl
{
\tl_if_empty:NTF \l_listings_boxed_shortcaption_tl
{
\captionof{figure}{\l_listings_boxed_caption_tl}
}
{
\captionof{figure}[\l_listings_boxed_shortcaption_tl]{\l_listings_boxed_caption_tl}
}
\tl_if_empty:NF \l_listings_boxed_label_tl { \label{\l_listings_boxed_label_tl} }
}
\leavevmode\box_use:N \l_listings_boxed_box
}
\ExplSyntaxOff
\begin{document}
\begin{center}
\begin{blstlisting}[
caption=Ausgabe des C-Programms,
shortcaption=Ausgabe, % just for showing the syntax, it can be omitted
label=ggt_c_ausgabe,
basicstyle=\ttfamily, % just for testing the option is correctly passed
]
a | b | q | u | s | v | t
----------------------------------------
78 | 21 | 1 | | 1 | 1 | -1
21 | 15 | 3 | 1 | -3 | -1 | 4
15 | 6 | 1 | -3 | 4 | 4 | -5
6 | 3 | 2 | 4 | -11 | -5 | 14
3 | | 2 | -11 | 26 | 14 | -33
----------------------------------------
\end{blstlisting}
\end{center}
\end{document}