Я хочу отобразить листинг в сером поле с некоторым пространством по бокам.
Я настроил \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}
Теперь это выглядит так:
Никаких разрывов страниц в середине листинга и никакого смещенного фона.