假设我使用整数实现编号文档元素expl3
。进一步假设我想使用 交叉引用这些元素cleveref
。最好的方法是什么?
我想出了下面的方法,它似乎在一些最低限度的测试中起作用,但似乎不是特别安全。
\documentclass{article}
\usepackage{bookmark}
\usepackage{cleveref}
\makeatletter
\ExplSyntaxOn
\int_new:N\g_my_counter_int
\keys_define:nn { my / topic thing }
{%
label .tl_set:N = \l_my_label_tl,
}
\NewDocumentCommand \topicthing { O{} m }
{
\keys_set:nn { my / topic thing } { #1 }
\phantomsection
\int_gincr:N \g_my_counter_int
#2
\my_label_set:Nn \g_my_counter_int { topic }
\label {topic:\l_my_label_tl}
}
\cs_new_protected_nopar:Nn \my_label_set:Nn
{
\edef\@currentlabel{\int_use:N #1}
\cref@constructprefix {#2} {\cref@result}
\protected@edef\cref@currentlabel{
[#2] [\int_use:N #1] [\cref@result]
\int_to_arabic:n { #1 }
}
}
\ExplSyntaxOff
\crefname{topic}{topic}{topics}
\makeatother
\begin{document}
\topicthing[label=first]{First Topic}
\topicthing[label=second]{Second Topic}
\ref{topic:first}
\ref{topic:second}
\Cref{topic:first}
\Cref{topic:second}
\end{document}
据我所知,这给出了编号、链接等方面的目标输出。该.aux
文件看起来也很合理,尽管我不确定信息cleveref
写入的每个部分应该是用于什么:
\relax
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\providecommand\BKM@entry[2]{}
\newlabel{topic:first}{{1}{1}{}{section*.1}{}}
\newlabel{topic:first@cref}{{[topic][1][]1}{[1][1][]1}}
\newlabel{topic:second}{{2}{1}{}{section*.2}{}}
\newlabel{topic:second@cref}{{[topic][2][]2}{[1][1][]1}}
\gdef \@abspage@last{1}
当然,它正确地记录了交叉引用的类型,尽管我不知道是否应该填写空白。但标准案例在某些情况下也具有空白......
但是,虽然它不像在 a 中\cref
使用 a那么有趣,但它仍然不是很美观。\label
tcolorbox
有一个更好的方法吗?
请注意,我知道我可以使用 2e 计数器和\refstepcounter
!