替换并添加/到特定的标记序列

替换并添加/到特定的标记序列

有没有办法找到特定的标记序列并在其后添加命令?或者有没有办法找到特定的标记序列并将其替换为另一个?并且仅当标记序列在输入文件中时才执行此操作,否则不要留下任何错误消息。

例如,该命令\AtBeginDocument{\bfseries}查找字符串\begin{document}并向其添加\bfseries。有没有办法获得一个更通用的命令,可以查找任何类型的字符串并向其添加另一个字符串?像这样:

\if@tokensequenceisgivenadd{<String to find>}% or more shortly \if@tokenadd

<Add after it this string>

\fi

我将执行如下另一个命令:

\if@tokensequenceisgivenreplace{<String to find>}% or more shortly \if@tokenreplace

<Replace it with this string>

\fi

答案1

请注意,这AtBeginDocument在任何意义上都不是找到的。如果定义了命令\begin{document},则的代码\begin{document}将执行该命令,并将其附加到钩子宏的末尾,以便在 运行时执行它。\@begindocumenthook\AtBeginDocument{...}...\@begindocumenthook

但是,如果您的令牌列表不包含{}组,则您可以使用分隔宏。

\def\foo#1String to find#2!!{\def\zz{#1\bfseries#2}}

\bfseries在字符串后添加并定义\zz,通常用作

\def\zz{1 2 3 String to find 4 5 6}

\expandafter\def\expandafter\foo\zz!!

\zz定义为1 2 3 String to find\bfseries 4 5 6

这是你会发现的几个宏的基础patch,但你必须小心不要删除括号组。如果\zz最初

\def\zz{{1 2 3 }String to find 4 5 6}

然后,通过修补的结果\foo将再次成为 1 2 3 String to find\bfseries 4 5 6仅由顶层{}TeX 删除一层分组组成的参数。强大的修补宏必须添加额外的标记并再次删除它们以避免这种影响。

答案2

\AtBeginDocument命令不能通过搜索来工作:它将代码添加到钩子宏中,该宏是用于实现\begin{document}(实际上是\document宏)的内部代码的一部分。您需要做的是设置适当的钩子,或者直接将其附加到您正在使用的代码中。该etoolbox包使这变得容易

\RequirePackage{etoolbox}
\appto{\CommandToAlter}{tokens-to-add}

如果您想要做的只是完全改变定义,那么假设我们正在谈论一个宏,您可以简单地\def/\renewcommand它。

相关内容