无序编号计数器

无序编号计数器

我所在的部门负责编写工作流程需求文档。因此,产品在设计之前会创建一份文档,内容如下:

要求 1:产品必须满足 A

要求 2:产品必须满足 B 要求

要求 3:产品必须防止 C

在流程的后期,我们会与客户一起修改需求文档,以随着设计的发展调整任何需求。例如,我们可能会删除需求 2,并在文档中将新需求放在需求 1 之上。我们的流程要求可追溯性,每个需求都必须保留其唯一的标识符/编号。因此,在需求 1 上方添加的新需求需要编号为需求 4。然后需求 1 必须跳转到需求 3,而需求 2 可能永远不会被重复使用。

问题最终变成了一份包含 200 多个需求的文档,而多个作者使得手动跟踪容易出错。Latex 有没有办法利用这个历史记忆给出无序的自动编号?或者在文档中留下一个不可见的已删除需求编号?无序编号问题本身似乎很难解决?

感谢您的任何想法或帮助!

答案1

一种可能性是采用两步方法,将需求的编写和打印分开。

\documentclass{article}
\usepackage{etoolbox}

\newcounter{myrequirementcounter}
\setcounter{myrequirementcounter}{0}
\newcommand\newrequirement[2]{%
    \stepcounter{myrequirementcounter}%
    \csedef{myrequirement#1}{\noexpand\item[Req. \themyrequirementcounter] #2}}
\newcommand\printrequirement[1]{%
    \csname myrequirement#1\endcsname}

\begin{document}
\newrequirement{thisone}{This is a requirement}
\newrequirement{another}{This is another requirement}
\newrequirement{hidden}{This is an old requirement}
\newrequirement{added}{This is another new requirement}

\begin{description}
\printrequirement{added}
\printrequirement{thisone}
\printrequirement{another}
\end{description}
\end{document}

讨论

我们定义了一个新的计数器,myrequirementcounter当添加新需求时自动增加需求数量。

我们定义了两个新命令\newrequirement\printrequirement

  • \newrequirement接受两个参数:第一个是用于存储需求的“标签”,第二个是需求的实际文本。
  • \printrequirement接受一个参数:要回忆的“标签”。

重要提示:您应确保通过命令按(时间)顺序将需求添加到文档中\newrequirement。一个好方法是将需求列表拆分为单独的 TeX 文件,并确保任何写入该 TeX 文件的工具只能添加新行。然后您可以将\input这些定义添加到文件中。

打印部分通过将命令包装在描述列表中来处理\printrequirement;您也可以更改代码以将其包装在其他环境中或以自己的方式进行格式化。这只是一个概念证明。基本思想是,由于可以决定某些需求不再出现,并且需求的顺序可能会改变,所以这是需要人工交互的部分,您应该让人们根据自己的意愿移动该列表中的项目。

可能的补充

原则上,可以有额外的健全性检查代码,例如,确保每个要求最多打印一次的代码(否则在编译时发出警告),以及打印所有满足以下要求的代码:不是已打印在文件中。

答案2

使用这种方法,必须首先按照所需的编号顺序定义标签,使用(作为示例)\defineitems{A B C {pre A}}。这意味着定义的第一个项目(与需求 1 相关联)具有标签“A”...定义的第四个项目(需求 4)具有标签“pre A”(标签不能有空格,除非分组)。

然后,使用标准itemize环境来呈现已定义的项目,按照列表要求的顺序。由于所有项目都必须通过其标签来标识,因此我已定义\pitem{}它接受标签的强制参数。该标签将重新翻译回需求编号,如之前在 中定义的那样\defineitems

最后,如果有人希望获得已删除项目的 TeX 源代码记录,则可以将已停用的项目绑定在一起,\defunct...\enddefunct以便在列表中跳过它们,或者,如果不需要以前使用过的项目的纸质记录,则可以将它们完全删除而不会产生任何后果。

\documentclass{article}
\newcounter{processeditems}
\long\def\defunct#1\enddefunct{}
\newcommand\defineitems[1]{\parseitems #1 \relax<THEEND>}
\def\parseitems#1 #2<THEEND>{%
  \stepcounter{processeditems}%
  \expandafter\xdef\csname processeditem#1\endcsname{\theprocesseditems}%
  \ifx\relax#2\relax\else\parseitems #2<THEEND>\fi%
}
\newcommand\pitem[1]{\item[Req \csname processeditem#1\endcsname:]}
\begin{document}
\defineitems{A B C {pre A}}% PROVIDED IN DESIRED "NUMBERING" SEQUENCE

\begin{itemize}% PROVIDED IN "PRESENTATION" SEQUENCE
\pitem{pre A} product must do D

\pitem{A} product must do A

\defunct\pitem{B} product must do B\enddefunct

\pitem{C} product must prevent C
\end{itemize}
\end{document}

在此处输入图片描述

相关内容