在 cleveref 的 \crefformat 中访问原始标签

在 cleveref 的 \crefformat 中访问原始标签

cleveref我可以访问中的原始标签\crefformat吗?在此 MWE 中,我尝试获取与第一行相同的输出,但使用第二行:

\documentclass{article}
\usepackage{hyperref}
\usepackage{cleveref}
\crefformat{section}{#2the \nameref*{#1} section#3}
\begin{document}

Please read the \nameref{sec:Introduction} section!

Please read \cref{sec:Introduction}!

\section{Introduction}
\label{sec:Introduction}

\end{document}

然而,我得到的是这样的:

line 9: Reference `1' on page 1 undefined
: There were undefined references.

这当然并不意外,因为在 中\crefformat#1被节号 取代1,如文档中所述。但是,#2#3用于超链接, 和#4不存在,所以我想知道我是否以及如何sec:Introduction在 中访问原始标签(在本例中为 )\crefformat

我想一个解决方法是使用一个宏,给定 n,返回第 n 个部分标签,但我想这会变得混乱。

我的另一个想法是修补,也许在某种程度上使我的 MWE 用- 而不是-cleveref有意义,因为当该部分没有数字时,它不会输出任何有用的内容(甚至没有或)。\section*\section\cref{sec:Introduction}thesection

答案1

据我所知,没有办法直接访问当前标签名称,但可以将其存储在\cref@getref(从而稍微改变命令,比如说定义)\@lastusedlabel

\documentclass{article}
\usepackage{hyperref}
\usepackage{cleveref}
\makeatletter
\def\cref@getref#1#2{%
  \xdef\@lastusedlabel{#1}%
  \expandafter\let\expandafter#2\csname r@#1@cref\endcsname%
  \expandafter\expandafter\expandafter\def%
    \expandafter\expandafter\expandafter#2%
    \expandafter\expandafter\expandafter{%
      \expandafter\@firstoftwo#2}}%
\creflabelformat{section}{#2the \nameref*{\@lastusedlabel} section#3}
\makeatother
\begin{document}

Please read the \nameref{sec:Introduction} section!

Please read \cref{sec:Introduction}!

\section{Introduction}
\label{sec:Introduction}

\end{document}

在此处输入图片描述

答案2

我发现自己遇到了类似的问题,并意识到所提出的补丁对于范围格式来说是不够的。

这里我提出了另一个问题(我没有声誉点可以在这里评论)以寻求更完整的方法。

实际上,我似乎自己找到了一个完全可行的解决方案。

相关内容