使用 bibtex 时,关键字字段通常用于与已发表论文相关的实际元数据关键字,但在 biblatex 中,关键字字段用于参考书目过滤器,并且“通常不打印”。也就是说,关键字字段的含义已经改变:它现在用于根据主题对条目进行排序,而不是作为论文中实际元数据的占位符。因此,现在的问题是:为了存储并可能打印论文元数据中出现的关键字,哪个字段或其他解决方案是放置论文关键字元数据的正确/推荐位置?
(仍然存在的类似字段是摘要字段,其仍然用于论文摘要。在这方面,旧的 bibtex 条目可以按原样重复使用。)
答案1
如果您愿意,您可以biblatex
打印该字段的内容keywords
。
字段的内容不会对 隐藏biblatex
,它们可以被打印。但该字段具有特殊格式 - 它不是用 分隔的普通列表and
,而是一个逗号分隔值的列表,biblatex
没有内置函数。所以我们需要做一些我们通常会自己做的\print...
事情。biblatex
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber]{biblatex}
\NewBibliographyString{keyword,keywords}
\DefineBibliographyStrings{english}{%
keyword = {keyword},
keywords = {keywords},
}
\newcounter{cbx@keyword@total}
\newcounter{cbx@keyword@count}
\newcommand*{\keywordscount}[1]{%
\stepcounter{cbx@keyword@total}}
\newcommand*{\keywordsprint}[1]{%
\stepcounter{cbx@keyword@count}%
\ifnumless{\value{cbx@keyword@count}}{2}
{}
{\addcomma\space}%
#1}
\DeclareFieldFormat{keywords}{%
\setcounter{cbx@keyword@total}{0}%
\setcounter{cbx@keyword@count}{0}%
\forcsvlist{\keywordscount}{#1}%
\ifnumgreater{\value{cbx@keyword@total}}{1}
{\bibstring{keywords}}
{\bibstring{keyword}}%
\addcolon\space
\forcsvlist{\keywordsprint}{#1}%
}
\renewbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\printfield{pubstate}%
\newunit\newblock
\printfield{keywords}}
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
date = {1980},
keywords = {civil-service,importance},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{appleby}
\printbibliography
\end{document}
如果您不执着于使用keywords
其 csv 格式,您可以定义一个新的、普通的列表字段并使用它。
由于此解决方案使用了biblatex
常规列表功能,我们可以减少上面所需的辅助函数。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\begin{filecontents*}{printkeywords.dbx}
\ProvidesFile{printkeywords.dbx}[2020/03/16 add printable keyword list to biblatex data model]
\DeclareDatamodelFields[type=list,datatype=literal]{printkeywords}
\DeclareDatamodelEntryfields{printkeywords}
\end{filecontents*}
\usepackage[style=authoryear, backend=biber, datamodel=printkeywords]{biblatex}
\NewBibliographyString{keyword,keywords}
\DefineBibliographyStrings{english}{%
keyword = {keyword},
keywords = {keywords},
}
\DeclareListWrapperFormat{printkeywords}{%
\ifnumgreater{\value{listtotal}}{1}
{\bibstring{keywords}}
{\bibstring{keyword}}
\addcolon\space
#1}
\DeclareListFormat{printkeywords}{%
\usebibmacro{list:plain}%
#1\isdot}
\renewbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\printfield{pubstate}%
\newunit\newblock
\printlist{printkeywords}}
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
date = {1980},
printkeywords = {civil-service and importance},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{appleby}
\printbibliography
\end{document}
MWE 的输出是相同的。