¿Cómo resalto un bloque de código fuente en LaTeX?

¿Cómo resalto un bloque de código fuente en LaTeX?

Tengo muchos bloques de código fuente en mi documento (cada uno de ellos tiene al menos 40 líneas). Me gustaría formatear partes de estos bloques de código, preferiblemente con algunas anotaciones a la derecha. Estaba pensando en simplemente poner un marco de color alrededor de algunas de las líneas.

¿Existe alguna forma canónica de hacer esto? ¿Hay algún paquete que pueda usar?

Ahora estoy usando listingsel paquete y el código fuente en mi documento se inserta de la siguiente manera:

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

Respuesta1

Con el verbatimboxpaquete, se pueden pasar argumentos opcionales (en forma de macros) a los entornos textuales del paquete. Esto permite todo tipo de personalización. En mi MWE a continuación, pruebo el número de línea de código. Si está en el rango 8-18, aplica un fondo \colorfieldal listado. Además, aplico números de línea rojos si el número de línea de código está en ese rango, o números negros si está fuera de él (el valor predeterminado es que no hay números de línea).

Además, compruebo que si está en la línea de código 11, llamo la atención sobre esa línea con un comentario en cuadro.

Puede elegir el método del color de fondo, el método del número de línea coloreada, el método del cuadro resaltado, los tres, alguna combinación de los mismos o algo completamente diferente, todos los cuales se personalizan a través de sus definiciones de macro. El paquete realiza un seguimiento de los números de línea a través del contador VerbboxLineNo, que puede utilizarse en sus macros.

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

ingrese la descripción de la imagen aquí

información relacionada