我如何删除列表末尾的多余空白行?

我如何删除列表末尾的多余空白行?

我遇到一个问题,我lstlisting在 里面使用了itemize。这导致我的源代码块中多出一行,我无法删除。我已经尝试了几乎所有影响间距的参数,但都不起作用。这是我的程序:

\documentclass[a4paper]{scrartcl}
\usepackage[usenames,dvipsnames,table]{xcolor}
\usepackage[latin1]{inputenc}
\usepackage[ngerman,english]{babel}

\usepackage{listings}
\lstset{language=[Visual]{C++},
keepspaces=true,
tabsize=2,
xrightmargin=\parindent,
basicstyle=\ttfamily,
frame=single,
framesep=1mm,
framerule=0pt,
columns=fullflexible,
backgroundcolor=\color[gray]{0.9}}

\begin{document}
There are two kinds of header files:
\begin{itemize}
  \item content
  \begin{lstlisting}[belowskip=-\baselineskip]
  #include <iostream>
  \end{lstlisting}
  \item more content.
\end{itemize}
\end{document}

输出结果如下:

在此处输入图片描述

我已经看到过一些与此主题相关的帖子,例如:列表环境内 lstlisting 环境下方的垂直额外空间 但设置对我\parsep来说0pt不起作用。

我也试过

\begin{lstlisting}[belowskip=-\baselineskip]
#include <iostream>
\end{lstlisting}

就像另一篇文章所建议的那样,但我的框架遇到了问题。

答案1

代码末尾的空白行是由嵌入列表最末尾的换行符引起的,即在行的末尾

#include <iostream>

因为\end{lstlisting}还没有检测到,listings所以打印换行符逐字。同样的现象也发生在verbatim环境中;请参阅这个答案

如果你删除有问题的换行符,该空白行就会消失,方法是:

\begin{lstlisting}
#include <iostream>\end{lstlisting}

代替

\begin{lstlisting}
#include <iostream>
\end{lstlisting}

请参阅下面我的代码中的第 2 部分。

或者,如果您加载lstautogobble包并激活autogobble密钥(这是可取的,以防止输出中出现过多的缩进),那么额外的空白行就会消失;请参阅下面代码中的第 3 节。

另请注意,独立列表不需要任何对策,即驻留在外部源文件中并通过宏插入到文档中的列表\lstinputlisting。额外的空白行问题仅发生在嵌入式列表(即包含在环境中的列表lstlisting)中。请参阅下面我的代码中的第 4 节。

最后,关于空间列表中,我通常会全局调整值belowskip;在您的情况下,-0.5em似乎是合适的。

在此处输入图片描述

\documentclass[a4paper]{scrartcl}

\usepackage[usenames,dvipsnames,table]{xcolor}
\usepackage[latin1]{inputenc}
\usepackage[ngerman,english]{babel}

\usepackage{listings}
\usepackage{lstautogobble}
\lstset
{
  language        = [Visual]{C++},
  keepspaces      = true,
  tabsize         = 2,
  xrightmargin    = \parindent,
  basicstyle      = \ttfamily,
  frame           = single,
  framesep        = 1mm,
  framerule       = 0pt,
  columns         = fullflexible,
  belowskip       = -0.5em,
  backgroundcolor = \color[gray]{0.9},
}

\usepackage{filecontents}
\begin{filecontents*}{sample.c}
#include <iostream>
\end{filecontents*}


\begin{document}

\section{Your listing}
There are two kinds of header files:
\begin{itemize}
  \item content
  \begin{lstlisting}
  #include <iostream>
  \end{lstlisting}
  \item more content.
\end{itemize}

\section{Your listing without the newline at the end}
There are two kinds of header files:
\begin{itemize}
  \item content
  \begin{lstlisting}
  #include <iostream>\end{lstlisting}
  \item more content.
\end{itemize}

\section{Your listing with \texttt{autogobble}}
There are two kinds of header files:
\begin{itemize}
  \item content
  \begin{lstlisting}[autogobble]
  #include <iostream>
  \end{lstlisting}
  \item more content.
\end{itemize}

\section{Your listing inserted from an external file}
There are two kinds of header files:
\begin{itemize}
  \item content
    \lstinputlisting{sample.c}
  \item more content.
\end{itemize}

\end{document}

相关内容