如何在 tocloft 自定义列表的元素上使用 \nameref?

如何在 tocloft 自定义列表的元素上使用 \nameref?

我正在使用该tocloft包创建一个新的列表“问题”,并且我想使用\nameref(从包中)在我的文档中的某个点\hyperref手动列出问题(不使用):\listofquestion

\documentclass{article}

\usepackage{hyperref}
\usepackage{tocloft}

\begin{document}
\newlistof{question}{qcnt}{List of Questions}
\newcommand{\question}[1]{%
    \par\vspace{5mm}\noindent%
    \refstepcounter{question}\textbf{Q\thequestion:~#1}%
    \phantomsection\addcontentsline{qcnt}{question}
    {\protect\numberline{Q\thequestion}#1}
    \par
}
\section{Questions}
\label{sect:questions}

\nameref{q:bla} %prints "Questions"

\question{bla?}
\label{q:bla}
\end{document}

但是,我得到的是最后一部分的名称(在本例中为“问题”)而不是问题的名称(在本例中为“bla?”)作为输出\nameref{q:bla}

我该如何修复这个问题?我做错了什么?任何帮助我都非常感谢。

答案1

您必须启用\nameref才能知道当前标题,即在命令\NR@gettitle{#1}中使用\question将标题的信息存储到标签信息中,该信息将写入文件.aux。这是通过\NR@gettitle(实际上是通过\newlabel)完成的

\documentclass{article}

\usepackage{tocloft}

\newlistof{question}{qcnt}{List of Questions}

\usepackage{hyperref}

\makeatletter
\newcommand{\question}[1]{%
  \par\vspace{5mm}\noindent%
  \refstepcounter{question}%
  \NR@gettitle{#1}%
  \textbf{Q\thequestion:~#1}%
  \phantomsection\addcontentsline{qcnt}{question}
  {\protect\numberline{Q\thequestion}#1}
  \par
}
\makeatletter



\begin{document}

\section{Questions}
\label{sect:questions}

\nameref{q:bla}

\question{bla?}
\label{q:bla}

\end{document}

这是相应的.aux文件:

\relax 
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
\global\let\oldcontentsline\contentsline
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
\global\let\oldnewlabel\newlabel
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
\AtEndDocument{\ifx\hyper@anchor\@undefined
\let\contentsline\oldcontentsline
\let\newlabel\oldnewlabel
\fi}
\fi}
\global\let\hyper@last\relax 
\gdef\HyperFirstAtBeginDocument#1{#1}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\@writefile{toc}{\contentsline {section}{\numberline {1}Questions}{1}{section.1}}
\newlabel{sect:questions}{{1}{1}{Questions}{section.1}{}}
\@writefile{qcnt}{\contentsline {question}{\numberline {Q1}bla?}{1}{section*.1}}
\newlabel{q:bla}{{1}{1}{bla?}{section*.1}{}}

可以看到,bla?标题已输入到标签中。稍后q:bla会抓取。\nameref

在此处输入图片描述

相关内容