Prerequisite
为了确保您能够成功地将 Jupyter Notebook 转换为符合格式要求的 PDF 文档,请按照以下推荐步骤进行设置和安装:
- 安装 $\LaTeX$ 编译环境:
- 安装 Pandoc。
- 下载 nbconvert 模板:请确保下载最新版本的模板文件(v0.6.0),避免使用上一版本的模板(如果有)。这个文件包含由 jupyter notebook 生成 pdf 格式的课程报告的需要的所有文件。(感谢 zepinglee 的GB/T7714-2015)
- 配置 Python 环境:请按照这篇指南: 基于 pyenv-win 和 Poetry, 构建 Python 开发环境 配置您的 Python 环境。
- 学习 Markdown 和 Jupyter Notebook 的基础:
- 学习如何导出
.bib
格式的文献文件:推荐使用 Zotero 以及 Better BibTeX 插件来生成所需的引文和参考文献键。将导出的.bib
格式的文献文件放置在您的 Notebook 所在的文件夹中。 - 参照模板:确保您提交的实验报告的 PDF 版本应与《商务智能与数据挖掘》课程报告模板或者《数据结构与算法》课程实验报告模板类似。
Notebook 转成 pdf 格式过程
-
在 Jupyter Notebook 中准备好报告内容。
-
编辑 Notebook 的 metadata,如下图所示:
- 点击工具栏上的
Edit
,找到Edit Notebook Metadata
并点击
- 在页面右边的
Notebook metadata
中添加相关内容
- 点击工具栏上的
-
解压下载好的 nbconvert 模板压缩文件,解压后将其中的名为
coursereport
的整个文件夹复制到.venv/share/jupyter/nbconvert/templates/
文件夹下。 -
在 terminal 中使用以下命令(
jupyter nbconvert notebook.ipynb --to pdf --template=coursereport
)将您的名为notebook
的文档转换为 pdf 格式。
nbconvert 模板功能说明
-
该模板目前适用于《商务智能分析》和《数据结构与算法》课程的实验报告。
-
关于 Notebook 的 metadata 设置:注意这里是 Notebook 的 metadata,而非各个 cell 的 metadata。以下内容必须设置:
"title": "《数据结构与算法》实验报告", "subtitle": "动态数组与链表比较", "bibfile": "bib", "bibstyle": "gbt7714-numerical", "abstract": "这是一段用于演示在报告中显示摘要的演示内容,实际值啊要内容应根据您的研究内容总结和展示。摘要应该展示出您的研究背景、创新的研究方法以及研究结论等内容。", "authors": [ { "name": "姓名1(学号)" }, { "name": "姓名2(学号)" }, { "name": "姓名3(学号)" } ],
-
如果您不想让 Notebook 中某个 cell 的内容显示在最终的 pdf 版本上,请在该 cell 的 metadata 添加如下设置:
"hide": true
。 -
在正文中可以通过
\citep{reference key}
或者\citet{reference key}
的方式设置文献引用,转成 pdf 时,会在文末自动生成参考文献。具体可以参考report_template.ipynb
文件。如果您是从 Zotero 并运用 Better BibTeX 插件导出的.bib
格式文件,请先运行如下代码,去除各个文献条目中的 DOI, 以便在生成的参考文献中不会显示该内容。注意,在运行该代码时,请检查文件路径。from pybtex.database import parse_file def remove_doi_field(bib_input_path, bib_output_path): # 解析BibTeX文件,指定编码为utf-8 bib_data = parse_file(bib_input_path, encoding='utf-8') # 遍历所有条目并删除doi字段(如果存在) for entry in bib_data.entries.values(): if 'doi' in entry.fields: del entry.fields['doi'] # 将修改后的BibTeX数据写回文件,同时指定编码为utf-8 with open(bib_output_path, "w", encoding='utf-8') as bibfile: bib_data.to_file(bibfile, bib_format='bibtex') def main(): bib_input_path = "./notebook/bib.bib" bib_output_path = "./notebook/bib.bib" remove_doi_field(bib_input_path, bib_output_path) if __name__ == "__main__": main()
经过以上过程,呈现在最终 pdf 文档中的参考文献应该如下图所示:
-
对于图表以及代码块,请在对应的 cell 的 metadata 中添加标题和标签
-
对于图,请使用
"figcaption": "这里是你图片的标题"
以及"figlabel": "这是对应图的标签,可以用于在正文中引用该图"
。 -
对于表格,请使用
"tabcaption": "这里是你表格的标题"
以及"tablabel": "这是对应表格的标签,可以用于在正文中引用该表"
。 -
对于代码块,请使用
"codecaption": "这里是你代码块的标题"
以及"codelabel": "这是对应代码块的标签,可以用于在正文中引用该代码块"
。 -
这样,在生成 pdf 格式的文档时,会自动设置好图表的标题以及各个图表及代码的引用。如下图所示:
-
-
为了能正常转换
pd.DataFrame
为三线表格,请在您的 setup cell 中执行以下代码def _repr_latex_(self): return "%s" % self.to_latex() pd.DataFrame._repr_latex_ = _repr_latex_
-
为了统一生成的图片格式,请参考以下 matplotlib 的设置:
# personal matplotlib style sheet # Figure size figure.figsize : 12, 6 # Font sizes axes.labelsize : 14 axes.titlesize : 16 xtick.labelsize : 12 ytick.labelsize : 12 legend.fontsize : 12 font.size : 12 # Legend and borders legend.frameon : True legend.framealpha : 1 legend.edgecolor : black # Line widths and grid axes.linewidth : 1.25 grid.linestyle : -- grid.linewidth : 0.5 # Color cycle axes.prop_cycle : cycler('color', ['k', 'gray', 'silver', 'rosybrown', 'lightcoral', 'firebrick']) # Font family font.family : serif font.serif : Times New Roman # Spines axes.spines.top : False axes.spines.right : False # Title alignment (might not work depending on the Matplotlib version) axes.titlelocation : left axes.titlepad : 20 # Image resolution savefig.dpi : 300
为了使用该设置,你需要将该设置保存为
.mplstyle
格式的文件,并在相应的 module 或者 notebook 中导入。比如将其命名为matplotlib.mylstyle
, 并放在项目文件夹下configs/
,计划在src/test.py
文件中使用该设置,那么,我应该在该文件中采用如下方式导入:import matplotlib.pyplot as plt plt.style.use(style="configs/matplotlib.mplstyle")
-
需要其他功能或者在使用过程中有什么问题,请在此链接提交 issue。