Latex文献引用实用技巧——以natbib包为例说明

本文档介绍如何利用LaTeX的natbib包高效管理文献引用,提供代码示例展示如何设置引用样式,包括自动文献列表和作者排序。通过修改文献列表格式文件,可以实现按姓氏首字母排序和自定义显示样式。附带代码下载链接以供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

大家在写技术文档、论文、项目书的时候,会引用很多文献,使用Latex可以实现对文献引用的统一自动管理,可以自动生成文献列表,不需要手工罗列,可以自动实现引用的更新和链接,不需要手工管理。但在撰写Latex文档时,默认的引用方式和生成的文献列表可能不满足我们的需求,本文介绍如何使用功能强大的natbib包进行文献引用管理,并针对常见几种常见需求,给出一些基于natbib的解决方法。

解决方法

在latex文档中如何使用natbib包

直接结合代码示例为大家说明,代码及注释如下:

\documentclass[12pt]{article} %文档头

\usepackage[UTF8]{ctex} % 显示中文
\usepackage[authoryear,sort&compress,round]{natbib} % 导入natbib包,使用author-year格式,圆括号,对多个引用按照在reference list中的顺序进行排序,compress表示压缩多个数字引用,如(3-8, 15),这里使用author-year,compress选项是不发挥作用的
\usepackage{hyperref} % 导入超链接包,在文中文献引用处点击可实现跳转

\newcommand{\citen}[1]{[\citenum{#1}]} % 定义一个新命令,在方括号中显示文献编号,如[3]




\begin{document} % 开始文档

\section{国内外研究现状} % 第一部分

关于人类视觉注意的理论假设人类视觉系统只详细地处理图像的某个局部,而不是整幅图像。
\cite{80cogSc/Treisman_featureIntegration},\cite{85HN/KochVisualAttention}的早期工作,以及\citeauthor{98pami/Itti}~\citen{98pami/Itti}和\citeauthor{04nature/Wolfe_attributesVisual}~\citen{04nature/Wolfe_attributesVisual}等人的视觉注意理论提议将视觉注意机制分为两个阶段:
快速的、下意识的、自底向上的、数据驱动的显著性提取;
以及慢速的、任务依赖的、自顶向下的、目标驱动的显著性提取。

\citeauthor{98pami/Itti}的工作是在\citeyear{98pami/Itti}年完成的。文献\citen{04nature/Wolfe_attributesVisual}的工作是关于视觉注意理论的。


{
\setcitestyle{numbers} % 为参考文献列表加数字编号
\bibliographystyle{myplainnat} % 对reference list的plainnat格式进行了修改,将作者的名字按照姓氏在前、名字在后的格式显式
\nocite{*} % 显示bib文件中的全部参考文献,无论文中是否引用,如果只想显示文中引用到的文献,那就删去或者注释掉这行代码
\bibliography{Cmm.bib} % 参考文献bib文件名称
}

\end{document}

结果如下截图:
在这里插入图片描述

注意要点
  • 上图显示的PDF文档中,正文中每一处文献引用(姓名、年份、数字编号)都是基于\cite命令实现的,均不需要手动输入,既节省了大量查找时间也避免了手工输入的错误。
  • 参考文献列表带编号,便于查找,并且,参考文献按照作者姓氏首字母从A到Z排序,便于查找。
  • 需要注意上述代码中的\bibliographystyle{myplainnat},这里对textlive自带的文献列表格式文件plainnat.bst进行了修改(不要直接修改,复制一份进行修改),只修改了一行代码,即{ s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=改为{ s nameptr "{vv~}{ll}{, f.}{, jj}" format.name$ 't :=,使得在文献列表中,作者的名字按照姓氏在前、名字在后的样式显示,将修改好的文件另存为myplainnat.bst,放在当前latex项目的文件夹中(与.tex文件位于同一文件夹)。如果你对reference list的显示样式有其他自定义需求,那么可以基于textlive已有的一些样式文件进行自定义修改或者使用textlive命令一步步地定义一个全新的样式文件。
  • 上面的源代码,使用最少的代码量为大家展示了latex中使用natbib包进行文献应用和展示的小技巧,一定注意,下面这几行代码一定要有,并且顺序不要乱。
    \usepackage[authoryear,sort&compress,round]{natbib}
    \usepackage{hyperref}
    \setcitestyle{numbers} 
    \bibliographystyle{myplainnat}
    \nocite{*}
    \bibliography{Cmm.bib}
    

本博文代码下载

下载链接(密码:73i7)

如果你的问题没解决

再仔细读一读上面的代码注释注意要点应该可以启发你解决自己遇到的相关问题,即使没有提供直接答案,也可能会给你一些解决问题或者搜索答案的思路。

### 如何在LaTeX引用其他文件或同一文件中的LaTeX代码片段 #### 使用`listings`宏展示并引用代码片段 为了在LaTeX文档中优雅地显示和引用代码片段,推荐使用`listings`宏。此宏允许定义带有标签的代码列表,并通过`\label`和`\ref`机制实现跨引用。 ```latex % 导言区加载listings宏 \usepackage{listings} % 定义一个新的环境用于Python代码 \lstnewenvironment{python}[1][]{ \lstset{ language=Python, basicstyle=\ttfamily\small, % 设置字体样式 numbers=left, % 显示左侧行号 numbersep=5pt, % 行号距离正文的距离 frame=single, % 添加边框 captionpos=b, % 底部放置标题 breaklines=true, % 自动断行 postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space}, % 断行标志 #1 % 用户自定义设置 } }{} ``` 当需要插入一段代码时,可以通过如下方式操作: ```latex \begin{python}[caption={快速排序算法}, label={lst:quick-sort}] def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) \end{python} ``` 上述子创建了一个名为“快速排序算法”的代码清单,并赋予其标签`lst:quick-sort`以便后续引用[^1]。 #### 跨文件引用外部代码片段 对于大型项目而言,源码往往存储于多个独立文件之中。此时可借助`minted`宏配合`inputminted`命令完成对外部`.py`, `.cpp`等编程语言源文件的选择性读取与渲染。 假设存在一个位于当前工作目录下的`example.py` Python脚本,则可通过下面的方式将其部分内容嵌入到PDF报告里: ```latex % 需要提前安装Pygments支持库才能正常使用minted宏 \usepackage{minted} ... 如需查看完整的快速排序实现,请参见附录A中的代码~\vref{code:full-implementation}. \section*{附录 A} \appendix \renewcommand{\thelstlisting}{A.\arabic{lstlisting}} \inputminted[firstline=1,lastline=8,label={完整版快速排序},frame=lines]{python}{example.py} ``` 这里利用了`firstline`和`lastline`参数指定仅导入特定范围内的行数;而`label`选项则用来附加描述性的标题给这段摘录后的程序段落[^2]。 #### 实现内部代码块之间的相互关联 除了能够标记整个代码区域外,在某些情况下还希望针对个别语句添加注解或是建立更细粒度上的链接关系。这时可以考虑采用组合策略:即先将目标位置设为书签形式,再运用超链接工具跳转至对应地点。 ```latex \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{listings} \begin{document} \begin{lstlisting}[language=C++,escapechar=!] int main() { ! \hypertarget{func-start}{// 函数入口处} printf("Hello world\n"); ! \hypertarget{func-end}{// 函数结束前} return 0; } \end{lstlisting} 稍后我们会在另一处提及这个简单的C++应用程序,特别是从!\hyperlink{func-start}{函数开始}直到!\hyperlink{func-end}{即将返回之前}的部分。 \end{document} ``` 在这个案里面,通过设定两个锚点(`\hypertarget`)分别指向感兴趣的起始/终止位置,之后便能轻松构建交互式的导航路径让读者点击浏览感兴趣的内容区间[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值