Kindle(和其他)电子书的两个导航问题

Kindle(和其他)电子书的两个导航问题

首先,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文件过滤器processopf文件过滤器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我认为人们能看到的工作文件示例越多越好。

相关内容