biblatex:是否可以修补用 \newbibmacro 创建的宏?

biblatex:是否可以修补用 \newbibmacro 创建的宏?

这个问题引出了包中的一个新功能:
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}{-}{+}{}{}

把第一个-改为+

相关内容