列表环境中不需要的白线

列表环境中不需要的白线
\documentclass{article}
\usepackage{listings}
\usepackage{color}
\begin{document}
\definecolor{light-gray}{gray}{0.95}
\lstset{basicstyle=\ttfamily\footnotesize,
    backgroundcolor=\color{light-gray}, xleftmargin=0.7cm,
    frame=tlbr, framesep=0.2cm, framerule=0pt,  
}
\begin{lstlisting}[mathescape]
k = $\lfloor (10\log n \cdot \log\log n)^{1/3} \rfloor$;
k = $\lfloor (4\log n \cdot \log n)^{1/3} \rfloor$;
\end{lstlisting}
\end{document}

生产

只是一张描述情况的图片

类似问题的答案说“这条线只是观看者的假象”。但这条线出现在两个观看器和各种缩放步骤中。最重要的是,人们可以清楚地看到它1/3与白线重叠。所以我不再接受它只是一个假象。

如何解决这个问题?是否可以以某种方式在 lstlisting 环境下方放置另一个灰色层,以“吞噬”所有白线?

编辑:有没有一种不需要编辑每一行代码的解决方案?

答案1

该问题与“背景颜色和 mathescape 损坏的列表“。那里的答案解释了原因。简而言之:

背景是通过在每行开头放置彩色规则(钩子EveryLine)来绘制的。然后排版该行。因此,它listings不知道该行的最大高度和深度。超出支柱盒高度和深度的所有内容都保持白色。

解决方法\smash

\smash创建一个盒子,其高度和深度为零:

\documentclass{article}
\usepackage{listings}
\usepackage{color}
\begin{document}
\definecolor{light-gray}{gray}{0.95}
\lstset{basicstyle=\ttfamily\footnotesize,
    backgroundcolor=\color{light-gray}, xleftmargin=0.7cm,
    frame=tlbr, framesep=0.2cm, framerule=0pt,
}
\begin{lstlisting}[mathescape]
k = $\smash{\lfloor (10\log n \cdot \log\log n)^{1/3}\rfloor}$;
k = $\smash{\lfloor (4\log n \cdot \log n)^{1/3} \rfloor}$;
\end{lstlisting}
\end{document}

结果

通过增加行距来解决

如果您担心线条太窄可能会接触,则可以使用较大的行距。设置\baselineskip不会basicstyle产生影响,但\fontsize\linespread可以显式/隐式地\selectfont工作。以下示例使用\linespread(参见egreg 的回答\footnotesize包含隐含的\selectfont

\documentclass{article}
\usepackage{listings}
\usepackage{color}
\begin{document}
\definecolor{light-gray}{gray}{0.95}
\lstset{basicstyle=\ttfamily\linespread{1.15}\footnotesize,   
    backgroundcolor=\color{light-gray}, xleftmargin=0.7cm,
    frame=tlbr, framesep=0.2cm, framerule=0pt,
}
\begin{lstlisting}[mathescape]
k = $\smash{\lfloor (10\log n \cdot \log\log n)^{1/3}\rfloor}$;
k = $\smash{\lfloor (4\log n \cdot \log n)^{1/3} \rfloor}$;
\end{lstlisting}
\end{document}

结果

答案2

这就是我想要的。通过在 listings 环境下方放置一个灰色层(通过 mdframed),每条白线都会消失:

\documentclass{article}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{listings}  
\begin{document}
\lstset{language=c++,basicstyle=\linespread{1.1}\ttfamily\footnotesize,
    xleftmargin=0.0cm, frame=t, framesep=0.15cm, framerule=0pt, tabsize=4,
    showspaces=false, showstringspaces=false,showlines=true,
    commentstyle=\ttfamily\footnotesize\color{gray},
}

\begin{mdframed}[backgroundcolor=black!5,leftmargin=0.5cm,hidealllines=true,%
  innerleftmargin=0.2cm,innerrightmargin=0.2cm,innertopmargin=-0.72cm,innerbottommargin=-0.10cm]
\begin{lstlisting}[mathescape, caption = This is some code]
k = $\lfloor (10\log n \cdot \log\log n)^{1/3} \rfloor$;    //with caption
k = $\lfloor (4\log n \cdot \log n)^{1/3} \rfloor$;
\end{lstlisting}
\end{mdframed}

\begin{mdframed}[backgroundcolor=black!5,leftmargin=0.5cm,skipabove=0.3cm,hidealllines=true,%
  innerleftmargin=0.2cm,innerrightmargin=0.2cm,innertopmargin=-0.0cm,innerbottommargin=-0.10cm]
\begin{lstlisting}[mathescape]
k = $\lfloor (10\log n \cdot \log\log n)^{1/3} \rfloor$;   //without caption
k = $\lfloor (4\log n \cdot \log n)^{1/3} \rfloor$;
\end{lstlisting}
\end{mdframed}

\end{document}

在此处输入图片描述

答案3

您可以增加基线跳过,以便线条不会太近(对于 TeX 来说):

\documentclass{article}
\usepackage{listings}
\usepackage{color}
\begin{document}
\definecolor{light-gray}{gray}{0.95}
\lstset{basicstyle=\linespread{1.1}\ttfamily\footnotesize,
    backgroundcolor=\color{light-gray}, xleftmargin=0.7cm,
    frame=tlbr, framesep=0.2cm, framerule=0pt,
}
\begin{lstlisting}[mathescape]
k = $\lfloor (10\log n \cdot \log\log n)^{1/3} \rfloor$;
k = $\lfloor (4\log n \cdot \log n)^{1/3} \rfloor$;
\end{lstlisting}
\end{document}

在此处输入图片描述

相关内容