Poner un lstlisting en una minipágina rompe la configuración de xleftmargin

Poner un lstlisting en una minipágina rompe la configuración de xleftmargin

Quiero mostrar una lista en un cuadro gris con algo de espacio a los lados.
Lo he configurado \lstsetcomo me gusta:

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

No quiero saltos de página en listados cortos. Lo soluciono usando una minipágina. Sin embargo, esto rompe mi configuración de márgenes.

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

Esto produce el siguiente resultado:

ingrese la descripción de la imagen aquí

Si elimino el \noindenty el minipagese ve así.

ingrese la descripción de la imagen aquí

Que tiene la sangría correcta dentro del listado. ¿Cómo puedo hacer para que el listado no tenga un salto de página dentro, pero mantenga el espacio correcto dentro del cuadro gris?

He intentado

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

Pero eso produce el mismo resultado que el minipageanterior.

Respuesta1

Gracias a @egreg. Encontré la respuesta aquí:Cómo conservar el mismo parskip en minipágina

Simplemente copie y pegue la respuesta vinculada anteriormente y obtendrá un fondo gris que se extiende más allá del resto del texto, por lo que se necesitan algunos ajustes.

La solución es definir una nueva longitud fija que reemplazará la variable \parindentdentro del archivo minipage.

El siguiente cambio soluciona el 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}

Ahora se ve así:

ingrese la descripción de la imagen aquí

Sin saltos de página en medio de un listado ni fondo desalineado.

información relacionada