我需要引用列表中行数的计数值。有办法吗?
\lstinputlisting[caption={SPARQL query used...},label={lst:sqry}]{codes/sparql_query.sparql}
我可以使用 \ref{lst:sqry} 在文档中引用此列表,但我需要能够自动计算该列表中的行数并引用该值。
我将非常感激任何帮助。
答案1
下面的代码应该使用 counter 来实现这个效果lst@lineno
。该示例在列表之后创建了一个包含行数的引用:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{listings}
\makeatletter
\newcommand*{\lstcountlabel}[1]{%
\@bsphack
\begingroup
\edef\@currentlabel{\the\numexpr\the\lst@lineno-1}%
\label{#1}%
\endgroup
\@esphack
}
\makeatother
\begin{document}
\lstinputlisting[
language={[LaTeX]TeX},
columns=flexible,
numbers=left,
basicstyle=\ttfamily,
caption={The listings has \ref{lst:job} lines.},
]
{\jobname.tex}
\lstcountlabel{lst:job}
\end{document}
答案2
该解决方案采用了不同的方法,并作为问题的答案而写成“列表:总行数计数”关闭得太快了。
此解决方案使用的方法不同于我的其他答案:
标签也用于记住代码行数。此变体使用包
zref
来实现此目的。代码行数通过列表标题中的宏提供
\mylstlines
。这样用户就无需发明唯一的标签名称。计数器mylstlisting
标识列表,其值用于标签名称中。代码行数通过
mylstlines
挂接到列表钩子上的计数器进行计数EveryPar
。这样,的值mylstlines
就不会受到影响所选行范围(firstline
)或更改打印行号(firstnumber
)的选项的影响。
示例文件:
\documentclass[a4paper]{article}
\usepackage{listings}
\usepackage{zref-base}
\makeatletter
\newcounter{mylstlisting}
\newcounter{mylstlines}
\lst@AddToHook{PreSet}{%
\stepcounter{mylstlisting}%
\setcounter{mylstlines}{0}%
}
\lst@AddToHook{EveryPar}{%
\stepcounter{mylstlines}%
}
\lst@AddToHook{ExitVars}{%
\begingroup
\zref@wrapper@immediate{%
\zref@setcurrent{default}{\the\value{mylstlines}}%
\zref@labelbyprops{mylstlines\the\value{mylstlisting}}{default}%
}%
\endgroup
}
% \mylstlines print number of lines inside listing caption
\newcommand*{\mylstlines}{%
\protect\zref@extract{mylstlines\the\value{mylstlisting}}{default}%
}
\makeatother
% cosmetics
\usepackage[T1]{fontenc}
\usepackage[variablett]{lmodern}
\lstset{basicstyle=\ttfamily, columns=fullflexible,
numbers=left, stepnumber=1}
\begin{document}
\lstlistoflistings
\lstinputlisting[%
language={[LaTeX]TeX},
caption={Example with \mylstlines\ lines.},
]{\jobname}
\end{document}
顺便说一句[题外话]:这个例子中的代码行数是另一个问题的答案。