我有一个大型的参考书目文件,其中绝大多数条目都带有注释(并且注释可以(并且确实)包含\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.9
和biber 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{*}
第二轮,否则将不会写入,.bcf
也biber
不会查找任何内容。但是,\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}