Biblatex-带有不平衡括号的 xpatch bibmacro

Biblatex-带有不平衡括号的 xpatch bibmacro

我正在尝试cite使用 xpatch修补 biblatex 的 bibmacro \xpretobibmacro,并且\xapptobibmacro需要(我认为……)为修补命令提供不平衡的括号。也就是说,我想以cite“如果条目属于特定条目类型,则按我说的做,否则按你通常的做法做”的形式修补 bibmacro。

因此,我考虑使用 xpatch 来实现这一点,这样我就可以不管当前的 citestyle 是什么都可以进行修补,这正是我想要的。但是,要做到这一点,我需要在条件前面加上一个悬挂的开括号,并附加一个闭括号。当然,这会让 latex 发出抱怨。

有没有办法做到这一点?

这里是 MWE:

\documentclass{article}

\usepackage[style=authoryear]{biblatex}
\usepackage{xpatch}

\addbibresource{biblatex-examples.bib}

% This is the desired end result, which works
\renewbibmacro*{cite}{%
    \ifentrytype{article}
        {This is an article.}
      {\iffieldundef{shorthand}
          {\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
             {\usebibmacro{cite:label}%
              \setunit{\printdelim{nonameyeardelim}}}
             {\printnames{labelname}%
              \setunit{\printdelim{nameyeardelim}}}%
           \usebibmacro{cite:labeldate+extradate}}
          {\usebibmacro{cite:shorthand}}}%
    }

% This is what I'd like to do, which doesn't work
%\xpretobibmacro{cite}{%
%   \ifentrytype{archive}
%       {This is an article.}
%       {%
%   }
%{}{}% <success> and <failure>
%
%\xapptobibmacro{cite}{}}
%{}{}% <success> and <failure>

\xshowbibmacro{cite}

\begin{document}

An article: \cite{bertram}.

A book: \cite{gerhardt}.

\end{document}

答案1

您可以使用regexpatch

\documentclass{article}

\usepackage[style=authoryear]{biblatex}
\usepackage{regexpatch}

\addbibresource{biblatex-examples.bib}

\regexpatchbibmacro{cite}
  { \A (.*) \Z } % match everything, remember as \1
  {
   \c{ifentrytype}\cB\{\cL(article)\cE\}
     \cB\{\cL(This)\ \cL(is)\ \cL(an)\ \cL(article).\cE\}
     \cB\{\1\cE\}
  }
  {}{}

%\xshowbibmacro{cite}

\begin{document}

An article: \cite{bertram}.

A book: \cite{gerhardt}.

\end{document}

在此处输入图片描述

一些注意事项:\A (.*) \Z匹配整个输入;括号组成一个捕获组,在替换字符串中可用\1。在替换字符串中,\c{ifentrytype}代表宏\ifentrytype:基本上字符串是

\ifentrytype{article}{This is an article.}{\1}

但我们必须准确地告诉 LaTeX 各种标记的性质:\cB\{\cE\}代表括号(在 TeX 中的特殊含义),\cL(...)使得里面的文本由字母组成(类别代码 11)。

答案2

这是从 Audrey 的方法中得到启发(或借鉴?)的超链接名称与 biblatex 作者年份 (biblatex 1.4b)它非常适合这个特定的问题,所以我认为值得把它放在这里。

方法是使用biblatex\savebibmacro保存\restorebibmacrocite然后在重新定义它时恢复其原始值。

\documentclass{article}

\usepackage[style=authoryear]{biblatex}

\addbibresource{biblatex-examples.bib}

\savebibmacro{cite}

\renewbibmacro*{cite}{%
  \ifentrytype{article}
    {This is an article.}
    {\restorebibmacro{cite}%
      \usebibmacro{cite}}}

\begin{document}

An article: \cite{bertram}.

A book: \cite{gerhardt}.

\end{document}

“狡猾”?也许吧。我觉得它非常巧妙。而且它似乎确实能完成任务。

相关内容