我创建了一个自定义计数器“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..}