expl3-Funktion nicht innerhalb von `\label{...}` erweitert

expl3-Funktion nicht innerhalb von `\label{...}` erweitert

Problem

Ich möchte eine expl3-Funktion innerhalb eines verwenden \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}

Beim Setzen des Dokuments erhalte ich eine

) (./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}}

Offenbar wird der Inhalt \slugifynicht expandiert und der expl3-Code wird direkt in die aux-Datei geschrieben. Wie kann ich das verhindern und meinen Code zum Laufen bringen?

Hintergrund

Ich möchte die Verwendung von Querverweisen in meinem (riesigen) Dokument vereinfachen. Ich würde etwas wie

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

% ...

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

anstatt

...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}
% ...

Antwort1

Was Sie tun möchten, ist einfach nicht möglich. Regex-Ersetzungen und Zuweisungen sind einfach nicht erweiterbar und können daherniemalsim Kontext einer vollständigen Erweiterung von beispielsweise verwendet werden \label.

Sie können jedoch beispielsweise das verarbeitete Etikett in einem Makro speichern und weitergeben oder Ihr \slugifyMakro das Etikett sofort platzieren lassen usw.

Denken Sie bei solchen Dingen immer an dieses Zitat:

»Das ist auf Dauer nicht so produktiv, wie man denkt.« — Schlagzeug

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

verwandte Informationen