Как избавиться от лишней пустой строки в конце моего объявления?

Как избавиться от лишней пустой строки в конце моего объявления?

У меня проблема с тем, что я использую 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 в моем коде ниже.

Наконец, что касается пространствапослелистинг, я обычно настраиваю значение belowskipglobally; в вашем случае -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}

Связанный контент