使用 tex4ebook 和 \nocite bibtexing 时 epubcheck 出现错误

使用 tex4ebook 和 \nocite bibtexing 时 epubcheck 出现错误

在使用命令运行 biblatex 时,我在之后\nocite运行时收到以下错误消息。epubchecktex4ebook

ERROR(RSC-005): Testfile.epub/OEBPS/Testfileli3.html(19,88): Validierungsfehler: Der Wert des Attributs "id" ist ungültig; es muss ein XML-Name ohne Doppelpunkte sein

Translated:
validation error: The value of attribute "id" is invalid; is has to be a XML-name without colon

MWE 如下所示,但它仅重现了 1 次错误。在我的 sourcefile.tex 中,我得到了 175 个 \nocite 命令,并使用 epubcheck 得到了 173 条相同的错误消息。

\documentclass[11pt,a4paper]{report}
\usepackage{ebgaramond-maths}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tex4ebook}
\usepackage[sortlocale=auto,bibstyle=authoryear,citestyle=authortitle-ticomp]{biblatex}
\addbibresource{biblatex-examples.bib}

\begin{document}

\nocite{sigfridsson}
\nocite{westfahl:space}
\nocite{set}
\nocite{stdmodel}
\nocite{aksin}
\nocite{bertram}

\printbibliography

\end{document}

有解决办法吗?-->有,请参阅答案 1。它可以将 epubcheck 错误数从 123 减少到 20。

更新 1

我现在还剩下 20 个 epubcheck 错误,它们似乎都与命令有关\pageref{somelabel}。epubcheck 给出ERROR(RSC-012) Fragmentbezeichner ist nicht angegeben并指向 html 文件中的以下示例(共 20 个):

(wie vorangehend, bei Andrej
Sacharow<a id='dx17-18004'></a> ab Seite <a href='#x11-12001r9'>249<!--  tex4ht:ref: AndrejSacharow   --></a>, gesehen und angedeutet)

并指向页码“249”。但这\pageref位于普通正文中,没有嵌入其他命令和环境中。

到目前为止,还无法在 MWE 中重现 epubcheck 错误。

答案1

这个问题应该由 DOM 过滤器修复make4ht,但我发现这个特定的过滤器有问题。我已经在make4ht源代码中修复了这个问题,但如果你不想更新它,你可以改用这个构建文件:

local domfilter = require "make4ht-domfilter"

local allowed_chars = {
  ["-"] = true,
  ["."] = true
}
local function fix_colons(id)
  -- match every non alphanum character
  return id:gsub("[%W]", function(s)
    -- some characters are allowed, we don't need to replace them
    if allowed_chars[s] then return s end
    -- in other cases, replace with underscore
    return "_"
  end)
end

local function id_colons(obj)
  -- replace : characters in links and ids with unserscores
  obj:traverse_elements(function(el) 
    local name = string.lower(obj:get_element_name(el))
    if name == "a" then
      local href = el:get_attribute("href")
      -- don't replace colons in external links
      if href and not href:match("[a-z]%://") then
        local base, id = href:match("(.*)%#(.*)")
        if base and id then
          id = fix_colons(id)
          el:set_attribute("href", base .. "#" .. id)
        end
      end
    end
    local id  = el:get_attribute("id")
    if id then
      el:set_attribute("id", fix_colons(id))
    end
  end)
  return obj
end


local process = domfilter {id_colons}

Make:match("html$", process)

编译使用:

我还发现了另一个问题,那就是 DOI 编号格式错误。可以使用此配置文件修复:

\Preamble{xhtml}
\def\nolinkurl#1{#1}
\begin{document}
\EndPreamble

编译使用:

$ tex4ebook -e build.lua -c config.cfg filename.tex

结果如下:

在此处输入图片描述

相关内容