Выделение фрагмента кода в списке
У меня есть куча кода в среде lstlisting. Как выделить (цвет фона) только определенный фрагмент кода в среде?
5 ответов
Вы можете использовать \colorbox и escape-символ внутри вашего списка:
Добавьте к своей преамбуле
\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}
Это немного громоздко, но вы можете разбить код на несколько 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}
Вот решение для выделения (частей) отдельных строк с помощью
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}
и ты получаешь
Итак
lstlisting
Подсветка синтаксиса сохраняется.
Есть пакет под названием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}
и вы получите
однако он все еще не оптимизирован, вам нужно вручную настроить левый и правый край полосы выделения, а установка нескольких строк для выделения является громоздкой.
Пакет листингов предоставляет backgroundcolor=\color{} в качестве опции, но я уверен, что это делает весь цвет BG, а не кусок.
Вы могли бы взглянуть на то, как поставить цветную коробку или пакет с цветными коробками.