如何正确实现 cleveref 的 \cref@currentlabel 以实现自定义交叉引用

如何正确实现 cleveref 的 \cref@currentlabel 以实现自定义交叉引用

我有一些自定义交叉引用,需要与计数器不自然关联的标签。因此,我的宏\@currentlabel直接设置,而不是使用\refstepcounter。这可以正常工作,但cleveref无法理解这些引用的类型(除非为每个受影响的指定自定义类型\label)。

我见过一些问题,重新定义设法\cref@currentlabel了解cleveref要使用的正确格式,但不清楚包期望使用的参数规范是什么。从零碎来看,重新定义似乎遵循类似于

\protected@edef\cref@currentlabel{%
  [type][???][\cref@result]%
  The typeset label}

所以我的问题是:应该如何传达cleveref当前标签是自定义标签,具有自定义类型mytype?应该如何\cref@currentlabel重新定义?

答案1

cleveref是一个非常巧妙的封装,但是很难理解,因为里面有很多绕组。

在我看来,最简单的方法是使用\label[type]{labelname} Funny enough,type根本不需要是一个计数器,但\cref@currentlabel必须像 OP 已经做的那样进行定义。

[...]第二个里面的值\cref@currentlabel{...}通常是计数器的值,这在这里并不重要,所以我把它留空。

应该调用\crefname\Crefname宏来告知cleveref有关的信息type name

\documentclass{article}

\usepackage{blindtext}
\usepackage{hyperref}
\usepackage{cleveref}

\usepackage{xparse}


\makeatletter

\NewDocumentCommand{\arblabel}{O{footext}m+m}{%
  \begingroup
  \cref@constructprefix{#1}{\cref@result}%
  \protected@edef\@currentlabel{%
    #3}%
  \protected@edef\@currentlabelname{#3}%
  \protected@edef\cref@currentlabel{%
    [#1][][\cref@result]%
    #3%
  }
  \label[#1]{#2}%
  \endgroup  
}

\makeatother


\crefname{footext}{some foo text}{some foo texts}
\Crefname{footext}{Some Foo text}{Some foo texts}


\begin{document}

\blindtext[3]
\section{My section} \label{secone}
\blindtext[2]

Here is the link target: \arblabel{foo}{This is a nice foo text}

\blindtext[2]

\cref{foo} or rather like \Cref{foo}?

\end{document}

相关内容