Colocar uma listagem em uma minipágina quebra as configurações do xleftmargin

Colocar uma listagem em uma minipágina quebra as configurações do xleftmargin

Quero exibir uma listagem em uma caixa cinza com algum espaço nas laterais.
Eu configurei \lstsetdo jeito que gosto:

\lstset{basicstyle=\ttfamily,keywordstyle=\bfseries
,commentstyle=\itshape\color{green},
xleftmargin=\parindent,  <<--- minipage breaks this setting.
backgroundcolor=\color{light-gray},
framexleftmargin=\parindent,
framextopmargin=6pt,
framexbottommargin=6pt, 
frame=tb, framerule=0pt}

Não quero quebras de página em listagens curtas. Eu corrijo isso usando uma minipágina. No entanto, isso quebra minhas configurações de margem.

\documentclass[]{article}
\usepackage{float}
\usepackage{listings} 
\usepackage{color}
\usepackage[margin=1in]{geometry}
%\usepackage{fontspec}
%\setmonofont{Bitstream Vera Sans Mono}[Scale=0.85]
\definecolor{light-gray}{gray}{0.95}
\definecolor{darkgreen}{RGB}{0,64,0}
\lstset{basicstyle=\ttfamily,keywordstyle=\bfseries,commentstyle=\itshape    \color{darkgreen}, xleftmargin=\parindent,backgroundcolor=\color{light-gray},
framexleftmargin=\parindent,
framextopmargin=6pt,
framexbottommargin=6pt, 
frame=tb, framerule=0pt}
\begin{document}
\section{listing}
\noindent
\begin{minipage}[H]{\linewidth}
\begin{lstlisting}[language=Delphi,caption={get the next block},label={ref:bitset_next},
                   keywords={function,int,asm,end},xleftmargin=\parindent]
function bitset.next(previous_block_index: int): int;
//***************************************************************************
//pseudo code:
//***************************************************************************
//Load the bitset into a register
//shift out the bits that we've already processed
//count the number of inactive blocks
//next_block_index = previous_block_index + inactive_blocks_inbetween + 1
asm
  //rcx = self = pointer to bitset
  //edx = previous_block_index
  mov rax,[rcx]            //rax = bitset.
  lea ecx,[edx+1]          //go to the next bit    
  shr rax,cl               //shift out the bits we've already processed
  tzcnt rax,rax            //count empty positions to skip
  add eax,ecx              //return (prev+1+empty positions found)
end;  
\end{lstlisting}
\end{minipage}
\end{document}

Isso produz a seguinte saída:

insira a descrição da imagem aqui

Se eu remover o \noindente o, minipageficará assim.

insira a descrição da imagem aqui

Que tem o recuo correto dentro da listagem. Como faço para que a listagem não tenha quebra de página, mas mantenha o espaçamento correto dentro da caixa cinza.

eu tentei

\begin{lstlisting}[float,floatplacement=H]

Mas isso produz a mesma saída minipageacima.

Responder1

Obrigado a @egreg. Encontrei a resposta aqui:Como preservar o mesmo parskip na minipágina

Simplesmente copiar e colar a resposta vinculada acima produzirá um fundo cinza que se estende além do resto do texto, portanto, alguns ajustes são necessários.

A correção é definir um novo comprimento fixo que substituirá a variável \parindentdentro do arquivo minipage.

A seguinte alteração corrige o problema:

\newlength{\listingindent}                %declare a new length
\setlength{\listingindent}{\parindent}    %make it a fixed version of \parindent
\lstset{basicstyle=\ttfamily,keywordstyle=\bfseries,commentstyle=\itshape\color{darkgreen},backgroundcolor=\color{light-gray},
xleftmargin=\listingindent,         <<-- make fixed 
framexleftmargin=\listingindent,    <<-- make fixed
framextopmargin=6pt,
framexbottommargin=6pt, 
frame=tlrb, framerule=0pt,linewidth=\linewidth}
....
\noindent      <<-- force noident, or the frame will appear out of bounds
\begin{minipage}[H]{\linewidth}
\begin{lstlisting}[language=Delphi,caption={get the next block},label={ref:bitset_next},
                   keywords={function,int,asm,end}]
function bitset.next(previous_block_index: int): int;
...
\end{lstlisting}
\end{minipage}

Agora fica assim:

insira a descrição da imagem aqui

Nenhuma quebra de página no meio de uma listagem e nenhum plano de fundo desalinhado.

informação relacionada