为什么我的 listing/lstlisting 背景中有空白的水平间隙?

为什么我的 listing/lstlisting 背景中有空白的水平间隙?

listings当我更改背景颜色时,代码块中出现水平间隙。此最小工作示例代码和屏幕截图演示了此问题。

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset{
    basicstyle=\linespread{0.67}\ttfamily,
    backgroundcolor=\color{gray}
}
\begin{document}
\begin{lstlisting}
n := 42;
for i in [1,2,3,4,5] do
    n := n+i;
od;
\end{lstlisting}
\end{document}

问题截图

我知道 ⅔ 的行距太荒谬了,我只是想用这个例子来强调这个问题。真正的问题是尽管线宽为 1,但这些间隙仍然会出现,尽管非常微弱!

1 条模糊线条的线条分布截图

这是怎么回事?我该如何解决?

答案1

您可以将lstlistings其包装起来tcolorbox

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage[many]{tcolorbox}

\tcolorboxenvironment{lstlisting}{
  spartan,
  frame empty,
  boxsep=0mm,
  left=1mm,right=1mm,top=-1mm,bottom=-1mm,
  colback=gray!45,
}


\lstset{
    basicstyle=\linespread{0.67}\ttfamily,
}

\begin{document}

\begin{lstlisting}
n := 42;
for i in [1,2,3,4,5] do
    n := n+i;
od;
\end{lstlisting}

\end{document}

在此处输入图片描述

答案2

这不是我最喜欢的解决方案,因为它涉及包含另一个包并将每个lstlisting环境包装在另一个环境中,但是Ulrike Fischer 在评论中的建议使用tcolorbox作品,它为代码块添加了令人愉悦的边距。

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset{
    basicstyle=\linespread{0.67}\ttfamily,
    %backgroundcolor=\color{gray},
}
\usepackage{tcolorbox}
\newtcolorbox{tcolorbox-code}{%
    colback=gray, %
    colframe=gray, %
    sharp corners %
}

\begin{document}
\begin{tcolorbox-code}
\begin{lstlisting}
n := 42;
for i in [1,2,3,4,5] do
    n := n+i;
od;
\end{lstlisting}
\end{tcolorbox-code}
\end{document}

代码输出的屏幕截图

答案3

我找到了这个解决方法。我们可以给线条添加框架,并将框架的边框宽度设置为 0。它帮我消除了线条之间的垂直间隙。

\usepackage{listings}
\lstset{
  basicstyle=\small\ttfamily,
  columns=flexible,
  breaklines=true,
  backgroundcolor=\color{lightgray},
  frame=ltb,
  framerule=0pt,
}

相关内容