使用jupyter notebook导出pdf时,出现了一些问题:
1)会报错,缺少安装包;
2)没有报错并且生成了pdf,但是只显示英文,不显示中文。
下面是给出了一些网搜后适用自己的解决办法。
导出pdf步骤:File-> Download as -> PDF via LaTex(.pdf)
:
出现报错没有Pandoc
:
jupyter notebook nbconvert failed: Pandoc wasn't found. Please check that pandoc is installed
报错说明:转换失败,原因是没有找到Pandoc
。
Pandoc
Pandoc官网下载地址: https://pandoc.org/installing.html
下载安装包github地址:https://github.com/jgm/pandoc/releases/tag/3.1.6.2
gitcode的镜像也有:https://gitcode.net/mirrors/jgm/pandoc/-/releases/3.1.6.1?spm=1033.2243.3001.5876
下载pandoc后根据提示正常安装即可。
MiKTex
如果导出pdf通过LaTex,还需要下载MiKTex
: https://miktex.org/download
下载MiKtex后根据提示正常安装即可。
两个包(Pandoc,MiKTex)都安装完成后,退出并重启jupyter notebook后才生效。并且,在重启后在导出pdf过程中,会自动安装一些依赖包,根据提示点击安装即可。
注:期间想通过HTML导出pdf,还安装过pip install nbconvert(不过,PDF via. HTML还是报错,先忽略)。
如果jupyter notebook编辑的内容都是英文,安装上面2个包并安装依赖包后直接导出是没有问题的。如果内容包含中文,则只显示英文忽略中文。
需要以下三步:
(1)将.ipynb
文件编译为.tex
格式:
jupyter nbconvert --to latex ${ipynb_file}
# 示例:
jupyter nbconvert --to latex jupy2pdf-中文.ipynb
执行完成后,会生成文件jupy2pdf-中文.tex
。
(2) 修改tex文件:
在tex文件的中加入加载包命令:
\usepackage{fontspec, xunicode, xltxtra}
\setmainfont{Microsoft YaHei}
\usepackage{ctex}
(3) 使用 MiKTeX 生成pdf:
执行如下命令可生成pdf:
xelatex ${tex_file}
# 示例:
xelatex jupy2pdf-中文.tex
其中,命令xelatex
就是前面下载的MiKTex软件,对应下载路径:
/YourDir/MiKTeX/miktex/bin/x64/xelatex
执行完成后,会生成相应的中间文件:
jupy2pdf-中文.ipynb # 原文件
jupy2pdf-中文.tex # tex编辑文件
jupy2pdf-中文.aux
jupy2pdf-中文.log
jupy2pdf-中文.out
jupy2pdf-中文.pdf # 目标pdf文件
"解决方法1:修改tex"虽然解决了中文显示问题,但是每次需要手动添加相应的中文包才能解决。
(1)先是参考了一篇博客,需要在Python安装包下:
Python\Lib\site-packages\nbconvert\templates\latex
找到 base.tplx
文件并进行修改。
笔者有nbcovert安装目录,但是没有找到 latex目录(更没有 base.tplx
文件),可能这种方法可以从根本上解决并直接导出pdf(而不需要每次手动在tex文件中手动添加)。
(2)其他地方找到了解决办法
参考: https://www.zhihu.com/question/427092422
与上面修改文件的路不同,修改的是jupyter目录下的文件:
Python\share\jupyter\nbconvert\templates\latex\index.tex.j2
就是把 block doclass
下的 article
改成 ctexart
:
示例:从jupyter导出pdf显示中文 (章节名称居中了?)
(3)章节名称居中问题调整
类似地,修改内置文件:
Python\share\jupyter\nbconvert\templates\latex\index.tex.j2
在index.tex.j2
文件中增加如下命令:参考博客
\CTEXsetup[format={\Large\bfseries}]{section}
<完>