문제
.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}