我正在使用以下命令为我在文档后面提到的不同事物定义一个自定义计数器。
\usepackage{cleveref}
\newcommand{\customcounter}[2]{%
\newcounter{#1} \setcounter{#1}{0} \crefname{#1}{#2}{#2s}
\expandafter\newcommand\csname #1\endcsname[1]{\noindent%
\refstepcounter{#1}\textbf{#2\arabic{#1}}\label{##1}\\%
\makeatletter
}
}
\customcounter{goal}{G}
\customcounter{functionalrequirement}{FR}
引用事物时,我通常会从编辑器(带有 tex workshop 或 TexStudio 的 Visual Studio Code)获得提示。但是当使用以这种方式定义的标签时,它不会拾取标签。
我对此有两个解决方案:
- 将标签移出命令并直接写在命令后面(因此 \goal{g:reach-himalaya} 将变成 \goal\label{g:reach-himalaya})。但这不起作用,因为标签现在指向最后一节而不是我的目标。
- 创建一个 .tex 文件,在其中再次打印我生成的所有标签。然后将此文件包含在 false if 块内的 \input 中。这样,IDE 会拾取标签,但生成仍然有效。我无法让它工作,因为它不允许我正确地将命令打印到文件中
现在我的问题是:我如何才能正确地实施这些解决方案?我认为1代码更简洁,不需要太多的变通方法。另一方面,解决方案2也很有趣,因为它使命令的使用更容易。
答案1
我找到了一种解决方法,它与第一个提出的解决方案非常相似。我从命令定义中拉出了 \label 部分。代码现在如下所示:
\usepackage{cleveref}
\newcommand{\customcounter}[2]{%
\newcounter{#1} \setcounter{#1}{0} \crefname{#1}{#2}{#2s} \crefformat{#1}{#2##2##1##3}
\expandafter\newcommand\csname #1\endcsname[1]{\noindent%
\refstepcounter{#1}\textbf{#2\arabic{#1}}##1\\%
}
}
\customcounter{goal}{G}
并可与以下产品一起使用:
\goal{\label{g:reach-himalaya}}