宏如何知道一个值已经出现过多少次以及还会出现多少次?

宏如何知道一个值已经出现过多少次以及还会出现多少次?

使用 ConTeXt,我有一个可以赋予唯一键值的宏:

\macro{000010}
\macro{000011}
\macro{000010}
\macro{000010}
\macro{000012}
\macro{000011}

我需要能够访问该值在文档中迄今为止出现的次数以及该值总共出现的次数的信息。上面的代码将为我提供以下信息:

1/3
1/2
2/3
3/3
1/1
2/2

信息不仅仅显示在页面中,我需要访问这些信息以便在条件中使用。

我如何才能获得有关宏持有某个值的次数以及该值在整个文档中将持有多少次的信息?

答案1

在 ConTeXt 中执行此操作的规范方法是使用计数器(并context负责适当次数的运行)。

\unexpanded\define[1]\macro
    {\ctxcommand{doifnotstructurecounter("macro::#1")}
        {\definestructurecounter[macro::#1]}%
     \incrementstructurecounter[macro::#1]%
     \rawstructurecounter[macro::#1]/\laststructurecounter[macro::#1]}

笔记:我不得不使用低级 Lua 函数,doifnotstructurecounter因为 TeX 包装器中有一个错误\doifundefinedstructurecounter。一旦修复了这个错误,您就可以用替换第一行\doifundefinedstructurecounter{macro::#1}

你可能也会对我的实验感兴趣视觉计数器模块可以很好地直观地显示计数器。

答案2

这需要运行几次才能得到总数:

\documentclass{article}

\makeatletter
\def\macro#1{%
\expandafter\ifx\csname count#1\endcsname\relax
  \expandafter\gdef\csname count#1\endcsname{0}%
  \AtEndDocument{%
    \immediate\write\@auxout{%
      \global\noexpand\@namedef{maxcount#1}{\csname count#1\endcsname}}}%
\fi
\count@\csname count#1\endcsname
\advance\count@\@ne
\the\count@/\csname maxcount#1\endcsname
\expandafter\xdef\csname count#1\endcsname{\the\count@}}
\makeatother
\begin{document}

\macro{000010}

\macro{000011}

\macro{000010}

\macro{000010}

\macro{000012}

\macro{000011}

\end{document}

在此处输入图片描述

相关内容