\xpatchcmd
提供的修补命令regexpatch
以空格开头时失败。\xpatchcmd
提供的修补命令xpatch
可以正常工作。
一些版本信息:
XeTeX 3.14159265-2.6-0.99999
expl3 2018/06/14
xparse 2018/05/12
regexpatch 2018/05/02 v0.2d
例子:
\documentclass{minimal}
\usepackage{regexpatch}
\def\test{source}
\xpatchcmd{\test}{source}{substituted}{}{\ddt}
% only this one fails
\def\test{ source}
\xpatchcmd{\test}{source}{substituted}{}{\ddt}
\def\test{source source}
\xpatchcmd{\test}{source}{substituted}{}{\ddt}
\begin{document}
abc
\end{document}
答案1
该问题是由线路引起的
\tl_set:Nf \l_xpatch_replacement_tl { \cs_replacement_spec:N #1 }
在 的定义中\xpatch_get_all:N
,在regexpatch.sty
。
由于f
-type 总是会吞噬一个空格字符(参见f
第 I.1 节中关于 -type 的文档,texdoc interface3
以及这个回答),第一行设置\l_xpatch_replacement_tl
为source
(而不是<space>source
)。使用\tl_set:Ne
而不是\tl_set:Nf
可能会修复此问题。
以下重新定义\xpatch_get_all:N
似乎有效。
\documentclass{article}
\usepackage{regexpatch}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_set:Nn {Ne}
\cs_generate_variant:Nn \tl_set_rescan:Nnn {Nne}
\cs_set_protected:Npn \xpatch_get_all:N #1
{
% use \tl_set:Ne instead of \tl_set:Nf
\tl_set:Ne \l_xpatch_prefix_tl { \cs_prefix_spec:N #1 }
\tl_set_rescan:Nnx \l_xpatch_prefix_tl { } \l_xpatch_prefix_tl
\tl_set:Ne \l_xpatch_arg_tl { \cs_argument_spec:N #1 }
\tl_set_rescan:Nnx \l_xpatch_arg_tl
{ \char_set_catcode_space:n {`\ } } \l_xpatch_arg_tl
\tl_set:Ne \l_xpatch_replacement_tl { \cs_replacement_spec:N #1 }
\tl_set_rescan:Nne \l_xpatch_replacement_tl
{ \char_set_catcode_space:n {`\ } } \l_xpatch_replacement_tl
}
\ExplSyntaxOff
\begin{document}
\def\test#1 #2{ source }
\ttfamily
|\meaning\test| \par
\xpatchcmd{\test}{source}{substituted}{}{\fail}
|\meaning\test|
\end{document}
我还没有完全理解为什么regexpatch
会用到\tl_set:Nf
它们。而且我不确定上述解决方案是否会导致新的问题。