Caption 包破坏了 center/varwidth

Caption 包破坏了 center/varwidth

我收到了精彩评论如何使列表居中:

\documentclass[a4paper]{book}
%\usepackage[hang,small,it,hypcap=true]{caption}  % screw hypcap
\usepackage[T1]{fontenc}
\usepackage{fancyvrb}
\usepackage{listings}
\lstset{
  fancyvrb=true,%
}
\usepackage{varwidth}

\lstset{
    basicstyle=\linespread{0.94}\ttfamily,%
    fancyvrb=true,%
    captionpos=b
}

\begin{document}

\begin{center}\begin{varwidth}{\linewidth}%
\begin{lstlisting}[caption={I want to be centered},label={lst:label2}]
trait Sys[S <: Sys[S]] {
  type Tx     <: stm.Txn[S]
  type Var[A] <: stm.Var[S#Tx, A]
  type ID     <: stm.Identifier[S#Tx]
  type Acc
  ...
}
\end{lstlisting}\end{varwidth}
\end{center}

\end{document}

到目前为止,一切都很好:

在此处输入图片描述

如果我添加caption包(在上面的例子中取消注释),我必须做因为很多东西都依赖于它,所以中心位置被破坏了:

在此处输入图片描述

我还发现添加showframe包也有同样的问题,所以罪魁祸首可能是centervarwidth而不是caption。如何解决这个问题?

答案1

varwidth无法处理任意内容,您会收到警告

Package varwidth Warning: Failed to reprocess entire contents

在这些情况下,环境就变成了minipage具有指定宽度的简单环境。你可以在环境外使用标题lstlisting

\documentclass[a4paper]{book}
\usepackage[T1]{fontenc}

\usepackage[
  hang,
  small,
  it,
  hypcap=true
]{caption}
\usepackage{fancyvrb}
\usepackage{listings}
\lstset{
  fancyvrb=true,
}
\usepackage{varwidth}

\lstset{
    basicstyle=\linespread{0.94}\ttfamily,
    fancyvrb=true,
    captionpos=b
}

\begin{document}

\begin{center}
\begin{varwidth}{\linewidth}
\begin{lstlisting}
trait Sys[S <: Sys[S]] {
  type Tx     <: stm.Txn[S]
  type Var[A] <: stm.Var[S#Tx, A]
  type ID     <: stm.Identifier[S#Tx]
  type Acc
  ...
}
\end{lstlisting}\end{varwidth}
\captionof{lstlisting}{I want to be centered}\label{lst:label2}
\end{center}

\end{document}

在此处输入图片描述

注意列表和标题之间可能出现的分页符。浮动会更好;figure(带\captionof{lstlisting})会很好。

答案2

这是另一个解决方案:

\documentclass[a4paper]{book}
\usepackage[T1]{fontenc}

\usepackage{caption}
\usepackage{fancyvrb}
\usepackage{listings}

\begin{document}

\begin{figure}
\centering
\lstset{xleftmargin=0.18\textwidth,xrightmargin=0.18\textwidth}
\begin{lstlisting}
trait Sys[S <: Sys[S]] {
  type Tx     <: stm.Txn[S]
  type Var[A] <: stm.Var[S#Tx, A]
  type ID     <: stm.Identifier[S#Tx]
  type Acc
  ...
}
\end{lstlisting}
\captionof{lstlisting}{Type members of the system abstraction}\label{lst:scala_system_decl}
\end{figure}

\end{document}

在此处输入图片描述

相关内容