在“\xpatchcmd”上使用“\verb”作为替换字符串时出错

在“\xpatchcmd”上使用“\verb”作为替换字符串时出错

在此代码上:

\documentclass{article}
\usepackage{catchfilebetweentags,regexpatch,verbatim}
\tracingpatches
\tracingxpatches
\newcommand{\test}{testone (testtwo)}
\begin{document}
\xpatchcmd*{\test}{(}{(\verb|}{}{}
\xpatchcmd*{\test}{)}{|)}{}{}
\test
\show\test
\end{document}

产生错误:

! LaTeX Error: \verb ended by end of line.

\show\test输出以下内容:

> \test=\long macro:
->testone (\verb |testtwo|).
l.11 \show\test

显然,\xpatchcmd在 之后引入了一个额外的空格\verb,该空格将作为 的开始/结束字符,\verb而不是|

第一个问题:有没有办法改变这种情况\xpatchcmd*

作为一种解决方法,我切换到它shortvrb并且它有效,但是当我更接近“真实”情况时出现了另一个问题。 MWE:

\documentclass{article}
\usepackage{catchfilebetweentags,regexpatch,verbatim,shortvrb}
\MakeShortVerb{\|}
\tracingpatches
\tracingxpatches
\def\test{testone (\testtwo)}
\begin{document}
\xpatchcmd*{\test}{(}{(|}{}{}
\xpatchcmd*{\test}{)}{|)}{}{}
\test
\show\test
\end{document}

正如我们所见,这些代码在宏的使用shortvrb和定义上有所不同\test。我原本以为这个字符串 ( \testtwo) 会与详细运算符一起使用,|但事实并非如此。

第二个问题:为什么会出现这种行为以及如何使其发挥作用?

答案1

如果你的真实例子确实是真实的,那么我会从中得出你想要在括号(...之间)设置的参数\ttfamily参数,但它包含一个单身的以 开头的控制序列\。为此,以下补丁提供了一种解决方法:

在此处输入图片描述

\documentclass{article}

\usepackage{etoolbox}

\def\test{testone (\testtwo)}

\begin{document}

\patchcmd{\test}{(}{(\begingroup\ttfamily\string}{}{}
\patchcmd{\test}{)}{\endgroup)}{}{}
\test
\show\test

\end{document}

\string后面跟着一个控制序列,将转义符\变成可打印的反斜杠。.log文件显示

> \test=macro:
->testone (\begingroup \ttfamily \string \testtwo \endgroup ).
l.12 \show\test

答案2

我们来做一个实验:

\documentclass{article}

\newcommand{\test}{testone \verb|testtwo|}

\begin{document}

\show\test

\test

\end{document}

在终端上,你可以看到

> \test=\long macro:
->testone \verb |testtwo|.
l.7 \show\test

? 

! LaTeX Error: \verb ended by end of line.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.9 \test

因此您会发现这对于 来说不是问题regexpatch,尤其是对于 来说\xpatchcmd

事实上,\verb不能用作另一个命令的参数,包括宏的替换文本。

使用\shortvrb没有帮助。

相关内容