答案1
您可以扩展抑制列表包中特定行的行号使用circledsteps
包(见https://tex.stackexchange.com/a/496665/) 表示行号:
\documentclass{article}
\usepackage{circledsteps}
\pgfkeys{/csteps/inner color=white}
\pgfkeys{/csteps/fill color=black}
\usepackage{listings}
\lstset{numbers=left,numberblanklines=false,escapeinside=||}
\def\origthelstnumber{\Circled{\arabic{lstnumber}}}
\makeatletter
\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}
\Suppressnumber
\begin{lstlisting}[language=C]
void func(int arr[5]);
int main(void) {|\Reactivatenumber|
unsigned int i = 0;|\Suppressnumber|
unsigned int j = 0;
int arr[3][5];|\Reactivatenumber|
func(arr[i]);|\label{someline}|
int x = arr[i][j];|\label{otherline}\Suppressnumber|
return 0;
}
\end{lstlisting}
Interesting lines are \Circled{\ref{someline}} and \Circled{\ref{otherline}}.
\end{document}
当然,这只适用于内联列表,而不适用于\lstinputlisting
,因为您需要插入 LaTeX 代码来打开和关闭数字并在列表中手动设置标签。
如果你希望源保持不变,那么你可以使用以下命令精心设计的解决方案基于在 Minted 中跳过行号并从特定数字继续?(这是针对 Minted 的,但对于 Listings 来说,其工作原理大致相同)。在这里,您需要手动设置哪一行获得哪个编号,并手动编号参考资料。
\begin{filecontents*}{matrices.c}
void func(int arr[5]);
int main(void) {
unsigned int i = 0;
unsigned int j = 0;
int arr[3][5];
func(arr[i]);
int x = arr[i][j];
return 0;
}
\end{filecontents*}
\documentclass{article}
\usepackage{circledsteps}
\pgfkeys{/csteps/inner color=white}
\pgfkeys{/csteps/fill color=black}
\usepackage{listings}
\lstset{numbers=left}
\let\origlstnumber\thelstnumber
\def\thelstnumber{%
\ifnum\value{lstnumber}=6\Circled{1}\fi%
\ifnum\value{lstnumber}=7\Circled{2}\fi%
}
\begin{document}
\section*{Selected circled numbers}
\lstinputlisting[language=C]{matrices.c}
Interesting lines are \Circled{1} and \Circled{2}.
\let\thelstnumber\origlstnumber
\section*{Normal numbers}
\lstinputlisting[language=C]{matrices.c}
\end{document}
请注意,C 代码也包含在该文件中,但仅在filecontents
用于演示目的的环境中,如果您有原始文件,则没有必要。