regexpatch \xpatchcmd 无法修补以空格开头的命令

regexpatch \xpatchcmd 无法修补以空格开头的命令

\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_tlsource(而不是<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它们。而且我不确定上述解决方案是否会导致新的问题。

相关内容