在使用 expl3 工具的代码中局部重新定义 ~

在使用 expl3 工具的代码中局部重新定义 ~

我正在尝试重写一个包以使用 expl3 工具。

这里我需要定义一个\initializeplaintitle命令,将文档标题的“纯化”版本存储到\@title宏中。当前(LaTeX2e)版本是

\newcommand\initializeplaintitle[1][]{%
  {%
    \def\\{ }%
    \def~{ }%
    \def\emph##1{##1}%
    #1%
    \protected@xdef\plaintitle{\@title}%
  }%
}

如您所见,它进行了一些本地分配,以便标题中存在的任何\\和都变成空格,并且它会删除所有命令。~\emph

我想知道如何在使用 expl3 语法和工具编写的包中获得相同的结果。原则上,应该\def变成。但是,鉴于这在 expl3 语法中被重新定义,\tl_set:Nn我该如何处理?~

答案1

您可以使用\char_set_active:nN

\char_set_active:nN { `\~ } \c_space_tl

~这为第一个参数中指定的字符在其处于活动状态的上下文中(在正常情况下)赋予了含义。

你还必须压缩空间,所以可能是这样的

\documentclass{article}
\usepackage{xparse}

\title{A \emph{title} \\ about \emph{A.~Uthor}} % to initialize \@title

\ExplSyntaxOn

\tl_new:N \g_callegar_title_pure_tl
\tl_new:N \l__callegar_title_pure_tl

\cs_new_protected:Nn \callegar_purify_title:
 {
  \tl_set_eq:Nc \l__callegar_title_pure_tl { @title }
  % \emph{...} -> ...
  \regex_replace_all:nnN { \c{emph}\cB. (.*?) \cE. } { \1 } \l__callegar_title_pure_tl
  % \\ and ~ -> space
  \regex_replace_all:nnN { (\c{\\}|\cA\~) } { \  } \l__callegar_title_pure_tl
  % multiple spaces to a single space
  \regex_replace_all:nnN { \s+ } { \  } \l__callegar_title_pure_tl
  % globally set the purified title
  \tl_gset_eq:NN \g_callegar_title_pure_tl \l__callegar_title_pure_tl
 }

\callegar_purify_title:
\tl_show:N \g_callegar_title_pure_tl

\stop

输出将是

> \g_callegar_title_pure_tl=A title about A. Uthor.

相关内容