技术笔记006 – Markdown 语法笔记

1. 引用代码

```bash
printf("Hello World");
```
printf("Hello World!");

2. 标题

## 标题1
### 标题2
#### 标题3

标题1

标题2

标题3


3. 引用

> 引用内容

引用内容


4. 列表

1.1 这是第一行列表项。
2.1 这是第二行列表项。
- 这是第三行列表项。

1.1 这是第一行列表项。
2.1 这是第二行列表项。

  • 这是第三行列表项。

5. 分隔符

---


6. 加粗

**这是加粗的文字** 

这是加粗的文字


技术笔记003 – Jupyter Notebook 生成 PDF

作为一个日记爱好者,我断断续续写了将近10年的日记。从最传统的纸质笔记开始,到通用文字软件Page,Word,再到后来的专用软件 Day One,期间还使用了一段时间 Latex 这种硬核编辑器。总得来说 Day One 这种专门记录的 App 是最好用的。既能方便记录,又能生成 PDF 供长期保存。不过去年我换回了 Windows 系统,Day One 没有 Windows 的桌面版,尽管老的 Mac 还在使用,但是来回切换电脑总不是个事儿。我就开始尝试其他软件进行的记录。试过几种以后,感觉都一般般。索性就拿平时的工作用具 Jupyter Notebook 开始记录。一晃一年多过去了。我想把之前的记录生成 PDF 方便以后打印出来。在转PDF过程中遇到许多困难,我把期间一些很有意思的点记录在这篇文章里,供以后回顾和借鉴。

一切的起点是一篇名为 Jupyter Notebook to PDF in a few lines 的博文,其中介绍了使用 notebook-as-pdf + pyppeteer 的模式把 Jupyter Notebook 中的内容生成 PDF。就拿我第一篇技术笔记 技术笔记001 – 使用PuTTYgen生成NoMachine NX 服务的key-pair 为例,说一下 Jupyter Notebook 生成 PDF 时图片载入的问题。

我在做记录时,一般使用 Markdown 语法。为了方便,我通常把 .ipynb 和图片放在同一个文件夹中,在使用图片时直接在 Markdown 语句中使用相对路径,代码如下:

**第四步,保存 public key**:将 Public key for pasting into OpenSSH authorized_keys file 对话框中的所有内容复制并保存到一个文件中,这个就是用于服务器是的 public key。

![](0![](06_生成_public_key.png)

<center><sup>图6:保存 public key</sup></center>

注意,要使用上述方法生成的 private key 和 public key 才能成功使用 NX 服务。现在版本 PuTTYgen 使用 Save public key 和 Save private key 两个按钮所生成的文件不符合 OpenSSH 标准,不可以直接使用 NX 服务。

在运行后显示的结果是:

图1: 使用 Markdown 语法 + 图片相对路径编辑代码 在 Jupyter Notebook 中的显示结果

我们可以看到,Jupter Notebook 中 Markdown 载入图片是默认居中的。但是如果特意在 Markdown 语句中使用<center>标识符指定该图片居中,会导致图片无法显示。代码和执行结果如下:

<center>![](06_生成_public_key.png)</center>
图2: 使用 Markdown 语法 + <center>标识符 + 图片相对路径编辑代码 在 Jupyter Notebook 中的显示结果

这里的图片是无法显示的。应该是 Jupyter Notebook markdown 编译器的问题。所以,大多数情况下。我都避免在 Jupyter NoteBook 中导入图片时使用<center>标识符指定图片居中。好了,说回本文主题,在不加<center>标识符时使用相对路径,将 .ipynb 导出为 PDF 的结果是:

图3: 使用 Markdown 语法 + 图片相对路径编辑代码 在生成的 PDF 中的显示结果

图片竟然不显示了!?我第一个想法是可能是由于我的 .ipynb 文件和图片放在一个文件夹中,直接使用相对路径载入图片时不会出错。但是,在转 PDF 时,如果使用的编译器不同于在 Jupyter Notebook 中运行时使用的编译器。那么,相对路径就会造成麻烦。所以,我改用了绝对路径。载入图片的代码和 Jupyter Notebook 中运行结果如下:

![](D:/91_Workspace/04_Web/03_网站文章/04_技术笔记/001_使用puttygen生成NoMachine_NX_服务的key-pair/06_生成_public_key.png)
图4: 使用 Markdown 语法 + 图片绝对路径编辑代码 在 Jupyter Notebook 中的显示结果

这就很尴尬了,还没有到转 PDF 这一步,在 Jupyter Notebook 中就不显示了。这也可能是编译器问题。从上面相对路径的结果我们可以推测出,生成 PDF 过程中应该使用了应该不同于 Jupyter Notebook 运行时的编译器。所以使用绝对路径时在 Jupyter Notebook 中不显示图片的问题可能不会影响转 PDF 以后文件。我们来看一下转 PDF 以后的结果:

图5: 使用 Markdown 语法 + 图片绝对路径编辑代码 在生成 PDF 中的显示结果

有意思的事情又发生了。使用绝对路径时,生成的 PDF 中可以显示图片。但是,图片位置却没有被设成居中。那么,我们要是把<center>标识符加上,由于编译器不同,会不会成功在生成的 PDF 中成功让图片居中显示呢?出于严谨的态度,这里分别将 Jupyter Notebook 中和转成的 PDF 中的结果都展示出来。

载入图片代码:

<center>![](D:/91_Workspace/04_Web/03_网站文章/04_技术笔记/001_使用puttygen生成NoMachine_NX_服务的key-pair/06_生成_public_key.png)</center>

Jupyter Notebook 中的结果:

图6: 使用 Markdown 语法 + <center>标识符 + 图片绝对路径编辑代码 在 Jupyter Notebook 中的显示结果

转成 PDF 后的结果:

图7: 使用 Markdown 语法 + <center>标识符 + 图片绝对路径编辑代码 在生成 PDF 中的显示结果

这里我们看到无论是 Jupyter Notebook 还是转成的 PDF中,都无法正常显示图片。也就是说到现在为止所试过的几种方案中,还未能找到成功在生成的 PDF 中居中显示图片的方法。由于我们使用的转 PDF 方式是从 .ipynb 文件先转到 HTML,再由 HTML 转到 PDF(详见 Jupyter Notebook to PDF in a few lines )。所以,我们可以尝试直接使用 HTML 的语法导入图片,我们再来看看结果。代码如下:

<div align="center">
<img src="D:/91_Workspace/04_Web/03_网站文章/04_技术笔记/001_使用puttygen生成NoMachine_NX_服务的key-pair/06_生成_public_key.png" height="200px">
</div>

Jupyter Notebook 中的结果:

图8: 使用 HTML 语法编辑代码 在 Jupyter Notebook 中的显示结果

转成 PDF 后的结果:

图9: 使用 HTML 语法编辑代码 在生成 PDF 中的显示结果

这里看到,在使用HTML语句时,在 Jupyter Notebook 中无法正常显示图片,但是在生成的 PDF 中却可以正常居中显示。综合以上做的试验,我列出了下面的表格:

代码风格Jupyter Notebook
中正常显示
可以在生成的
PDF 中显示
可以在生成的
PDF 中居中显示
Markdown语法
+图片相对路径
Markdown语法
+图片绝对路径
HTML语法
表1: 代码风格 vs 图片显示情况

总结一下,要使用 Jupyter NoteBook 浏览文章时,就使用 Markdown语法 +图片相对路径编辑导入图片代码。要导出 PDF 时,就使用 HTML语法编辑导入图片代码。说起来还是有点不方便的。但是截至 Jupyter Notebook 6.3.0 版本,还没有更好的解决方案。

在 WordPress.com 上创建免费网站或博客

向上 ↑