我已经开始使用 LaTeX(学校推荐)撰写论文,作为一个完全的新手,我一直在努力弄清楚如何按出现顺序更改引用。
我使用的是 natbib 包和在网上找到的自定义书目样式,引用采用作者年份 (John 等,2005) 样式,而不是数字 [1,3]。我进行了一些搜索,但大多数结果都显示人们使用数字系统,作为这方面的完全初学者,我还没有尝试过一些可行的方法。
我目前的引用如下:(Frank 等,2005;John 等,2002;Matthew,2008)
我想按年份排序或关闭排序,以便它按照我在文档中输入的顺序显示。
例如:(John 等人,2002 年;Frank 等人,2005 年;Matthew,2008 年)
引用和参考书目本身是完美的,我只关心引用顺序是否未排序(或按文档中的出现排序),因为目前它是按名称的字母顺序对所有内容进行排序。所以我的问题是,如何使用 natbib 和自定义 bibliostyle 实现按出现对引用中的参考文献进行排序(或关闭按字母顺序排序)?如果这不可能,有人可以指出我获得类似效果的正确方向吗?
提前感谢您的时间和帮助。
答案1
该unsrtnat
样式按引用顺序对参考书目进行排序。类似于LaTeX/BibTex 不按出现顺序排列引用:
\documentclass{article}
\usepackage[semicolon]{natbib}
\begin{filecontents}{\jobname.bib}
@book{foo,
author = {Foo},
year = {2002},
title = {Title of Foo},
}
@book{bar,
author = {Bar},
year = {2005},
title = {Title of Bar},
}
@book{baz,
author = {Baz},
year = {2008},
title = {Title of Baz},
}
\end{filecontents}
\begin{document}
\section{The Beginning}
First we cite \citep{foo}.
Now we cite \citep{bar}.
Then we cite \citep{baz}.
Finally, we cite \citep{foo,bar,baz}.
\bibliographystyle{unsrtnat}
\bibliography{\jobname}
\end{document}
答案2
有两种方法可以继续。无论你选择哪种方式,请确保使用新的 BST 重新运行 BibTeX,以便正确更新 BBL。
1.) 简单方法(一般来说)
最简单的方法要完成您想要的操作,请使用 makebst 重新生成 bst。即从命令行执行:
latex makebst
生成的脚本将为您定制一个 docstrip bst 驱动程序。您可以选择所有您喜欢的格式选项,包括条目的排序顺序(如果有)。完成后,您将获得一个“dbj”文件,您可以使用它来生成您的 bst。例如,如果结果是“mycustom.dbj”,则执行:
latex mycustom.dbj
您将生成一个“mycustom.bst”。此外,此 BST 文件将与 natbib 兼容。
2.) 困难方法(针对一般的 BST)
或者,您可以自己编辑 bst 文件,并根据稿件中的出现情况对显式排序进行修改。只要您熟悉后缀(想想“逆波兰表示法”)语法,这并不难。例如,如果我打开“abbrvnat.bst”文件,我会看到有一个块...
FUNCTION {presort}
{ calc.label
label sortify
" "
*
type$ "book" =
type$ "inbook" =
or
'author.editor.sort
{ type$ "proceedings" =
'editor.organization.sort
{ type$ "manual" =
'author.organization.sort
'author.sort
if$
}
if$
}
if$
" "
*
year field.or.null sortify
*
" "
*
cite$
*
#1 entry.max$ substring$
'sort.label :=
sort.label *
#1 entry.max$ substring$
'sort.key$ :=
}
这是设置条目顺序的函数。在函数中,您必须反向阅读代码。要注意的第一个重要块以 开头type$ "book" =
并以 结尾if$
。该行type$ "book" =
测试 是否type$
等于"book"
。下一行类似地测试类型是否为 inbook。然后,下面的“或”将这两个进行析取,结果是if$
最后的 的测试。 后面的行or
是 的第一个分支if$
,该行后面的花括号块是 的 else 分支if$
。该模式在块内继续。基本上,这部分代码决定最初按哪个字段排序。这大段代码之后的行将*
那些主排序键与次要排序键(如年份)连接起来(在这种语言中)。这种连接一直持续到最终分配sort.key$
。因此,我们的工作是重写此代码以sort.key$
根据手稿中的出现顺序设置 。因此,借用 unsrtnat.bst,我们将该代码块替换为以下内容:
INTEGERS { seq.num }
FUNCTION {init.seq}
{ #0 'seq.num :=}
EXECUTE {init.seq}
FUNCTION {int.to.fix}
{ "000000000" swap$ int.to.str$ *
#-1 #10 substring$
}
FUNCTION {presort}
{ calc.label
label sortify
" "
*
seq.num #1 + 'seq.num :=
seq.num int.to.fix
'sort.label :=
sort.label *
#1 entry.max$ substring$
'sort.key$ :=
}
结果是排序键与条目在手稿中出现的顺序一致。
但是,再说一次,制作您自己的自定义 BST 的最佳方式几乎总是使用latex makebst
,它允许您设置自定义排序顺序。另外,生成的 BST 文件与 natbib 兼容。
答案3
我也遇到过同样的问题,解决方案非常简单,即使我花了数周时间才弄清楚!尝试使用
\bibliographystyle{unsrtnat}
作为一种风格,是的,就这么简单!这将按照出现的顺序而不是作者姓名的字母顺序为您提供引用排序。
答案4
我使用natbib
专门.bst
用于期刊的文件。我需要按照论文在文档中出现的顺序列出它们。事实证明,以下简单的解决方案对我有用:
我打开.bst
文件并注释掉只有命令的行SORT
。我用新名称保存了文件并将其用作我的样式文件。现在,论文没有排序,而是按出现的顺序列出。