Jupyter导出PDF乱码问题解决方法(macOS)

前言

最近在使用Jupyter Lab的时候发现,如果是在macOS系统里将Notebook笔记文件直接导出为PDF格式,其中的中文部分会发生乱码。在网上查阅相关资料,多数已经过时,所以记录一下这个小问题的解决办法。

环境介绍

本文接下来介绍的方法仅在macOS 11.4、Python 3.8.3、Jupyter Core 4.7.1、Jupyter Lab 3.0.11下测试通过,但是我觉得应该适用于绝大多数的macOS以及较新版本的Jupyter。

image-20210607101843986

Jupyter导出PDF乱码

问题描述

在使用macOS的时候,遇到中文乱码的情况,依据原因的不同,大致可以分为两类:

  • 文件编码选择错误造成的乱码,例如在命令行终端中中文字符显示乱码、txt文件打开后乱码等,此类乱码的解决办法就是选择正确的编码/解码方式(例如GB 18030、zh_CN.UTF-8等);
  • 缺少中文字体造成的乱码,例如在使用maplotlib库作图时,中文图例无法正确显示,此类乱码的解决办法则是增加或者替换所缺少的中文字体。

Jupyter 笔记导出为PDF文件时的中文乱码属于上述的第二种情况,所以只要安装其所需要的字体或者直接修改为系统自带的中文字体即可。

已有方法

如果在网上搜索可以发现,这个问题还是相当普遍的,也有相应的解决方法,不外乎两种:

  • 修改Jupyter导出PDF时所使用的的模板

    image-20210607103952853

  • 先导出LaTeX文件,修改LaTeX文件后再转PDF

    image-20210607104234016

两个方法相比,显然方法1比方法2更为简洁,但是遗憾的是,在前面提到的环境下,找不到模板文件。但是方法2也并非一无是处:试验了一下方法2,在当前环境下仍然适用,这也就为我们解决乱码问题提供了思路。方法1之所以不再适用,很可能是因为Jupyter改变了PDF导出的方式

解决方法

回想之前在Jupyter Notebook导出幻灯片(基于Reveal.js) 所介绍的,为了修改.ipynb导出HTML的样式,我们找到了nbconvert自带的模板,并根据Jinja2语法作了相应的修改。那么?Jupyter导出PDF应该也是类似的道理!?

根据技术文档可知,Jupyter将笔记本导出为其他格式文件是通过``nbconvert实现的,对于PDF甚至还支持两种方式:PDFWebPDF,其中前者是基于Latex实现的,后者是基于HTML实现的。显然,我们用到的是前者。

image-20210607112247822

既然如此,那么问题的关键就是修改nbconvert所使用的模板。同样由技术文档可以查到nbcovert模板的存储位置。

image-20210607112104173

修改LaTeX模板

大概弄清楚了乱码的原因和修改的原理,真正的修改实际上非常简单:就是在base.tex.j2中设置主字体(使用LaTeX撰写论文的朋友应该并不陌生)。

image-20210607130959205

如果还不可以的话,可以参考:

https://macplay.github.io/posts/xetex-de-zhong-wen-hua-she-zhi/

macOS字体查看

另外,在修改字体之前,应该要先看一下系统里是自带的中文字体是哪些,macOS字体安装的目录包括\System\Library\Fonts\\Library\Fonts\

image-20210607132432987

结论

这篇文章其实没有太多内容,就是介绍了MacOS系统上Jupyter 导出PDF中文乱码的最新解决办法。

参考资料

  1. https://blog.csdn.net/claroja/article/details/71654188
  2. https://blog.csdn.net/Jimmyzqb/article/details/105757856
  3. https://nbconvert.readthedocs.io/en/latest/customizing.html#where-are-nbconvert-templates-installed