Quiero mostrar una lista en un cuadro gris con algo de espacio a los lados.
Lo he configurado \lstset
como 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:
Si elimino el \noindent
y el minipage
se ve así.
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 minipage
anterior.
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 \parindent
dentro 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í:
Sin saltos de página en medio de un listado ni fondo desalineado.