这是列表包错误吗?

这是列表包错误吗?

我使用 listings 包(最新版本 1.8b),但在以下情况下它无法正常工作:

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

\section{Title}
\begin{lstlisting}
lstlisting content
\end{lstlisting}
text

\section{Title}
text
\begin{lstlisting}
lstlisting content
\end{lstlisting}
text

\section{Title}
text
\end{document}

在此处输入图片描述

之前的版本没有这个问题,是bug吗?

答案1

是的,这是一个错误,而且是一个非常古老的错误。

环境lstlisting最终会执行 ,\let\if@nobreak\iffalse这是错误的,因为它是一个本地分配,而内核命令\@nobreakfalse可以完成这项工作全球

\documentclass{article}
\usepackage{listings}

\makeatletter
\let\lstlisting\relax
\let\lstlisting@\relax
\lstnewenvironment{lstlisting}[2][]{%
     \lst@TestEOLChar{#2}%
     \lstset{#1}%
     \csname\@lst @SetFirstNumber\endcsname
   }{%
     \@nobreakfalse
     \csname\@lst @SaveFirstNumber\endcsname
   }
\makeatother


\begin{document}

\section{Title}
\begin{lstlisting}
lstlisting content
\end{lstlisting}
text

\section{Title}
text
\begin{lstlisting}
lstlisting content
\end{lstlisting}
text

\section{Title}
text
\end{document}

在此处输入图片描述

答案2

如果列表是章节标题后的第一个框,这似乎与列表放置其输出的方式有关(我没有真正调查过)。您可以通过在\leavevmode后面\section和前面放置一个来解决这个问题\begin{lstlisting}

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

\section{Title}
\leavevmode
\begin{lstlisting}
lstlisting content
\end{lstlisting}
text

\section{Title}
text
\begin{lstlisting}
lstlisting content
\end{lstlisting}
text

\section{Title}
text
\end{document}

在此处输入图片描述

相关内容