排序选项、多重参考上下文和书目列表的意外行为(biblatex 3.0)

排序选项、多重参考上下文和书目列表的意外行为(biblatex 3.0)

我有一个大型的参考书目文件,其中绝大多数条目都带有注释(并且注释可以(并且确实)包含\cite命令)。

我必须制作一个显示图块和注释的带注释条目的列表,并且这些条目应按时间倒序列出(并按年份分组)。

最后,我必须创建一个标准的参考书目,包括带注释的条目、注释中引用的条目以及最终的crossref条目。参考书目采用标准数字格式并按字母顺序排列。

对于带注释的条目列表,我可以使用一个书目列表(带有适当的过滤器和特殊的驱动程序):

\renewcommand{\thesubsection}{\arabic{subsection}}

\DeclareBibliographyDriver{ggtype}{%
    \ifnumless{\thefield{year}}{\value{anno}}
      {\section*{\printfield{year}}
         \setcounter{subsection}{0}
         \setcounter{anno}{\thefield{year}}}
      {}
    \subsection[]{\thefield{title}}
    \printfield{note} \printfield{year}
    \cite{\thefield{entrykey}}
}

\DeclareBibliographyCategory{exclude}
\addtocategory{exclude}{sixth}

\DeclareBiblistFilter{ggtype}{
 \filter[type=field,filter=note]
}

\defbibenvironment{ggtype}
  {\newrefcontext[sorting=nty]} % this line is for biblatex 3.0, biber 2.0
  %{} % this line is for biblatex 2.9, biber 1.9
  {}
  {}

\newcounter{anno}
\setcounter{anno}{2016}

我的想法是分两轮处理条目。第一轮我使用\nocite{*}包含 bibtex 文件中的所有条目,第二轮从 biblist 中的信息中提取条目(驱动器包括一个确保自我引用的命令(\cite{\thefield{entrykey}} biblist 驱动器定义末尾的),然后\nocite{*}删除。我使用\IfFileExists{\jobname.bbl}{}{\nocite{*}}来实现这一点。

使用biblatex 2.9biber 1.9。我可以使用以下模式

\begin{document}

\IfFileExists{\jobname.bbl}{}{\nocite{*}}

\printbiblist[heading=none,notcategory=exclude,sorting=ydnt]{ggtype}
\printbibliography[sorting=nyt]
\end{document}

然后使用以下工作流程:latex->biber->latex->biber->latex

Biblatex 3.0并将选项biber 2.0替换为“引用上下文”。因此,我的模式是:sorting\printbibliography\printbiblist

\begin{document}

\newrefcontext[sorting=ydnt]
\IfFileExists{\jobname.bbl}{}{\nocite{*}}

\printbiblist[heading=none,notcategory=exclude]{ggtype}
\printbibliography
\end{document}

并注意的\newrefcontext第一个参数\definebibenvironment

我可以使用与 相同的工作流程biblatex 2.9

这是“意外行为”部分。如果我使用

\usepackage[sorting=nty]{biblatex}

然后,工作流程失败。 biblist 在第二次 latex 运行中没有打印出来,在第二轮中也没有引用,并且biber抱怨没有引用。请注意,sorting=nty在这种情况下是无用的(因此解决方案是不要使用它),它对 来说是无害的biblatex 2.9 biber 1.9,但对 来说却有问题biblatex 3.0 biber 2.0

而且,第一轮之后,bbl文件生成正确,并且不为空。

这个问题已报告给 biblatex 开发人员,但他们要求将问题发布到此网站(并收集其他人的想法)。一个建议是将其纳入\nocite{*}第二轮,否则将不会写入,.bcfbiber不会查找任何内容。但是,\cite应该在 biblist 中发布。虽然此建议适用于 MWE(请参阅下文了解完整的 MWE),但对于我从事的项目,它需要额外的latex->biber往返。

所以问题是,带有附加(且无用)sorting选项的行为是否是预期的行为。

\documentclass{article}

\usepackage[backend=biber
    sorting=nyt, % this is the problematic line; commenting it solves the problem.
]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@book{first,
    title = {First Title},
    author = {Author, Author},
    year = 2015,
    note = {note}
}
@book{second,
    title = {Second Title},
    author = {Duthor, Duthor},
    year = 2015,
    note = {note}
}
@book{third,
    title = {Third Title},
    author = {Buthor, Buthor},
    year = 2014,
    note = {note}
}
@book{fourth,
    title = {Fourth Title},
    author = {Cuthor, Cuthor},
    year = 2014,
    note = {note \cite{seventh}}
}
@book{fifth,
    title = {Fifth Title},
    author = {Euthor, Euthor},
    year = 2014,
}
@book{sixth,
    title = {Sixth Title},
    author = {Futhor, Futhor},
    year = 2015,
    note = {note}
}
@book{seventh,
    title = {Seventh Title},
    author = {Guthor, Guthor},
    year = 2014,
}
\end{filecontents}
\addbibresource{\jobname.bib}

\renewcommand{\thesubsection}{\arabic{subsection}}

\DeclareBibliographyDriver{ggtype}{%
    \ifnumless{\thefield{year}}{\value{anno}}
      {\section*{\printfield{year}}
         \setcounter{subsection}{0}
         \setcounter{anno}{\thefield{year}}}
      {}
    \subsection[]{\thefield{title}}
    \printfield{note} \printfield{year}
    \cite{\thefield{entrykey}}
}

\DeclareBibliographyCategory{exclude}
\addtocategory{exclude}{sixth}

\DeclareBiblistFilter{ggtype}{
 \filter[type=field,filter=note]
}

\defbibenvironment{ggtype}
  % comment/uncomment the following wto line for biblatex 3.0 and 2.9
  {\newrefcontext[sorting=nty]} % 3.0
  %{} % 2.9
  {}
  {}

\newcounter{anno}
\setcounter{anno}{2016}

\begin{document}

% comment /uncomment the following line for biblatex 2.9/3.0
\newrefcontext[sorting=ydnt] % 3.0

\IfFileExists{\jobname.bbl}{}{\nocite{*}}

% comment the following two lines for biblatex 2.9
\printbiblist[heading=none,notcategory=exclude]{ggtype}
\printbibliography

% uncomment the following two lines for biblatex 2.9
%\printbiblist[heading=none,notcategory=exclude,sorting=ydnt]{ggtype}
%\printbibliography[sorting=nty]
\end{document}

在此处输入图片描述

相关内容