Tenho muitos blocos de código-fonte em meu documento (cada um deles tem pelo menos 40 linhas). Gostaria de formatar partes desses blocos de código, de preferência com algumas anotações à direita. Eu estava pensando em simplesmente colocar uma moldura colorida em torno de algumas linhas.
Existe alguma maneira canônica de fazer isso? Há algum pacote que eu possa usar?
No momento estou usando listings
o pacote e o código fonte do meu documento é inserido da seguinte maneira:
\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}
Responder1
Com o verbatimbox
pacote, argumentos opcionais (na forma de macros) podem ser passados para os ambientes literais do pacote. Isso permite todos os tipos de personalização. No meu MWE abaixo, testo o número da linha do código. Se estiver no intervalo de 8 a 18, aplica um plano de fundo \colorfield
à listagem. Além disso, aplico números de linha vermelhos se o número da linha de código estiver nesse intervalo, ou números pretos se estiver fora dele (o padrão é nenhum número de linha).
Além disso, verifico se estiver na linha de código 11, chamo a atenção para essa linha com um comentário em caixa.
Você pode escolher o método da cor de fundo, o método do número da linha colorida, o método da caixa destacada, todos os três, alguma combinação deles ou algo completamente diferente, todos personalizados por meio de suas definições de macro. O pacote monitora os números das linhas através do contador VerbboxLineNo
, que podem ser utilizados em suas 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}