我想将诸如替换为: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_
本地的。