我在文档中跟踪一系列任务。我们将它们称为 A(任务 1)、B(任务 2)和 C(任务 3)。我尝试创建一个命令,\mytask
该命令允许我根据标签添加任务,以及在任务发展过程中将添加到文档命令的其他参数。
当我添加任务时,我希望能够引用它们并确定它们的状态是New
、 或Continuing
。现在,我试图用\@ifundefined{r@#1}
和标签Defined
和来区分它们的状态Undefined
。
令我惊讶的是,当我将其包含\refstepcounter{task}\label{#1}%
在命令中时,我得到了非常奇怪的编号,并且逻辑iflabelexists
似乎对命令的位置不敏感\label
。
我的输出是:
1 测试
1.1 定义任务 4
1.2 定义B任务3
1.3 定义B任务3
1.4 定义任务 4
1.5 定义C任务 5
虽然我有点预料到这些数字会因为 IO 而有点交错,但在\refstepcounter
显示任务编号的标题之后,我没想到 A 的数字会比 B 大。此外,我预计状态(已定义或未定义)为:
1 测试
1.1 未定义
1.2 未定义 B
1.3 定义B
1.4 定义
1.5 定义C
我无法解释为什么使用refstepcounter
切换 ifundefined 标志,但我猜测
if Exists(A) == false
Show title demonstrating the proof that the label hasn't been created yet
create label and counter
% NOTE: this logic is proof of concept only, real situation, this can not be worked around by starting from a lower counter number
else
% label already exists
Show title demonstrating the proof that the label has been created yet
Don't increase counter
失败与 Tex 需要多次运行编译器有关...最初我以为我的 TOC 正在切换标签的第一次使用,但我认为我遇到了更大的问题。
是否有一种动态的方式可以使用这样的自定义计数器?
梅威瑟:
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\usepackage{cleveref}
\makeatletter
\newcommand{\iflabelexists}[3]{\@ifundefined{r@#1}{#3}{#2}}
\makeatother
\newcounter{task}
\renewcommand{\thetask}{\arabic{task}}
\crefname{task}{task}{task}
\NewDocumentCommand{\mytask}{ m }
{
% #1 - Task label
\iflabelexists{#1}%
{%
\subsection{Defined $#1$ \cref{#1}}%
}{%
\subsection{Undefined $#1$ \cref{#1}}%
\refstepcounter{task}\label{#1}%
}%
}
\begin{document}
\section{Tests}
\setcounter{task}{0}% Start value
\mytask{A}
\mytask{B}
\mytask{B}
\mytask{A}
\mytask{C}
\end{document}
答案1
请考虑以下示例:
\documentclass{article}
\begin{document}
\section{Test}\label{test}
\makeatletter
\@ifundefined{r@test}{undefined}{defined}
\makeatother
\end{document}
第一次运行 LaTeX 时它将打印“undefined”,下次运行时它将打印“defined”。
\label{test}
处理时,LaTeX 会在文件\newlabel{test}{{1}{1}}
中写入.aux
内容,但没有定义\r@test
。它\newlabel{test}{{1}{1}}
确实如此,所以测试
\@ifundefined{r@#1}
您正在使用的不会达到您的目标。
您必须为此定义自己的宏。
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\usepackage{cleveref}
\makeatletter
\newcommand{\iflabelexists}[3]{\@ifundefined{engbirdr@#1}{#3}{#2}}
\makeatother
\newcounter{task}
\renewcommand{\thetask}{\arabic{task}}
\crefname{task}{task}{task}
\makeatletter
\NewDocumentCommand{\mytask}{ m }
{
% #1 - Task label
\iflabelexists{#1}%
{%
\subsection{Defined $#1$ \cref{#1}}%
}{%
\subsection{Undefined $#1$ \cref{#1}}%
\global\expandafter\let\csname engbirdr@#1\endcsname\@empty
\refstepcounter{task}\label{#1}%
}%
}
\makeatother
\begin{document}
\section{Tests}
\setcounter{task}{0}% Start value
\mytask{A}
\mytask{B}
\mytask{B}
\mytask{A}
\mytask{C}
\end{document}