考虑这个例子:
\documentclass[a4paper]{article}
\usepackage{listings}
\lstnewenvironment{shell}{}{}
%\usepackage{verbatim}
%\let\shell\verbatim
%\let\endshell\endverbatim
\begin{document}
\subsubsection{Test1}
\begin{shell}
test
\end{shell}
Some text
\subsubsection{Test2}
More text, Test2 has no spacing above
\subsubsection{Test3}
Looks ok
\end{document}
当我编译这个时我得到
上面部分的空间Test2
去哪了?如果我不使用listings
,说一下注释的内容,一切就都好了。
有任何想法吗?
下面列出了版本。
article.cls 2007/10/19 v1.4h Standard LaTeX document class
size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option)
listings.sty 2013/08/26 1.5b (Carsten Heinz)
keyval.sty 1999/03/16 v1.13 key=value parser (DPC)
lstmisc.sty 2013/08/26 1.5b (Carsten Heinz)
listings.cfg 2013/08/26 1.5b listings configuration
答案1
环境lstlisting
不会\if@nobreak
在章节标题之后立即重置。不幸的是,我几年前的错误报告落入了超空间。
一个“糟糕”的修复方法是自己添加缺少的操作:
\documentclass[a4paper]{article}
\usepackage{listings,etoolbox}
\makeatletter
\newcommand{\fixspacing}{\@nobreakfalse}
\makeatother
\lstnewenvironment{shell}{}{\fixspacing}
\begin{document}
\subsubsection{Test1}
\begin{shell}
test
\end{shell}
Some text
\subsubsection{Test2}
More text, Test2 has no spacing above
\subsubsection{Test3}
Looks ok
\end{document}
不太干净的补丁是
\documentclass[a4paper]{article}
\usepackage{listings}
\makeatletter
\g@addto@macro\lst@DeInit{\@nobreakfalse}{}{}
\makeatother
\lstnewenvironment{shell}{}{}
\begin{document}
\subsubsection{Test1}
\begin{shell}
test
\end{shell}
Some text
\subsubsection{Test2}
More text, Test2 has no spacing above
\subsubsection{Test3}
Looks ok
\end{document}
不幸的是,\lstnewenvironment@
该操作更合适的命令无法修补,因此修复实际上应该在包级别。我的印象是,在应该设置为 false 的\lst@DeInit
地方调用了。但我可能错了。\if@nobreak