Referência cruzada de inteiros expl3 com intelligentef

Referência cruzada de inteiros expl3 com intelligentef

Suponha que eu implemente elementos numerados do documento usando expl3números inteiros. Suponha ainda que eu gostaria de fazer referência cruzada desses elementos usando cleveref. Qual é a melhor maneira de fazer isso?

Eu descobri o seguinte, que parece funcionar em testes mínimos, mas não parece especialmente seguro.

\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}

Até onde eu sei, isso fornece a saída desejada em termos de numeração, vinculação, etc. O arquivo também parece razoável, embora eu não tenha certeza para que serve .auxcada parte da informação escrita: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}

Certamente está registrando corretamente o tipo de referência cruzada, embora não saiba se os espaços em branco devem ser preenchidos. Mas os casos padrão também apresentam espaços em branco em alguns casos....

No entanto, embora não seja tão divertido quanto trabalhar \crefcom um \labelin a tcolorbox, ainda não é nada bonito.

Existe uma maneira melhor de fazer isso?

Observe que estou ciente de que poderia usar um contador 2e e \refstepcounter!

informação relacionada