我使用 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}