在我的文档中我有一个需求列表(目前这些只是通过自定义命令创建的文本)。
一个特别之处是这些需求是手动编号的(而不是按数字排序)。这非常重要,因为这样我们可以确保需求在各个文档和版本之间保持唯一可识别性。
我如何列出需求清单?我如何从文本中引用(可在 PDF 中点击)我的需求?
我发现了几个这样的例子(例如使用 ntheorem),但它们都会自动编号。
例如,这可以按如下方式工作(要求分布在整个文档中):
\requirement{7}{Important requirement}
...
\requirement{8}{Secondary requirement}
...
\requirement{3}{Moved requirement, this must be followed if \refRequirement{7} is not follow}
\listOfRequirements
这将按照文档中的设置顺序生成需求,其中包含指向需求 7 的可点击链接,以及单独章节中的需求列表(按数字排序),这些指示需求所在的页面,以及指向它们的链接。
答案1
这是一个可以满足您的两个请求的解决方案;让我们来看看代码。
线路
\newcommand\listOfRequirements{\@starttoc{req}}
启动一个名为的文件\jobname.req
,我们将在其中写入需求。该\requirement
命令定义为
\newcommand{\requirement}[2]{%
\hypertarget{req:#1}
#1. #2%
\phantomsection
\addcontentsline{req}{subsection}{\protect\numberline{\protect#1} #2}%
}
哪个
- 设置
hypertarget
要由命令使用的\refRequirement
(稍后会详细介绍) - 输出
#1
并#2
提交文件 - 设置
phantomsection
超链接正常工作所必需的 - 添加编号包含 的条目
#2
作为#1
其编号\jobname.rec
最后,该\refRequirement
命令超链接到需求的原始位置。
\newcommand{\refRequirement}[1]{\hyperlink{req:#1}{#1}}
与任何toc-based
命令一样,它至少需要两次编译才能稳定(如果您有任何其他变化的toc
类型元素,则可能更多)。
% arara: pdflatex
% arara: pdflatex
% !arara: indent: {overwrite: on}
\documentclass{report}
\usepackage{lipsum}
\usepackage{hyperref}
\makeatletter
% requirements
\newcommand\listOfRequirements{\@starttoc{req}}
% command to output requirement on the page, and also add it
% to the list of requirements
\newcommand{\requirement}[2]{%
\hypertarget{req:#1}
#1. #2%
\phantomsection
\addcontentsline{req}{subsection}{\protect\numberline{\protect#1} #2}%
}
\newcommand{\refRequirement}[1]{\hyperlink{req:#1}{#1}}
\begin{document}
\begin{itemize}
\item here's a reference to requirement \refRequirement{7}
\item here's a reference to requirement \refRequirement{3}
\item here's a reference to requirement \refRequirement{8}
\end{itemize}
\lipsum
\requirement{7}{Important requirement}
\lipsum
\requirement{8}{Secondary requirement}
\lipsum
\requirement{3}{Moved requirement, this must be followed if is not follow}
\lipsum
\chapter{Requirements}
\listOfRequirements
\end{document}
答案2
要获取编号和参考,您只需将命令开头的数字设置为 Arg-1,然后使用\refstepcounter
:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}%
\usepackage{hyperref}
\newcounter{requirement}
\newcommand\requirement[1]{%
\par
\setcounter{requirement}{\the\numexpr #1-1}% number -1
\refstepcounter{requirement}% +1
\therequirement:}
\begin{document}
\requirement{3} blablablaq\label{a}
\requirement{7} blablablaq\label{b}
\newpage
see requirement \ref{b}
\end{document}