如何引用列表中行数的计数值

如何引用列表中行数的计数值

我需要引用列表中行数的计数值。有办法吗?

    \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}

结果

顺便说一句[题外话]:这个例子中的代码行数是另一个问题的答案。

相关内容