Eu tenho o problema de usar um lstlisting
dentro 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:
Já vi posts tratando desse assunto como este:espaço extra vertical abaixo do ambiente lstlisting dentro de um ambiente de lista
Mas definir \parsep
como 0pt
nã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, listings
imprime aquele caractere de nova linhaliteralmente. O mesmo fenômeno ocorre com o verbatim
meio 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 lstautogobble
pacote e ativar a autogobble
chave (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 \lstinputlisting
macro. O problema de linha extra em branco ocorre apenas para listagens incorporadas (ou seja, listagens contidas em um lstlisting
ambiente). Veja a seção 4 no meu código abaixo.
Por fim, em relação ao espaçodepoisna listagem, geralmente ajusto o valor belowskip
globalmente; no seu caso, -0.5em
parece apropriado.
\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}