Проблема
Я хотел бы использовать функцию 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-код записывается прямо в файл aux. Как мне предотвратить это и заставить мой код работать?
Фон
Я хотел бы упростить использование перекрестных ссылок внутри моего (огромного) документа. Я бы набрал что-то вроде
... 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}