使用以下代码,我准备了自己的自定义计数器并将其用于命令中,同时还创建了一个标签。然后我使用几种类型的命令,并\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}