使用给定标签的计数器值

使用给定标签的计数器值

我定义了两个新的计数器和两个宏。第一个宏\requirement只是增加计数器requirement。第二个宏\subrequirement基本上做同样的事情,但用作requriment参考。两个宏都定义了一个新标签。

现在我想传递一个已经定义的标签并使用传递的标签中的\subrequirement计数器值requirement无需重置实际计数器 requirement

\documentclass[a4paper, 12pt]{scrartcl}

\usepackage{etoolbox} % Used anyway in the document
\usepackage{hyperref} % Used if important for question

% Define counter
\newcounter{requirement}
\newcounter{subrequirement}[requirement]

% Define new commands
\newcommand{\requirement}[1]{%
    \refstepcounter{requirement}R\therequirement%
    \label{req:#1}%
}%
\newcommand{\subrequirement}[2][]{%
    \ifstrempty{#1}{%
        \refstepcounter{subrequirement}R\therequirement.\thesubrequirement%
        \label{subreq:#2}%
    }{%
        % use passed label as reference counter
%        \refstepcounter{subrequirement}R\therequirement.\thesubrequirement%
%        \label{subreq:#2}%
    }%
}%

\begin{document}
    Define requirement: \requirement{request} (R1)

    Reference request \ref{req:request}

    Define second requirement: \requirement{need-help} (R2)

    Define subrequirement \subrequirement{need-help-1} (R2.1) and \subrequirement{need-help-2} (R2.2)

    Define subrequirement of with passed reference \subrequirement[request]{request-1} (R1.1 wanted)

    Define requirement \requirement{tex-SX} (R3 is desired)
\end{document}

编辑1:(肮脏的)解决方案 - 手动设置子计数器

\documentclass[a4paper, 12pt]{scrartcl}

\usepackage{etoolbox} % Used anyway in the document
\usepackage{xparse}
\usepackage{hyperref} % Used if important for question

% Define counter
\newcounter{requirement}
\newcounter{subrequirement}[requirement]

% Define new commands
\newcommand{\requirement}[1]{%
    \refstepcounter{requirement}R\therequirement%
    \label{req:#1}%
}%

\NewDocumentCommand{\subrequirement}{ O{} O{0} m}{%
    \ifstrempty{#1}{%
        \refstepcounter{subrequirement}R\therequirement.\thesubrequirement%
        \label{subreq:#3}%
    }{%
        % use passed label as reference counter
        \ifnumequal{#2}{0}{%
            R\ref{req:#1}.\thesubrequirement%
        }{%
            R\ref{req:#1}.#2%
        }%
        \label{subreq:#3}%
    }%
}

\begin{document}
    Define requirement: \requirement{request} (R1)

    Reference request \ref{req:request}

    Define second requirement: \requirement{need-help} (R2)

    Define subrequirement \subrequirement{need-help-1} (R2.1) and \subrequirement{need-help-2} (R2.2)

    Define subrequirement of with passed reference \subrequirement[request][1]{request-1} (R1.1 wanted)

    Define requirement \requirement{tex-SX} (R3 is desired)
\end{document}

edit 命令提供了第二个可选参数来手动设置子计数器。man 的问题是忽略是否已经有带子计数器的条目。

答案1

我使用属性列表来存储需求编号及其当前的子需求编号。

\subrequirement使用时不带可选参数,则使用当前需求编号。

\documentclass[a4paper, 12pt]{scrartcl}

\usepackage{xparse} 
\usepackage{hyperref}

\ExplSyntaxOn

% user interface
\NewDocumentCommand{\requirement}{m}
 {
  \faltfe_requirement:n { #1 }
 }
\NewDocumentCommand{\subrequirement}{om}
 {
  \IfNoValueTF { #1 }
   {
    \faltfe_requirement_sub:Vn \g_faltfe_requirement_current_tl { #2 }
   }
   {
    \faltfe_requirement_sub:nn { #1 } { #2 }
   }
 }

% variables
\prop_new:N \g_faltfe_requirement_prop
\int_new:N \g_faltfe_requirement_int
\tl_new:N \g_faltfe_requirement_current_tl

\cs_new_protected:Nn \__faltfe_requirement_currentlabel:n
 {
  #1
  \cs_set:cpx { @currentlabel } { #1 }
 }

\cs_new_protected:Nn \faltfe_requirement:n
 {
  \int_gincr:N \g_faltfe_requirement_int
  \prop_gput:Nnx \g_faltfe_requirement_prop
   { #1 }
   { \int_to_arabic:n { \g_faltfe_requirement_int } }
  \prop_if_in:NnF \g_faltfe_requirement_prop { #1@sub }
   {
    \prop_gput:Nnn \g_faltfe_requirement_prop { #1@sub } { 0 }
   }
  \tl_gset:Nn \g_faltfe_requirement_current_tl { #1 }
  % print the number and set the current label
  \use:c { phantomsection }
  R\__faltfe_requirement_currentlabel:n
   { \int_to_arabic:n { \g_faltfe_requirement_int } }
  \label{req:#1}
 }

\cs_new_protected:Nn \faltfe_requirement_sub:nn
 {
  \prop_gput:Nnx \g_faltfe_requirement_prop
   { #1@sub }
   { \int_to_arabic:n { 1 + \prop_item:Nn \g_faltfe_requirement_prop { #1@sub } } }
  % print the number and set the current label
  \use:c { phantomsection }
  R\__faltfe_requirement_currentlabel:n
   {
    \prop_item:Nn \g_faltfe_requirement_prop { #1 }
    .
    \prop_item:Nn \g_faltfe_requirement_prop { #1@sub }
   }
  \label{subreq:#2}
 }
\cs_generate_variant:Nn \faltfe_requirement_sub:nn { V }

\ExplSyntaxOff

\begin{document}

Define requirement: \requirement{request} (R1)

Reference request \ref{req:request}

Define second requirement: \requirement{need-help} (R2)

Define subrequirement \subrequirement{need-help-1} (R2.1)
and \subrequirement{need-help-2} (R2.2)

Define subrequirement of with passed reference
\subrequirement[request]{request-1} (R1.1 wanted)

Define requirement \requirement{tex-SX} (R3 is desired)

\ref{subreq:request-1}

\end{document}

我们\use:c { phantomsection }设置(有条件地hyperref加载)一个锚点。

在此处输入图片描述

tabularx有点问题,因为每个单元格都被排版多次,因此值会相应地增加。

不幸的是,该包没有提供了解第一次试验排版何时发生的钩子,所以我们只能在最后一步进行增量。

\documentclass[a4paper, 12pt]{scrartcl}

\usepackage{xparse}
\usepackage{tabularx}
\usepackage{hyperref}

%%% code starts here
\makeatletter
\providecommand{\TX@vwarn}{x} % in case tabularx is not loaded
\makeatother

\ExplSyntaxOn

% user interface
\NewDocumentCommand{\requirement}{m}
 {
  \faltfe_requirement:n { #1 }
 }
\NewDocumentCommand{\subrequirement}{om}
 {
  \IfNoValueTF { #1 }
   {
    \faltfe_requirement_sub:Vn \g_faltfe_requirement_current_tl { #2 }
   }
   {
    \faltfe_requirement_sub:nn { #1 } { #2 }
   }
 }

% variables
\prop_new:N \g_faltfe_requirement_prop
\int_new:N \g_faltfe_requirement_int
\tl_new:N \g_faltfe_requirement_current_tl

\cs_new_protected:Nn \__faltfe_requirement_currentlabel:n
 {
  #1
  \cs_set:cpx { @currentlabel } { #1 }
 }

\cs_new_protected:Nn \faltfe_requirement:n
 {
  \tl_if_empty:cF { TX@vwarn }
   {% we're not doing a trial typesetting, do it 
    \int_gincr:N \g_faltfe_requirement_int
    \prop_gput:Nnx \g_faltfe_requirement_prop
     { #1 }
     { \int_to_arabic:n { \g_faltfe_requirement_int } }
    \prop_if_in:NnF \g_faltfe_requirement_prop { #1@sub }
     {
      \prop_gput:Nnn \g_faltfe_requirement_prop { #1@sub } { 0 }
     }
   }
  \tl_gset:Nn \g_faltfe_requirement_current_tl { #1 }
  % print the number and set the current label
  \phantomsection
  R\__faltfe_requirement_currentlabel:n
   { \int_to_arabic:n { \g_faltfe_requirement_int } }
  \label{req:#1}
 }

\cs_new_protected:Nn \faltfe_requirement_sub:nn
 {
  \tl_if_empty:cF { TX@vwarn }
   {% we're not doing a trial typesetting
    \prop_gput:Nnx \g_faltfe_requirement_prop
     { #1@sub }
     { \int_to_arabic:n { 1 + \prop_item:Nn \g_faltfe_requirement_prop { #1@sub } } }
   }
  % print the number and set the current label
  \phantomsection
  R\__faltfe_requirement_currentlabel:n
   {
    \prop_item:Nn \g_faltfe_requirement_prop { #1 }
    .
    \prop_item:Nn \g_faltfe_requirement_prop { #1@sub }
   }
  \label{subreq:#2}
 }
\cs_generate_variant:Nn \faltfe_requirement_sub:nn { V }

\ExplSyntaxOff
% code ends here

\begin{document}

\begin{tabularx}{\textwidth}{X}
Define requirement: \requirement{request} (R1)
\\
Reference request \ref{req:request}
\\
Define second requirement: \requirement{need-help} (R2)
\\
Define subrequirement \subrequirement{need-help-1} (R2.1)
and \subrequirement{need-help-2} (R2.2)
\\
Define subrequirement of with passed reference
\subrequirement[request]{request-1} (R1.1 wanted)
\\
Define requirement \requirement{tex-SX} (R3 is desired)
\end{tabularx}
\ref{subreq:request-1}

\end{document}

相关内容