Como faço para me livrar da linha extra em branco no final da minha listagem?

Como faço para me livrar da linha extra em branco no final da minha listagem?

Eu tenho o problema de usar um lstlistingdentro de um arquivo itemize. Isso leva ao problema de uma linha extra no meu bloco de código-fonte que não consigo excluir. Já tentei quase todos os parâmetros que afetam o espaçamento, mas nada funcionou. Este é o meu programa:

\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}

o que me produz a seguinte saída:

insira a descrição da imagem aqui

Já vi posts tratando desse assunto como este:espaço extra vertical abaixo do ambiente lstlisting dentro de um ambiente de lista Mas definir \parsepcomo 0ptnão funcionou para mim.

Eu também tentei

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

como sugerido em outro post, mas estou com um problema com meu porta-retratos.

Responder1

A linha em branco no final do seu código é causada pelo caractere de nova linha bem no final da sua listagem incorporada, ou seja, no final da linha

#include <iostream>

Porque \end{lstlisting}ainda não foi detectado, listingsimprime aquele caractere de nova linhaliteralmente. O mesmo fenômeno ocorre com o verbatimmeio ambiente; veja a "nota lateral" emesta resposta.

Essa linha em branco desaparecerá se você remover o caractere de nova linha em questão, escrevendo

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

em vez de

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

Veja a seção 2 no meu código abaixo.

Alternativamente, se você carregar o lstautogobblepacote e ativar a autogobblechave (o que é desejável aqui, para evitar muito recuo na saída), aquela linha extra em branco desaparecerá; veja a seção 3 no meu código abaixo.

Além disso, observe que nenhuma contramedida é necessária para listagens independentes, ou seja, listagens que residem em arquivos de origem externos e são inseridas no seu documento por meio da \lstinputlistingmacro. O problema de linha extra em branco ocorre apenas para listagens incorporadas (ou seja, listagens contidas em um lstlistingambiente). Veja a seção 4 no meu código abaixo.

Por fim, em relação ao espaçodepoisna listagem, geralmente ajusto o valor belowskipglobalmente; no seu caso, -0.5emparece apropriado.

insira a descrição da imagem aqui

\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}

informação relacionada