怎样用Emacs调电子书格式
背景
找了本电子书,是 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 文档,其全篇断行凌乱无序的,基本都可以通过这种找段尾、打标记、合并行、替换标记为理想的格式的思路,实现文档美化。