第一个清单的行号忽略了步骤号,而第二个清单则没有问题。我猜这可能与使用数学模式有关,但 mathescape 适用于这两种模式,所以如果是这样的话,我不清楚该怎么做
\documentclass[a4paper, twoside]{book}
\usepackage{listings}
\lstset{
basicstyle=\small,
keywordstyle=\ttfamily,
identifierstyle=\ttfamily,
numbers=left,
numberstyle=\tiny,
stepnumber=5,
numbersep=5pt,
numberfirstline=true,
firstnumber=1,
mathescape=true
}
\begin{document}
\begin{lstlisting}
g = $\infty$
for $v$ in vertices:
s = $\emptyset$
r = $\{v\}$
pred[v] = $\emptyset$
d[v] = $0$
while not r == $\emptyset$:
x = $x \in r$
s = s $\cup$ x
r = r $\setminus$ x
for
\end{lstlisting}
\begin{lstlisting}
step = 1
res = new Graph()
def BFS(v,currentLength,maxLength):
if currentLength < maxLength:
if not label[v]:
label[v] = step
step = step + 1
for w in Neighborhood(v):
if label[w]:
continue
pred[w] = v
res.Append(v,w)
BFS(w,currentLength + 1, maxLength)
root = PickVertex()
BFS(root,0,k)
\end{lstlisting}
\end{document}
答案1
我相信这是由列表代码。打印这些行号是因为测试代码行是否是第一行的标志永远不会被重置。如果你添加
\makeatletter
\gdef\lst@numberfirstlinefalse{\global\let\lst@ifnumberfirstline\iffalse}
\lst@AddToHook{Init}{\global\let\lst@ifnumberfirstline\iftrue}
\makeatother
到你的代码(之后\usepackage{listings}
),那么你将得到预期的结果(\global
缺少lstmisc.sty
)。(编辑:我刚刚添加了在里面上面的行来修复下面评论中提到的第一个行号问题。)