![按作者分组的 BibTeX 样式](https://linux22.com/image/231591/%E6%8C%89%E4%BD%9C%E8%80%85%E5%88%86%E7%BB%84%E7%9A%84%20BibTeX%20%E6%A0%B7%E5%BC%8F.png)
我正在寻找一种 BibTeX 样式,以如下所示的方式格式化末尾的参考列表。关键点是:
- 参考文献按作者(列表)排序,然后每个作者都有一个按年份列出的参考文献列表。
- 每位作者的名字都占一行,而该作者的参考文献则列在下面,但没有名字,甚至没有“—”
我不太担心确切的标点符号;如果我有任何按作者排序的课程,我可以根据需要破解标点符号。
我在很多书中都见过这种风格。一个现代的例子是杰克的集合论,第 3 版。但我从未发现过能生成此类输出的 BibTeX 样式。
所需输出的示例:
琼斯,萨姆 [2001]《论文》期刊等 [2002] “其他论文”,期刊等 刘易斯,乔 [1999a] 一些书籍、出版商等 [1999b] “另一篇论文”,Big Journal 等
答案1
我终于设法使用创建了一个解决方案biblatex
该包默认将重复出现的作者或编辑者姓名替换为破折号,并且可以重新定义所涉及的宏来实现“按作者分组”:
- 将长度(控制不同作者之间的间距)设置
\bibnamesep
为正值; - 重新定义
\bibnamedash
(调用来排版“重复”破折号)不执行任何操作; - 创建一个新的宏
\authoryearpunct
,a)开始一个新行 b)对于这一行,取消由长度控制的悬挂缩进\bibhang
c)将以下字符串大写(例如“编辑器”) - 在适当的位置插入此宏(每当作者/编辑者姓名实际排版时);
- 重新格式化年份(用括号代替大括号,没有句点)。
诸如“编辑”和“译者”之类的注释将排版在新行的开头,这解释了同一个人既是一部所引用作品的作者,又是另一部作品的编辑/译者的可能性。
编辑:您的样式示例不包括以编辑代替作者的作品。也就是说,应该可以添加“编辑”注释后年份(标题之前)。
\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