Некоторые дополнительные проблемы с генерацией индекса и tex4ebook

Некоторые дополнительные проблемы с генерацией индекса и tex4ebook

Это продолжение моего предыдущего вопроса.здесь.

Он использует файлы, предоставленные @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.

Основные проблемы:

  1. Команда \indexprologue корректно обрабатывается в PDF:

Вывод в формате PDF

Однако при запуске tex4ebook он игнорируется.

вывод tex4ebook

  1. Я думаю, что есть непоследовательное поведение в опции intoc и опции \addcontentsline{toc}{chapter}{Index}. Опция intoc игнорируется при запуске tex4ebook.

  2. Ссылка на индекс в оглавлении указывает на пустую страницу, а не на место, где находится заголовок индекса.

вывод tex4ebook

В pdf-файле все правильно.

Вывод в формате PDF

  1. Использование автоматической опции в команде makeindex не приводит к созданию гиперссылок:

вывод tex4ebook

Использование опции 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, и нет смысла компилировать индекс в каждом из этих вызовов.

введите описание изображения здесь

Связанный контент