Как выделить блок исходного кода в LaTeX?

Как выделить блок исходного кода в LaTeX?

У меня в документе много блоков исходного кода (каждый из них содержит не менее 40 строк). Я хотел бы отформатировать части этих блоков кода, желательно с некоторыми аннотациями справа. Я думал просто добавить цветную рамку вокруг некоторых строк.

Есть ли какой-то канонический способ сделать это? Есть ли какие-то пакеты, которые я мог бы использовать?

Сейчас я использую listingspackage, и исходный код в моем документе вставлен следующим образом:

\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}

введите описание изображения здесь

Связанный контент