我正在以书的形式编写一组文档,每篇文档针对 4-5 个主题。每本书都有多达 30 个章节,每个章节位于不同的文件中。这些书必须能够相互交叉引用,因为它们都用于相同的最终目的。在每本书中,有些章节与其他章节无关,可以稍后重新排列。显然,标签中的章节编号是无用的。我希望每本书的每个章节/部分都有基于字符串的标签键。我无法使用一致的命名方案手动生成所有这些键。
为此,我使用基于正则表达式的字符串压缩器。虽然我不是 TeX/LaTeX 专家,但这个论坛对我帮助很大 (正则表达式中的无符号整数变量)。每章应获得一个 math:mod:first_chapter 格式的标签,而各节应标记为 math:sec:first_chapter:section_name。自定义章节/节命令用于自动标记。
在我的 MWE 中,我只是包含了章节的案例。
\documentclass{book}
\usepackage{etoolbox,xparse,expl3,l3regex}
\usepackage[outer]{showlabels}
\ExplSyntaxOn
\NewDocumentCommand{\compactlabel}{O{20}m}
{
\tl_set:Nn \l_tmpa_tl { #2 }
\regex_replace_all:nnN {[^a-zA-Z\s]} {} \l_tmpa_tl
\regex_replace_all:nnN {\b[a-zA-Z]{1,2}\b} {} \l_tmpa_tl
\regex_replace_once:nnN {\A\s+} {} \l_tmpa_tl
\regex_replace_once:nnN {\s+\Z} {\ } \l_tmpa_tl
\regex_replace_all:nnN {\s+} {_} \l_tmpa_tl
\regex_replace_all:nnN {(^\w{1,#1})\w*} {\1} \l_tmpa_tl
\regex_replace_once:nnN {_\Z} {} \l_tmpa_tl
\tl_set:Nx \l_tmpa_tl { \str_lower_case:f { \tl_use:N \l_tmpa_tl } }
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\ExplSyntaxOn
\cs_set_eq:NN \explower \tl_lower_case:n
\ExplSyntaxOff
\newcommand{\subjectshort}{Compsci} % unique for each book
\newcommand{\chaplabel}[1]{
\expandafter\label\expandafter{\explower{\subjectshort}:mod:#1} % works but not desirable
%\expandafter\label\expandafter{\explower{\subjectshort}:mod:\chaplabel{#1}} % does not work but desirable
}
\newcommand{\mychapter}[1]{ \chapter{#1} \chaplabel{#1}}
\begin{document}
\mychapter{First Chapter}
Some text
\end{document}
创建标签时,压缩名称不起作用。我尝试使用多个\expandafter
s 并\detokenize
使其工作。我总是收到错误:辅助文件中缺少 endcsname。这让我抓狂。这里出了什么问题?我该如何让它工作?任何帮助都将不胜感激。
答案1
您可能会喜欢以下做法,但我不认为这真的有用。
\documentclass{book}
\usepackage{expl3,xparse}
%\usepackage{l3regex} % not for releases after June 2017
\usepackage[outer]{showlabels}
\ExplSyntaxOn
\NewDocumentCommand{\generatechapterlabel}{O{20}m}
{
\magguu_compactlabel:nn { #1 } { #2 }
\label{\str_lower_case:f { \subjectshort }:mod:\l_magguu_compactlabel_tl}
\tl_gset_eq:NN \g_magguu_currentchapterlabel_tl \l_magguu_compactlabel_tl
}
\NewDocumentCommand{\generatesectionlabel}{O{20}m}
{
\magguu_compactlabel:nn { #1 } { #2 }
\label
{
\str_lower_case:f { \subjectshort } : sec :
\g_magguu_currentchapterlabel_tl :
\l_magguu_compactlabel_tl
}
}
\tl_new:N \l_magguu_compactlabel_tl
\tl_new:N \g_magguu_currentchapterlabel_tl
\cs_new_protected:Nn \magguu_compactlabel:nn
{
\tl_set:Nn \l_magguu_compactlabel_tl { #2 }
% remove non alphabetic/space characters
\regex_replace_all:nnN {[^a-zA-Z\s]} {} \l_magguu_compactlabel_tl
% remove words less than three letter long
\regex_replace_all:nnN {\b[a-zA-Z]{1,2}\b} {} \l_magguu_compactlabel_tl
% remove leading spaces
\regex_replace_once:nnN {\A\s+} {} \l_magguu_compactlabel_tl
% remove trailing spaces
\regex_replace_once:nnN {\s+\Z} {\ } \l_magguu_compactlabel_tl
% change runs of space into an underscore
\regex_replace_all:nnN {\s+} {_} \l_magguu_compactlabel_tl
% truncate to #1 characters
\regex_replace_all:nnN {(^\w{1,#1})\w*} {\1} \l_magguu_compactlabel_tl
% remove a possible trailing underscore
\regex_replace_once:nnN {_\Z} {} \l_magguu_compactlabel_tl
% lowercase the string
\tl_set:Nx \l_magguu_compactlabel_tl { \str_lower_case:f { \tl_use:N \l_magguu_compactlabel_tl } }
}
\ExplSyntaxOff
\newcommand{\subjectshort}{Compsci} % unique for each book
\newcommand{\mychapter}[1]{\chapter{#1}\generatechapterlabel{#1}}
\newcommand{\mysection}[1]{\section{#1}\generatesectionlabel{#1}}
\textwidth=5cm % just to see the labels
\begin{document}
\mychapter{First Chapter}
Some text in chapter~\ref{compsci:mod:first_chapter}
\mysection{First Section}
Some text in section~\ref{compsci:sec:first_chapter:first_section}
\end{document}