自动标签,自动生成密钥

自动标签,自动生成密钥

我正在以书的形式编写一组文档,每篇文档针对 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}

创建标签时,压缩名称不起作用。我尝试使用多个\expandafters 并\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}

在此处输入图片描述

相关内容