怎样用Emacs调电子书格式

From 清冽之泉
Jump to navigation Jump to search

背景

源pdf格式精美但转txt后换行凌乱.png

找了本电子书,是 pdf 格式的,无法导出为好格式的 txt。想起好久没玩 Emacs 的 regexp 怕生疏了,于是就用 Emacs 调一下 txt 电子书的格式。

注意,通常并不建议使用 Emacs 调整电子书格式,因为直接重新找资源是更自然、方便、合理的方案。

友情提示:下列图片,点开看全图更易理解,因为白边区域易与网页底色混淆。

观察

换行凌乱.png

在 pdf 中,全选并粘贴进 Emacs,得到初版 txt。

打开 whitespace-mode,发现每一行大概有 58 字,坑爹的是每一行末尾有一个行尾符 $。通常的纯文本,都只在段尾才有一个行尾符 $。那怎么办呢?

步骤

1. 找段尾

在段尾插入锚点.png

把以句号、省略号、后引号、问号、后括号、破折号、感叹号结尾的地方,全打上 rjsyffj 这个标记,rjsyffj 是一句诗:人间四月芳菲尽。打上标记后,在把全书所有断行合并成一行,段尾也有了 rjsyffj 这个明显的标记。
\(。\|……\|”\|?\|)\|——\|!\)$ → \&rjsyffj
2. 找章节

把章名摘出来.png

这句就是把第某章前面加两个空行,后面也加一个空行,再打上 rjsyffj 这个标记,把全书所有断行合并成一行之后,章节名也有了 rjsyffj 这个明显的标记。^J 是在 Emacs 中按 C-q C-j 出现的,意思是换行。
\(第.章\) → ^J^J\&^Jrjsyffj
3. 合并行

合并全书为一行安插了诗句锚点.png

把所有断行合并成一行。相当于这几十万字的电子书变成了一行,但由于段尾在第 1 步中做了 rjsyffj 这个标记,所以这一大行,下一步把段尾替换出来就形成了美观的分段。
delete-indentation
4. 找段尾

把锚点替换为段尾符就实现了分段.png

把rjsyffj换成空行
5. 收尾

去除凌乱换行后成功分段.png

删除多余的空格,取消 whitespace-mode,与原 pdf 对比看是否有误

评价

\|表“或”的用法比较有意思。先加 magic letter,替换再找回的思路,高效。Emacs 命令 delete-indentation,强大。想到用。……”?)——!这七个符号定位段尾的方法,真棒。

表面上,本文针对的是处理电子书。实际上,对于从 pdf 导出来的 word 文档或 txt 文档,其全篇断行凌乱无序的,基本都可以通过这种找段尾、打标记、合并行、替换标记为理想的格式的思路,实现文档美化。