制作自己的 Kindle 电子书

2023-11-16

想象以下场景:你刚收到一台新的 Kindle Paperwhite,心中已然响起了轰轰烈烈的 “我今年(或这个冬天)一定要阅读 100 本书!”。结果发现,想看的书 Amazon 上找不到,或者排版很糟糕。

如何解决?自己动手做呗!

准备工作

我使用的是 macOS,因此本教程应该可以在 *nix 系统上完美复现。理论上移植到 Windows 也应该是无痛的。

首先,显然,我们需要源文件(通常是 .txt 格式),对于软件,需要安装 calibre。尽管我相信 calibre 很可能早就装好在你电脑上了吧~

在编辑源文件时,我通常使用 VS Code,因为它支持正则表达式搜索。 Sublime Text 也支持这一点,所以如果习惯的话也可以用它。

简单场景

本教程的精髓就是通过正则匹配为 txt 文件中的章节名称加入 markdown 样式的 header 标记(即’#‘, ’##‘, etc.)。这样在 calibre 转换 txt 为 mobi 时它就可以识别并自动按照 markdown header 划分整体的 txt 文件为 mobi 中的各个章节。

VS Code 如何进行正则匹配搜索可以看微软的这篇教程:here

简单粗暴,直接上我常用的正则匹配:

  • 第(.*)卷\s -> ##第$1卷
  • 第(.*)章\s -> ###第$1章

有时候小说结尾还有后记,这个就匹配不到了,所以我一般还会再拉到结尾去检查一下,看小说作者在结尾还写了什么番外或者后记然后手动为其添加 markdown 标记。Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved

修改后效果如下:
请添加图片描述
在这里插入图片描述

再例如,我有一个示例文件,其章节名称如下所示,第一行为课程编号,第二行为英文,第三行为中文:

在这里插入图片描述

则我们可以使用如下的正则去匹配它:

^(\s+|)lesson(\s+)(\d+)(\s+|\n)(.*)(\s+|\n)(\s+)(.*)(\s+|\n)

其中,

  • ^(\s+|) - any space/tab before word ‘lesson’
  • (\s+) - any space between ‘lesson’ and lesson number
  • (\d+) - lesson number
  • (\s+|\n) - match any space or hard return after lesson number
  • (.*) - match English title
  • (\s+|\n) - match any space or hard return after English title
  • (\s+) - match space before Chinese title
  • (.*) - match chinese title
  • (\s+|\n) - match any space or hard return after Chinese title

使用如下的替换来达到下图的效果:

\n\n##Lesson $3 - $5 / $8\n\n

在这里插入图片描述

那有点复杂的场景?

在本节中,我将假设一个有点复杂的场景,假如我们有多个 .txt 文件。相当于按章将小说分成几部分。Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved假设我们有 4 个文件夹,每个文件夹中都有一堆 .txt 文件,并且全部使用数字文件名:

在这里插入图片描述

在这种情况下,通常意味着我们的书有 4 卷(因为有 4 个文件夹)。我们可以使用以下 shell 程序在每个文件夹中分别将其中所有文件(章节)合并为一个卷:

for file in `ls | sort -n`; do cat ${file} >> volume_ONE.txt; done
# repeat for TWO THREE and FOUR

在这里插入图片描述

然后,我们需要合并这 4 个卷。我们首先创建一个 YourBookTitle.txt 并打开它。在其开头输入 “# 卷一 title”,然后硬回车到新的一行,保存。

例如,YourBookTitle.txt 内容可以长这样:

#卷一 如何制作自己的手机电子书?

Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
然后运行:

cat volume_ONE.txt <(echo'#卷二 这是一个卷名')volume_TWO.txt <(echo'#卷三 这是另一个卷名')volume_THREE.txt <(echo'#卷四 这还是一个卷名')volume_FOUR.txt>> YourBookTitle.txt

现在,4 个卷都在一个 .txt 文件中了,且每卷的开头带有 “#卷x 标题”。

之后,重复简单场景中的匹配即可。更复杂的匹配,可以试试去参考资料【3】中找。

calibre 中的操作

现在,修改好 txt 后,我们可以启动 calibre,将 txt 转换为 mobi。

  1. 我们首先编辑 metadata,并为该书生成漂亮的封面:

    在这里插入图片描述

    • 对于中文小说的制作,导入 txt 时就应在 edit metadata 时选择语言为 Chinese,否则会遇到在阅读时不能选宋体等中文字只能选英文字体(如 Helvetica)的情况
    • (其它可选操作):将字体系列更改为 Times New Roman

    在这里插入图片描述

  2. 将字符编码更改为 gb2312 / gb18030
    Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
    在这里插入图片描述

  3. 添加 header 的样式(自己设计的,感觉还不错,Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

    在这里插入图片描述

    h1 {
        color:black;
        text-align:center;
        font-weight:bold;
    }
    h2, h3, h4, h5, h6 {
        background-color: rgb(202, 202, 202);
        border-left: 10px solid rgb(138, 136, 136);
        display:block;
        margin: 1.5em 10px;
        padding: 0.5em 10px;
        color:black;
        text-align:left;
    }
    
  4. (可选操作)如果在 txt 中未使用任何 “h1”,而使用了“h2” 和“h3”,则需要更改 “insert pagebreak before” 项。

在这里插入图片描述

  1. Table of contents 设置:在其中添加 “h1” 和“h2”。同理,若没使用 “h1”,则此处应使用“h2” 和“h3“分别进行更改。

在这里插入图片描述

  1. Mobi output:我习惯选择 “both”。

在这里插入图片描述

  1. (可选)有的时候未删除缩进会导致输出的 mobi 格式诡异,所以发现问题后可通过删除缩进来尝试修复。

在这里插入图片描述
(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

成果

看起来很不错吧:

在这里插入图片描述

参考资料

在这里插入图片描述
(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)


visitor tracker


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作自己的 Kindle 电子书 的相关文章

  • Java的replaceAll()方法

    replaceAll 方法实际是采用正则表达式的规则去匹配的 在regex中 表示一个 在java中一个 也要用 表示 这样 前一个 代表regex中的 后一个 代表java中的 所以字符串转义一次 正则转义一次 那么一个斜扛要写4个 1
  • Web前端复习——JS(正则表达式+内置对象)

    正则表达式 专门规定字符中字符 格式规则 的表达式 何时使用 只要定义字符串格式规则 都用正则表达式 最简单正则 一个关键词的原文 就是最简单的正则 1 备选字符集 规定某 一位 字符可选的备选文字列表 语法 备选字符列表 强调 1 无论备
  • Linux文本处理工具和正则表达式

    Linux文本处理工具和正则表达式 一 查看 截取和修改文本的工具 1 查看文本的工具 cat 最常用的文件查看命令 当不指明文件或者文件名为一杠 时 读取标准输入 cat OPTION FILE A 显示所有控制符 tab键 I 行结束符
  • Pattern.compile的flag参数

    Pattern compile函数 Pattern Pattern compile String regex int flag regex为正则表达式 flag的取值范围如下 Pattern CANON EQ 当且仅当两个字符的 正规分解
  • JavaScript最后分水岭——正则表达式

    个人简介 个人主页 微风洋洋 博客领域 编程基础 后端 写作风格 干货 干货 还是tmd的干货 精选专栏 JavaScript 支持洋锅 点赞 收藏 留言 好久不见 甚是想念 大家好 我是微风洋洋 也可以叫我洋锅 细心地小伙伴可能已经发现
  • 爬虫入门_3:数据解析及案例实战

    聚焦爬取 爬取页面中指定的页面内容 编码流程 指定url 发起请求 获取响应数据 数据解析 持久化存储 数据解析分类 正则 re M 多行匹配 re S 单行匹配 bs4 xpath 数据解析原理概述 解析的局部的文本内容都会在标签之间或者
  • Mac M1安装Homebrew 简单实用

    1 首先创建安装目录 sudo mkdir p opt homebrew 2 将目录属主修改为当前用户 方便直接实用brew install sudo chown R whoami opt homebrew 3 进入 opt文件夹 cd o
  • Python3 如何优雅地使用正则表达式(详解五)

    非捕获组命名组 精心设计的正则表达式可能会划分很多组 这些组不仅可以匹配相关的子串 还能够对正则表达式本身进行分组和结构化 在复杂的正则表达式中 由于有太多的组 因此通过组的序号来跟踪和使用会变得困难 有两个新的功能可以帮你解决这个问题 非
  • js常用正则表达式 匹配多个汉字、数字、英文、所有字符(附带Layui中form的表单验证)

    常用正则表达式 转自 菜鸟工具 https c runoob com front end 854 一 校验数字的表达式 数字 0 9 n位的数字 d n 至少n位的数字 d n m n位的数字 d m n 零和非零开头的数字 0 1 9 0
  • KITTI数据集介绍

    KITTI数据集 7481 training images and point clouds and 7518 test images and point clouds 采集平台 1惯性导航系统 GPS IMU OXTS RT 3003 1
  • Golang教程:(十六)结构体

    原文 https golangbot com structs 欢迎来到Golang系列教程的第十六篇 什么是结构体 结构体 struct 是用户自定义的类型 它代表若干字段的集合 有些时候将多个数据看做一个整体要比单独使用这些数据更有意义
  • 表示数值的字符串(含思路解答示意图)【剑指offer——JAVA实现】

    题目描述 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值 但是 12e 1a3 14 1 2 3 5 和 12e 4 3 都不是 解法一 思路 状态机
  • 正则表达式(日期、金额、特殊字符)_java语言

    正则表达式 java 正则表达式在线测试网站 个人觉得还算精确 http tool chinaz com regex 备注 如有错误 希望留言指出 虚心请教 金额格式 正数 包含至多2位小数 第1种形式 校验金额格式是否正确 正数 包含至多
  • java OpenOffice把word转html(Convert word to html )

    1 下载安装OpenOffice 网址http download openoffice org index html 2 下载第三方工具包JODConverter http www artofsolving com opensource j
  • [网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)

    这是作者的系列网络安全自学教程 主要是关于网安工具和实践操作的在线笔记 特分享出来与博友共勉 希望您们喜欢 一起进步 前文分享了Wireshark抓包原理知识 并结合NetworkMiner工具抓取了图像资源和用户名密码 本文将讲解Pyth
  • 正则校验手机号

    正则表达式可以用来校验手机号码的合法性 如果你想使用正则表达式来校验中国大陆的手机号码 可以使用如下的正则表达式 1 3 9 d 9 这个正则表达式可以匹配所有 13 到 19 开头的 11 位数字 即所有中国大陆的手机号码 例如 如果你想
  • SourceInsight

    1 开胃菜 初级应用 1 1 选择美丽的界面享受工作 虽然不能以貌取人 但似乎从来没有人责备以貌取软件的 SI的华丽界面 绝对符合现代花花世界的人的审美趣味 在SI中 我们可以轻松地把各种类型关键字 变量 标志符 函数 宏 注释等定义为不同
  • 【golang】error parsing regexp: invalid or unsupported Perl syntax (正则表达式校验密码)

    要在 Go 中编写密码校验规则 确保密码不少于8位且包含数字和字母 你可以使用正则表达式和 Go 的 regexp 包来实现 以下是一个示例代码 错误示范 package main import fmt regexp func valida
  • Python 正则表达式指南

    文章目录 1 正则表达式基础 1 1 简单介绍 1 2 数量词的贪婪模式与非贪婪模式 1 3 反斜杠的困扰 1 4 匹配模式 2 re模块 2 1 开始使用re 2 2 Match 2 3 Pattern 1 正则表达式基础 1 1 简单介
  • 无法使用Python登录亚马逊

    我正在使用 Python 3 编写一个脚本来登录 Amazon 以获取我的 Kindle 亮点 它基于这篇文章 https blog jverkamp com 2015 07 02 scraping kindle highlights 我无

随机推荐

  • adb连接及常用命令

    adb命令连接模拟器设备 以夜神模拟器为例 夜神模拟器默认端口为62001 adb connect 127 0 0 1 62001 当打开了多个模拟器 设备连接失败时 解决方法 查看连接的设备 可以查看连接的adb的设备情况 如果连接多个设
  • 02_计算机网络笔记-网络拓扑-交换机-VLAN

    文章目录 一般家庭的网络拓扑 交换机的基本原理与配置 虚拟局域网VLAN 个人博客 https blog csdn net cPen web 一般家庭的网络拓扑 光猫 调制解调器 1 光信号和电信号的转换 2 路由器的功能 可以拨号 账号和
  • MyBatis 采用注解方式批量更新数据 @Mapper @Update (包含2种方法)

    批量更新数据方法 1 注释db filed name 表示的是的数据库字段名字 entity name 表示的是你的实体字段 table name 表示你的表名 Update
  • ONNXRUNTUIME c++使用(分割网络)与相关资料(暂记)

    下面的教程是在linux系统上运行的 如果想在windows系统上运行 可以看官方链接或中文教程https bbs huaweicloud com blogs 335706 官方链接中有完整的VS的带 sln的项目 ONNXRUNTUIME
  • ES学习笔记之-ClusterState的学习

    前面研究过ES的get api的整体思路 作为编写ES插件时的借鉴 当时的重点在与理解整体流程 主要是shardOperation 的方法内部的调用逻辑 就弱化了shards 方法 实际上shards 方法在理解ES的结构层面 作用更大一些
  • JAVA获取IP地址、电脑Mac地址

    1 获取IP地址 注意 IP地址经过多次反向代理后会有多个IP值 其中第一个IP才是真实IP 所以不能通过 request getRemoteAddr 获取IP地址 如果使用了多级反向代理的话 X Forwarded For的值并不止一个
  • javaWeb项目中分页和模糊查询技术

    分页 需求 登录成功后 展现全部时 出现分页 思路 前端 1 设置分页按钮 以及分页数据 页码 总页数 总条数 2 设置分页请求 即点击上一页 下一页时发请求 后端 3 web xml映射 映射到Servlet能接收请求 4 Dao查询分页
  • opencv实践项目-人脸检测

    目录 1 opencv CascadeClassifier人脸检测步骤 2 CascadeClassifier分类器简介 2 1 从文件中加载级联分类器 2 2 目标检测方法 3 代码实现 1 opencv CascadeClassifie
  • SRVE0255E: A WebGroup/Virtual Host to handle /p2pd/servlet/dispatch has not been defined.

    Technote troubleshooting Problem Abstract When setting up IBM Cognos within IBM WebSphere the URI is not accessible The
  • 【MySQL】轻松学习 普通索引

    目录 引言 一 普通索引的创建 1 创建表时定义索引 2 已存在的表上创建索引 3 ALTER TABLE 语句创建索引 二 查看索引执行情况 引言 创建索引是指在某个表的一列或多列上建立一个索引 以便提高对表的访问速度 创建索引有3种方式
  • umijs----路由(修改路由的某一个path )

    1 在src下创建app js ts tsx 2 修改路由 export function patchRoutes routes routes为 umirc ts中设置的routes数组 可以使用数组的方法插入删除 运行时在最前面插入一个路
  • Webpack配置Vue热更新

    Webpack配置Vue热更新 需要的包 cnpm i vue webpack webpack cli webpack dev server html webpack plugin clean webpack plugin style lo
  • 【正点原子MP157连载】第七章 认识HAL库-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1 实验平台 正点原子STM32MP157开发板 2 购买链接 https item taobao com item htm id 629270721801 3 全套实验源码 手册 视频下载地址 http www openedv com t
  • selenium4

    1 单选框和复选框 单选框 type radio 定位 gt 点击 判断是否被选中 元素 is selected 复选框 type checkbox 只选择一个 gt 同单选框一样 全选 定位所有复选框 遍历 判断是否被选中 点击 选择部分
  • java入门六:java基础终章

    1 static关键字 静态变量和类一起加载 final修饰后的类无法被继承 2 抽象类 abstract修饰符可以用来修饰方法也可以修饰类 如果修饰方法 那么该方法就是抽象方法 如果修饰类 那么该类就是抽象类 抽象类中可以没有抽象方法 但
  • Linux Shell程序设计(2)

    实验十一 Shell程序设计 2 一 实验要求 综合运用shell编程知识进行设计性编程 二 实验内容和实验步骤 1 实验内容 假设你作为某工厂生产管理员 需要负责统计各车间每天生产的产品数据 你的计算机安装了双硬盘 为了保证数据安全 你在
  • 【定位问题】Mybatis-plus的selectPage()分页查询不生效问题

    背景 项目需要从mybits切换到mubits plus 但是我在进行分页查询的时候 发现一直不生效 问题原因 添加监听器 配置如下 Configuration MapperScan com baomidou mybatisplus sam
  • parted创建硬盘分区并创建LVM

    目的 将两个三T的硬盘做成LVM sdc sdd 一 parted将硬盘进行分区 1 parted的命令方式 Parted 命令分为两种模式 命令行模式和交互模式 1 命令行模式 parted option device command 该
  • 【原创】第一个iOS应用程序

    摘要 第一个iOS应用程序 包括获取控件 绑定事件 设置属性等内容 iOS Objective C 目录 第一章 窗口与应用程序 第二章 添加视图 2 1 从nib文件初始化视图 2 2 使用脚本添加视图 第三章 添加子视图 3 1 通过x
  • 制作自己的 Kindle 电子书

    想象以下场景 你刚收到一台新的 Kindle Paperwhite 心中已然响起了轰轰烈烈的 我今年 或这个冬天 一定要阅读 100 本书 结果发现 想看的书 Amazon 上找不到 或者排版很糟糕 如何解决 自己动手做呗 准备工作 我使用