LaTeX文档分章节引入参考文献

在使用LaTeX编辑文档时,可以方便地插入参考文献,推荐使用bibtex插件,我在文章 LaTeX 插入参考文献中详细介绍了这种方法。最近阅读一些书籍时,注意到有些书籍在每章或每节的末尾插入了参考文献,这对于编写大型教学资料非常有帮助。本文将介绍如何在章节末尾插入参考文献。

bib 文献库

在编写资料时,可以根据文献的分类分别建立不同的文献库,例如编写一本物理资料时,可以分别建立li.bib、dian.bib、re.bib等文件。例如: li.bib文件的内容如下

li.bib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@book{zhou2009,
author = {周衍柏},
title = {理论力学教程},
edition = {3},
publisher = {高等教育出版社},
address = {北京},
year = {2009},
note = {第五版于2023年出版}
}

@book{liu2019,
author = {刘川},
title = {理论力学},
publisher = {北京大学出版社},
address = {北京},
year = {2019},
isbn = {978-7-301-30653-6}
}

@book{landau2007,
author = {朗道 and 栗弗席兹},
title = {力学},
translator = {李俊峰 and 鞠国兴},
publisher = {高等教育出版社},
address = {北京},
year = {2007}
}

@book{goldstein2013,
author = {Goldstein, Herbert and Poole, Charles P. and Safko, John L.},
title = {Classical Mechanics},
edition = {3},
publisher = {Pearson},
address = {Harlow},
year = {2013},
isbn = {978-1-292-02655-8}
}

@book{liang2009,
author = {梁昆淼},
title = {力学(第四版)(下册)},
publisher = {高等教育出版社},
address = {北京},
year = {2009}
}

文献的引用

在正文需要引用的地方使用\cite{键名}。 例如推荐刘川的书时写:

1
推荐刘川的《理论力学》\cite{liu2019}作为入门教材。

文档末列出被引用过的文献

使用传统的 BibTeX 方式

在文档末尾(\end{document})加入两行:

1
2
\bibliographystyle{plain} % 或unsrt, ieeetr 等样式
\bibliography{li, dian, re} %多个库用英文逗号隔开,逗号后跟一个空格, 不需要加.bib

其中plain是基础样式,按作者字母排序、数字标号。如果你希望参考文献按引用先后顺序排列,把样式换成unsrt即可。

使用现代的 BibLaTeX 方式

只需要在导言为每个文献库单独调用一次\addbibresource命令,即

biblatex 方式
1
2
3
4
\usepackage[backend=biber, style=numeric]{biblatex}
\addbibresource{li.bib} % 特别注意要加上 .bib, 这与传统的bibtex方式不同
\addbibresource{dian.bib}
\addbibresource{re.bib}

在正文中的任何位置都可以使用命令\printbibliography插入引用过的条目,biblatex默认只打印在正文中被\cite系列命令引用过的条目。如果某个文献在.bib文件中但未被引用,它不会出现在目录中。

\printbibliography支持在方括号[]内添加参数,以控制目录的标题、内容和格式。具体定制选项如下:

  • 自定义标题,可以使用title选项修改:

    1
    2
    3
    \printbibliography[title={参考文献}]
    % 或英文标题
    \printbibliography[title={Reference list}] %[reference:2]

  • 将目录添加到目录,如果希望“参考文献”作为一个章节出现在目录中,使用heading=bibinto:

    1
    \printbibliography[heading=bibintoc, title={参考文献}] %[reference:3]

  • 按类型或关键词过滤条目,可以生成分类文献列表。

    1
    2
    3
    4
    5
    6
    7
    8
    % 只列出文章(@article)类型的文献
    \printbibliography[type=article, title={期刊论文}] %[reference:4]

    % 只列出在 .bib 文件中标记了 keyword={primary} 的文献
    \printbibliography[keyword=primary, title={核心文献}] %[reference:5]

    % 排除某一类文献,例如排除网络来源(@online)
    \printbibliography[nottype=online, title={非网络文献}] %[reference:6]

每节末列出参考文献

列出正文中引用过的条目

  • 方式一:全局加载,按节引用(最简单)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\usepackage[backend=biber, style=numeric]{biblatex}
\addbibresource{li.bib}
\addbibresource{dian.bib}

\begin{document}

\section{力学}
\begin{refsection}
推荐刘川《理论力学》\cite{liu2019}。
\printbibliography[heading=subbibliography, title={本节参考文献}]
\end{refsection}

\section{电学}
\begin{refsection}
推荐某本电学书 \cite{some-elec-book}。
\printbibliography[heading=subbibliography, title={本节参考文献}]
\end{refsection}
  • 方式二:为 refsection 指定专属 bib(更严格, 推荐使用)

如果你希望“力学这一节只能引用 li.bib 里的书,电学只能引用 dian.bib 里的书”,可以给 refsection 环境加上可选参数,直接指定该节使用的文献源:

1
2
3
4
5
6
7
8
9
10
11
\begin{refsection}[li.bib]
\section{力学}
推荐刘川《理论力学》\cite{liu2019}。
\printbibliography[heading=subbibliography, title={本节参考文献}]
\end{refsection}

\begin{refsection}[dian.bib]
\section{电学}
推荐某本电学书 \cite{some-elec-book}。
\printbibliography[heading=subbibliography, title={本节参考文献}]
\end{refsection}

这个写法在 biblatex 文档和多个教程中被明确支持。它的优点是各节文献源完全隔离,不会互相污染;缺点是如果某一节需要同时引用两个库里的书,写起来会稍麻烦(需要把两个库都列进去,或改回方式一)。

列出所有文献库中的文献

使用\nocite{*} 放在refsection环境内部,将它的作用范围被限制在当前节,意思是将所有文献库中的文献都标记为引用过,虽然没有引用过。写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
\usepackage[backend=biber, style=numeric]{biblatex}
\addbibresource{li.bib}
\addbibresource{dian.bib}

\begin{document}

\section{力学}
\begin{refsection}[li.bib]
\nocite{*} % 列出 li.bib 中全部条目,即使正文没引用
% 正文正常 \cite 也可写在这里
\printbibliography[heading=subbibliography, title={力学参考文献}]
\end{refsection}

\section{电学}
\begin{refsection}[dian.bib]
\nocite{*}
\printbibliography[heading=subbibliography, title={电学参考文献}]
\end{refsection}

\end{document}

每章末列出参考文献

导言区设置

1
2
\usepackage[backend=biber, style=numeric]{biblatex}
\addbibresource{refs.bib} % 你之前生成的 BibTeX 文件

正文写法

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{refsection}
\chapter{力学}
...
推荐参考朗道的《力学》\cite{landau2007}。
...
\printbibliography[heading=subbibliography, title={本章参考文献}]
\end{refsection}

\begin{refsection}
\chapter{电学}
...
\printbibliography[heading=subbibliography, title={本章参考文献}]
\end{refsection}

编译

传统 bibtex

bibtex 方式在文档末列出文献的编译
1
2
3
4
xelatex foo.tex
bibtex foo.aux % 注意此处需要明显写出foo.aux
xelatex foo.tex
xelatex foo.tex

现代 biblatex

先安装biber命令,在 ArchLinux中执行命令:

1
sudo pacman -S biber

编译流程

biblatex 方式在文档末列出文献的编译
1
2
3
4
xelatex foo.tex
biber foo % 注意此处没有 .aux
xelatex foo.tex
xelatex foo.tex