使用 \regex_replace_all:nnN 替换时缺少空格

使用 \regex_replace_all:nnN 替换时缺少空格

我怎样才能\regex_replace_all:nnN不删除之间的空格x y

在此处输入图片描述

\documentclass{article}
\usepackage{l3regex}

\ExplSyntaxOn
\cs_new:Npn \replace #1#2#3
 {
  \tl_set:Nn \l_tmpa_tl  {#3}
  \regex_replace_all:nnN {#1} {#2} \l_tmpa_tl
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

\begin{document}
\replace{a}{x y}{abc}
\end{document}

答案1

正则表达式替换的语法规则在某些方面相当奇怪;正如文档所述,搜索或替换字符串中的重要空格应始终被转义,因为未转义的空格会被忽略。

此外,您需要指定您想要一个具有正确类别代码的“真实”空间;如果您只是x\ y在替换字符串中说,您将获得一个类别代码 12 的空间,它将打印当前字体的插槽 32 中的任何字符(在 OT1 编码中是一个奇怪的字形,在 T1 编码中,但在 T2A 中也是“可见空间”)。

所以最正确的语法是

\replace{a}{\cLx\cS\ \cLy}{abc}

指定 x 和 y 为普通字母:默认情况下l3regex使用类别代码 12 字符。然而,这有点挑剔,因为类别代码 12 和 11 字符在打印时无法区分。

对于这样的简单替换,你可以使用

\tl_replace:Nnn

例如,

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\replace}{mmm}
 {
  \tl_set:Nn \l_tmpa_tl {#3}
  \tl_replace_all:Nnn \l_tmpa_tl {#1} {#2}
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

\begin{document}
\replace{a}{x y}{abc}
\end{document}

相关内容