我想要获得具有相反编号顺序并在数字上加上前缀的不同参考列表,例如:
图书
[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}
这应该足够灵活,以便您可以使用任何其他方式对所有参考文献进行分类,例如类别、关键字等。