2

一日一技 | 如何给自制电子书添加脚注

 1 year ago
source link: https://sspai.com/post/75170
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

因为有在 Kindle 里看网络小说的习惯,但是大部分网站不提供导出为 Kindle 兼容格式的功能,就不得不自己动手,丰衣足食。在阅读过程中,有些小说考据严谨,作者常常会在文中插入注释讲述出处或相关解释,但是通过脚本下载的文档通常都是将其放在章节末尾,阅读时需要反复查阅,配合上墨水屏缓慢的反应速度,阅读体验实在称不上好。

于是就萌生了「把注释加进正文」的想法。既然 Kindle 商店里的正规出版物都有这样的功能,那用电子书编辑器是不是也能做到?

于是我在搜索引擎中输入关键字后,找到了书伴的 教程。他们提供了两行代码,但是具体怎么用没有讲得很清楚。我花了一阵子研究到底应该怎么操作,最初几次总是做不成功,经过反复试验,总算是摸清了原理。因此,本文就是基于那篇教程的详细解释版,希望对你有所帮助。

筛选出需要加入注释的位置,并打上标记

要做的第一步,就是筛选出「哪里要放注释」,以及「这里的注释是什么」。为了方便操作,以下的步骤都会在 TXT 文件中进行。

在晋江小说里,正文中多用 【1】来标记「这里有条注释」,注释内容则通常写在文末的「作者有话要说」里。豆瓣阅读的注释在网页中可以弹出显示,但下载后就会变成 [注:……] 的样子。

1
1

因此,首先要从 TXT 文件中找出所有注释在正文中的位置,并在原文注释处留下编号记录;然后在一个新文档中,记录注释的编号和此处所对应的注释内容。

在原文中留下编号记录一是为了方便后面搜索替换,因此要使用在文章中不会出现,且方便检索的数字和符号组合才最方便,我使用的是 [1],括号里的数字随着注释顺序依次增加1。新建一个文档整合所有注释则是因为,这样可以在后期实现批量替换,也不用在文档里前后翻阅才能找到注释内容,在最后一步整理好格式,就可以一起加到电子书最后,还不会影响阅读体验。

1

修改标记前后文档的对比。原文是「\[注:.*\]」的检索结果,下图中的 [1] 为手动键入。使用的软件是 Sublime Text,实际使用中,所有可以搜索正则表达式的文本编辑器都是一样的。

下图为文中所有的注释内容集合。每段最前面的数字和原文的留下的标记是一一对应的关系。在开头的数字后使用 tab 分割。这篇小说的注释不是很多,最终输出的时候也没有做分卷,所以所有的注释都放在了一起——至于为什么分卷重要,会在后文解释。

1

当所有注释内容都整理好了,就可以开始替换正文了。

正文中,需要用这样的表达式替换在上一步中留下的 [1] 这样的标记:

查找\[(\d+)\]
替换为<sup><a id="footnote-\1-backlink" href="part0000.html#footnote-\1">[\1]</a></sup>

而在单独建立的注释集合文档中,需要用这样的表达式标记注释内容:

查找^(\d+)\t(.*)
替换为<p><a id="footnote-\1" href="part0000.html#footnote-\1-backlink">[\1]</a>\2</p>

在搜索时使用了正则表达式简化流程2。它们的意思分别是这样的:

  • \[\] 是即是正文中的 []。在正则表达式中,它们有独特的含义,因此需要加一个 \ 将其标记为「正文中使用的符号,并非作为表达式使用」。
  • \d+ 是一段数字。\d 是一个数字。字符和数字都被半角括号 () 框住,这样在替换的时候就能被识别到。被第一个括号框住的标记为 \1,以此类推。
  • ^ 确认要查找的文段在每行开头,这样做是防止某一段注释中使用了数字,而被从中间截断,并误提取成一条新的注释。
  • \t 是 tab 的正则写法。在上一部中,就是用 tab 将数字与注释正文分割的。
  • 字符和数字都被半角括号 () 框住,这样在替换的时候就能被识别到。被第一个括号框住的标记为 \1,以此类推。

(我这里使用的是 Sublime 作为正则表达式查找替换工具,默认是 PCRE 的写法也就是使用  \n 或者 $n 查找数字,而在 Python 或是 sed/vim中则只能用 \n,在 Javascript 中则只能用 $n。最后,大家可以使用 https://regex101.com 来测试自己写出来的正则表达式。)

其余部分则是 HTML 表达式:

  • <sup> ... </sup> 定义了一个上标文本,输入后,被框住的内容就会比正文内容显示的更高、更小。
  • <a> ... </a> 用于标记页面内的超链接。<p> ... </p>用于标记页面内的普通段落。
  • id="..." 简单来说,就是给这一部分元素取了个名字,这样在创建链接的时候,就可以直接将其指向这个名字所在的位置。正因如此,不同注释的 id 必须不同,才能使其跳转到正确的位置。
    • 需要注意的是,诸如footnote-1footnote-1-backlink 的 id 只是为了方便检索。只要在代码中,「这一段文字的 id」和「要跳转到的目的地」名字是一一对应的,就不会出现问题。
  • href="..." 用来指示超链接指向的目标。可以指向某个链接,也可以指向某个页面中的任何元素。
  • href="part0000.html#footnote-\1-backlink" 指代的就是在 part0000.html 这个文件中,id 为 footnote-\1-backlink 的文段。

在这里使用 HTML 表达式则是因为常见的 ePub 和 AZW3 电子书,其正文内容本质上就是一个或多个 HTML 文件的集合。经由 Calibre 转化的电子书文件,其默认生成的 HTML 文件的命名方式就类似于 part0000.html 。如果文本过长,或者分了好几卷3,就会生成多个 HTML 文件(如下图中的对比)。

1

在实际使用过程中我发现,如果文章没有分卷,最终文件只有一个 HTML 文档的话,在超链接中添加跳转目的地的所在页面(href="X.html#id) ,导入 Kindle 后就无法显示注释内容。因此,只需要写 href="#id就能成功跳转。而如果是多个分卷内的不同注释,则必须要加上原文或注释所在的页面才能跳转成功。

书伴的 教程 中也指出,发现如果注释标记和注释内容在同一个页面上,前后之前需要有足够多的段落,不然点击注释标记将没有反应。如果注释标记和注释内容放在不同的页面上,则没有这个问题。在我的使用中没有出现这种情况。

转换文件并检查

最后一步就是把整理好格式的注释内容放进正文所在的文档里,然后使用 Calibre 将 TXT 文档转为 Kindle 可读性的格式。具体操作过程可以参考 这一篇 中的「转换格式、编辑和阅读」一节。

转换成功之后,最好还是检查一下再导入 Kindle。用 Calibre 自带的阅读器打开文档,如果都可以跳转,那么在 Kindle 上应当可以以正常阅读与操作。我遇到过的最常见的问题就是在电脑上可以成功跳转,但是在 Kindle 中可以显示超链接,却无法显示注释内容。出现这个情况,几乎每次都是「未能在原文中正确引用页面链接」的缘故。

最终,带有注释的电子书在 Kindle 上的效果如下图:

1

富贵险中求》by 王食欲。本段出自第 168 章「文公野夜宿顾双家,王桀与之针锋相对」。

书伴(2021)如何给自制 Kindle 电子书添加弹出脚注或尾注?

W3 Schools (n.d.) HTML <a> Tag.

Computer Hope (2022) How to create links to sections on the same page in HTML.

@广陵止息 对本文亦有贡献。

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰 

> 实用、好用的 正版软件,少数派为你呈现 🚀


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK