我定义了两个新的计数器和两个宏。第一个宏\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}