智能使用标签和 newcounter

智能使用标签和 newcounter

我在文档中跟踪一系列任务。我们将它们称为 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}

在此处输入图片描述

相关内容