我需要管理需求列表,并使用计数器保存其创建后的值。我该怎么做?
例子:
步骤 1:创建文档,其中包含两个要求,alpha 和 beta,构建后分别获得编号 1 和 2:
1 alpha 2 beta
步骤 2:创建第三个需求。再次构建:
1 alpha 2 beta 3 gamma
步骤 3:有人想在文档开头添加另一个要求,但旧的引用必须保持不变。因此,第五个是第四个,即使介于一和二之间:
1 alpha 4 delta 2 beta 3 gamma
我认为它需要一个生成的文件来记住使用过的引用,但我不知道如何实现这一点。
答案1
您可以使用etoolbox
包来执行此操作,该包定义了列表操作、布尔值和字符串比较(以及其他内容)。下面的 MWE 生成一个文件,stored.txt
其中的需求按连续运行的顺序存储。对于新运行,现有项目按此列表的顺序编号,新项目添加到末尾。请注意 @Christian Hupfer 的评论。
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\persistent}{} % create initially empty list
\newcounter{Current} % existing position in list
\newcounter{MaxSeq} % highest position in list
\newtoggle{FoundInList} % boolean test if item is found
\newcommand{\cmphandler}[2]{%
\stepcounter{Current}% % increase position in list
\ifstrequal{#1}{#2}% % if the current item is the item to print
{\toggletrue{FoundInList}\listbreak}{}% % then set to found and exit loop
}
% write full list to file after adding items
\newcommand{\writeall}[1]{\write\listfile{\noexpand\listgadd{\noexpand\persistent}{#1}\noexpand\stepcounter{MaxSeq}}}
% print the current item in the document
\newcommand{\printpersistent}[1]{%
\setcounter{Current}{0}%
\togglefalse{FoundInList}%
\forlistloop{\cmphandler{#1}}{\persistent}% % find position in list
\iftoggle{FoundInList}% % if item is found
{\arabic{Current} #1}% % print position and item
{\listgadd{\persistent}{#1}\stepcounter{MaxSeq}\arabic{MaxSeq} #1}% % else add to end of list and print item
\par % start new paragraph
}
\begin{document}
% load existing list if available
\InputIfFileExists{stored.txt}{}{}
% print all items
\printpersistent{alpha $(\alpha)$}
\printpersistent{delta $(\delta)$}
\printpersistent{beta $(\beta)$}
\printpersistent{gamma $(\gamma)$}
% print full list to file
\newwrite\listfile
\openout\listfile=stored.txt
\forlistloop{\writeall}{\persistent}
\closeout\listfile
\end{document}
三次运行后的结果: