Ich möchte eine Auflistung in einem grauen Feld mit etwas Platz an den Seiten anzeigen. Ich habe es so
eingerichtet, wie ich es möchte:\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}
Ich möchte keine Seitenumbrüche in kurzen Auflistungen. Ich behebe dies mithilfe einer Miniseite. Dadurch werden jedoch meine Randeinstellungen zerstört.
\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}
Dies erzeugt die folgende Ausgabe:
Wenn ich das \noindent
und das entferne minipage
, sieht es so aus.
Das hat die richtige Einrückung innerhalb der Auflistung. Wie erreiche ich, dass die Auflistung keinen Seitenumbruch hat, aber den richtigen Abstand innerhalb des grauen Felds beibehält?
ich habe es versucht
\begin{lstlisting}[float,floatplacement=H]
Das Ergebnis ist jedoch dasselbe wie minipage
oben.
Antwort1
Danke an @egreg. Ich habe die Antwort hier gefunden:So bewahren Sie denselben Parskip in der Minipage auf
Durch einfaches Kopieren und Einfügen der oben verlinkten Antwort entsteht ein grauer Hintergrund, der über den restlichen Text hinausgeht, sodass einige Anpassungen erforderlich sind.
\parindent
Die Lösung besteht darin, eine neue -feste- Länge zu definieren, die die Variable innerhalb ersetzt minipage
.
Die folgende Änderung behebt das Problem:
\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}
Jetzt sieht es so aus:
Keine Seitenumbrüche mitten in einer Auflistung und kein falsch ausgerichteter Hintergrund.