全局计数器作为参数

全局计数器作为参数

我需要一个全局计数器,可以将其用作方法的参数。当它用作参数时,我只想要它的当前值...因此该方法接收的是一个数字,而不是计数器。希望我说得清楚。

您对如何创建这样的设置有什么建议吗?

下面是一个示例,显示了我遇到的计数器意外增加的问题:

\documentclass{article}
\usepackage{xparse}

\newcounter{myCounter}

\NewDocumentCommand{\GetUinuqieID}{}{%
    \stepcounter{myCounter}\themyCounter
}

\makeatletter%
% Arguments:
%  1) The text
%  2) The label
\newcommand*{\textlabel}[2]{%
  \edef\@currentlabel{#1}% Set target label
   #1\phantomsection\label{#2}% Print and store label
}
\makeatother

\begin{document}

\textlabel{\GetUinuqieID}{DDD} % prints 1, expected
\ref{DDD} % prints 2, expected 1
\textlabel{\GetUinuqieID}{FFF}
\ref{FFF} 
\textlabel{\GetUinuqieID}{GGG}
\ref{GGG} 
\end{document}

答案1

能够引用计数器的通常方式是使用\refstepcounter而不是\counter,然后下一个\label将自动选择正确的值。

就像是

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}

\newcounter{myCounter}

\NewDocumentCommand{\GetUinuqieID}{}{%
  \refstepcounter{myCounter}\themyCounter
}

\makeatletter%
% Arguments:
%  1) The text
%  2) The label
\newcommand*{\textlabel}[2]{%
  #1\label{#2}% Print and store label
}
\makeatother

\begin{document}

\textlabel{\GetUinuqieID}{DDD} % prints 1, expected
\ref{DDD} % prints 2, expected 1
\textlabel{\GetUinuqieID}{FFF}
\ref{FFF} 
\textlabel{\GetUinuqieID}{GGG}
\ref{GGG} 
\end{document}

应该工作并给予

1 1 2 2 3 3

正如预期的那样。

根据预期的用例,这可能会稍微简化一些。

事实上,问题中的代码的问题是(除其他外)这\GetUinuqieID是一个强大的命令,这意味着它没有扩展为中的数字\edef\@currentlabel。相反,标签被写成\GetUinuqieID,并且该命令仅在标签打印为时才扩展\ref,这意味着此时计数器将再次递增,导致

1 2 3 4 5 6

相关内容