Это продолжение моего предыдущего вопроса.здесь.
Он использует файлы, предоставленные @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 он игнорируется.
Я думаю, что есть непоследовательное поведение в опции intoc и опции \addcontentsline{toc}{chapter}{Index}. Опция intoc игнорируется при запуске tex4ebook.
Ссылка на индекс в оглавлении указывает на пустую страницу, а не на место, где находится заголовок индекса.
В pdf-файле все правильно.
- Использование автоматической опции в команде makeindex не приводит к созданию гиперссылок:
Использование опции noautomatic работает. Это не большая проблема, но это отличается от того, как ведет себя обычный латексный запуск, и это кажется странным.
Сталкивались ли другие с подобными проблемами и есть ли какие-либо рекомендации по их устранению или способы получения стабильных результатов?
Я подозреваю, что это будет @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
вызывается из файла сборки. Другая причина в том, что LaTeX вызывается несколько раз в каждом запуске tex4ebook, и нет смысла компилировать индекс в каждом из этих вызовов.