\patchcmd
著名人物的命令etoolbox
\patchcmd
软件包有一个小限制:每当在另一个命令的参数中使用时,修补似乎都会失败,并且搜索/替换文本本身包含对参数的引用。例如:
\documentclass{article}
\usepackage{etoolbox}
\def\test#1{#1test}
\ifdefparam{\test}{%
\patchcmd{\test}{#1}{#1-}{\typeout{juhu!}}{\typeout{oje!}}%
}{%
}
\show\test
\begin{document}
\end{document}
这里,可以使用以下技巧轻松解决问题:
\documentclass{article}
\usepackage{etoolbox}
\def\test#1{#1test}
\ifdefparam{\test}\iftrue\iffalse
\patchcmd{\test}{#1}{#1-}{\typeout{juhu!}}{\typeout{oje!}}
\fi
\show\test
\begin{document}
\end{document}
但问题仍然存在:是否有一种普遍适用的解决方法来解决这个限制\patchcmd
?
答案1
使用\xpatchcmd
(实验性)提供的命令regexpatch
包。最小示例:
\documentclass{article}
\usepackage{regexpatch}
\def\test#1{#1test}
\ifdefparam{\test}{%
\xpatchcmd{\test}{#1}{#1-}{\typeout{juhu!}}{\typeout{oje!}}%
}{%
}
\show\test
\begin{document}
\end{document}
根据其文档,该regexpatch
软件包是xpatch
l3experimental
包,旨在捆绑包中的底层 LaTeX3 包变得稳定后立即替换后者。
请注意,软件包\xpatchcmd
所实现的xpatch
显示出与 相同的限制\patchcmd
。这可以通过软件包文档中的以下句子来解释regexpatch
:
该包现在完全独立于
etoolbox
。