我在这里放了一个改编版“无光束”文件此代码。非常感谢 Daniel 给出的以下指示。
% Sources :
% 1) https://tex.stackexchange.com/questions/18969/creating-a-zebra-effect-using-listings
% 2) https://tex.stackexchange.com/questions/24046/listing-zebra-effect-and-broken-lines
% 3) https://tex.stackexchange.com/questions/30877/highlighting-line-ranges-in-a-lstlisting-partial-solution-but-expansion-issues/31267#31267
\documentclass[10pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage{ucs}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{pgf}
\usepackage{pgffor}
% Define backgroundcolor
\usepackage[
style=1,
skipbelow=\topskip,
skipabove=\topskip
]{mdframed}
\definecolor{bggray}{rgb}{0.85, 0.85, 0.85}
\mdfsetup{
leftmargin = 20pt,
rightmargin = 20pt,
backgroundcolor = bggray,
middlelinecolor = black,
roundcorner = 15
}
\BeforeBeginEnvironment{lstlisting}{\begin{mdframed}\vskip-.5\baselineskip}
\AfterEndEnvironment{lstlisting}{\end{mdframed}}
\makeatletter
%
% \btIfInRange{number}{range list}{TRUE}{FALSE}
%
% Test if int number <number> is element of a (comma separated) list of ranges
% (such as: {1,3-5,7,10-12,14}) and processes <TRUE> or <FALSE> respectively
%
\newcount\bt@rangea
\newcount\bt@rangeb
\newcommand\btIfInRange[2]{%
\global\let\bt@inrange\@secondoftwo%
\edef\bt@rangelist{#2}%
\foreach \range in \bt@rangelist {%
\afterassignment\bt@getrangeb%
\bt@rangea=0\range\relax%
\pgfmathtruncatemacro\result{ ( #1 >= \bt@rangea) && (#1 <= \bt@rangeb) }%
\ifnum\result=1\relax%
\breakforeach%
\global\let\bt@inrange\@firstoftwo%
\fi%
}%
\bt@inrange%
}
\newcommand\bt@getrangeb{%
\@ifnextchar\relax%
{\bt@rangeb=\bt@rangea}%
{\@getrangeb}%
}
\def\@getrangeb-#1\relax{%
\ifx\relax#1\relax%
\bt@rangeb=100000% \maxdimen is too large for pgfmath
\else%
\bt@rangeb=#1\relax%
\fi%
}
%
% \btLstHL{range list}
%
\newcommand{\btLstHL}[1]{%
\btIfInRange{\value{lstnumber}}{#1}%
{\color{blue!30}}%
{\def\lst@linebgrd}%
}%
%
% \btInputEmph[listing options]{range list}{file name}
%
\newcommand{\btLstInputEmph}[3][\empty]{%
\lstset{%
linebackgroundcolor=\btLstHL{#2}%
\lstinputlisting{#3}%
}% \only
}
% Patch line number key to call line background macro
\lst@Key{numbers}{none}{%
\def\lst@PlaceNumber{\lst@linebgrd}%
\lstKV@SwitchCases{#1}{%
none&\\%
left&\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}\lst@linebgrd}\\%
right&\def\lst@PlaceNumber{\rlap{\normalfont
\kern\linewidth \kern\lst@numbersep
\lst@numberstyle{\thelstnumber}}\lst@linebgrd}%
}{%
\PackageError{Listings}{Numbers #1 unknown}\@ehc%
}%
}
% New keys
\lst@Key{linebackgroundcolor}{}{%
\def\lst@linebgrdcolor{#1}%
}
\lst@Key{linebackgroundsep}{0pt}{%
\def\lst@linebgrdsep{#1}%
}
\lst@Key{linebackgroundwidth}{\linewidth}{%
\def\lst@linebgrdwidth{#1}%
}
\lst@Key{linebackgroundheight}{\ht\strutbox}{%
\def\lst@linebgrdheight{#1}%
}
\lst@Key{linebackgrounddepth}{\dp\strutbox}{%
\def\lst@linebgrddepth{#1}%
}
\lst@Key{linebackgroundcmd}{\color@block}{%
\def\lst@linebgrdcmd{#1}%
}
% Line Background macro
\newcommand{\lst@linebgrd}{%
\ifx\lst@linebgrdcolor\empty\else
\rlap{%
\lst@basicstyle
\color{-.}% By default use the opposite (`-`) of the current color (`.`) as background
\lst@linebgrdcolor{%
\kern-\dimexpr\lst@linebgrdsep\relax%
\lst@linebgrdcmd{\lst@linebgrdwidth}{\lst@linebgrdheight}{\lst@linebgrddepth}%
}%
}%
\fi
}
\makeatother
\begin{document}
\begin{lstlisting}[
language = C,
linebackgroundcolor = {\btLstHL{4-6,9}},
]
/**
* Prints Hello World.
**/
#include <stdio.h>
}
int main(void) {
printf("Hello World!");
return 0;
}
\end{lstlisting}
\end{document}
答案1
宏\btIfInRange
依赖于pgffor
包。只需将其添加到您加载的包列表中,代码就可以正常编译。
请注意,您使用的实现有一个缺点,即所有未选择的行也会获得背景颜色(在您的情况下为白色,因此您实际上看不到它)。但是,只要您将列表放入某些内容中\colorbox
或为主字体选择另一种颜色,结果可能会看起来很丑陋。在我回答突出显示列表中的行范围:部分解决方案,但存在扩展问题我提出了一种可以克服这一限制的解决方法。