有效地将同一补丁应用于多个 bibdrivers

有效地将同一补丁应用于多个 bibdrivers

这个答案对于让 Biblatex 打印书籍的 ISSN 字段的问题,我建议使用包\xpatchbibdriver中的命令来解决方案xpatch

\xpatchbibdriver{book}{%
  {\printfield{isbn}}
}{%
  {\printfield{issn}\newunit\newblock\printfield{isbn}}
}{}{}

我的答案存在一个问题,那就是补丁需要针对每种类似书籍的书目类型(书籍、收藏、会议录、收藏中、会议录中等)分别应用。

有没有更好的方法可以一次修补所有条目?我对该包\foreach的命令有点熟悉pgffor,但以下简单的用法不起作用,可能是因为它\i在传递给之前没有展开\xpatchbibdriver

\usepackage{pgffor}
\foreach \i in {incollection,proceedings,book,inproceedings}{%
  \xpatchbibdriver{\i}{%
    {\printfield{isbn}}
  }{%
    {\printfield{issn}\newunit\newblock\printfield{isbn}}
  }{}{}
}

有什么方法可以强制扩展\i?我需要\expandafter在这里的某个地方吗?(或者,有没有更好的方法可以在不使用pgfforand/or 的情况下完成我正在做的事情xpatch?)

答案1

由于\xpatchbibdriver使用 构建命令名称\csname...\endcsname,因此\i扩展

补丁未执行,因为\foreach其工作是在一个组中进行的,因此补丁最终会消失。使用\@for

\makeatletter
\@for\next:=incollection,proceedings,book,inproceedings\do{%
  \xpatchbibdriver{\next}
    {{\printfield{isbn}}}
    {{\printfield{issn}\newunit\newblock\printfield{isbn}}}
    {}{}%
}
\makeatother

特点etoolbox

\renewcommand{\do}[1]{%
  \xpatchbibdriver{#1}
    {{\printfield{isbn}}}
    {{\printfield{issn}\newunit\newblock\printfield{isbn}}}
    {}{}%
}
\docsvlist{incollection,proceedings,book,inproceedings}

xparse

\documentclass{article}
\usepackage{biblatex}
\usepackage{xpatch,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\massxpatchbibdriver}{mmmmm}
 {
  \clist_map_inline:nn { #1 }
   {
    \xpatchbibdriver{##1}{#2}{#3}{#4}{#5}
   }
 }
\ExplSyntaxOff

\massxpatchbibdriver{incollection,proceedings,book,inproceedings}
  {{\printfield{isbn}}}
  {{\printfield{issn}\newunit\newblock\printfield{isbn}}}
  {}{} 

相关内容