tex4ebook 的书籍模板

tex4ebook 的书籍模板

我正在尝试使用 memoir 和 Texlive 为 tex4ebook 设置一本书籍模板。

具有我想要的一切的 MWE 是:

\documentclass[ebook,12pt,oneside,openany]{memoir}

\begin{filecontents}{test.bib}
@book{Hiemenz,
author={Hiemenz},
title={Polymer Chemistry}
}
\end{filecontents}

\usepackage{lipsum}

\usepackage[backend=biber,hyperref=auto,backref=true]{biblatex}
\bibliography{test}

\usepackage{imakeidx}
\makeindex[intoc=true,columns=1]

\usepackage[hyperindex=true]{hyperref}

\title{Book}
\author{Author}
\date{}

\begin{document}

\maketitle

\frontmatter

\tableofcontents \newpage

\mainmatter

\chapter{C1}

aword\index{aword}

\lipsum \newpage

Here comes a quotation \cite{Hiemenz}.

\chapter{C2}

bword\index{bword}

\lipsum \newpage

\backmatter

\phantomsection
\addcontentsline{toc}{chapter}{Bibliography}
\printbibliography \newpage

\phantomsection
\printindex

\end{document}

使用 pdflatex 可以产生正确的结果。

pdflatex output

使用 tex4book 会导致一些问题。

build.mk4 文件是:

 Make:add("biber","biber ${input}")

 Make:htlatex {}
 Make:biber {}
 Make:htlatex {}
 Make:htlatex {}
 Make:htlatex {}

该cfg文件是:

% save the clearpage before it is redefined by tex4ht
\let\oldclrearpage\clearpage
% define macro for newpage insertion
\def\mypagebreak{\Configure{newpage}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="newpage"></div>}}}
%
\Preamble{xhtml}
\CutAt{section}
%
% enforce newpage
%
% define it for \newpage
%
\mypagebreak
\Css{.newpage{page-break-before:always;}}
% modify \Configure{BODY} so our confiurations work on all extracted pages
\Configure{@BODY}{\def\clearpage{\bgroup\mypagebreak\oldclrearpage\egroup}}
\Configure{@/BODY}{\global\let\clearpage\oldclrearpage\Configure{newpage}{}}
\begin{document}
\EndPreamble

这不会生成正确的电子书。目录中缺少索引条目,并且索引页不是超链接。

tex4ebook output

有什么办法可以让 tex4ebook 版本正常工作吗?

谢谢。

编辑1

我忘了在第一章之前放入 \mainmatter。现在已将其包括在内。我保留输入文件的其余部分,以便与 @michal.h21 进行比较,这是一个出色的解决方案。

编辑 2 - 附加问题

问题 1:

我想要包含一个封面(称为 cover.jpg)并让它在 Kindle 版本上正确显示,并在目录中带有链接,以便电子书图片中的目录如下所示:

覆盖

开始 [评论:此链接应指向 sample.tex 中的哪里?]

目录的其余部分与原始问题相同

我看过 这里这里但我不确定什么是最好的方法来实现这一点并避免这些页面上讨论的双重封面问题。

问题2:

上面的两个网页还讨论了整理构建过程中生成的 html 代码的各种方法。推荐的方法是什么?

总结一下,@michal.h21 修改后的 sample.tex 和 build.mk4 以及我的 sample.cfg 还需要做哪些额外的修改才能使这一切正常工作?[@michal.h21 的 imakeidx.4ht 保持原样。]

我希望这些额外的变化将为 Kindle 电子书提供一个完整的模板,其他用户可以轻松地将其改编为自己的书籍。

谢谢。

答案1

索引的问题在于 HTML 中没有页面,因此使用它们没有意义。相反,我们可以为每个\index使用编号,并在该位置插入链接目的地。这样,我们就可以直接转到索引条目被使用的地方。

我们将使用xindy,因为它比 更灵活,makeindex并且支持更多语言。我们还将利用您使用包的事实imakeidx,因为它使我们能够轻松修改应包含在索引中的信息。

首先,您需要修改源文件,因为您不想自动创建索引(也许您想要,但在每次运行 LaTeX 时调用索引命令是没有意义的),并且我们需要将索引包含在目录中:

\documentclass[ebook,12pt,oneside,openany]{memoir}

\begin{filecontents}{test.bib}
@book{Hiemenz,
author={Hiemenz},
title={Polymer Chemistry}
}
\end{filecontents}

\usepackage{lipsum}

\usepackage[backend=biber,hyperref=auto,backref=true]{biblatex}
\bibliography{test}

\usepackage{imakeidx}
\makeindex[intoc=true,columns=1]

\usepackage[hyperindex=true]{hyperref}

\title{Book}
\author{Author}
\date{}

\begin{document}
\ifdefined\HCode
  \phantomsection
  \addcontentsline{toc}{chapter}{Cover}
  \coverimage{cover.jpg}
\fi

\maketitle

\frontmatter

\tableofcontents \newpage

\mainmatter

\chapter{C1}

aword\index{aword}

\lipsum \newpage

Here comes a quotation \cite{Hiemenz}.

\chapter{C2}

bword\index{bword}
\lipsum \newpage

\backmatter

\phantomsection
\addcontentsline{toc}{chapter}{Bibliography}
\printbibliography \newpage

\phantomsection
\printindex

\end{document}

然后配置文件为imakeidximakeidx.4ht

\RequirePackage[]{etoolbox}
\RequirePackage{gettitlestring}
\newcounter{indexcnt}
\let\@Index\@index
\patchcmd{\@Index}{\@wrindex}{\@Wrindex}{}{}
\let\@Wrindex\@wrindex
\patchcmd{\@Wrindex}{\thepage}{\theindexcnt}{}{}
\let\xIndex\index
\patchcmd{\xIndex}{\@index}{\@Index}{}{}
\patchcmd{\xIndex}{\@index}{\@Index}{}{}

\pretocmd{\xIndex}{\@stepindexcnt\@indexanchor}
% \patchcmd{\index}{\@index}{\@Index}{}{}
% \patchcmd{\xIndex}{\@index}{\@Index}{}{}
% \let\protected@iwrite\protected@write
% \let\@index\@Index
% \patchcmd{\protected@iwrite}{\write}{\immediate\write}{}{}
\patchcmd{\@Wrindex}{\protected@write}{\protected@iwrite}{}{}
\let\Index\xIndex
\let\index\xIndex
%\show\Index
\newcommand\@indexanchor{%
  \edef\idx@anch{idx-anch\theindexcnt}%
  \Link[]{}{\idx@anch}\EndLink%
  %\Ref{(idx-link-\idx@anch)}{\FileName/\idx@anch}
}
\newcommand\@stepindexcnt{\stepcounter{indexcnt}}
\newcommand\hello[1]{\@hello#1}
\def\@hello#1/{%
  \Link{idx-anch#1}{}#1\EndLink%
}


\GetTitleStringSetup{expand}
\GetTitleStringDisableCommands{%
  \renewcommand\LaTeX{LaTeX}
}

\newcount\idxkwdcnt
\LinkCommand\IdxKWLink{span,href,id}
\newcommand\idxkeyword[1]{%
  \global\advance\idxkwdcnt by 1\relax%
  % use tags only one time
  \GetTitleString{#1}
  \ifcsdef{idxkw\GetTitleStringResult}{}%
  %{\Tag{idxkw#1}{idxkw\the\idxkwdcnt}}%
  {\expandafter\Tag\expandafter{idxkw\GetTitleStringResult}{idxkw\the\idxkwdcnt}}%
  \csgdef{idxkw\GetTitleStringResult}{x}
  \a:IdxKW{}{idxkw\the\idxkwdcnt}#1\b:IdxKW
}


\NewConfigure{IdxKW}{2}
\Configure{IdxKW}{\IdxKWLink}{\EndIdxKWLink}


\newcommand\idxlocator[1]{\Link{idx-anch#1}{}#1\EndLink}%

\begin{filecontents*}{\jobname.xdy}
(define-attributes (("default" "definition" "textbf")))
( define-location-class "sec-num" :var
                        ("arabic-numbers"
             :sep "." "arabic-numbers"
             :sep "." "arabic-numbers"
             :sep "." "arabic-numbers"
             :sep "." "arabic-numbers"
))
(require "texindy.xdy")
(markup-keyword :open "\idxkeyword{" :close "}" )
(markup-locref :open "\idxlocator{" :close "}")
(markup-locref :open "\textbf{\idxlocator{" :close "}}"  :attr "textbf")
(markup-locref :open "\textbf{\idxlocator{" :close "}}"  :attr "definition")
\end{filecontents*}

它包含索引目标和xindy辅助模块的配置。

最后,我们必须添加xindy对文件的支持.mk4

Make:add("biber","biber ${input}")
Make:add("xindy", function(par)
  -- par.encoding  = par.encoding or "utf8"
  -- par.language = par.language or "english"
  par.idxfile = par.idxfile or par.input .. ".idx"
  local modules = par.modules or {}
  local t = {}
  for k,v in ipairs(modules) do
    t[#t+1] = "-M ".. v
  end
  par.moduleopt = table.concat(t, " ")
  local xindy_call = "xindy -L ${language} -C ${encoding} ${moduleopt} ${idxfile}" % par
  print(xindy_call)
  return os.execute("xindy -L ${language} -C ${encoding} ${moduleopt} ${idxfile}" % par)
end, {modules = {"texindy"}, language = "english", encoding = "utf8"})

if mode=="draft" then
  Make:htlatex {}
else
 Make:htlatex {}
 Make:biber {}
 -- xindymodule = Make.params["input"]
 Make:xindy {modules = {"sample"}}
 Make:htlatex {}
 Make:htlatex {}
 Make:htlatex {}
end

Make:xindy命令可以接受一些附加参数,即、 和languagetable encoding。我们可以使用默认值,我们只需要传递 生成的模块,使用idxfilemodulesimakeidx.4ht

 Make:xindy {modules = {"sample"}}

该模块名为\jobname.xdy,我们发布时应不带扩展名。我的文件名为sample.tex,因此模块名称为sample

结果如下:

enter image description here


编辑:

您可以使用命令将封面图片添加到文档中\coverimage。它假定它是png格式,因此您需要添加

 \Configure{CoverMimeType}{image/jpeg}

.cfg如果要使用 ,则将其添加到文件中。jpg您可以使用 和 的技巧将其添加到目录中。由 定义,因此您只能在使用 编译文档时使用它,例如:\phantomsection\addcontentsline\coverimagetex4ebooktex4ebook

\ifdefined\HCode
  \phantomsection
  \addcontentsline{toc}{chapter}{Cover}
  \coverimage{cover.jpg}
\fi

相关内容