自定义计数器和交叉引用

自定义计数器和交叉引用

我创建了一个自定义计数器“rtaskno”和一个命令“\rtask”,如下所示:

\newcounter{rtaskno}
\newcommand{\rtask}{%
   \stepcounter{rtaskno}%
   \thertaskno}

我喜欢按如下方式使用它们:

\section{Task \rtask. Blah Blah..}

\section{Task \rtask. Blah Blah..}

\section{Task \rtask. Blah Blah..}

\section{Task \rtask. Blah Blah..}

如果我想在文本后面交叉引用“任务 3”,我该怎么做?标签放在哪里?

答案1

你的问题中存在棘手的时间问题。如果你要准备目录,那么现在的情况就会失败。

也许最好的办法是使用两次传递策略:

\newcounter{rtaskno}
\newcommand{\rtask}[1]{\refstepcounter{rtaskno}\label{#1}}

当你想在章节标题中使用任务编号时,你可以这样写

\rtask{label}
\section{Task \ref{label}. Blah}

答案2

您需要使用\refstepcounter而不是\stepcounter来使您的计数器对引用机制“可见”。标签可以放在 之后的任何位置,\refstepcounter只要它在下一个标签之前即可\refstepcounter(例如下一个定理环境、章节标题等...

使用它里面章节标题可能会比较棘手。

答案3

有两点需要注意:1) 您需要使用\refstepcounter而不是\stepcounter,2) 由于您要\rtask在 sectionning 命令中使用 ,因此您必须保护它,或者更好的是,从一开始就将其声明为健壮的。我还包含了定义的参数,以便您可以获得交叉引用所需的标签:

编辑:如果创建了目录,这种方法将彻底失败。一种可能的解决方法是使用可选参数\section,但我不太喜欢这个选项。有关创建目录时的正确可能解决方案,请参阅 egreg 的答案。

\documentclass{article}

\newcounter{rtaskno}
\DeclareRobustCommand{\rtask}[1]{%
   \refstepcounter{rtaskno}%
   \thertaskno\label{#1}}

\begin{document}

\section{Task \rtask{task:one}. Blah Blah..}

\section{Task \rtask{task:two}. Blah Blah..}

\section{Task \rtask{task:three}. Blah Blah..}

\section{Task \rtask{task:four}. Blah Blah..}

Task~\ref{task:four}

\end{document}

答案4

您可以为此创建一个新命令:

\newcommand{\newTask}[2]{\section{Task \rtask. #2}\label{#1}}

并按如下方式使用它:

\newTask{t:first}{Blah Blah..}
\newTask{t:second}{Blah Blah..}
\newTask{t:third}{Blah Blah..}

相关内容