一个标签被引用了多少次?哪一个被引用最多?

一个标签被引用了多少次?哪一个被引用最多?

给定一个 LaTeX 文档,我想使用一种自动方法来了解所有标签中哪一个是被引用最多的,哪一个是被引用第二多的等等。我给你举个例子来说明。假设我们有这个文档:

\documentclass{article}

\usepackage{amsthm}

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}{Lemma}

\begin{document}
 \begin{lemma}
  \label{lm:1} Content of the first lemma.
 \end{lemma}
 Using lemma~\ref{lm:1} we have the following:
 \begin{lemma}
  \label{lm:2} Content of the second lemma.
 \end{lemma}
 Another consequence of lemma~\ref{lm:3} is the following:
 \begin{lemma}
  \label{lm:3} Content of the third lemma.
 \end{lemma}
 Finally, combining lemmas~\ref{lm:1},~\ref{lm:2},~\ref{lm:3} we have the following:
 \begin{theorem}
  \label{th:1}
 \end{theorem}
\end{document}

在这种情况下,我希望看到的列表如下:

  1. 流明:1

  2. 流明:3

  3. 流明:2

  4. 第:1

由于 lm:1 和 lm:2 都被引用两次,因此另一个可接受的列表如下:

  1. 流明:3

  2. 流明:1

  3. 流明:2

  4. 第:1

我不需要每个可能的列表,其中一个就足够了。

编辑:如果在制作此类列表的过程中,我们想要忽略以特定前缀开头的每个标签,该怎么办?假​​设我们想要忽略上例中以“lm”开头的每个标签。那么所需的输出将如下所示:

  1. 第:1

答案1

这里有一种方法:

\documentclass{article}

\usepackage{amsthm}
\usepackage{pgffor}
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}{Lemma}

\let\oldref\ref
\let\oldlabel\label
\newcounter{labls}
\makeatletter
\def\ref#1{%
\@ifundefined{refrs@#1}{\xdef\temp{1}\expandafter\expandafter\expandafter\global\expandafter\let\csname refrs@#1\endcsname\temp}{%
\xdef\temp{\expandafter\expandafter\expandafter\number\expandafter\numexpr\csname refrs@#1\endcsname+1\relax}\expandafter\expandafter\expandafter\global\expandafter\let\csname refrs@#1\endcsname\temp\oldref{#1}}%
}

\def\label#1{%
\@ifundefined{labls@#1}
{\stepcounter{labls}}%
{Error:Already Defined Label: #1}
\@ifundefined{refrs@#1}{\xdef\temp{0}\expandafter\expandafter\expandafter\global\expandafter\let\csname refrs@#1\endcsname\temp}{\relax}%
\xdef\temp{#1}%
\expandafter\expandafter\expandafter\global\expandafter\let\csname LabelName\arabic{labls}\endcsname\temp\oldlabel{#1}%
}
\makeatother



\newcommand\reflist[1][]{%
\foreach\i in {1,...,\value{labls}}{%
\expandafter\expandafter\expandafter\global\expandafter\let\csname printed\i\endcsname\undefined%
}%
\foreach\k in {1,...,\value{labls}}{%
\xdef\maxRefs{-1}%
\xdef\printLabelNum{\k}%
\xdef\printLabelName{\csname LabelName\k\endcsname}%
\foreach \l in {1,...,\value{labls}}{%
\xdef\CurLabel{\csname LabelName\l\endcsname}%
\xdef\CurNum{\l}%
\xdef\CurRefs{\csname refrs@\CurLabel\endcsname}%
\ifnum\CurRefs > \maxRefs
\ifcsname printed\l\endcsname
\relax
\else
\xdef\maxRefs{\CurRefs}%
\xdef\printNum{\l}%
\fi
\fi
}%
{\bfseries \k)\csname LabelName\printNum\endcsname\xdef\t{#1}\ifx\t\empty\relax\else:~\maxRefs\fi\ifnum\k<\value{labls}\\\fi}%
\expandafter\expandafter\expandafter\global\expandafter\let\csname printed\printNum\endcsname\maxRefs%
}%
}

\begin{document}
 \begin{lemma}
  \label{lm:1} Content of the first lemma.
 \end{lemma}
 Using lemma~\ref{lm:1} we have the following:
 \begin{lemma}
  \label{lm:2} Content of the second lemma.
 \end{lemma}
 Another consequence of lemma~\ref{lm:3} is the following:
 \begin{lemma}
  \label{lm:3} Content of the third lemma.
 \end{lemma}

 Finally, combining lemmas~\ref{lm:1},~\ref{lm:2},~\ref{lm:3} we have the following:
 \begin{theorem}
  \label{th:1}
 \end{theorem}

\noindent\reflist\vspace{1cm}

%You may add a non empty optional argument to print the appearances
\noindent\reflist[ ]

\end{document}

在此处输入图片描述

答案2

对于这种应用程序,我经常发现使用解析文本文件的脚本语言更容易。下面是一个使用 unix 工具的示例,其中您的文件名为doc.tex

   sed "s:\}:\}\n:g" doc.tex |\
   sed -rn "s:.*ref\{(.*)\}.*:\1:p" |\
   sort | uniq --count

这输出

      2 lm:1
      1 lm:2
      2 lm:3

然后您可以通过管道将其排序sort -r

第一个 sed 命令在 } 后插入换行符,以下命令匹配 \ref{} 模式,但每行只匹配一次,这就是使用前一个命令的原因。后续命令不言自明。

要忽略标签,你可以使正则表达式更具体,或者过滤上面的输出

相关内容