按作者分组的 BibTeX 样式

按作者分组的 BibTeX 样式

我正在寻找一种 BibTeX 样式,以如下所示的方式格式化末尾的参考列表。关键点是:

  • 参考文献按作者(列表)排序,然后每个作者都有一个按年份列出的参考文献列表。
  • 每位作者的名字都占一行,而该作者的参考文献则列在下面,但没有名字,甚至没有“—”

我不太担心确切的标点符号;如果我有任何按作者排序的课程,我可以根据需要破解标点符号。

我在很多书中都见过这种风格。一个现代的例子是杰克的集合论,第 3 版。但我从未发现过能生成此类输出的 BibTeX 样式。


所需输出的示例:

琼斯,萨姆
[2001]《论文》期刊等
[2002] “其他论文”,期刊等

刘易斯,乔
[1999a] 一些书籍、出版商等
[1999b] “另一篇论文”,Big Journal 等

答案1

我终于设法使用创建了一个解决方案biblatex该包默认将重复出现的作者或编辑者姓名替换为破折号,并且可以重新定义所涉及的宏来实现“按作者分组”:

  • 将长度(控制不同作者之间的间距)设置\bibnamesep为正值;
  • 重新定义\bibnamedash(调用来排版“重复”破折号)不执行任何操作;
  • 创建一个新的宏\authoryearpunct,a)开始一个新行 b)对于这一行,取消由长度控制的悬挂缩进\bibhangc)将以下字符串大写(例如“编辑器”)
  • 在适当的位置插入此宏(每当作者/编辑者姓名实际排版时);
  • 重新格式化年份(用括号代替大括号,没有句点)。

诸如“编辑”和“译者”之类的注释将排版在新行的开头,这解释了同一个人既是一部所引用作品的作者,又是另一部作品的编辑/译者的可能性。

编辑:您的样式示例不包括以编辑代替作者的作品。也就是说,应该可以添加“编辑”注释年份(标题之前)。

\documentclass{article}

\usepackage[style=authoryear]{biblatex}

\setlength{\bibnamesep}{\baselineskip}
\renewcommand*{\bibnamedash}{}
\newcommand*{\authoryearpunct}{\\\hspace*{-\bibhang}\bibsentence}
\renewcommand*{\labelnamepunct}{\addspace}

\makeatletter

\renewbibmacro*{date+extrayear}{%
  \iffieldundef{year}
    {}
%    {\printtext[parens]{\printdateextra}}}% DELETED
    {\printtext[brackets]{\printdateextra}}}% NEW

\renewbibmacro*{author}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\usebibmacro{bbx:savehash}%
        \printnames{author}%
%   \iffieldundef{authortype}% DELETED
%     {\setunit{\addspace}}% DELETED
%     {\setunit{\addcomma\space}}}% DELETED
    \setunit{\authoryearpunct}}% NEW
     \iffieldundef{authortype}
       {}
       {\usebibmacro{authorstrg}%
    \setunit{\addspace}}}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\addspace}}%
  \usebibmacro{date+extrayear}}

\renewbibmacro*{bbx:editor}[1]{%
  \ifboolexpr{
    test \ifuseeditor
    and
    not test {\ifnameundef{editor}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\printnames{editor}%
%   \setunit{\addcomma\space}% DELETED
    \setunit{\authoryearpunct}% NEW
    \usebibmacro{bbx:savehash}}%
     \usebibmacro{#1}%
     \clearname{editor}%
     \setunit{\addspace}}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\addspace}}%
  \usebibmacro{date+extrayear}}

\renewbibmacro*{bbx:translator}[1]{%
  \ifboolexpr{
    test \ifusetranslator
    and
    not test {\ifnameundef{translator}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\printnames{translator}%
%   \setunit{\addcomma\space}% DELETED
    \setunit{\authoryearpunct}% NEW
    \usebibmacro{bbx:savehash}}%
     \usebibmacro{translator+othersstrg}%
     \clearname{translator}%
     \setunit{\addspace}}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\addspace}}%
  \usebibmacro{date+extrayear}}

\makeatother

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@misc{a01,
  author = {Author, A.},
  year = {2001},
  title = {Alpha},
}
@misc{a02,
  author = {Author, A.},
  year = {2002},
  title = {A title that goes to great lengthts in expounding the matter at hand and therefore doesn't fit into one line},
}
@misc{b03,
  editor = {Buthor, B.},
  year = {2003},
  title = {Bravo},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\nocite{*}

\begin{document}

\printbibliography

\end{document}

编辑:不知何故,这在没有\makeatletter-\makeatother组合的情况下也能工作。尽管如此,还是添加了。

答案2

尝试biblatex-philosophy风格,它完全符合您的要求。

答案3

如果您使用该选项,样式jurabib/包就可以做类似这样的事情。bibformat=ibidemalt

\usepackage[bibformat=ibidemalt]{jurabib}

它将按作者姓名对参考文献进行分组,但不会在每个参考文献前面加上年份。

我建议联系您见过的使用此格式的书籍的作者或出版商,并询问其中是否有使用 LaTeX 编写的书籍,如果是,他们能否向您指出一个可以满足您需求的 BibTeX 样式文件。如果没有,您可以尝试准备一个自定义样式文件来为您完成此操作,可能只需复制jurabib.sty和修改它即可。BibTeX 使用一种古怪的语言来定义样式,但一旦您花了一些时间使用它,它就不会太晦涩难懂。(或者:在此网站上搜索 biblatex 的提及,如果它适合您,可能会更容易)

答案4

由于这两个答案都不太令人满意,我花了一个下午的时间学习 btxhak.pdf 的 BibTex。我修改了 amsalpha 样式以产生我想要的输出类型。这只是一个粗略的破解;对于任何生产文档,都需要非常仔细地校对。但它似乎确实能完成工作。由于这里没有办法发布文件,我所能做的就是链接到它们:示例 pdf源代码.tar.gz

相关内容