我正在尝试重写一个包以使用 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.