使用标签引用文本并打印

使用标签引用文本并打印

我想在乳胶文档中提出要求,并希望参考它们。到目前为止,我拥有的是:

\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}

在此处输入图片描述

相关内容