我想在乳胶文档中提出要求,并希望参考它们。到目前为止,我拥有的是:
\documentclass{memoir}
\usepackage{hyperref}
\usepackage{lipsum}
\newcounter{requirements}
\setcounter{requirements}{0}
\newcommand{\Requirement}[1]{%
~\linebreak\noindent%
{\hspace*{1em}{%
\refstepcounter{requirements}%
\textbf{Req.~\arabic{requirements}}%
\label{req:\arabic{requirements}}%
\hspace*{1em}%
#1}\\*[\baselineskip]}
}
\begin{document}
\Requirement{First requirement!}
\Requirement{Requirement number two!}
\Requirement{Requirement number three!}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
See \ref{req:1}.
\end{document}
但是我现在如何才能让 \ref 命令显示 Req. 1 而不是仅仅 1。我还希望能够根据请求在文本中打印需求文本,这样我就可以给出 \printrequirement{Req-1} 命令(或类似命令),然后它会打印需求文本。这样可以吗?包含 Req 很重要(在 Req-1 中,或者可以是 \printrequirement{Req}{1} 之类的命令),因为我想创建几个不同的需求子集,例如,还会有一个新的计数器使用 Subreq- 作为前缀。
谢谢!
答案1
我不确定\label
自动准备是否是一件好事。无论如何,cleveref
这会让你问的问题变得非常简单。
\documentclass{memoir}
\usepackage{hyperref}
\usepackage{cleveref}
\newcounter{requirements}
\setcounter{requirements}{0}
\crefname{requirements}{Req.}{Req.}
\newcommand{\Requirement}[1]{%
\par\addvspace{\topsep}% <----- Adjust to suit
\noindent\quad % <------------- Are you sure about this?
\refstepcounter{requirements}%
\label{req:\arabic{requirements}}%
\textbf{Req.~\arabic{requirements}}%
\quad
#1%
\par
\addvspace{\topsep}% <--------- Adjust to suit
}
\begin{document}
\Requirement{First requirement!}
\Requirement{Requirement number two!}
\Requirement{Requirement number three!}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
See \cref{req:1}.
\end{document}
我修改了你的定义,\Requirement
因为~\linebreak
和\\*[\baselineskip]
肯定是错误的。调整间距以满足您的需要;\topsep
是列表前后通常使用的垂直空间,并\addvspace
确保它没有被添加两次。
答案2
我们通常重新定义\the_counter_
,请看一个例子。
% run: *latex mal-req.tex
\documentclass{memoir}
\usepackage[colorlinks]{hyperref}
\usepackage{lipsum}
\newcounter{requirements}
\setcounter{requirements}{0}
\newcommand{\Requirement}[1]{%
~\linebreak\noindent%
{\hspace*{1em}{%
\refstepcounter{requirements}%
\textbf{Req.~\arabic{requirements}}%
\label{req:\arabic{requirements}}%
\hspace*{1em}%
#1}\\*[\baselineskip]}
}
\renewcommand\therequirements{Req.\,\arabic{requirements}}
\begin{document}
\Requirement{First requirement!}
\Requirement{Requirement number two!}
\Requirement{Requirement number three!}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
See \ref{req:1}.
\end{document}
答案3
\Rqref{1}
我添加了要提供的宏Req. 1
(输入起来更长,但是 OP 要求它,并且它允许 OP 在一个地方更改定义,以使所有出现都说“要求 1”而不是“要求 1”,例如)。
我还提供了宏\Rqtext{2}
来提供需求的实际文本。
\documentclass{memoir}
\usepackage{hyperref}
\usepackage{lipsum}
\newcounter{requirements}
\setcounter{requirements}{0}
\newcommand{\Requirement}[1]{%
~\linebreak\noindent%
{\hspace*{1em}{%
\refstepcounter{requirements}%
\textbf{Req.~\arabic{requirements}}%
\label{req:\arabic{requirements}}%
\hspace*{1em}%
#1}\\*[\baselineskip]}%
\expandafter\def\csname ReqNo\romannumeral\therequirements\endcsname{#1}%
}
\newcommand\Rqtext[1]{\csname ReqNo\romannumeral#1\endcsname}
\newcommand\Rqref[1]{Req.~\ref{req:#1}}
\begin{document}
\Requirement{First requirement!}
\Requirement{Requirement number two!}
\Requirement{Requirement number three!}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
See \Rqref{1}.
The text of the second requirement was ``\Rqtext{2}''.
\end{document}