将列表列表放在小页面中断 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}

我不想在简短列表中出现分页符。我使用 minipage 解决了这个问题。但是这会破坏我的边距设置。

\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。我在这里找到了答案:如何在 minipage 中保留相同的 parskip

只需复制粘贴上面链接的答案就会产生超出其余文本的灰色背景,因此需要进行一些调整。

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

现在看起来像这样:

在此处输入图片描述

列表中间没有分页符,也没有错位的背景。

相关内容