biblatex 引文中页码的复杂格式(postnote)

biblatex 引文中页码的复杂格式(postnote)

我正在尝试改变引文中页码的显示方式,biblatex以模仿期刊的(中度)复杂风格。

问题在于,格式会根据引用是否以页面范围结束(例如整篇文章或合集引用)或不以页面范围结束(例如书籍引用)而改变。

如果引用以页码范围结尾,则格式为:space|'at'|space|pagenumber。例如:

马尔科姆。《线与洞穴》[《线与洞穴》],实践智慧,7(1962),38-45,第38页

如果引用未以页码范围结尾,则格式为:逗号|空格|页码。例如:

欧文,柏拉图的伦理学(牛津:牛津大学出版社,1995 年),38

我可以使用以下方法\DeclareFieldFormat分别格式化文章引用和书籍引用。但是,由于样式对文章的第一个引用(除第一个引用外)都使用简写,因此文章应仅在第一个引用中使用“at”。例如,第二个引用应如下所示:

线与洞穴,38

因此,我想做的是根据文章引用的页码引用是第一次完整引用还是后续简写引用,以不同的方式格式化文章引用的页码引用。

这是一个最小的工作示例(尽管为了简单起见我仅使用了标准详细风格):

\documentclass{article}

\begin{filecontents}{\jobname.bib}
@ARTICLE{Malcolm1962,
  author = {John Malcolm},
  title = {The Line and the Cave},
  year = {1962},
  volume = {7},
  pages = {38-45},
  shorthand = {Line \& Cave},
  journal = {Phronesis}
}

@BOOK{Irwin1995,
  author = {Terence Irwin},
  title = {Plato's Ethics},
  year = {1995},
  publisher = {Oxford University Press},
  address = {Oxford},
  shorthand= {Ethics}
}
\end{filecontents}    

\usepackage[british]{babel}
\usepackage{csquotes}
\usepackage[style=verbose]{biblatex}

\addbibresource{\jobname.bib}

\DeclareFieldFormat{pages}{#1} 
\renewcommand{\postnotedelim}{}
\DeclareFieldFormat[article, incollection]{postnote}{ at #1}
\DeclareFieldFormat[article, incollection]{multipostnote}{ at #1}
\DeclareFieldFormat[book]{postnote}{, #1}
\DeclareFieldFormat[book]{multipostnote}{, #1}

\begin{document} 
\cite[38]{Malcolm1962}

\cite[101]{Irwin1995}

\cite[40-42]{Malcolm1962}%Produces 'at 40-42' when it should produce ', 40-42'
\end{document}

答案1

对于标准详细样式,此功能已通过citepages选项设置实现:

\usepackage[style=verbose,citepages=separate]{biblatex}

在或citepages=separate字段下,每当通过测试将识别为页面引用时,都会用和参考书目字符串分隔。pagespagetotalpostnote\postnotedelimthiscitepostnote\iffieldpages

将以下内容添加到您的序言中应该会给您带来所需的结果。

\DefineBibliographyStrings{english}{%
  thiscite = {at}}

\renewbibmacro*{cite:postnote:pages}{%
  \setunit{\addspace}%
  \bibstring{thiscite}%
  \setunit{\addspace}%
  \printfield{postnote}}

pages在其他样式下,您可以通过跟踪字段的引用时间并修改参考书目宏来获得相同的效果postnote。以下是您也可以将其添加到序言或 biblatex 配置文件中的示例。

\renewbibmacro*{postnote}{%
  \iffieldundef{postnote}
    {}
    {\ifboolexpr{
       test {\iftoggle{cbx:citepages}}
       and
       test {\iffieldpages{postnote}}
     }
       {\setunit{\addspace}%
        \bibstring{thiscite}%
        \setunit{\addspace}}
       {\setunit{\postnotedelim}}%
     \printfield{postnote}}}

\DeclareFieldFormat{pages}{%
  #1%
  \ifboolexpr{ test {\ifcitation} and not test {\ifblank{#1}} }
    {\global\toggletrue{cbx:citepages}}
    {}}

\newtoggle{cbx:citepages}
\AtEveryCitekey{\global\togglefalse{cbx:citepages}}

citepages选项还处理pagetotal字段。您可以通过类似地修改格式指令将代码扩展到此字段pagetotal。请注意,我忽略了条目类型,只处理了定义字段的情况pages。当然,您可以使用\ifentrytype测试来考虑类型。

相关内容