我正在编写自己的风格,对于大多数条目类型,type
必须打印该字段后标题,但有些条目必须打印前。因此,对于某些条目类型,我需要type
将字段排序在title
字段之前,而对于某些条目类型,我需要将字段排序在字段之后。有办法吗?
平均能量损失
\begin{filecontents}{\jobname.bib}
@book{abook,
author = {Alfred A.},
title = {A Book},
type = {B Type}}
@book{anotherbook,
author = {Alfred A.},
title = {Another Book},
type = {A Type}}
@article{anarticle,
author = {Alfred A.},
title = {An Article},
type = {C Type}}
\end{filecontents}
\documentclass{article}
\usepackage[backend=biber, bibstyle=standard]{biblatex}
\addbibresource{\jobname.bib}
\DeclareBibliographyDriver{book}{
\printnames{author}
\newunit
\printfield{title}
\newunit
\printfield{type}
}
\DeclareBibliographyDriver{article}{
\printnames{author}
\newunit
\printfield{type}
\newunit
\printfield{title}
}
\DeclareSortingScheme{nty}{
\sort{
\field{presort}
}
\sort[final]{
\field{sortkey}
}
\sort{
\field{sortname}
\field{author}
\field{editor}
\field{sorttitle}
\field{title}
\field{subtitle}
}
\sort{
%\field{type}
\field{sorttitle}
\field{title}
\field{subtitle}
}
\sort{
\field{sortyear}
\field{year}
}
\sort{
\field[padside=left,padwidth=4,padchar=0]{volume}
\literal{0000}
}
}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
这是我得到的:
由于是按title
before排序的type
,“An Article”排在“Another Book”之前,而它实际上应该排在最后,因为它type
以“C”开头。
现在,如果我取消注释该行,\field{type}
则会得到以下信息:
因为它是按type
before排序的title
,所以“另一本书”排在“一本书”之前,而事实应该正好相反。
这个答案建议使用该sortkey
字段,但就我而言,这不起作用,因为作者总是放在第一位。
答案1
这是一个奇怪的要求,因为在排序之前你必须以某种方式镜像格式。你可以使用源映射通过以正确的顺序将内容附加到自定义字段来实现。以下是一些让你的 MWE 工作的方法:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\pertype{book}
\step[fieldsource=title]
\step[fieldset=usera, origfieldval]
\step[fieldsource=type]
\step[fieldset=usera, origfieldval, append]
}
\map{
\pertype{article}
\step[fieldsource=type]
\step[fieldset=usera, origfieldval]
\step[fieldsource=title]
\step[fieldset=usera, origfieldval, append]
}
}
}
那么你的排序将是:
\DeclareSortingScheme{nty}{
\sort{
\field{presort}
}
\sort[final]{
\field{sortkey}
}
\sort{
\field{sortname}
\field{author}
\field{editor}
\field{sorttitle}
\field{title}
\field{subtitle}
}
\sort{
\field{usera}
}
\sort{
\field{sortyear}
\field{year}
}
\sort{
\field[padside=left,padwidth=4,padchar=0]{volume}
\literal{0000}
}
}
尽管它实际上不再nty
进行排序并且您可能应该给它起个别的名字。