我有一些自定义交叉引用,需要与计数器不自然关联的标签。因此,我的宏\@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}