У меня проблема с тем, что я использую a lstlisting
внутри an 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 внутри среды list
Но у меня настройка \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
globally; в вашем случае -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}