La función expl3 no se expande dentro de `\label{...}`

La función expl3 no se expande dentro de `\label{...}`

Problema

Me gustaría utilizar una función expl3 dentro de un archivo \label{...}.

%!TEX program=xelatex
\documentclass{article}

\usepackage{l3regex}

\ExplSyntaxOn
    \tl_new:N \l_slugify_tl
    \cs_new:Npn \slugify #1 {
        \tl_set:Nf \l_slugify_tl { \tl_lower_case:n { #1 } } %lower case
        \regex_replace_all:nnN { [^a-z]+ }{ - }\l_slugify_tl % remove non-letters
        \regex_replace_all:nnN { (^-|-$$$$) }{ } \l_slugify_tl % clean up leading/trailing dashes
        \tl_use:N \l_slugify_tl
    }
\ExplSyntaxOff


\begin{document}

\subsection{The Explanation}
    \label{wiki:\slugify{The Explanation}}

\end{document}

Al componer el documento, aparece un

) (./test-regex-slug.aux
! Undefined control sequence.
<argument> r@wiki:\tl 
                      _set:Nf {the explanation}\regex _replace_all:nnN {[^a-...
l.3 ...x_replace_all:nnN {(^-|-$$$$)}{}}{{0.1}{1}}

Aparentemente, el contenido de \slugifyno se expande y el código expl3 se escribe directamente en el archivo auxiliar. ¿Cómo puedo evitar eso y hacer que mi código funcione?

Fondo

Me gustaría simplificar el uso de referencias cruzadas dentro de mi (enorme) documento. Yo escribiría algo como

... e.g. using a \linkR{Time of Flight} detector.
That \linkR{TOF} would ...

% ...

\section{\anchorR{Time of Flight} Detector (\aliasR{TOF})}
% ...

en lugar de

...e.g. using a \hyperref[time-of-flight]{Time of Flight} detector.
That \hyperref[time-of-flight]{TOF} would...

% ...

\section{Time of Flight Detector (TOF)} \label{time-of-flight} \label{tof}
% ...

Respuesta1

Lo que quieres hacer simplemente no es posible. La sustitución de expresiones regulares y las asignaciones simplemente no son ampliables y, por lo tanto, puedennuncausarse en un contexto de expansión completa de, por ejemplo, \label.

Sin embargo, puede hacer cosas como guardar la etiqueta procesada en una macro y pasarla o simplemente hacer que su \slugifymacro coloque la etiqueta inmediatamente, etc.

Siempre que hagas este tipo de cosas, ten en cuenta esta cita:

»A largo plazo, esto no es tan productivo como se podría pensar.« — percutir

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \l_slugify_tl

\NewDocumentCommand \slugify { m m m }
{
  \tl_set:Nf \l_slugify_tl { \tl_lower_case:n { #3 } } %lower case
  \regex_replace_all:nnN { [^a-z]+ }{ - }\l_slugify_tl % remove non-letters
  \regex_replace_all:nnN { (^-|-$$$$) }{ } \l_slugify_tl % clean up leading/trailing dashes
  #1 { #2 \tl_use:N \l_slugify_tl }
}

\ExplSyntaxOff

\begin{document}

\subsection{The Explanation}
    \slugify{\label}{wiki:}{The Explanation}

\end{document}

información relacionada