我正在尝试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
保存\restorebibmacro
,cite
然后在重新定义它时恢复其原始值。
\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}
“狡猾”?也许吧。我觉得它非常巧妙。而且它似乎确实能完成任务。