![如何在 LaTeX 中突出显示一段源代码?](https://linux22.com/image/476679/%E5%A6%82%E4%BD%95%E5%9C%A8%20LaTeX%20%E4%B8%AD%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E4%B8%80%E6%AE%B5%E6%BA%90%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我的文档中有许多源代码块(每个至少有 40 行)。我想格式化这些代码块的某些部分,最好在右侧添加一些注释。我考虑过简单地在某些行周围添加彩色框。
有没有一些规范的方法可以做到这一点? 有什么软件包我可以使用吗?
现在我正在使用listings
包,并且我的文档中的源代码以以下方式插入:
\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}