Natbib 按出现顺序排序和引用

Natbib 按出现顺序排序和引用

我已经开始使用 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。我用新名称保存了文件并将其用作我的样式文件。现在,论文没有排序,而是按出现的顺序列出。

相关内容