我正在尝试在作业中获取一些控制台输出。我将其放在列表环境中,但我希望它在页面上水平居中。我唯一居中的是标题 ;-/
\begin{minipage}{1\textwidth}
\begin{center}
\begin{lstlisting}[caption={Ausgabe des C-Programms},label={ggt_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{center}
\end{minipage}
答案1
我知道一些奇怪的解决方案,包括将内容临时保存到一个框中,然后确定文本宽度。
最简单的解决方案是使用表格环境:
\begin{center}
\begin{tabular}{c}
\begin{lstlisting}[...]
...
\end{lstlisting}
\end{tabular}
\end{center}
但是,这并不能使标题居中。要使标题在列表上方正确居中,需要另一种解决方案。我们必须将标题从列表环境中移除;这可以通过图形(或另一个浮动环境)来实现。
以下是将列表和标题居中的方法:
\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}
答案2
仅当以水平模式启动时,包lstlisting
才会将内容装箱(这就是它将内容装箱的原因tabular
)。
一种解决方案是强制水平模式,但还有设置标题的额外问题,这可以借助来完成\captionof
,让 LaTeX 认为这是一个列表而不是一个图形。
为了拥有一个键值接口,我设置了一个新的接口来拦截caption
和label
,同时将每个未知选项传递给\lstset
。唯一的变化是应该将一个简短的标题指定为和的值,shortcaption
而不是
caption=[short caption]{long caption}
格式的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}