是否可以让 (La)TeX 在编译时搜索并替换宏中的文本?例如,给定
\newcommand{\sometext}{a b c d e f g}
我想要一些类似的东西
\searchreplace{\sometext}{b c}{x
y}
这将导致
a x
y d e f g
理想情况下,这可以通过替换宏来实现,例如
\searchreplace{hi {\itshape there}}{\itshape}{\bfseries}
然后会产生(并解释)
hi {\bfseries there}
答案1
etoolbox
通过 提供此功能,它在\patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
其中搜索并将其替换为,如果搜索和替换成功则执行,否则。<search>
<cmd>
<replace>
<success>
<failure>
下面使用传递给的基本参数\patchcmd
:
\documentclass{article}
\usepackage{etoolbox}
% \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
\newcommand{\searchreplace}[3]{\patchcmd{#1}{#2}{#3}{}{}}
\begin{document}
\newcommand{\sometext}{a b c d e f g}
\sometext
\searchreplace{\sometext}{b c}{x
y}
\sometext
\end{document}
建议也包括以下内容,\tracingpatches
以便确保(通过.log
)如果修补不成功,到底出了什么问题。
你可能会遇到某些宏的问题,而你的替代方案是xpatch
当然,也存在其他选项(例如,regexpatch
)。