將 lstlisting 放入 minipage 會破壞 xleftmargin 設定

將 lstlisting 放入 minipage 會破壞 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。我在這裡找到了答案:如何在 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}

現在看起來像這樣:

在此輸入影像描述

列表中間沒有分頁符,背景也沒有錯位。

相關內容