答案1
正如评论中提到的那样,对于交替线背景颜色,lstlinebgrd
可以使用包(另请参阅此主题)。对于行号的背景颜色,我们可以只在列表的左侧使用一个超宽的框架,对于分隔符规则,我们可以将框架分隔符与填充颜色结合起来。
我们使用以下选项来调整布局(我认为其余部分是不言自明的):
framexleftmargin
稍微缩进代码,linebackgroundsep
并linebackgroundwidth
用背景颜色补偿缩进。framesep
在代码和左框架之间设置一个小间隙,由 填充fillcolor
。framerule
是左框架的宽度,rulecolor
是其颜色,numbersep
是行号与框架右侧的距离加上间隙。有一个额外的宏\numberstyle
用于设置行号本身的样式,以测试小于十的数字,并在必要时用前导零填充它们。xleftmargin
将整个列表按框架宽度、间隙和缩进向右推,这样行号就不会打印在左边距。
完整示例代码:
\documentclass{article}
\usepackage{listings}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage{lstlinebgrd}
\lstset{
basicstyle = \ttfamily\small,
numbers=left,
numberstyle=\numberstyle,
linebackgroundcolor=\linebgstyle,
frame=l,
% code indentation
framexleftmargin=0.5em,
linebackgroundsep=0.5em,
linebackgroundwidth=\dimexpr\linewidth+0.5em\relax,
% separation rule
framesep=3pt,
fillcolor=\color{green!80!black},
% numbers background
framerule=4em,
numbersep=\dimexpr 1.5em+3pt\relax,
rulecolor=\color{lightgray!50!white},
% don't put numbers into margin
xleftmargin=\dimexpr 4em+3pt+0.5em\relax,
}
\newcommand\linebgstyle{%
\ifodd\value{lstnumber}%
\color{white}%
\else
\color{lightgray!10!white}%
\fi
}
\newcommand\numberstyle[1]{%
\small\ttfamily
\color{gray!60!black}%
\ifnum#1<10 0\else\fi
#1.%
}
\begin{document}
\lipsum[1]
% example code from http://esd.cs.ucr.edu/labs/tutorial/DRIVER.vhd
\begin{lstlisting}
library ieee;
use ieee.std_logic_1164.all;
entity Driver is
port( x: in std_logic;
F: out std_logic
);
end Driver;
architecture behv1 of Driver is
begin
process(x)
begin
-- compare to truth table
if (x='1') then
F <= '1';
else
F <= '0';
end if;
end process;
end behv1;
architecture behv2 of Driver is
begin
F <= x;
end behv2;
\end{lstlisting}
\end{document}
输出