在这个答案对于让 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
在这里的某个地方吗?(或者,有没有更好的方法可以在不使用pgffor
and/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}}}
{}{}