从乳胶产生ePub

2021-03-07 11:06:29

我想告诉你我的旅程,为没有废话指南教科书生产EPUB文件。这是一种史诗般的战斗,具有许多技术障碍,但我最终工作,结果很美:

在此博客文章中,我想分享我从包含许多数学方程式的乳胶源文件中生成EPUB和Mobi文件的内容。我觉得这应该在某处录制有利于具有乳胶稿件的其他词干作者和出版商,并希望将它们转换为.pub和.mobi格式。请继续阅读,观看关于数学电子书的“它是如何制作的”。

图1:此博客文章中描述的电子书生产管道。每个框都表示不同的标记格式,箭头表示用于在格式之间转换的软件。硬步骤是从.tex源生成清洁的.html + mathjax格式。其他格式的产生是标准的。

从历史上看,我用来生成没有废话指南教科书的主要工具一直是pdflatex,这是在乳胶生态系统中产生PDF的最常见方法。问题是PDF文件的固定宽度布局不适合具有不同屏幕尺寸的移动屏幕和侵蚀器设备。现代出版物全部是关于HTML和ePub等离途格式。如果我们希望更多人学习数学,我们必须在移动移动中进行数学教科书。

将LaTex源文件转换为SoftCover支持的宏(使用基于TexSoup的TEX绞刑和使用ImageMagic的图像转换)

从HTML生成EPUB文件(由SoftCover基于MathJax,Phantomjs,Inkscape策划)

(奖金)将EPUB转换为Mobi(由于口径附带的电子书 - 转换命令行实用程序)

转换过程相当复杂,取决于以几种编程语言编写的工具。严重,在本市管道中使用6+不同的编程语言:Python 3.x,Python 2.7(因为一个库需要它),Perl,Ruby,JavaScript和Bash。如果这是一个收集的主题 - 所有比赛,我都会赢得大时间!立即采取了很多依赖性,但必须做到。此外,Rube Goldberg机器是一种公认​​的软件设计模式🙂

我为我创建的脚本为自动为自动化这个管道而自豪,但我希望它可以清除您即将阅读的一切的真正信誉,以便读取那些开发我使用的工具的人。我站在巨人的肩膀上:迈克尔哈特(Softcover和Polytexnic),Alvin Wan(Texsoup)和Kovid Goyal(Caliber)。这些是通过他们维护的开源软件工具使所有这一切成为可能的人。他们应该得到真正的信用 - 我的贡献只是连接这些工具,以使用一些Python脚本构建端到端的管道。

如果您只有10秒的注意力留下,您需要知道的唯一方法就是要安装SoftCover(安装说明)并将其用于任何新项目:这是转换数学书籍(.tex源文件)的最佳方式.pub和.mobi。从用(SoftCover New --Latex MyBook)生产的样本书开始,并在编译定期时延长章节。

在本博客文章的第一部分,我们将从eBook文件格式上开始一些背景。将此视为哲学论文中的定义部分。什么是epub文件? (扰流板:它是一个带有.html +元数据的zip文件)我们还将讨论我强烈推荐的软件工具,以生成这些文件:softcover和caliber。这部分应该对“电子书业务”中的任何人都很有趣,因为理解底层格式 - 最终在读者的设备上下载的文件 - 是一件大事。即使你不是技术,你也需要知道这个东西。

将有一些技术细节(如命令行终端或cmd.exe),但这并不是那么糟糕。事实上,所描述的工具可能被任何可以克服omg-in-a-comment-line恐惧的人使用。一旦你经历了几次过程,“我应该在这里输入什么?”时刻消失了,你会知道要键入的内容:命令。就像点击命令运行程序一样,命令行终端命令也运行程序。

博客帖子的第二部分将进入图1中描述的转换和处理步骤的Nitty-griTy细节。将有很多链接丢弃到有用的脚本,但注意一些脚本对此非常特定于此.tex宏在没有废话指南教科书中使用,因此不要指望直接重用相同的代码。想想它更像是示例代码。或徽章:概念验证。 在研究SoftCover和Caliber后,技术细节只会有意义,您与他们一起玩过,现在您想学习如何使用它们使用脚本将它们粘在一起。这个代码演练主要是Minireference Co. Dev团队(您真正)的记忆和Hov-Works Logbook。

对于任何需要将公式重型的.tex书籍转换为.pub文件的任何人都会有趣,并坚持没有看起来很可怕的数学方程。基本上,如果你是一个自尊的数学教科书自我发布者,那么我们已经为你有了一些脚本!

在我们进入技术细节之前,让我们谈谈电子书格式。很高兴了解我们试图生产的最终产品。

Kindle文件格式(.awz,.awz3,.kf8等)是亚马逊Kindle设备上使用的专有格式。没有办法直接生成Kindle电子书,相反,KDP分发的推荐过程是生成EPUB文件,让KDP处理转换为其专有格式。因此,通过KDP在Kindle设备上分发,关键是产生良好的质量,符合标准的ePub。

Mobi格式(Mobipocket短暂)是另一个专有的电子书文件格式,在广泛采用EPUB之前非常受欢迎。早期版本的亚马逊Kindle在内部使用Mobi格式,因此Kindle设备仍然支持Mobi格式。

对于eBook发布者来说,它是良好的做法。除了具有Kindle设备的读者的利益之外,还有eBook发布者提供.mobi文件,因为Kindle设备本身不支持EPUB文件。幸运的是,每次安装时都有一个很好的命令行工具(电子书 - 转换)。

使用电子书转换真的很简单。如果您有源文件Book.epub,则希望将其转换为.mobi格式,您可以运行

并且您将最终使用所有Kindle设备可读的文件。

这是最广泛支持的电子书格式以及我们在这里努力的主要焦点。 EPUB文件格式基于HTML和CSS等Web技术,它被编码为IDPF标准。一个.pub eBook是一个独立的HTML,CSS,图像和元数据容器,它们被打包为.zip文件。如果您有一个EPUB文件,您可以将其扩展到.epub到.zip并解压缩以查看内容。您还可以使用像SIGIL这样的EPUB编辑器,允许您“查看源”并直接修改EPUB文件,而无需首先解压缩它们。

使用HTML的内容是原则 - 是一件好事。在实践中,不同的读者对标记,造型和媒体播放的支持不同,并且很少有EPUB读者支持运行脚本的可能性。因此,我们采取保守派方法并针对基本的EPUB V3格式,而不利用像SVG图像,音频播放和交互元素这样的网络平台的现代功能。我期待着在未来探索EPUB3的这些高级功能,但是为了获得最大的兼容性,我将避免现在避免此类尼数,并且假设“客户”是一个只支持基本的HTML,CSS和图片。

那么你如何建造ePub?从理论上讲,您只需使用HTML标记准备您的书,您就完成了您的书。好吧,不太。当我说EPUB格式基于HTML和CSS等网站技术时,它有点误导,因为它只覆盖了内容页面 - 这本书的章节。此外,符合标准符合标准的.EPB文件还必须指定书籍元数据(Content.Opf)和结构(TOC.NCX)。有几个“电子书框架”,如pandoc,sphinx,gitbook等,可用于生产epub。如果您的书不包含数学方程式,我将推荐其中一个既定的框架之一以“外包”生成ePub的复杂性。例如,请参阅此博文。

但是,在没有废话指南教科书的情况下,我们从1000多页开始包含大量方程的乳胶源文件。

问题声明:从乳胶源文件生成一个漂亮的epub文件,该文件包括用于练习和问题的公式,数字,表和自定义宏。

“自定义”一词的发生应该给你一个暗示事情很快就会有趣......

现在让我们谈谈从.tex源执行特定转换的软件工具。按重要性顺序,这些工具是Softcover,Caliber,TexSoup和Fab-Classic。我们首先从最重要的部分开始:在任何上下文中广泛重复使用的工具;我们推迟了关于我们执行的特定转换的技术细节,直到本博文的后半部分。

进入Softcover项目的第一个主角。 SoftCover是一种从Markdown或LaTex源文件中生产电子书的框架。您可以运行单个命令(SoftCover Build),以构建所有类型的书籍格式,包括PDF,EPUB和Mobi。这是用红宝石写的美丽的东西。

一旦我了解了这个项目,我就知道这是前进的方向。我之前尝试过几种用于生成乳胶的EPUB文件的工具,这适用于短篇文章和博客文章,但更长的文本失败,如没有废话指南教科书。我尝试之前尝试的所有其他方法都以某种方式劣等,并且它们都不支持No废话指南教科书所需的所有标记。 SoftCover支持90%的标记,我需要直接开箱即用开箱即用,并且很容易添加缺失的碎片。

所以Softcover是好的,但是有一个大问题:我对Ruby生态系统一无所知的事实。什么是宝石?什么是捆绑? am-我应该刚刚耙?这不是一个容易的感觉是“无能的初学者”,它让我想起了我学习代码的早期,甚​​至无法获得基本的DEV设置工作,让沿着计划。但是软版本是如此善良,现有的红宝石知识或不是 - 我知道这是这项工作的工具。

还原问题:学习足够的Ruby来使用SoftCover并自定义代码,以支持书籍中使用的乳胶宏,用于数字,练习和问题。

SoftCover在内部工作的方式基于(子集)胶乳源文件格式称为polytex,它被处理以生成HTML文件,并从中生成ePub。 SoftCover LaTex格式(Polytex)包括我在书中使用的90%的乳胶宏(内联数学,显示的公式,数字,表格,参考等),所有我所要做的就是预先处理书籍源文件它们兼容它们。听起来很简单,对吗?

在这个故事中输入第二个主角:乳胶处理库称为alvin wan创建的texsoup。 TexSoup的名称是一个类比流行的库,用于处理名为MeauteSoup的HTML标记。如果您想知道词源,则术语“汤”是指大多数网页的凌乱标记,这通常是一个难以用手解析的标签的混乱汤,并需要汤解析库来帮助这个任务。

我之前尝试使用基于SED,Python正则表达式,手动注释,修补程序,Perl清理脚本以及其他几个句子解决方案的ad-hoc sciripts使用ad-hoc sciripts多次制作书籍的源文件兼容。这些之前的尝试都没有效果好,因为与正面表达的解析乳胶本质上是一个丢失的战斗。

相比之下,TexSoup库能够“逻辑上”解析乳胶源文件,并允许类似于MeautifueSoup允许HTML的富申请操作。您可以使用查找和find_all方法找到特定的元素,并使用文明的API以编程方式进行编程方式。还有什么可以要求的,而不是一个蟒蛇库,这确实是你需要做的事情!

当我发现TEXSOUP库时,我立即将其认识为将书籍源文件转换为软件辅助格式的任务的正确工具。 TexSoup用于转换和软件计算机的组合,用于生成电子书是正确的方法。我所要做的就是写一些脚本来组合这两个工具。

有一个令人表现出来的战略目标,激励了这一切努力。我希望电子书制作管道完全自动化:从.tex到.pub在一个命令中。拥有自动化管道对于支持持续改进(Kaizen教科书)的过程至关重要,该过程是Minirecence Publishing Co.的中央风格,所有书籍都是根据读者的反馈不断更新的:错字修复,抛光粗略解释,添加链接外部学习资源等。如果从源文件中生产EPUB需要任何耗时的手动步骤,那么EPUB文件将是二等公民,因为它们不会定期更新,就像打印书籍一样更新,这是我们想要的避免。

我用于自动执行.tex Soruce变换和随后的电子书生成过程的工具称为结构(特别是Fab-Classic,它是与原始API向后兼容性的织物项目的叉子)。任何其他自动化库都可用于实现相同的结果,但我选择了面料,因为我拥有此零魔力Python脚本框架的最大体验。如果您知道Makefile是什么,那么您将很容易地识别Fabfile.py如何工作。

所以这就是我在10月12日的地方:我准备好了工具,计划弄清楚了,但我仍然需要做这项工作......

在博客文章的其余部分中,我们将提供有关TexSoup SoftCover自动化脚本的更多技术详细信息,用于将乳胶源文件转换为EPUB。我的目标是为样本书存储库中的代码写一个完整的“演练”。

术语“数据流水线”是谈论一系列转换序列的奇特方式,您应用于某些数据:采用此输入格式,将其转换为另一种格式,然后输出第三种格式。在这种情况下,管道将LaTex源文件作为输入将乳胶源文件转换为XML,然后对XML进行一些进一步的转换,最终输出将包装成EPUB文件的HTML文件。在博客文章的早期部分,我们介绍了名词(文件格式)和动词(软件),现在是时候将整个句子放在一起。

管道的第一步需要处理Minirefering Books中使用的所有乳胶宏和样式(请参阅TEX标头文件),并将其转换为SoftCover兼容的Polytex格式。

No BullShit指南教科书主要是写在“标准”乳胶中。有一个名为00.minirefrence.hdr.tex的公共标题文件,该文件定义了页面设置,字体选择和诸如\ eqdef的一些自定义宏(读取“被定义为”)和矩阵转置符号的\ sft。

MINISERGERGERED HEADER文件还为书中的练习和问题定义了某些自定义环境,这些内容存储在包含在主文本的适当位置的单独文件中。每个问题包括一个问题,答案和解决方案。这三个部分得到了不同的对待:问题出现在主文本中,而答案和解决方案分别发送给特殊文件(例如,Answers_ch1.tex和solutions_ch1.tex)。这些文件已包含在答案和解决方案附录中。答案LaTex包和这些自定义宏启用此功能。

本书中的数字由概念地图,图表,绘图,力图和其他插图的混合组成。作为上一篇关于书籍更新的一部分(2019),我做了很多工作来替换我的丑陋的手绘图,用Tikz生成的美丽矢量图形(很多感谢Robyn Theissen-Bock谁领导了这项工作)。这些数字中的每一个都是根据独立的.tex源文件创建的,基于独立文档类,每次构建图形的PDF版本时,也会生成带有相同名称的.png文件(这将稍后变得重要)。

总的来说,这本书是非常少数宏和自定义的“香草”乳胶。这就是乳胶的全部点:基本书DocumentClass是如此强大,你不需要做任何习惯来生产精美排版书籍。

SoftCover Framework支持的LateX语法的子集称为Polytex。 Polytex涵盖了No Bullsss指南教科书中使用的90%的宏,所以就在盒子中,Tex-Compling用SoftCover编译源文件给出了一个非常不错的结果。

然而,90%不是100%,我们必须对源文件进行一些转换,以使其工作。我要做的具体事情达到100%是:

问题和练习(在Ruby实施的主要文本中跳过答案和解决方案的定制规则)。

章节和部分文件:softcover期望本书的章节作为整个文件呈现,这与拆分每个部分的方法不直接兼容我为书籍使用的源文件。因此,我不得不连接各个部分的源文件来创建章节文件。

数字:由于底层工具序列操作方式的方式,每个数字的\标签必须放在数字的\标题内,以便参考工作权。没问题,这是Texsoup中的五个班轮。

表:解析表是任何标记平台的挑战,这也不例外。最后我为书中的特定表写了一组ad-hoc转换。

我花了大约一个星期和一半的强烈编码,把所有这些转换程序都汇集在一起​​,以改变没有废话导向乳胶到软版兼容的多角形的多角形。

“ETL作业”的概念是企业世界中的标准行话术语,参考来自外部系统的“摄取”(提取)数据的过程,并将其注入您的公司系统(加载)。源数据很少以内部系统预期的格式,因此需要在中间的转换步骤。

提取 - 变换负载管道是一种有用的设计模式,用于管理通常处理数据的复杂性。首先,以可以获得的任何格式提取源数据,然后您执行一个或多个转换,最后输出预期的进一步处理的格式。以下是我创建的管道的四个步骤:

生成源清单:此步骤从书的“主要”文件开始,并递归遵循所有包含的源文件,以创建构建本书所需的文件的详尽列表。结果是可以检查和手动调整的YAML清单文件。

提取内容:源清单告诉我们,我们需要从书的外部源目录中提取到新的临时目录(源/提取/)。 这是一个相当简单的步骤,只需复制清单中列出的文件而不会对它们进行任何处理。 这个目的 ......