![如何在列表中引用源代码的行号,而无需手动添加标签?](https://linux22.com/image/404085/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%88%97%E8%A1%A8%E4%B8%AD%E5%BC%95%E7%94%A8%E6%BA%90%E4%BB%A3%E7%A0%81%E7%9A%84%E8%A1%8C%E5%8F%B7%EF%BC%8C%E8%80%8C%E6%97%A0%E9%9C%80%E6%89%8B%E5%8A%A8%E6%B7%BB%E5%8A%A0%E6%A0%87%E7%AD%BE%EF%BC%9F.png)
我用listings
它来编写我的 Matlab 代码。在那里我可以使用\label
和\ref
命令让读者直接找到我的代码和行号。
\begin{lstlisting}[caption={Code for deflection at the point of intersection},label={lst:A.1},numbers=left,escapeinside={@}{@}]
@\label{lst:Li11}@In_x = X_num - 1;
\end{lstlisting}
As you can see in listing \ref{lst:A.1} line number \ref{lst:Li11}
我的代码有 700 行,我必须通过交叉引用来讨论每一行代码。正如你所见,这很累。还有其他方法可以让我快速标记行号吗?
答案1
listings
不会自动为每个行号添加标签,但我们可以使用钩子EveryPar
来做到这一点。以下代码根据列表的label
值加上用连字符分隔的行号为每行定义一个标签,因此在您的示例中lst:A.1-1
,lst:A.1-2
等等。
\documentclass{article}
\usepackage{listings}
\usepackage{hyperref}
\makeatletter
\lst@AddToHook{EveryPar}{%
\edef\@temp{\noexpand\label{\lst@label-\arabic{lstnumber}}}%
\@temp
}
\makeatother
\begin{document}
\begin{lstlisting}[
caption={Code for deflection at the point of intersection},
label={lst:A.1},
numbers=left,
basicstyle=\ttfamily,
escapeinside={@}{@}]
foo
bar
@\label{lst:Li11}@In_x = X_num - 1;
baz
\end{lstlisting}
As you can see in listing \ref{lst:A.1} line number \ref{lst:Li11} ...
As you can see in listing \ref{lst:A.1} line numbers \ref{lst:A.1-1}--\ref{lst:A.1-3} ...
\end{document}