Highlighting a Chunk of Code within a lstlisting
Solution 1
You can use \colorbox and an escape character inside your listing:
Add to your preamble
\usepackage{color}
\definecolor{light-gray}{gray}{0.80}
then use it like this in your document:
\begin{lstlisting}[escapechar=!]
def mult(m: Matrix[Int], n: Matrix[Int]) {
val p = !\colorbox{light-gray}{new MatrixInt}!(m.rows, n.cols)
}
\end{lstlisting}
Solution 2
It's a bit cumbersome, but you can break the code into several lstlisting
environments.
\begin{lstlisting}
line
\end{lstlisting}
\vspace{-\baselineskip}
\begin{lstlisting}[backgroundcolor=\color{pink}]
very
interesting
\end{lstlisting}
\vspace{-\baselineskip}
\begin{lstlisting}
line
line
\end{lstlisting}
Solution 3
Here's a solution for highlighting (parts of) individual lines using 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}
and you get
so the lstlisting
's syntax highlighting is retained.
Solution 4
There is a package called lstlinebgrd
that does this
% !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}
and you get
it is however, still not optimized, you have to manually adjust the left and right edge of highlight bar, and setting multiple lines to highlight is cumbersome.
Ryan R. Rosario
Ph.D., Machine Learning (Statistics), UCLA Alum: Machine Learning Engineer at Facebook I wear many hats, the largest being Computer Scientist hat. My languages: R, Python, C++, Java Applications: text mining, data mining, machine learning.
Updated on April 14, 2021Comments
-
Ryan R. Rosario about 3 years
I have a bunch of code in a lstlisting environment. How can I highlight (color background) just a particular chunk of code within the environment?
-
Edd almost 15 yearsWill this work if you've got, for example, line numbers, or will they get restarted?
-
Anton Geraschenko almost 15 years@Edd: By default, they will get restarted, but you can use the
firstnumber
keyword to fix that. In this example, you'd usefirstnumber=2
andfirstnumber=4
in the second and thirdlstlisting
environments, respectively. Usingfirstnumber=last
is supposed to continue the numbering from the previouslstlisting
environment, but when I try it, it's off by one. -
Anton Geraschenko almost 15 yearsIt turns out there's an even better solution to the numbering problem: use the
name
keyword (eg\begin{lstlisting}[name=asdf, ...
). The name doesn't get displayed, andlstlisting
environments with the same name share a line counter by default. -
thequark almost 14 yearsI need something extra. I am using Beamer package for my presentation and I have to highlight code present in lstlisting. The difference in my need is I can't change the code inside lstlisting, like escaping or having special comment definition. The code is present inside a different file which can't be changed. Copying the code and making modifications is not an option as there are many of them. Can we indicate from outside (i.e. in \begin{lstlisting}) which lines to highlight?
-
Julian about 13 yearsNice but it doesn't work with multiple lines and you are losing the syntax highlighting inside a
colorbox
. -
Julian about 13 yearsthis works with multiple lines and the syntax highlighting get preserved. Anyone knows if this can be encapsulated in a
newcommand
ornewenvironment
? -
Gohu almost 13 years
\vspace{-\baselineskip}
didn't work for me to suppress separation between each block. Setting optionsaboveskip=0
andbelowskip=0
as needed did. -
MKroehnert over 11 yearsWhen using LaTeX Beamer I had to mark the frame as fragile with
\begin{frame}[fragile]
to make it work. -
Michael over 8 yearsWorks great! Anyway, somehow I got the error
latex undefined color model
when changing colors to\definecolor{light-green}{green}{0.80}
. That's why I switched to\definecolor{lightgreen}{rgb}{0.8,1.0,0.8}
instead. Hope it helps anyone. -
sepideha over 2 yearslstlisting doesnot work with TexLive 2021
-
Supernormal over 2 yearsThis looks nice, although
lstlinebgrd
is currently broken tex.stackexchange.com/questions/451532/… -
zyy over 2 years@Supernormal Thanks for the information, hope it will recover soon!