这个问题引出了包中的一个新功能:
xpatch
这etoolbox
该软件包提供了各种工具“对于连接或修改现有代码很有用”(etoolbox
手册,第 3.4 节)。最重要的是\patchcmd
语法如下的命令
\patchcmd[<prefix>]{<command>}{<search>}{<replace>}{<success>}{<failure>}
哪个“提取 的替换文本<command>
,将 [ 第一次出现的 ] 替换<search>
为<replace>
,然后重新组装<command>
”其他有用的宏有,例如\apptocmd
和,\pretocmd
它们分别将代码附加到命令的替换文本中。
这biblatex
软件包包含命令\newbibmacro
、\renewbibmacro
和\providebibmacro
(以及带星号的命令)。这些命令类似于\newcommand
/ \renewcommand
/ \providecommand
"但[命令名称]可以包含数字、标点符号等字符,且不以反斜杠开头”(biblatex
手册,第 4.6.4 节)。以这种方式定义的“bibmacros”可以通过 执行\usebibmacro{<command name>}
。
是否可以定义一个命令,以与用创建的宏相同的方式\patchbibmacro
提取和修改用创建的宏的替换文本?\newbibmacro
\patchcmd
\newcommand
答案1
\makeatletter
\def\act@on@bibmacro#1#2{%
\expandafter#1\csname abx@macro@\detokenize{#2}\endcsname}
\def\patchbibmacro{\act@on@bibmacro\patchcmd}
\def\pretobibmacro{\act@on@bibmacro\pretocmd}
\def\apptobibmacro{\act@on@bibmacro\apptocmd}
\def\showbibmacro{\act@on@bibmacro\show}
\makeatother
现在您有
\patchbibmacro \pretobibmacro \apptobibmacro \showbibmacro
解释:
\newbibmacro{foo}[1]{-#1-}
实际执行
\expandafter\newcommand\csname abx@macro@\detokenize{foo}\endcsname[1]{-#1-}
(我省略了一些血腥细节,但这几乎是事实)。
当然,这对于带有可选参数的宏不起作用,但方法如下:
\makeatletter
\def\act@on@bibmacroopt#1#2{%
\expandafter#1\csname\expandafter\string\csname abx@macro@\detokenize{#2}\endcsname\endcsname}
\def\patchbibmacroopt{\act@on@bibmacroopt\patchcmd}
\def\pretobibmacroopt{\act@on@bibmacroopt\pretocmd}
\def\apptobibmacroopt{\act@on@bibmacroopt\apptocmd}
\def\showbibmacroopt{\act@on@bibmacroopt\show}
\makeatother
你\patchbibmacroopt
可以定义biblatex
宏,例如
\newbibmacro{baz}[2][x]{-#1-#2-}
我们必须记住,\newcommand{\baz}[2][x]{-#1-#2-}
宏的真正作用是
\\baz
当然,必须使用
\csname\string\baz\endcsname
更简单的解决方案
这个问题导致xpatch
软件包中添加了一些功能,现在
\xpatchbibmacro
\xpretobibmacro
\xapptobibmacro
\patchcmd
即使定义了具有可选参数的 bibmacros 也可以立即使用;其语法与、\pretocmd
和的语法相同\apptocmd
:
\xpatchbibmacro{<name>}{<search>}{<replace>}{<success>}{<failure>}
\xpretobibmacro{<name>}{<code to prepend>}{<success>}{<failure>}
\xapptobibmacro{<name>}{<code to append>}{<success>}{<failure>}
因此,如果foo
已经定义为,\newbibmacro{foo}[1]{-#1-}
则可以说,例如,
\xpatchbibmacro{foo}{-}{+}{}{}
把第一个-
改为+
。