怎样用Emacs调电子书格式: Difference between revisions

From 清冽之泉
Jump to navigation Jump to search
Tags: Mobile edit Mobile web edit
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
==背景==
==背景==
[[File:源pdf格式精美但转txt后换行凌乱.png|650px]]
[[File:源pdf格式精美但转txt后换行凌乱.png|333px]]


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


注意,通常并不建议使用 Emacs 调整电子书格式,因为直接重新找资源是更自然、方便、合理的方案。
注意,通常并不建议使用 Emacs 调整电子书格式,因为直接重新找资源是更自然、方便、合理的方案。
友情提示:下列图片,点开看全图更易理解,因为白边区域易与网页底色混淆。


==观察==
==观察==
Line 11: Line 13:
在 pdf 中,全选并粘贴进 Emacs,得到初版 txt。
在 pdf 中,全选并粘贴进 Emacs,得到初版 txt。


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


==步骤==
==步骤==
; 1. 标记段尾
[[File:在段尾插入锚点.png|490px]]
[[File:在段尾插入锚点.png|490px]]


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


; 2. 找章节
; 2. 标记章节
[[File:把章名摘出来.png|490px]]
[[File:把章名摘出来.png|490px]]


Line 26: Line 28:
: <code>\(第.章\)  → ^J^J\&^Jrjsyffj </code>
: <code>\(第.章\)  → ^J^J\&^Jrjsyffj </code>


; 3. 合并行
; 3. 合并全书成一行
[[File:合并全书为一行安插了诗句锚点.png|490px]]
[[File:合并全书为一行安插了诗句锚点.png|490px]]


Line 32: Line 34:
: <code>delete-indentation</code>
: <code>delete-indentation</code>


; 4. 找段尾
; 4. 提取段尾
[[File:把锚点替换为段尾符就实现了分段.png|490px]]
[[File:把锚点替换为段尾符就实现了分段.png|490px]]


: 把rjsyffj换成空行
: 在rjsyffj处换行


; 5. 收尾
; 5. 收尾

Latest revision as of 07:53, 20 October 2024

背景

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