我查看了以下内容:
然而,后一个线程中给出的解决方案只跳过了这一行后命令|\Suppressnumber|
已给出,同样,仅恢复编号后给出命令|\Reactivatenumber|
。换句话说,这给出了跳过的数字范围。
我想要的是:
- 需要抑制空行的行号(以及计数器不是递增:这个问题在上面的第一篇文章中已经解决);
- 对于指定的线路仅有的,而不是一个范围,以抑制其行号没有增加计数器。
使用一些非常例如,人为的 C,这就是我想要的:
\begin{lstlisting}
int main () { |\Suppressnumber|
1 printf("hello\n");
2 while (1) {
3 ;
4 if (0) {
5 ;
} else { |\Suppressnumber|
6 int b;
7 scanf("%d", &b);
} |\Suppressnumber|
} |\Suppressnumber|
} |\Suppressnumber|
\end{lstlisting}
我已经尝试了中的大多数相关钩子,listings
包括EveryLine
、、和,但我无法想到这样做的方法。EOL
EveryPar
InitVarsBOL
InitVarsEOL
答案1
正如你所描述的,第二种解决方案的问题在于,当你使用|\Suppressnumber|
它时,会抑制下一个行。这不会有问题:只需|\Suppressnumber|
将以前的到你想要抑制的那个,然后在线|\Reactivatenumber|
上本身
使用这种方法你会几乎获得所需的输出,因为您需要抑制第一行。如果您按照上一段建议的那样做,您将得到一个空的第一行,编号为 1。然后其余的输出将按您的需要编号 - 只差 1。
解决方案是使用这里建议的解决方案将第一行编号为 0 并将其删除。
完整的 MWE:
\documentclass{article}
\usepackage{listings}
\lstset{numbers=left,numberblanklines=false,firstnumber=0,escapeinside=||}
\let\origthelstnumber\thelstnumber
\makeatletter
\def\lst@PlaceNumber{\ifnum\value{lstnumber}=0\else
\llap{\normalfont\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}\fi}
\newcommand*\Suppressnumber{%
\lst@AddToHook{OnNewLine}{%
\let\thelstnumber\relax%
\advance\c@lstnumber-\@ne\relax%
}%
}
\newcommand*\Reactivatenumber{%
\lst@AddToHook{OnNewLine}{%
\let\thelstnumber\origthelstnumber%
\advance\c@lstnumber\@ne\relax}%
}
\makeatother
\begin{document}
\begin{lstlisting}
|\Suppressnumber|
int main () { |\Reactivatenumber|
printf("hello\n");
while (1) {
;
if (0)
;{|\Suppressnumber|
} else { |\Reactivatenumber|
int b;
scanf("%d", &b);|\Suppressnumber|
}
}
}
\end{lstlisting}
\end{document}
输出