列表:仅跳过定义命令的行号

列表:仅跳过定义命令的行号

我查看了以下内容:

  1. 抑制列表包中空行的行号
  2. 抑制列表包中特定行的行号

然而,后一个线程中给出的解决方案只跳过了这一行命令|\Suppressnumber|已给出,同样,仅恢复编号给出命令|\Reactivatenumber|。换句话说,这给出了跳过的数字范围。

我想要的是:

  1. 需要抑制空行的行号(以及计数器不是递增:这个问题在上面的第一篇文章中已经解决);
  2. 对于指定的线路仅有的,而不是一个范围,以抑制其行号没有增加计数器。

使用一些非常例如,人为的 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、、和,但我无法想到这样做的方法。EOLEveryParInitVarsBOLInitVarsEOL

答案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}

输出

在此处输入图片描述

相关内容