Размещение списка на мини-странице нарушает настройки xleftmargin

Размещение списка на мини-странице нарушает настройки xleftmargin

Я хочу отобразить листинг в сером поле с некоторым пространством по бокам.
Я настроил \lstsetтак, как мне нравится:

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

Я не хочу разрывов страниц в коротких списках. Я исправляю это с помощью мини-страницы. Однако это нарушает мои настройки полей.

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

Это дает следующий результат:

введите описание изображения здесь

Если убрать \noindentи , то minipageэто будет выглядеть так.

введите описание изображения здесь

Который имеет правильный отступ внутри листинга. Как мне сделать так, чтобы листинг не имел разрыва страницы внутри, но сохранял правильный интервал внутри серого поля.

я пробовал

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

Но это дает тот же результат, что и minipageвыше.

решение1

Спасибо @egreg. Я нашел ответ здесь:Как сохранить тот же парскип на мини-странице

Простое копирование и вставка приведенного выше ответа приведет к появлению серого фона, который будет выступать за пределы остального текста, поэтому необходимо внести некоторые коррективы.

Исправление заключается в определении новой фиксированной длины, которая заменит переменную \parindentвнутри minipage.

Следующее изменение устраняет проблему:

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

Теперь это выглядит так:

введите описание изображения здесь

Никаких разрывов страниц в середине листинга и никакого смещенного фона.

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