![Как выделить блок исходного кода в LaTeX?](https://rvso.com/image/476679/%D0%9A%D0%B0%D0%BA%20%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B1%D0%BB%D0%BE%D0%BA%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%BE%D0%B4%D0%B0%20%D0%B2%20LaTeX%3F.png)
У меня в документе много блоков исходного кода (каждый из них содержит не менее 40 строк). Я хотел бы отформатировать части этих блоков кода, желательно с некоторыми аннотациями справа. Я думал просто добавить цветную рамку вокруг некоторых строк.
Есть ли какой-то канонический способ сделать это? Есть ли какие-то пакеты, которые я мог бы использовать?
Сейчас я использую listings
package, и исходный код в моем документе вставлен следующим образом:
\begin{lstlisting}
#include <stdio.h>
#define N 10
/* Block
* comment */
int main()
{
int i;
// Line comment.
puts("Hello world!");
for (i = 0; i < N; i++)
{
puts("LaTeX is also great for programmers!");
}
return 0;
}
\end{lstlisting}
\lstinputlisting[caption=Scheduler, style=customc]{hello.c}
решение1
С помощью verbatimbox
пакета необязательные аргументы (в форме макросов) могут быть переданы в дословные среды пакета. Это позволяет выполнять всевозможные настройки. В моем MWE ниже я проверяю номер строки кода. Если он находится в диапазоне 8-18, он применяет фон к \colorfield
листингу. Кроме того, я применяю красные номера строк, если номер строки кода находится в этом диапазоне, или черные номера, если он находится за его пределами (по умолчанию номера строк отсутствуют).
Кроме того, я проверяю, что если в строке кода 11 есть что-то, я привлекаю внимание к этой строке с помощью комментария в рамке.
Вы можете выбрать метод цвета фона, метод цветного номера строки, метод выделенного поля, все три, некоторую их комбинацию или что-то совершенно другое, все из которых настраиваются через определения макросов. Пакет отслеживает номера строк через счетчик VerbboxLineNo
, который может использоваться в ваших макросах.
\documentclass{article}
\usepackage{verbatimbox,xcolor,lipsum}
% VERBATIMBOX PREP
\usepackage{verbatimbox}
\def\codesize{\footnotesize}
\newsavebox\thecolorfield
\newcommand\setcolorfield[1][blue!19!gray!18]{%
\savebox{\thecolorfield}{\codesize%
\makebox[0pt][l]{\textcolor{#1}{%
\rule[-\dp\strutbox]{\textwidth}{\dimexpr\ht\strutbox+\dp\strutbox}}}}%
}
\def\colorfield{\usebox{\thecolorfield}}
\setcolorfield
\newcommand*\ifline[4]{%
\ifnum\value{VerbboxLineNo}<#1#4\else
\ifnum\value{VerbboxLineNo}>#2#4\else#3\fi
\fi
}
\newcommand\rednum{\makebox[0ex][r]{\color{red}\arabic{VerbboxLineNo}:}\hspace{1ex}}
\newcommand\blacknum{\makebox[0ex][r]{\arabic{VerbboxLineNo}:}\hspace{1ex}}
\newcommand\boxcomment[1]{\fboxsep=1pt\smash{\rlap{%
\textcolor{red!30}{\rule[-1pt]{.75\textwidth}{1pt}}%
\colorbox{red!30}{\fbox{\parbox[b]{.2\textwidth}{\rmfamily #1}}%
}}}%
}
\newcommand\commentA{\boxcomment{I am drawing attention to ``Hello World''}}
\begin{document}
\lipsum[3]
\begin{verbnobox%
}[\codesize\ifline{8}{18}{\colorfield\rednum}{\blacknum}\ttfamily\ifline{11}{11}{\commentA}{}]
#include <stdio.h>
#define N 10
/* Block
* comment */
int main()
{
int i;
// Line comment.
puts("Hello world!");
for (i = 0; i < N; i++)
{
puts("LaTeX is also great for programmers!");
}
return 0;
}
\end{verbnobox}
\lipsum[4]
\end{document}