为什么管理环境中的计数器和标签会导致 \ref 获取错误的值?

为什么管理环境中的计数器和标签会导致 \ref 获取错误的值?

使用以下代码,我准备了自己的自定义计数器并将其用于命令中,同时还创建了一个标签。然后我使用几种类型的命令,并\ref在每个命令中使用创建的标签。

\documentclass{article}

\newcounter{mycounter}
\refstepcounter{mycounter}

\newcommand{\mynumberedelement}[2]{
    \label{#1}
    \textbf{\arabic{mycounter}}
    \refstepcounter{mycounter}
    #2
}

\begin{document}



\mynumberedelement{mylabel1}{A first element numbered 1}

\emph{Reference to 1} : \ref{mylabel1}



\mynumberedelement{mylabel2}{A second element numbered 2}

\emph{Reference to 2} : \ref{mylabel2}



\mynumberedelement{mylabel3}{A third element numbered 3}

\emph{Reference to 3} : \ref{mylabel3}



\mynumberedelement{mylabel4}{A second element numbered 4}

\emph{Reference to 4} : \ref{mylabel4}


\end{document}

结果正如我所料:

在此处输入图片描述

接下来,我添加一个新环境,没有其他的然后调用我的命令,并用这个环境替换我的一个命令:

\documentclass{article}

\newcounter{mycounter}
\refstepcounter{mycounter}

\newcommand{\mynumberedelement}[2]{
    \label{#1}
    \textbf{\arabic{mycounter}}
    \refstepcounter{mycounter}
    #2
}

\newenvironment{mynumberedenvironment}[2]{\mynumberedelement{#1}{#2}}{}


\begin{document}



\mynumberedelement{mylabel1}{A first element numbered 1}

\emph{Reference to 1} : \ref{mylabel1}



\mynumberedelement{mylabel2}{A second element numbered 2}

\emph{Reference to 2} : \ref{mylabel2}



\begin{mynumberedenvironment}{mylabel3}{A third element numbered 3, in an environment}
\end{mynumberedenvironment}

\emph{Reference to 3} : \ref{mylabel3}



\mynumberedelement{mylabel4}{A second element numbered 4}

\emph{Reference to 4} : \ref{mylabel4}


\end{document}

这次,结果不如我所料

在此处输入图片描述

正如您所见,最后一个引用不起作用。

为什么简单地将命令包装在环境中会弄乱这种引用?我应该怎么做才能让它工作?

答案1

我无法解释为什么你会得到这样的效果,但更合适的做法是增加计数器在你打算使用它之前,也更加干净。

\documentclass{article}

\newcounter{mycounter}

\newcommand{\mynumberedelement}[2]{
    \refstepcounter{mycounter} % <------
    \label{#1}
    \textbf{\arabic{mycounter}}
    #2
}

\newenvironment{mynumberedenvironment}[2]{\mynumberedelement{#1}{#2}}{}


\begin{document}



\mynumberedelement{mylabel1}{A first element numbered 1}

\emph{Reference to 1} : \ref{mylabel1}



\mynumberedelement{mylabel2}{A second element numbered 2}

\emph{Reference to 2} : \ref{mylabel2}



\begin{mynumberedenvironment}{mylabel3}{A third element numbered 3, in an environment}
\end{mynumberedenvironment}

\emph{Reference to 3} : \ref{mylabel3}



\mynumberedelement{mylabel4}{A second element numbered 4}

\emph{Reference to 4} : \ref{mylabel4}


\end{document}

在此处输入图片描述

作为额外的奖励,计数器和文本之间的间距正确。在原始帖子中,它们被两个空格隔开(一个在行后\textbf{\arabic{mycounter}},一个在行后)\refstepcounter{mycounter}。现在,只剩下一个空格。


更新:也许这有帮助。这是从LaTeX2e 非官方参考手册第 13.6 节\refstepcounter

此外,该命令还将当前 \ref 值定义为 \thecounter 的结果。

虽然计数器值是全局设置的,但 \ref 值是本地设置的,即在当前组内设置的。

因此,全局设置和本地设置之间存在一些问题。

答案2

\label命令始终引用使用 生成的最后一个数字\refstepcounter。因此,如果您有类似

\section{Foo}

Some text

\label{x}

\refstepcounter{mycounter}

标签将引用节号。这就是您的代码所发生的情况:\label始终是相关 的\refstepcounter.

修复如下。另请查看定义中的%和。\par

\documentclass{article}

\newcounter{mycounter}

\newcommand{\mynumberedelement}[2]{%
    \par
    \refstepcounter{mycounter}\label{#1}%
    \textbf{\arabic{mycounter}} #2\par
}

\begin{document}

\mynumberedelement{mylabel1}{A first element numbered 1}

\emph{Reference to 1}: \ref{mylabel1}


\mynumberedelement{mylabel2}{A second element numbered 2}

\emph{Reference to 2}: \ref{mylabel2}


\mynumberedelement{mylabel3}{A third element numbered 3}

\emph{Reference to 3}: \ref{mylabel3}


\mynumberedelement{mylabel4}{A second element numbered 4}

\emph{Reference to 4}: \ref{mylabel4}

\end{document}

在此处输入图片描述

相关内容