用 latex3 替换包括冒号的字符串

用 latex3 替换包括冒号的字符串

我想将诸如替换为:aà以下是代码

\ExplSyntaxOn
\str_new:N \replace_str
\cs_new:Npn \my_replace:n #1
{
 \str_set:Nn \replace_str {#1}
 \str_replace_all:Nnn \replace_str { :a } { à }
 \str_use:N \replace_str
}

\NewDocumentCommand \replace { m }
{
 \my_replace:n { #1 }
}
\ExplSyntaxOff

虽然这可以显示à,但即​​使控制序列也被视为字符串。然后我使用了\tl_而不是\str_

\ExplSyntaxOn
\tl_new:N \replace_str
\cs_new:Npn \my_replace:n #1
{
 \tl_set:Nn \replace_str {#1}
 \tl_replace_all:Nnn \replace_str { :a } { à }
 \tl_use:N \replace_str
}

\NewDocumentCommand \replace { m }
{
 \my_replace:n { #1 }
}

但是,它没有显示à但是:a

我该如何à处理这样的控制序列。

答案1

问题在于 catcode:在\ExplSyntaxOn和之间\ExplSyntaxOff, 的 catcode:是“字母”而不是“其他”。tl函数区分 catcode,因此代码块中的冒号与文档其余部分中的冒号不同。幸运的是, catcode 为“其他”的冒号保存在 中\c_colon_str,因此可以使用它代替。当然,\c_colon_str必须扩展,所以我们使用\tl_replace_all:Nfn

\documentclass{article}
\usepackage{xparse,expl3}
\ExplSyntaxOn
\tl_new:N \l_replace_tl
\cs_generate_variant:Nn \tl_replace_all:Nnn { Nfn }
\cs_new:Npn \my_replace:n #1
{
 \tl_set:Nn \l_replace_tl {#1}
 \tl_replace_all:Nfn \l_replace_tl { \c_colon_str a } { à }
 \tl_use:N \l_replace_tl
}

\NewDocumentCommand \replace { m }
{
 \my_replace:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\replace{abc:abc\LaTeXe}
\end{document}

我还进行了替换\replace_tl\l_replace_tl因为中的变量expl3总是带有范围前缀,这里是l_本地的。

在此处输入图片描述

相关内容