![使用 biblatex 计算参考文献数量](https://linux22.com/image/253730/%E4%BD%BF%E7%94%A8%20biblatex%20%E8%AE%A1%E7%AE%97%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE%E6%95%B0%E9%87%8F.png)
我正在创建带注释的参考书目。有没有办法获取参考书目中符合特定标准的参考文献数量并将其插入到文档中?
例如使用 biblatex 我使用以下命令创建一个部分:
\nocite{*} ;; include all references in .bib file
\printbibliography[keyword=MyProject,type=report,title=My project reports]
另一个使用:
\printbibliography[keyword=AnotherProject,type=report,title=Another project's reports]
我希望能够在文档的其他地方放置一个表格,其中按项目统计报告数量,或者在文本中包含这些计数。例如:
“今年我的项目出具了XX报告,而另一个项目出具了YY报告。”
关于如何开始做这件事,您有什么想法吗?
更新:
根据 Maieul 的出色和快速回答,我得到以下 MWE:
\documentclass[oneside,oldfontcommands,9pt,a4paper]{memoir}
\usepackage{url}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear,natbib=true,backend=biber,url=false,doi=false,eprint=false,isbn=false,maxbibnames=98]{biblatex}
\addbibresource{mybiblio.bib}
\begin{document}
\nocite{*}
\chapter{Introduction}
My project produced \thearticles peer-reviewed articles and Another Project produced \theotherarticles peer-reviewed articles. \par
Note - no numbers here.
\newcounter{articles}
\renewbibmacro*{finentry}{\stepcounter{articles}\finentry}
\printbibliography[keyword=MyProject,title=My project peer-reviewed articles,type=article]
\newcounter{otherarticles}
\renewbibmacro*{finentry}{\stepcounter{otherarticles}\finentry}
\printbibliography[keyword=AnotherProject,title=Another project peer-reviewed articles,type=article]
My project produced \thearticles peer-reviewed articles and Another Project produced \theotherarticles peer-reviewed articles. \par
This works
\end{document}
其中 mybiblio.bib 如下所示:
@ARTICLE{Other2000,
author = { Other, A N},
title = { my article},
journal = { Some journal },
keywords = {MyProject},
year = {2000},
number={2},
volume = {343},
pages = {230-8}
}
@article{Author1993,
author = {Author, E and Author, M},
journal = {Some Journal},
keywords = {MyProject},
number = {4},
pages = {424--428},
title = {{Another article}},
volume = {6},
year = {1993}
}
@article{Author1997a,
author = {Author, F and Author, T },
journal = {Another journal},
keywords = {AnotherProject},
title = {{A third article}},
year = {1997}
}
但是,正如您所看到的,我无法在文档中比 \printbibliography 命令更早地引用计数器。有什么方法可以尽早引用计数器吗?
答案1
好的,那么在你的序言中,写上
\newcounter{refs}
\makeatletter
\defbibenvironment{counter}
{\setcounter{refs}{0}
\renewcommand{\blx@driver}[1]{}
}
{We have \therefs references}
{\stepcounter{refs}}
\makeatother
并使用\printbibliography[env=counter,options for selection]
解释:你创建了一个新的书目类型,称为“计数器”。它由 定义\defbibenvironment
。
- 书目类型,此处为“计数器”
- 第二个参数:参考书目开头正在做什么。 在你的情况下是:a. 重置计数器 b. 说在测试条目时不打印任何内容。
- 参考书目末尾印刷的是什么。
- 每次进入时打印/执行什么。
抱歉,我用的是英文。如果可以的话,告诉我。我会在我的博客上写一篇法语文章。
答案2
您可以计算 中的引用数\AtDataInput
。为了避免指定两次计数/过滤条件,您可以创建类别。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[backend=biber,style=authoryear]{biblatex}
\DeclareBibliographyCategory{primary}
\DeclareBibliographyCategory{secondary}
\defbibheading{primary}{\subsection*{Primary sources}}
\defbibheading{secondary}{\subsection*{Secondary sources}}
\newcounter{primary}
\newcounter{secondary}
\AtDataInput{%
\ifboolexpr{ test {\ifkeyword{primary}} and not test {\ifentrytype{misc}} }
{\addtocategory{primary}{\thefield{entrykey}}%
\stepcounter{primary}}
{}%
\ifboolexpr{ test {\ifkeyword{secondary}} and not test {\iffieldundef{year}}
and test {\ifnumless{\thefield{year}+0}{1980}} }
{\addtocategory{secondary}{\thefield{entrykey}}%
\stepcounter{secondary}}
{}}
\addbibresource{biblatex-examples.bib}
\begin{document}
In this document, I cite \arabic{primary} primary works and \arabic{secondary}
secondary works.
\nocite{*}
% Filler text \parencite{aristotle:poetics,aristotle:rhetoric,nussbaum,hyman,pines}.
\printbibheading
\bibbycategory
% \bibbycategory is a shorthand for:
% \printbibliography[heading=primary,category=primary]
% \printbibliography[heading=secondary,category=secondary]
\end{document}
此方法也适用于 BibTeX 作为后端。\ifboolexpr
提供了一种灵活的方式来组合各个测试。更多详细信息请参阅手册biblatex
。
限制在于\AtDataInput
不区分参考部分。如果您的文档使用这些(通过选项refsection
或refsection
环境),您可以使用 中的某些命令使计数器特定于部分etoolbox
。
\newcounter{primary}
\def\theprimary{\csuse{primary:\therefsection}}
\newcounter{secondary}
\def\thesecondary{\csuse{secondary:\therefsection}}
\AtBeginEnvironment{refsection}{%
\csnumgdef{primary:\therefsection}{0}%
\csnumgdef{secondary:\therefsection}{0}}
\AtDataInput{%
\ifboolexpr{ test {\ifkeyword{primary}} and not test {\ifentrytype{misc}} }
{\addtocategory{primary}{\thefield{entrykey}}%
\csnumgdef{primary:\therefsection}{\csuse{primary:\therefsection}+1}}
{}%
\ifboolexpr{ test {\ifkeyword{secondary}} and not test {\iffieldundef{year}}
and test {\ifnumless{\thefield{year}+0}{1980}} }
{\addtocategory{secondary}{\thefield{entrykey}}%
\csnumgdef{secondary:\therefsection}{\csuse{secondary:\therefsection}+1}}
{}}
\theprimary
这里您只应该使用和访问计数器值\thesecondary
。
答案3
我认为你可以尝试这个:
\newcounter{报告} \renewbibmacro*{finentry}{\sttepcounter{报告}\finentry} \printbibliography[keyword=MyProject,type=report,title=我的项目报告] \newcounter{报告2} \renewbibmacro*{finentry}{\stepcounter{reports2}\finentry} \printbibliography[keyword=MyProject,type=report,title=我的项目报告] 今年,我的项目生成了 \thereports 报告,而另一个项目生成了 \thereports2 报告。
L.1 和 L. 4:创建计数器 L.2 和 L. 6:在参考书目每条条目处增加计数器。 L. 7:打印计数器
也可以看看http://geekographie.maieul.net/Une-bibliographie-commentee