我正在使用listings
包并通过 将代码包含到我的文档中\lstincludelistings
。问题是我想将一些代码行设置为粗体以指示与之前代码段的更改。
我怎样才能实现这一点而不必直接将代码复制粘贴到文档中?
答案1
一种解决方案是定义一个宏,该宏调用\lstinputlisting
三次(针对要强调的行之前的部分、行本身以及要强调的行之后的部分)并采用列表样式来\lstset
实现所需的突出显示:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{xcolor} % for coloring as emph
\usepackage{etoolbox} % for \ifnumcomp
\usepackage{beramono} % a tt font that has a boldface series
\lstset{basicstyle=\ttfamily}
% The style to be applied for the highlighted line:
\lstdefinestyle{highlight}{basicstyle=\ttfamily\bfseries\color{red}}
%\lstdefinestyle{highlight}{backgroundcolor=\color{orange!30}}
% input listing and emphasize a specific line
% \lstinputemph[listings options]{line number}{filename}
\newcommand{\lstinputemph}[3][\empty]{%
\lstset{aboveskip=0pt, belowskip=0pt, showlines=true,#1}%
\ifnumcomp{#2}{=}{0}{\lstinputlisting{#3}}{%
\ifnumcomp{#2}{=}{1}{}{\lstinputlisting[lastline=\the\numexpr#2-1\relax]{#3}}%
\lstinputlisting[firstnumber={#2},firstline={#2},lastline={#2},style=highlight]{#3}
\lstinputlisting[firstnumber={\the\numexpr#2+1},firstline=\the\numexpr#2+1\relax]{#3}
}% else
}
\begin{document}
\lstinputemph[language=C]{3}{hello.c}
\end{document}
文件hello.c
如下
#include <stdio.h>
void main() {
printf("Hello, World\n")
}
这导致以下输出(第二个示例使用不同的背景颜色来实现突出显示效果)