假设我定义了一个带有可选参数的环境(使用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
提供一个可选参数。这可以采用,但是当它没有可选参数时,您也不会使用它……