这是我上一个问题的后续这里。
它使用@Michal.h21提供的文件。我修改了输入文件,如下所示:
\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,noautomatic]
\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
\addcontentsline{toc}{chapter}{Index}
\indexprologue{Concepts}
\printindex
\end{document}
配置和构建文件与上一个问题相同,并再次由@Michal.h21 提供。
主要问题有:
- \indexprologue 命令在 pdf 中得到正确处理:
然而,它在 tex4ebook 运行中被忽略了。
我认为 inoc 选项和 \addcontentsline{toc}{chapter}{Index} 选项的行为不一致。在 tex4ebook 运行中,inoc 选项被忽略。
目录中的索引链接指向空白页,而不是索引标题所在的位置。
在pdf文件中是正确的。
- 在 makeindex 命令中使用自动选项不会产生超链接:
使用 noautomatic 选项有效。这不是什么大问题,但它与正常的 latex 运行行为不同,而且看起来很奇怪。
其他人是否遇到过这些问题?是否有任何建议的修复方法或获得一致结果的方法?
我怀疑这会落在@Michal.h21 身上,所以我会提前感谢他。
答案1
之前版本的imakeidx
包配置没有考虑到该包的一些特性,而是使用默认tex4ht
配置来处理 \printindex
命令。我们可以使用修改后的定义版本imakeidx
来获得对其中一些特性的支持。
这是文件的新版本imakeidx.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}%
\renewenvironment{theindex}%
{\imki@maybeaddtotoc
% \imki@indexlevel{\indexname}\imki@indexheaders
\imki@idxprologue
\global\let\imki@idxprologue\relax
\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\raggedright
\let\item\@idxitem
\imki@othercode}
{%
}
\let\indexspace\relax
\ConfigureEnv{theindex}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="theindex">}}{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}{}{}
\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*}
重要的变化是这样的:
\renewenvironment{theindex}%
{\imki@maybeaddtotoc
% \imki@indexlevel{\indexname}\imki@indexheaders
\imki@idxprologue
\global\let\imki@idxprologue\relax
\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\raggedright
\let\item\@idxitem
\imki@othercode}
{%
}
\let\indexspace\relax
\ConfigureEnv{theindex}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="theindex">}}{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}{}{}
将\reneenwironment{theindex}
考虑到\indexprologue
和 TOC 支持,\ConfigureEnv{theindex}
将<div class="theindex">
在索引内容周围添加元素。
有了这个改变,您不再需要在文档中使用\addcontentsline{toc}{chapter}{Index}
,来自目录的链接可以正确链接到索引。
关于您的最后一个问题,automatic
选项imakeidx
不起作用,因为在使用pdflatex
和编译时需要使用不同的选项tex4ht
。这就是为什么xindy
从构建文件中调用的原因。另一个原因是每次运行 tex4ebook 时都会多次调用 LaTeX,因此在每次调用中编译索引是没有意义的。