使用标签前缀和引用对 biblatex 3.3+ 进行反向编号

使用标签前缀和引用对 biblatex 3.3+ 进行反向编号

我想要获得具有相反编号顺序并在数字上加上前缀的不同参考列表,例如:

图书

[B3] 作者,A.,“Title1”,2016 年

[B2] 作者,B.,“Title2”,2016 年

[B1] 作者,C.,“Title3”,2015 年

期刊

[J2] 作者,D.,“Title4”,2016 年

[J1] 作者,E.,“Title5”,2014 年

等等。

我有以下有效的代码:

\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{lmodern}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{hyperref}

\usepackage[
    backend=bibtex, 
    style=numeric,
    firstinits=true,
    maxcitenames=99,
    maxbibnames=99,
    sorting=ydnt,
    defernumbers=true,
    isbn=false,
]{biblatex}
\addbibresource{publications.bib}

% Definition of asterisk
\newtoggle{bib@asterisk}
\DeclareEntryOption{asterisk}[true]{\settoggle{bib@asterisk}{#1}}

% Reverse ordering for numbers
\AtDataInput{%
  \csnumgdef{entrycount:\strfield{prefixnumber}}{%
    \csuse{entrycount:\strfield{prefixnumber}}+1}}

\DeclareFieldFormat{labelnumber}{\mkbibdesc{#1}}    
\newrobustcmd*{\mkbibdesc}[1]{%
  \number\numexpr\csuse{entrycount:\strfield{prefixnumber}}+1-#1\relax%
  \iftoggle{bib@asterisk}%
    {\textbf{*}}%
    {}%
  }

\begin{document}

\nocite{*}
\printbibliography[title={Books},type=books,prefixnumbers={B}]
\printbibliography[title={Journals},type=article,prefixnumbers={J}]
\end{document}

在 biblatex 上次更新后,我无法复制相同的结果。显然前缀数字已被弃用,他们强迫我使用 biber 而不是 bibtex。

新的代码如下:

\documentclass{article}

\usepackage[
    backend=biber, 
    style=numeric,
    firstinits=true,
    maxcitenames=99,
    maxbibnames=99,
    sorting=ydnt,
    defernumbers=true,
    isbn=false,
]{biblatex}
\addbibresource{publications.bib}

\AtDataInput{%
  \xifinlistcs{\thefield{entrykey}}{entrylist:\therefsection}{}{%
    \listcsxadd{entrylist:\therefsection}{\thefield{entrykey}}%
    \csnumgdef{entrycount:\therefsection}{%
      \csuse{entrycount:\therefsection}+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{entrycount:\therefsection}+1-#1\relax}

\begin{document}
\nocite{*}

\newrefcontext[labelprefix=B]
\printbibliography[type=book,resetnumbers]

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

\end{document}

但我得到的却是

图书

[B5] 作者,A.,“Title1”,2016 年

[B4] 作者,B.,“Title2”,2016 年

[B3] 作者,C.,“Title3”,2015 年

期刊

[J5] 作者,D.,“Title4”,2016 年

[J4] 作者,E.,“Title5”,2014 年

请注意,我还需要引用参考文献,因此我不能使用诸如 etemune 或类似的技巧。您知道如何解决这个问题吗?

答案1

我认为这样的方法可以奏效:它分别计算书籍和文章。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[
    backend=biber,
    style=numeric,
    giveninits=true,
    maxcitenames=99,
    maxbibnames=99,
    sorting=ydnt,
    defernumbers=true,
    isbn=false,
]{biblatex}
\addbibresource{biblatex-examples.bib}


\AtDataInput[book]{%
 \xifinlistcs{\thefield{entrykey}}{entrylist:\therefsection}{}{%
  \listcsxadd{entrylist:\therefsection}{\thefield{entrykey}}%
  \csnumgdef{bookentrycount:\therefsection}{%
      \csuse{bookentrycount:\therefsection}+1}}}

\DeclareFieldFormat[book]{labelnumber}{\mkbibbookdesc{#1}}

\newrobustcmd*{\mkbibbookdesc}[1]{%
   B\number\numexpr\csuse{bookentrycount:\therefsection}+1-#1\relax}

\AtDataInput[article]{%
 \xifinlistcs{\thefield{entrykey}}{entrylist:\therefsection}{}{%
  \listcsxadd{entrylist:\therefsection}{\thefield{entrykey}}%
  \csnumgdef{articleentrycount:\therefsection}{%
      \csuse{articleentrycount:\therefsection}+1}}}

\DeclareFieldFormat[article]{labelnumber}{\mkbibarticledesc{#1}}

\newrobustcmd*{\mkbibarticledesc}[1]{%
   J\number\numexpr\csuse{articleentrycount:\therefsection}+1-#1\relax}

\begin{document}

\cite{iliad} \cite{aksin,herrmann}, \cite{augustine}, \cite{aristotle:anima}

\printbibliography[type=book,resetnumbers]

\printbibliography[type=article,resetnumbers]

\end{document}

在此处输入图片描述

注意力

@set如果书目中有类型的条目,并且其中一篇文章或书籍属于此集合,则此方法将不起作用。在这种情况下,代码将计算文章,但不会在书目中显示它。

答案2

结合解决方案这里这里, 我们可以用

\documentclass{article}

\usepackage[
    backend=biber,
    style=numeric,
    firstinits=true,
    maxcitenames=99,
    maxbibnames=99,
    sorting=ydnt,
    defernumbers=true,
    isbn=false,
]{biblatex}
\addbibresource{publications.bib}

% Reverse publication list numbering
% Count total number of entries in each refsection
\makeatletter
\defbibenvironment{counter}
  {\renewcommand{\blx@driver}[1]{}}
  {}
  {\csnumgdef{entrycount}{%
      \csuse{entrycount}+1}}
\makeatother

% 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{entrycount}+1-#1\relax}


\begin{document}

\nocite{*}
\newrefcontext[labelprefix=B]
\printbibliography[env=counter,type=book,heading=none]
\printbibliography[type=book]

\csnumgdef{entrycount}{0}
\nocite{*}
\newrefcontext[labelprefix=J]
\printbibliography[env=counter,type=article,heading=none]
\printbibliography[type=article]
\end{document}

这应该足够灵活,以便您可以使用任何其他方式对所有参考文献进行分类,例如类别、关键字等。

相关内容