在此代码上:
\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
没有帮助。