How to use emacs to format ebooks and what are the general methods to format messy documents

From 清冽之泉
Jump to navigation Jump to search

背景

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

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

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

观察

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

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

步骤

1. 标记段尾

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

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

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

在rjsyffj处换行
5. 收尾

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

评价

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

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