我需要一个全局计数器,可以将其用作方法的参数。当它用作参数时,我只想要它的当前值...因此该方法接收的是一个数字,而不是计数器。希望我说得清楚。
您对如何创建这样的设置有什么建议吗?
下面是一个示例,显示了我遇到的计数器意外增加的问题:
\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