我希望实现简单的书目定制,其中年份显示为书目标签。
首先,我认为解决方案可能是创建一个.bst
文件、重新定义 biblabel 或后者的组合(或者可能是我忽略的一些简单的事情)。
我通常使用 biblatex 和 biber 作为后端。
所需功能
以下是 所作条目的格式\printbibliography
。我在这里不关心引用样式,因为\nocite{*}
使用的是。
作为背景,考虑一个 .bib 项目集合,它不太像文章引用,而是内容主要限于标题、注释,有时还有月份字段。
我本质上想用 bib 条目中的年份替换 biblabel。bib 条目的主体可以遵循流行风格的相同逻辑顺序,但有少数例外。bib 条目主体中不需要年份。
实施此操作可能还需要对书目条目的正文进行大量缩进;年份为四个字符,然后是其他字符。所有正文行的缩进量相同。书目标签文本和第一行将位于同一行。
将书目标签设置为月份和年份的某种组合(例如<month>, <year>
)也有一个可能的用例。如果在不同的引用部分之间从以年份作为书目标签跳转到以月份 + 年份作为书目标签,那么可能还想动态指定正文的缩进。
这将如何实现?
这个帖子解释了如何更改年份的位置。也许它可以解释如何删除它?
这个帖子描述 biblatex 的作者年份样式。也许年份样式已经可以实现?
答案1
将代码放在一起,mergedate
并研究本地和全局的标签日期设置,我们得出
\documentclass{scrartcl}
\usepackage[labeldateparts, locallabelwidth]{biblatex}
\addbibresource{biblatex-examples.bib}
\DeclareFieldFormat{labeldatewidth}{\mkbibparens{#1}}
\defbibenvironment{bibliography}
{\list
{\printtext[labeldatewidth]{\printlabeldate}}
{\setlength{\labelwidth}{\labeldatewidth}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\labelsep}{\biblabelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{\bibitemsep}%
\setlength{\parsep}{\bibparsep}}%
\renewcommand*{\makelabel}[1]{##1\hss}}
{\endlist}
{\item}
\renewbibmacro*{date}{%
\ifboolexpr{
test {\iflabeldateisdate}
and
not test {\ifdateshavedifferentprecision{label}{}}
}
{}
{\printdate}}
\renewbibmacro*{issue+date}{%
\ifboolexpr{
test {\iflabeldateisdate}
and
not test {\ifdateshavedifferentprecision{label}{}}
and
test {\iffieldundef{issue}}
}
{}
{\printtext[parens]{%
\printfield{issue}%
\setunit*{\addspace}%
\printdate}}%
\newunit}
\makeatletter
\newlength{\labeldatewidth}
\newlength{\locallabeldatewidth}
\appto\abx@dolabelwidths{\do{labeldate}}
\AtDataInput{%
\nottoggle{blx@skipbib}
{\begingroup
\blx@getlabeldata
\blx@setlabwidth{\labeldatewidth}{%
\printtext[labeldatewidth]{\printlabeldate}}%
\endgroup}
{}}
\AtEveryBibitem{%
\blx@setlabwidth{\locallabeldatewidth}{%
\printtext[labeldatewidth]{\printlabeldate}}}
\newrobustcmd*{\changedateformat}[2]{%
\csdef{blx@dateformat@#1date}{#2}%
\protected\csdef{blx@imc@print#1date}{\csuse{mkdaterange#2}{#1}}%
\protected\csdef{blx@imc@print#1dateextra}{\csuse{mkdaterange#2extra}{#1}}}
\makeatletter
\begin{document}
\nocite{sigfridsson, worman, knuth:ct:a, knuth:ct:b, knuth:ct:c, nussbaum, vizedom:related, baez/online, itzhaki, markey, wassenberg}
\printbibliography
\changedateformat{label}{long}
\printbibliography
\end{document}
编辑已更新以适用于biblatex
v3.16。有关旧版本,biblatex
请参阅编辑历史。
答案2
也许可以调整样式alphabetic
以使用年份作为labelalpha
。概念证明:
\documentclass{article}
\usepackage[style=alphabetic]{biblatex}
\addbibresource{biblatex-examples.bib}
\DeclareLabelalphaTemplate{
\labelelement{
\field[strwidth=4,strside=right]{year}
}
}
\defbibenvironment{bibliography}
{\list
{\printtext[labelalphawidth]{%
\printfield{labelprefix}%
\printfield{labelalpha}}}
{\setlength{\labelwidth}{\labelalphawidth}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\labelsep}{\biblabelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{\bibitemsep}%
\setlength{\parsep}{\bibparsep}}%
\renewcommand*{\makelabel}[1]{##1\hss}}
{\endlist}
{\item}
\DeclareFieldFormat{labelalphawidth}{\mkbibparens{#1}}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
更新:如果您还想在日期仅由年份组成的情况下从参考资料中删除年份,那么您可以选择(由 moewe 提供):
\documentclass{article}
\usepackage[style=alphabetic]{biblatex}
\addbibresource{biblatex-examples.bib}
\DeclareLabelalphaTemplate{
\labelelement{
\field[strwidth=4,strside=right]{year}
}
}
\defbibenvironment{bibliography}
{\list
{\printtext[labelalphawidth]{%
\printfield{labelprefix}%
\printfield{labelalpha}}}
{\setlength{\labelwidth}{\labelalphawidth}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\labelsep}{\biblabelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{\bibitemsep}%
\setlength{\parsep}{\bibparsep}}%
\renewcommand*{\makelabel}[1]{##1\hss}}
{\endlist}
{\item}
\renewbibmacro*{date}{%
\ifboolexpr{
test {\iffieldundef{month}}
and
test {\iffieldundef{season}}
}
{}
{\printdate}}
\renewbibmacro*{issue+date}{%
\ifboolexpr{
test {\iffieldundef{month}}
and
test {\iffieldundef{season}}
and
test {\iffieldundef{issue}}
}
{}
{\printtext[parens]{%
\printfield{issue}%
\setunit*{\addspace}%
\printdate}}%
\newunit}
\DeclareFieldFormat{labelalphawidth}{\mkbibparens{#1}}
\begin{document}
\nocite{*}
\printbibliography
\end{document}