使用 \nameref 从自定义环境中获取文本

使用 \nameref 从自定义环境中获取文本

我有一个自己的需求环境。我想在我的文档中引用每个需求并获取其文本。如果我使用,\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}

输出

相关内容