我目前正在写一本 200 页的书,里面有很多代码摘录(大约 100 个)。我喜欢在 lstlisting 环境中(在黑色框架内)显示它们。我有一些非常短的代码摘录(一行)和一些较长的代码摘录(最多 50 行)。我经常遇到 lstlisting 框架在页面上单独有顶部或底部框架边框的情况。我希望这个边框与其余代码显示在同一页面上。
我读到许多人建议将 lstlisting 环境放入浮动中。但这对我来说行不通,因为我有一些很长的代码。我不希望这些代码离我的文本很远,也不希望我的文本在页面末尾有巨大的空白,因为我强制在下一页浮动。
这难道不是告诉乳胶从页边距中占用一点额外空间以避免这些边框被单独留下的一种方法吗?
以下是 MWE(我是这个论坛的新手,所以如果我遗漏了什么,请告诉我)
\documentclass[14pt]{extreport}
\usepackage{lipsum}
\usepackage{listings}
\lstset{
basicstyle=\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
frame=single,
extendedchars=true,
language=Python,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
stepnumber=1,
tabsize=2,
title=\lstname,
belowskip=-1em,
aboveskip=1em,
belowcaptionskip=0em,
}
\begin{document}
\lipsum[2-4]
\begin{lstlisting}
dummy
dummy
dummy
dummy
\end{lstlisting}
\end{document}
答案1
可以避免寡妇规则:
\documentclass[14pt]{extreport}
\usepackage{lipsum}
\usepackage{listings}
\lstset{
basicstyle=\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
frame=single,
extendedchars=true,
language=Python,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
stepnumber=1,
tabsize=2,
title=\lstname,
belowskip=-1em,
aboveskip=1em,
belowcaptionskip=0em,
}
%\showoutput
\makeatletter
\gdef\lst@frameExit{%
\lst@frameSpreadV\lst@framexbottommargin
\lst@frameH B\lst@framebshape
\ifvoid\z@\else
\everypar{}\par\nobreak\lst@parshape\nointerlineskip\noindent\box\z@
\fi}
\makeatother
\begin{document}
\lipsum[2-4]
%\enlargethispage{5pt}
\begin{lstlisting}
dummy
dummy
dummy
dummy
\end{lstlisting}
\end{document}
但是就像防止普通段落中出现孤行一样,这并不总是能产生最好的结果,例如这里它只是将最后一行带到第 2 页,因此第二页上有一行和一条规则。
手动校正可以取得更好的效果
\documentclass[14pt]{extreport}
\usepackage{lipsum}
\usepackage{listings}
\lstset{
basicstyle=\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
frame=single,
extendedchars=true,
language=Python,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
stepnumber=1,
tabsize=2,
title=\lstname,
belowskip=-1em,
aboveskip=1em,
belowcaptionskip=0em,
}
%\showoutput
\begin{document}
\lipsum[2-4]
\enlargethispage{5pt}
\begin{lstlisting}
dummy
dummy
dummy
dummy
\end{lstlisting}
\end{document}
在其他情况下,可以通过缩小页面上的垂直空间,或强制页面上的段落减少一个相似项(通过在段落前加上\looseness=-1
或甚至重新措辞)来避免糟糕的中断。
考虑到写一本书所花的时间,花几分钟手动调整错误的分页符通常是值得的......