使用 nameref 和 xparse 获取可选标题

使用 nameref 和 xparse 获取可选标题

假设我定义了一个带有可选参数的环境(使用xparse),如下所示

\documentclass{article}
\usepackage{hyperref,xparse}
\newcounter{exercisecounter}
\stepcounter{exercisecounter}
\DeclareDocumentEnvironment{exercise}{o}
{\IfNoValueTF{#1}{Exercise \theexercisecounter:}{Exercise \theexercisecounter (#1):}}
{}
\begin{document}
\begin{exercise}[My Exercise]
This is my exercise.
\end{exercise}
Above is \nameref{my exercise}, which is Exercise \ref{my exercise}.
\end{document}

如果我想分别使用nameref和来引用练习的标题和练习计数器ref,我该怎么做?通常,给定一个具有可选参数的任意环境,我该如何告知hyperref使用可选参数作为标题和指定的计数器?

我理解解决方案可能是基于使用xpatch,但这是我的知识范围。

答案1

您必须使用设置标题nameref\NR@gettitle宏:

在此处输入图片描述

\documentclass{article}
\usepackage{hyperref,xparse}% hyperref also loads nameref
\newcounter{exercisecounter}
\makeatletter
\DeclareDocumentEnvironment{exercise}{o}
  {\par\refstepcounter{exercisecounter}%
   Exercise \theexercisecounter
   \IfNoValueF{#1}{ (#1)\NR@gettitle{#1}}%
   :\quad}
  {\par}
\makeatother
\begin{document}
\begin{exercise}[My Exercise]
This is my exercise.\label{my exercise}
\end{exercise}
Above is \nameref{my exercise}, which is Exercise \ref{my exercise}.
\end{document}

另请注意,出于参考目的,您需要\refstepcounter里面环境)。此外,上述设置不会产生太大作用,当你\nameref提供一个可选参数。这可以采用,但是当它没有可选参数时,您也不会使用它……

相关内容