2024-03-30    2024-05-29     1871 字  4 分钟

Prerequisite

为了确保您能够成功地将 Jupyter Notebook 转换为符合格式要求的 PDF 文档,请按照以下推荐步骤进行设置和安装:

  1. 安装 $\LaTeX$ 编译环境
    • 在 Windows 上,建议安装 TeX Live
    • 在 MacOS 上,建议安装 MacTeX
  2. 安装 Pandoc
  3. 下载 nbconvert 模板:请确保下载最新版本的模板文件(v0.6.0),避免使用上一版本的模板(如果有)。这个文件包含由 jupyter notebook 生成 pdf 格式的课程报告的需要的所有文件。(感谢 zepinglee 的GB/T7714-2015)
  4. 配置 Python 环境:请按照这篇指南: 基于 pyenv-win 和 Poetry, 构建 Python 开发环境 配置您的 Python 环境。
  5. 学习 Markdown 和 Jupyter Notebook 的基础
  6. 学习如何导出 .bib 格式的文献文件:推荐使用 Zotero 以及 Better BibTeX 插件来生成所需的引文和参考文献键。将导出的 .bib 格式的文献文件放置在您的 Notebook 所在的文件夹中。
  7. 参照模板:确保您提交的实验报告的 PDF 版本应与《商务智能与数据挖掘》课程报告模板或者《数据结构与算法》课程实验报告模板类似。

Notebook 转成 pdf 格式过程

  1. 在 Jupyter Notebook 中准备好报告内容。

  2. 编辑 Notebook 的 metadata,如下图所示:

    • 点击工具栏上的 Edit,找到 Edit Notebook Metadata 并点击

    picture 0

    • 在页面右边的 Notebook metadata 中添加相关内容

    picture 0

  3. 解压下载好的 nbconvert 模板压缩文件,解压后将其中的名为 coursereport 的整个文件夹复制到 .venv/share/jupyter/nbconvert/templates/ 文件夹下。

  4. 在 terminal 中使用以下命令(jupyter nbconvert notebook.ipynb --to pdf --template=coursereport)将您的名为 notebook 的文档转换为 pdf 格式。

nbconvert 模板功能说明

  1. 该模板目前适用于《商务智能分析》和《数据结构与算法》课程的实验报告。

  2. 关于 Notebook 的 metadata 设置:注意这里是 Notebook 的 metadata,而非各个 cell 的 metadata。以下内容必须设置:

    "title": "《数据结构与算法》实验报告",
    "subtitle": "动态数组与链表比较",
    "bibfile": "bib",
    "bibstyle": "gbt7714-numerical",
    "abstract": "这是一段用于演示在报告中显示摘要的演示内容,实际值啊要内容应根据您的研究内容总结和展示。摘要应该展示出您的研究背景、创新的研究方法以及研究结论等内容。",
    "authors": [
      {
       "name": "姓名1(学号)"
      },
      {
       "name": "姓名2(学号)"
      },
      {
       "name": "姓名3(学号)"
      }
    ],
    
  3. 如果您不想让 Notebook 中某个 cell 的内容显示在最终的 pdf 版本上,请在该 cell 的 metadata 添加如下设置:"hide": true

  4. 在正文中可以通过 \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 文档中的参考文献应该如下图所示:

    picture 2

  5. 对于图表以及代码块,请在对应的 cell 的 metadata 中添加标题和标签

    • 对于图,请使用"figcaption": "这里是你图片的标题" 以及 "figlabel": "这是对应图的标签,可以用于在正文中引用该图"

    • 对于表格,请使用"tabcaption": "这里是你表格的标题" 以及 "tablabel": "这是对应表格的标签,可以用于在正文中引用该表"

    • 对于代码块,请使用"codecaption": "这里是你代码块的标题" 以及 "codelabel": "这是对应代码块的标签,可以用于在正文中引用该代码块"

    • 这样,在生成 pdf 格式的文档时,会自动设置好图表的标题以及各个图表及代码的引用。如下图所示:

      picture 3

  6. 为了能正常转换 pd.DataFrame 为三线表格,请在您的 setup cell 中执行以下代码

    def _repr_latex_(self):
        return "%s" % self.to_latex()
    pd.DataFrame._repr_latex_ = _repr_latex_
    
  7. 为了统一生成的图片格式,请参考以下 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")
    
  8. 需要其他功能或者在使用过程中有什么问题,请在此链接提交 issue。

参考资料