专栏首页张俊红Jupyter Notebook如何导出包含中文的 PDF?

Jupyter Notebook如何导出包含中文的 PDF?

好文分享第18篇

Jupyter Notebook是很好的数据科学创作环境。Jupyter提供导出的格式有 .py、.html、.md、.pdf等。目前用其导出包含中文的pdf会遇到很多坑,网上也有一些解决方案,大致分为两种方式,一是安装 pandoc并不断根据报错提示安装sty文件,不是很有效,另一种是安装MiKTeX并改LaTeX文件。本文主要讲第二种方式。

Jupyter Notebook支持的导出格式

从效果来看,网页中notebook的渲染是最好看的,导出的html对代码和超链接失真严重。在网页上点Download as -> PDF via LaTex的时候先是说缺少Pandoc库,于是pip install pandoc,之后不再说缺少这个库了,而是 nbconvert failed: pdflatex not found on PATH 或者 nbconvert failed: PDF creating failed, captured latex output。查了一些资料后改用命令行,要避免'xelatex' 不是内部或外部命令,也不是可运行的程序或批处理文件,需要先安装MiKTeX,在其官网下载(https://miktex.org/download) 后,Windows版一路next安装就行。安装过程还是耗费些时间的,下载安装完成之后的步骤是:

1, ipynb文件编译为tex

在命令行中定位到要转换的jupyter文件的路径下,输入jupyter nbconvert --to latex yourNotebookName.ipynb

编译ipynb文件为LaTeX文件

在文件目录下就可以看到一个叫yourNotebookName.tex的LaTeX文件了。

2, 手动编辑latex文件

为了能支持输出中文,需要改一下tex文件,在编辑器(我用的是Notepad++)打开刚才生成的LaTeX文件, 在\documentclass{article}(没有这一句就在\documentclass[11pt]{ctexart} 的后面插入下面的语句)后面插入

\usepackage{fontspec, xunicode, xltxtra}\setmainfont{Microsoft YaHei}

修改LaTex文件

需注意的是,目前(2019年9月)下载的MiKTeX 通过上面语句编译生成的tex会缺少一句\usepackage{ctex} , 所以如果在\setmainfont{Microsoft YaHei} 缺了对ctex的引用的话,就需要补上 \usepackage{ctex} 。

3, 转latex为pdf

随后在命令行下输入:(我演示文件用的是GeoCluster.tex)

xelatex yourNotebookName.tex

之前没有运行过xelatex,首次运行会安装一些依赖文件,会慢一些,最后运行完毕:

可以在文件夹下看到输出的文件:

最后文件夹下的结果

  • .ipynb 是我们的jupyter文件
  • .tex 是由jupyter notebook文件生成的
  • .pdf 是我们最后的目标文件由.tex文件生成
  • .log、.out、.aux是LaTex生成pdf的一些输出和日志

总结一下,从jupyter notebook生成pdf文件需要的依赖项还是比较多的,Windows下安装MiKTeX才能用xelatex命令。生成步骤是先把ipynb文件编译为LaTex,然后为了支持中文修改一下lex文件,最后转换为pdf文件。

最后效果如下,虽然还是比不上网页端.ipynb的直接渲染效果,但比起导出的html等格式,能更好地作为展示格式。

生成pdf的效果

另外从ipynb文件变成pdf文件还可以采用的方式有:

  • 打开ipynb文件后在浏览器直接选择打印;
  • 导出markdown在Typora软件中选择导出为PDF;

这三种方式生成的PDF效果对比如下图:

可看出,文中这种导出LaTeX再变成PDF是很实用的。

本文分享自微信公众号 - 张俊红(zhangjunhong0428)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 时间序列预测(下)

    前面两篇给大家介绍了几种对时间序列直接的预测方法,这一篇给大家讲讲如何对时间序列进行分解,并根据分解法对数据进行预测。

    张俊红
  • python中的小魔法(一)

    ? 总第101篇 if-else的简洁写法 #常规写法 if a>b: c=a else: c=b #简洁写法 c=a if a>b...

    张俊红
  • 利用Python实现数据偏移

    现在有如下这么一张表,这张表存储了每个uid在不同周(w)的订单情况。我们想知道每个用户在不同周内消费频次的变化情况。消费频次变化的标准就是这周订单数和上周订单...

    张俊红
  • Jupyter Notebook导出包含中文的pdf

    Jupyter Notebook是很好的数据科学创作环境。Jupyter提供导出的格式有 .py、.html、.md、.pdf等。目前用其导出包含中文的pdf会...

    蛰虫始航
  • 使用bash编写Linux shell脚本--调试和版本控制

    当我还在布鲁克大学上学的时候, Macquarium 实验室中充满了苹果公司的 Macintosh Plus 电脑。一天,我在为第三年的操作系统课程准备一个程序...

    猿人谷
  • 面试官:插入 100 条数据用时最短的方法是?

    链接 | juejin.im/post/5d255ab9e51d454f73356dcd

    一个优秀的废人
  • MySQL 插入 100 行数据,用时最短的获得 Offer!

    原文链接:http://rrd.me/enSqt

    业余草
  • 怎么快速插入 100 条数据,用时最短

    问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗?

    Java技术栈
  • 你向 Mysql 数据库插入 100w 条数据用了多久?

    问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗?

    好好学java
  • linux命令行文本操作一文就够

    主要是 awk/grep/sed这三驾马车,加上vi这个神器,最后辅助一些小工具,包括 wc,cat,diff,join,paste,cut,uniq 这里 简...

    生信技能树

扫码关注云+社区

领取腾讯云代金券