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 listings
el 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 verbatimbox
paquete, 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 \colorfield
al 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}