如何在 biblatex 中建立复杂的参考文献排序方案?

如何在 biblatex 中建立复杂的参考文献排序方案?

我打算发表文章的期刊对参考文献列表有一些奇怪的排序要求。基本排序是按字母顺序排列的,但(引用自这里):

  1. “有两位作者的论文应按照第一作者的论文顺序,按照第二作者姓名的字母顺序排列。”
  2. “有两位以上作者的文章应按时间顺序排列在第一作者的文章之后”
  3. “如果某一年份有多个来自同一第一作者的参考文献,请按引用顺序列出参考文献。”

当然,使用 1 可以自动实现,sorting = nyt但是我如何包含要求 2 和 3?我猜解决方案应该涉及\DeclareSortingScheme{},但我不知道如何编写代码。

答案1

目前还不清楚这些规则应该如何结合起来。基于本期刊最近发表的参考文献似乎任何两位作者的论文都应该排在三位或更多位作者的作品之前,且第一作者相同,无论时间顺序如何。一位作者和两位作者的作品也有类似的先例。您可以通过将第一作者和一些“大”值复制到sortname每个有两位以上作者的条目的字段中来实现这一切。

对于一位或两位作者的条目,可以通过将整个列表添加到同一排序元素中sortname来省略,如下面新的排序方案中所做的那样。使用一些全局选项设置可以轻松实现与引文排序和名称列表截断相关的进一步要求。该文档还演示了其中的一些。authoremi

\documentclass{article}
\usepackage{csquotes}
\usepackage[american]{babel}
\usepackage[backend=biber,style=authoryear,sortcites,sorting=noneyear,
            maxcitenames=1,minbibnames=6,maxbibnames=7]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
      \step[fieldsource=author,match=\regexp{\s+and\s.+\s+and\s},final]
      \step[fieldset=sortname,origfieldval]
      \step[fieldsource=sortname,match=\regexp{\s+and\s.+},replace={\ and\ Zzz}]
    }
  }
}

\DeclareSortingScheme{noneyear}{
  \sort{\citeorder}
  \sort{\field{year}}
}

\DeclareSortingScheme{emi}{
  \sort{
    \field{sortname}
    \field{author}
  }
  \sort{\field{year}}
  \sort{\citeorder}
}

\begin{filecontents}{\jobname.bib}
@article{ref1,
  author = {First, Joe and Second, Jane and Third, Bob},
  title = {Article title},
  journaltitle = {Journal},
  date = {2001-01}}
@article{ref2,
  author = {First, Joe and Second, Jane and Third, Bob},
  title = {Article title},
  journaltitle = {Journal},
  date = {2000-01}}
@book{ref3,
  author = {First, Joe and Third, Bob},
  title = {Book title},
  year = {2002}}
@book{ref4,
  author = {Doe, Joe and Smith, Sam},
  title = {Book title},
  date = {2001}}
@book{ref5,
  author = {Doe, Joe and Brown, Bob},
  title = {Book title},
  date = {2002}}
@book{ref6,
  author = {First, Joe},
  title = {Book title},
  date = {2003}}
\end{filecontents}

\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}

\begin{document}
Filler \parencite{ref1,ref2,ref3,ref4,ref5,ref6}.
Filler \parencite{knuth:ct:c,knuth:ct:b,knuth:ct:a}.
\printbibliography[sorting=emi]
\end{document}

在此处输入图片描述

答案2

我认为,大部分工作都可以通过使用新式的(min|max)sortnameshttps://github.com/plk/biblatex/issues/755)。

minsortnames=1, maxsortnames=2,

你实际上告诉biblatex最多考虑前两个名字进行排序。更准确地说,

  1. 作品<name_1>分类如下<name_1>
  2. 作品仅按由 诱导的顺序<name_1> and <name_2>排列在作品之后,<name_1><name_2>
  3. 两位以上作者的作品排在 之下<name_1> et al.,排在<name_1>和 之后<name_1> and <name_2>

由于向后兼容的原因,设置(min|max)bibnames也将设置(min|max)sortnames,因此(min|max)sortnames必须在之后设置(min|max)bibnames

\documentclass{article}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=authoryear,
            sorting=emi, sortcites=true,
            minbibnames=6, maxbibnames=7,
            maxcitenames=1, maxcitenames=2,
            minsortnames=1, maxsortnames=2,
]{biblatex}


\DeclareSortingTemplate{emi}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort{
    \field{sortname}
    \field{author}
    \field{editor}
    \field{translator}
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{sortyear}
    \field{year}
  }
  \sort{\citeorder}
  \sort{
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{volume}
    \literal{0}
  }
}

\begin{filecontents}{\jobname.bib}
@article{ref1,
  author  = {First, Joe and Second, Jane and Third, Bob},
  title   = {Article title},
  journal = {Journal},
  date    = {2001-01},
}
@article{ref2,
  author  = {First, Joe and Second, Jane and Third, Bob},
  title   = {Article title},
  journal = {Journal},
  date    = {2000-01},
}
@book{ref3,
  author = {First, Joe and Third, Bob},
  title  = {Book title},
  year   = {2002},
}
@book{ref4,
  author = {Doe, Joe and Smith, Sam},
  title  = {Book title},
  date   = {2001},
}
@book{ref5,
  author = {Doe, Joe and Brown, Bob},
  title  = {Book title},
  date   = {2002},
}
@book{ref6,
  author = {First, Joe},
  title  = {Book title},
  date   = {2003},
}
\end{filecontents}

\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}

\begin{document}
Filler \autocite{ref1,ref2,ref3,ref4,ref5,ref6}.
Filler \autocite{knuth:ct:a,knuth:ct:c}.
Filler \autocite{knuth:ct:b}
\printbibliography
\end{document}

排序后的输出。

相关内容