我有一个自己的需求环境。我想在我的文档中引用每个需求并获取其文本。如果我使用,\namref
我只会获得相应部分的名称。有人能帮我吗?
这是一个简短的例子
\documentclass[12pt,ngerman,a4paper,oneside]{scrbook}
\usepackage[paper=a4paper,left=25mm,right=25mm,top=20mm,bottom=20mm,includeheadfoot]{geometry}
\usepackage{hyperref}
%% Requirement environment
\newcounter{requirement}
\renewcommand\therequirement{A\arabic{requirement}}
\newcommand{\reqref}[1]{\ref{#1}}
\newenvironment{req}[1][]{
\refstepcounter{requirement}
\begin{list}{\textbf{A\arabic{requirement}}\label{#1}}{%
\setlength{\labelsep}{10pt}\setlength{\leftmargin}{35pt}%
\setlength{\labelwidth}{40pt}\setlength{\listparindent}{0pt}%
}\em\item}%
{\end{list}}
\begin{document}
\chapter{My Chapter}
\section{My Section}
\begin{req}[A10]
Text First requirement...
\end{req}
\begin{req}[A20]
Text First requirement...
\end{req}
\begin{req}[A30]
Text First requirement...
\end{req}
Now I want to reference the requirement and the its text. \\
\nameref{A10} \\
\nameref{A20} \\
\nameref{A30} \\
\end{document}
答案1
以下示例使用environ
捕获req
环境的内容(在 中\BODY
),该内容以与.aux
常规 相同的方式\label
写入 (通过\@currentlabel
在调用 之前进行更新\label
)。
\documentclass{scrbook}
\usepackage{hyperref,environ}
\newcounter{requirement}
\renewcommand{\therequirement}{A\arabic{requirement}}
\makeatletter
\newcommand{\reqref}[1]{\ref{#1}}
\newcommand{\textref}[1]{\ref{t@#1}}
\NewEnviron{req}[1]{%
\refstepcounter{requirement}%
\begin{list}{\textbf{\therequirement}\label{#1}}{%
\setlength{\labelsep}{10pt}\setlength{\leftmargin}{35pt}%
\setlength{\labelwidth}{40pt}\setlength{\listparindent}{0pt}%
}\itshape\item
\def\@currentlabel{\BODY}\label{t@#1}%
\BODY
\end{list}
}
\makeatother
\begin{document}
\chapter{My Chapter}
\section{My Section}
\begin{req}{A10}
Text first requirement\ldots
\end{req}
\begin{req}{A20}
Text second requirement\ldots
\end{req}
\begin{req}{A30}
Text third requirement\ldots
\end{req}
Now I want to reference the requirement and the its text:
\textref{A10}
\end{document}
请注意,将内容写入环境.aux
是脆弱的,因为所有内容都会被扩展。因此,在某些情况下,您可能需要\protect
在环境主体中写入任何内容req
。
在此示例中,我将参数 设为强制参数,req
因为您要将其用作\label
。这\label
必须是唯一的,如果将其留空(或在可选参数的情况下缺失)将导致重复的\label
。
最后,我已将界面更改为\textref
使用提供给的相同标签req
。
答案2
我找到了一种快速而肮脏的方法来获取文本\nameref
。因此我使用了这里的解决方案:
这是完整的文档:
\documentclass[12pt,ngerman,a4paper,oneside]{scrbook}
\usepackage[paper=a4paper,left=25mm,right=25mm,top=20mm,bottom=20mm,includeheadfoot]{geometry}
\usepackage{hyperref}
\newcounter{requirementtextcounter}
\makeatletter
\newcommand{\labelText}[2]{%
#1\refstepcounter{requirementtextcounter}%
\immediate\write\@auxout{%
\string\newlabel{#2}{{1}{\thepage}{{\unexpanded{#1}}}{requirementtextcounter.\number\value{requirementtextcounter}}{}}%
}%
}
\makeatother
\newcounter{requirement}
\renewcommand\therequirement{A\arabic{requirement}}
\newcommand{\reqref}[1]{\ref{#1}}
\newenvironment{req}[1][]{
\refstepcounter{requirement}
\begin{list}{\textbf{A\arabic{requirement}}\label{#1}}{%
\setlength{\labelsep}{10pt}\setlength{\leftmargin}{35pt}%
\setlength{\labelwidth}{40pt}\setlength{\listparindent}{0pt}%
}\em\item}%
{\end{list}}
\begin{document}
\chapter{My Chapter}
\section{My Section}
\begin{req}[A10]
\labelText{Text First requirement...}{AT10}
\end{req}
\begin{req}[A20]
Text First requirement...
\end{req}
\begin{req}[A30]
Text First requirement...
\end{req}
Now I want to reference the requirement and the its text. \\
\nameref{AT10}
\end{document}