书目定制,以年份作为书目标签

书目定制,以年份作为书目标签

我希望实现简单的书目定制,其中年份显示为书目标签。

首先,我认为解决方案可能是创建一个.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}

两个具有不同日期缩进的参考书目

编辑已更新以适用于biblatexv3.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}

相关内容