将最新条目和最高参考编号放在顶部,形成单独的 Biblatex 书目

将最新条目和最高参考编号放在顶部,形成单独的 Biblatex 书目

我希望有类似描述的 biblatex 行为这里,即对不同类型的出版物建立单独的书目,每个书目应 1)加上相应的标签(C 代表会议出版物,J 代表期刊等),2)按最新条目排序(由出版年份定义)和 3)按书目按降序排列参考编号,即最新条目应具有最高的编号。

Journal articles
----------------
[J3]    reference from 2017
[J2]    reference from 2016
[J1]    reference from 2015

Conference publications
-----------------------
[C4]    reference from 2017
[C3]    reference from 2017
[C2]    reference from 2016
[C1]    reference from 2015

我目前有以下情况:

\usepackage[backend=biber,
        isbn=true,
        giveninits=true,
        style=numeric,
        maxnames=99,
        sorting=ydnt,
        defernumbers=true,
        autocite=superscript]{biblatex}

\subsection*{Journal articles}
\begin{refcontext}[labelprefix=J]
\printbibliography[type=article]
\end{refcontext}

\subsection*{Conference publications}
\begin{refcontext}[labelprefix=C]
\printbibliography[type=inproceedings]

单独的参考书目工作正常,labelprefix 也按预期工作,按年份降序排序。但是,如果我尝试上述问题中提到的解决方案,我会得到非常高的参考编号(在 500 左右)。

上述行为是否可能?如果可能,使用当前 biblatex 等的最优雅的解决方案是什么?

提前谢谢您!

答案1

此答案基于奥黛丽的回答Multibib 反向标签或排序顺序

由于一些内部结构随着时间的推移而发生变化,因此需要进行一些调整。在最近的版本中,某些条目可能会被处理多次,因此我们需要确保每个条目只被处理一次。

此解决方案需要defernumbers选项。

\documentclass{article}
\usepackage[backend=biber,style=numeric,sorting=ydnt,defernumbers]{biblatex}

% Count total number of entries in each refsection
\AtDataInput{%
  \ifcsundef{bbx@processedentries:\therefsection}
    {\csgdef{bbx@processedentries:\therefsection}{}}
    {}%
  \xifinlistcs{\thefield{entrykey}}{bbx@processedentries:\therefsection}{}{%
    \listcsxadd{bbx@processedentries:\therefsection}{\thefield{entrykey}}%
    \csnumgdef{bbx@entrycount:\therefsection:\thefield{entrytype}}{%
      \csuse{bbx@entrycount:\therefsection:\thefield{entrytype}}+1}}}

% Print the labelnumber as the total number of entries in the
% current refsection, minus the actual labelnumber, plus one
\DeclareFieldFormat{labelnumber}{\mkbibdesc{#1}}    
\newrobustcmd*{\mkbibdesc}[1]{%
  \number\numexpr\csuse{bbx@entrycount:\therefsection:\thefield{entrytype}}+1-#1\relax}

\addbibresource{biblatex-examples.bib}

\begin{document}
\nocite{aksin,bertram,chiu,companion,padhye,angenendt,moraux,sigfridsson}

\newrefcontext[labelprefix=J]
\printbibliography[type=article]

\newrefcontext[labelprefix=C]
\printbibliography[type=inproceedings]
\end{document}

答案2

非常感谢,moewe。您的代码非常棒。我针对“按关键字排序”的情况对其进行了轻微修改。例如,我有几种条目类型@misc(关键字:海报、演示文稿、地图、代码)。在这种情况下,按“entrytypes”排序不起作用。但是当我将代码中的“entrytype”更改为“关键字”时,它确实有效:

\AtDataInput{%
  \ifcsundef{bbx@processedentries:\therefsection}
    {\csgdef{bbx@processedentries:\therefsection}{}}
    {}%
  \xifinlistcs{\thefield{entrykey}}{bbx@processedentries:\therefsection}{}{%
    \listcsxadd{bbx@processedentries:\therefsection}{\thefield{entrykey}}%
    \csnumgdef{bbx@entrycount:\therefsection:\thefield{keywords}}{%
      \csuse{bbx@entrycount:\therefsection:\thefield{keywords}}+1}}}

% Print the labelnumber as the total number of entries in the
% current refsection, minus the actual labelnumber, plus one
\DeclareFieldFormat{labelnumber}{\mkbibdesc{#1}}    
\newrobustcmd*{\mkbibdesc}[1]{%
  \number\numexpr\csuse{bbx@entrycount:\therefsection:\thefield{keywords}}+1-#1\relax}

相关内容