首先,Kindle 出版指南强烈建议使用 HTML 目录 (TOC),它现在可能在 tex4ebook 中。他们还说它应该通过 OPF 文件中的指南项或landmarks nav
元素提供给用户。在文本开头包含一个元素也是不错的选择。我可以手动完成此操作,</package>
在 OPF 文件的前面插入以下几行:
<guide>
<reference type="toc" title="Contents" href="RefBookli1.html" />
<reference type="text" title="Preface" href="RefBookch1.html" />
</guide>
进而重新包装epub。有没有办法不手动完成这个操作,例如可以在 OPF 文件中插入文本的 lua 脚本?
其次,许多电子书在侧边栏中包含诸如“版权页”之类的项目。这些似乎是从 ncx 目录中提取的。显然,人们不希望这些内容出现在 HTML 目录中。有没有办法将内容添加到 ncx 目录中而不将它们添加到 HTML 目录中?这对我来说更像是一个好奇的问题,即使可能,我也不确定我是否会这样做。
谢谢!
答案1
您应该创建名为的文件<main_file>.mk4
(扩展名很重要,基本名称应该与处理后的文件相同)。该文件将在 tex4ebook 运行期间自动处理。我的文件包含:
local bookfile = "book"
local filter = require "make4ht-filter"
local add_guide = function(s) return s:gsub("</package>",[[<guide>
<reference type="cover" title="Cover" href="]] .."cover.jpg".. [[" />
<reference type="toc" title="Table of Contents" href="]] ..bookfile.. ".html#x1-1000".. [[" />
<reference type="text" title="Beginning" href="]] ..bookfile.."se1.html".. [[" />
</guide>
</package>]])
end
local process = filter{"cleanspan", "fixligatures"}
local guide = filter{add_guide}
Make:htlatex()
Make:htlatex()
Make:match("html$", process)
Make:match("opf$", guide)
Make:match("html$", "tidy -m -xml -utf8 -q -i -w 200 ${filename}")
bookfile
包含(再次?)基础文件的名称。add_guide
本地函数是主要工作程序:获取opf
文件,并使用正则表达式,替换</package>
指南部分关闭。
本节包含有关封面的信息(您将能够导航到封面;它是第一行)。第二部分包含对目录的引用(该文件有点旧了),第三部分添加了对文本开头的引用。您也可以添加其他引用。
接下来是过滤器的定义(process
用于 HTML 处理和guide
用于处理opf
文件)。Make 运行htlatex
两次,分别针对每个html
文件过滤器process
和opf
文件过滤器guide
。最后,tidy 清理每个 html 文件。
只有一个问题:我无法同时为 epub 和 mobi 文件添加封面。\coverimage{cover}
生成代码将插图添加到 html 文件和清单中,但不标记为封面。在指南中添加封面是可以的,但封面图像被包含两次。省略\coverimage
并按指南添加封面是可行的,但我不确定这是否是正确的方法。
答案2
我完全忽略了<guide>
元素,因为我主要关注的是该epub3
元素,并且该元素在该规范中已被弃用。但添加一些支持很容易,所以我添加了新命令\OpfGuide
以添加对指南的引用。语法如下:
\OpfGuide[filename]{title}{reference type}
在您的示例中,将其添加到.cfg
文件中
\OpfGuide[RefBookli1.html]{Table of contents}{toc}
\OpfGuide[RefBookch1.html]{Preface}{text}
对于您的第二个问题,ncx
文件是从构建的\tableofcontents
,但包含带星号的部分,所以也许类似的东西\section*{Copyright}
应该可以工作?
答案3
从@WojtekMyszka 的精彩回答开始(你应该多花点时间远离电脑,@michal.h21),我处理了这些问题和一些 html 清理问题,即删除空<p class="indent></p>
元素、空<a></a>
元素和空<div></div>
元素。我错过了可以通过tidy
编程调用的事实——我一直在使用“-t”选项来整理结尾——我认为更早地应用tidy
会让其中一些更简单一些。无论如何,我喜欢它,因为“splicer”辅助函数……嗯,很有用。我认为更好的 lua 编程实践是说,return (s:gsub(from,to))
我认为这是只返回第一个值gsub
并丢弃替换次数的习语,但我没有以这种方式测试它,这似乎有效。
local filter = require "make4ht-filter"
local splicer = function(from,to)
return function(s)
return s:gsub(from,to)
end
end
--html fixes
local afix = splicer("<a%s*></a>","")
local pfix = splicer("<p%s+[^>]*>%s*</p>", "")
local divfix = splicer("<div%s+[^>]*>%s*</div>", "")
--take out the cover image display
local snipcover = splicer('<div class="cover%-image">.-</div>',"")
--css fix
local cssfix = splicer("%,%s*%{","{")
--opf fix
local insertguide = splicer("</package>",[[
<guide>
<reference type="toc" title="Contents" href="RefBookli1.html" />
<reference type="text" title="Preface" href="RefBookch1.html" />
</guide>
</package>]])
--ncx fix
local insertcontents = splicer('<navPoint id="navPoint%-1" playOrder="1">',[[
<navPoint id="navPoint-0" playOrder="0">
<navLabel>
<text>Contents</text>
</navLabel>
<content src="RefBookli1.html" />
</navPoint>
<navPoint id="navPoint-1" playOrder="1">]])
local htmlprocess = filter{afix, pfix, divfix, "nkcleanspan", "fixligatures", "hruletohr"}
local cssprocess = filter{cssfix}
local coverprocess = filter{snipcover}
local opfprocess = filter{insertguide}
local ncxprocess = filter{insertcontents}
Make:htlatex()
Make:htlatex()
Make:htlatex()
Make:match("html$",htmlprocess)
Make:match("^RefBook%.html$", coverprocess)
Make:match("css$",cssprocess)
Make:match("opf$",opfprocess)
Make:match("ncx$",ncxprocess)
正如我在上面的评论中提到的,我能用这种方式处理 ncx TOC 纯属运气——可以在最开始插入一个额外的元素。
无论如何,我认为值得发布这篇文章,因为.mk4
我认为人们能看到的工作文件示例越多越好。