在lstlisting中突出显示代码块

37

我有很多代码在lstlisting环境中。如何在该环境中突出显示(着色背景)特定的代码块?


3
请将来在 https://tex.stackexchange.com 上提出与 LaTeX 相关的问题。 - 0 _
5
@IoannisFilippidis 那个消息在8年前就知道就好了。 - Ryan R. Rosario
有一个名为lstlinebgrd可以实现这个功能,唯一的注意点是它不能自动读取文本长度。 - zyy
这个使用覆盖来突出显示代码清单的块。 - Matthias Braun
5个回答

48
你可以在代码清单中使用 \colorbox 和转义字符:
将以下代码添加到导言区:
  \usepackage{color}

  \definecolor{light-gray}{gray}{0.80}
然后在你的文档中像这样使用它:
  \begin{lstlisting}[escapechar=!]
  def mult(m: Matrix[Int], n: Matrix[Int]) {
    val p = !\colorbox{light-gray}{new MatrixInt}!(m.rows, n.cols)
  }
  \end{lstlisting}

我需要额外的东西。我正在使用Beamer包制作演示文稿,必须突出显示lstlisting中出现的代码。我的需求不同之处在于我不能更改lstlisting中的代码,如转义或定义特殊注释。该代码位于另一个无法更改的文件中。复制代码并进行修改不是一个选项,因为它们有很多。我们可以从外部指示(即在\begin{lstlisting}中)要突出显示哪些行吗? - thequark
8
不错,但它不能处理多行,并且在 colorbox 中失去了语法高亮。 - Julian
在使用LaTeX Beamer时,我必须使用\begin{frame}[fragile]将帧标记为脆弱以使其正常工作。 - MKroehnert
1
非常好!不过,当我将颜色更改为\definecolor{light-green}{green}{0.80}时,出现了“latex undefined color model”错误。这就是为什么我改用\definecolor{lightgreen}{rgb}{0.8,1.0,0.8}的原因。希望能对大家有所帮助。 - Michael

13

虽然有点繁琐,但是你可以将代码分成几个lstlisting环境。

\begin{lstlisting}
line
\end{lstlisting}
\vspace{-\baselineskip}
\begin{lstlisting}[backgroundcolor=\color{pink}]
very
interesting
\end{lstlisting}
\vspace{-\baselineskip}
\begin{lstlisting}
line
line
\end{lstlisting}

1
如果你有行号,这个会工作吗?或者它们会重新开始? - Edd
1
@Edd:默认情况下,它们会重新开始,但你可以使用firstnumber关键字来修复这个问题。在这个例子中,你可以在第二个和第三个lstlisting环境中分别使用firstnumber=2firstnumber=4。使用firstnumber=last应该从前一个lstlisting环境继续编号,但是当我尝试时,结果偏差了一个。 - Anton Geraschenko
3
原来的句子已经有很好的解决方案:使用“name”关键字即可解决编号问题(例如\begin{lstlisting}[name=asdf, ...)。名称不会显示出来,具有相同名称的“lstlisting”环境默认共享一个行计数器。 - Anton Geraschenko
这个可以处理多行代码,并且语法高亮会被保留。有人知道是否可以封装在newcommandnewenvironment中吗? - Julian
\vspace{-\baselineskip} 对我来说无法抑制每个块之间的间隔。根据需要设置选项 aboveskip=0belowskip=0 可以解决问题。 - Gohu
lstlisting在TexLive 2021中无法工作。 - sepideha

2
这里有一个使用tikz来突出显示(部分)单行的解决方案:
\documentclass[pdftex,11pt,a4paper]{article}

\usepackage{listings}

\usepackage{tikz}
\usetikzlibrary{tikzmark}

% Command to place a TikZ anchor at the current position
\newcommand{\mytikzmark}[1]{%
  \tikz[overlay,remember picture,baseline] \coordinate (#1) at (0,0) {};}

\newcommand{\highlight}[2]{%
  \draw[yellow,line width=14pt,opacity=0.3]%
    ([yshift=4pt]#1) -- ([yshift=4pt]#2);%
}

\begin{document}
    \begin{lstlisting}[escapechar=@, language=C]
@\mytikzmark{hl1Start}@struct@\mytikzmark{hl1End}@ S {
    double @\mytikzmark{hl2Start}@salary_@\mytikzmark{hl2End}@;
};
    \end{lstlisting}
        
    \begin{tikzpicture}[remember picture, overlay]
        \highlight{hl1Start}{hl1End}
        \highlight{hl2Start}{hl2End}
    \end{tikzpicture}   
        
\end{document}

而且你会得到: enter image description here 这样就可以保留lstlisting的语法高亮显示。

1

有一个叫做lstlinebgrd可以完成这个功能。

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = xelatex
\documentclass{article}
\usepackage[a4paper]{geometry}

\usepackage{lstlinebgrd}
\usepackage{listings, xcolor}
\lstset{tabsize = 4, showstringspaces = false, breaklines = true, numbers = left, numberstyle = \tiny, basicstyle = \small \ttfamily, keywordstyle = \color{blue}, stringstyle = \color{red}, commentstyle = \color{green}, rulecolor = \color{black}}

\begin{document}

\begin{lstlisting}[language = python, frame = tRBl, basicstyle = \ttfamily \scriptsize, linebackgroundcolor = {\ifnum \value{lstnumber} = 8 \color{yellow} \fi, \ifnum \value{lstnumber} = 10 \color{yellow} \fi, \ifnum \value{lstnumber} = 12 \color{yellow} \fi}, linebackgroundsep = 2.2 em, linebackgroundwidth = 15 em]
import numpy
from tensorflow.keras.layers import Dense, Activation, Dropout, Input
from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.optimizers import Adam

model_input = Input(shape = x_train[0].shape)
x = Dense(120, activation = 'relu')(model_input)
x = Dropout(0.01)(x)
x = Dense(120, activation = 'relu')(x)
x = Dropout(0.01)(x)
x = Dense(120, activation = 'relu')(x)
x = Dropout(0.01)(x)
model_output = Dense(numpy.shape(y_train)[1])(x)
model = Model(model_input, model_output)
\end{lstlisting}

\end{document}

而你获得

highlight code

然而,它仍未经过优化,您需要手动调整高亮条的左右边缘,并且设置多行高亮是繁琐的。

这看起来不错,尽管 lstlinebgrd 目前存在问题 https://tex.stackexchange.com/questions/451532/recent-issues-with-lstlinebgrd-package-with-listings-after-the-latters-updates - Supernormal
@Supernormal 感谢提供信息,希望它能尽快恢复! - zyy

0

列表包提供了backgroundcolor = \ color {}选项,但我确定这会使整个背景色而不是一部分。

您可以尝试将其放在带有颜色的parbox中,或者使用colorbox包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接