如何在 v1.5 中获取 v1.3 的列表包行号行为?

如何在 v1.5 中获取 v1.3 的列表包行号行为?

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}

相关内容