我遇到一个问题,我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}