expl3 函数未在 `\label{...}` 内展开

expl3 函数未在 `\label{...}` 内展开

问题

我想在里面使用 expl3 函数\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}

在排版文档时,我得到了

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

显然,的内容\slugify没有展开,并且 expl3 代码直接写入辅助文件。我该如何防止这种情况并使我的代码正常工作?

背景

我想简化我的(大型)文档中交叉引用的使用。我会输入类似

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

% ...

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

代替

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

答案1

你想要做的事情根本不可能。正则表达式替换和赋值无法扩展,因此绝不在完整扩展上下文中使用,例如\label

但是,您可以执行诸如将处理后的标签保存在宏中并将其传递下去或者只是让您的\slugify宏立即放置标签等等。

每当你做这些事情时,请记住这句话:

“从长远来看,这并不像你想象的那么有成效。”—— 敲击

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

相关内容