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