在listings
包 v1.3 中,当包含文件中的行时,编号来自文件,即使省略了行(绝对数字)。但在 v1.5 中,编号忽略了文件中的位置,并使用相对的相对于列表的数字。
如何在 v1.5 中获得 v1.3 的行为?(请参阅下文了解您可能需要这样做的原因。)
例如,考虑文件中的 Java 源代码Example.java
:
public class Example implements StringHandler {
/**
* Prints the given string.
*
* @param s the given string
*/
@Override
public void handle(String s) {
System.out.println(s);
}
}
以下 LaTeX 代码将抑制该javadoc
标签:
\lstinputlisting[numbers=left,linerange={1-4,7-13}]{Example.java}
在 v1.3 中它产生:
1 public class Example implements StringHandler {
2
3 /**
4 * Prints the given string.
7 */
8 @Override
9 public void handle(String s) {
10 System.out.println(s);
11 }
12
13 }
但在 v1.5 中它会产生:
1 public class Example implements StringHandler {
2
3 /**
4 * Prints the given string.
5 */
6 @Override
7 public void handle(String s) {
8 System.out.println(s);
9 }
10
11 }
显示源文件中代码行所在的实际行号有助于读者找到它们。在上面的例子中,这不是问题。但想象一下列出包含数百行代码的文件中的代码片段。
答案1
现在我们开始黑客攻击。我这样做是因为\lst@lineno
在我的短暂测试中,有一半是不可预测的。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{\jobname-Example.java}
public class Example implements StringHandler {
/**
* Prints the given string.
*
* @param s the given string
*/
@Override
public void handle(String s) {
System.out.println(s);
}
}
\end{filecontents*}
\usepackage{listings}
\makeatletter
\def\lsthk@EveryPar
{% \show\lst@firstline
% \show\lst@advancelstnum
\ifnum\c@lstnumber<\lst@firstline
\global\c@lstnumber\numexpr-\lst@advancelstnum+\lst@firstline
% \lst@firstline contains ending \relax !!??!!??!!, so we use it
% \lst@advancelstnum is \@ne per defaul
\fi
\global\advance\c@lstnumber\lst@advancelstnum
\global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}%
\lst@SkipOrPrintLabel}%
\makeatother
\begin{document}
\lstinputlisting[numbers=left,linerange={1-4,7-13}]{\jobname-Example.java}
\end{document}
答案2
虽然我找不到您的问题的确切解决方案,但使用关键字“firstnumber”也许可以解决问题:
\lstinputlisting[numbers=left, linerange={1-4}, firstnumber=1]{Example.java}
\lstinputlisting[numbers=left, linerange={7-13}, firstnumber=7]{Example.java}