Dies ist eine Fortsetzung meiner vorherigen FrageHier.
Es verwendet die von @Michal.h21 bereitgestellten Dateien. Ich habe die Eingabedatei wie folgt geändert:
\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}
Die Konfigurations- und Build-Dateien sind dieselben wie in der vorherigen Frage und werden erneut von @Michal.h21 bereitgestellt.
Die Hauptprobleme sind:
- Der Befehl \indexprologue wird im PDF korrekt verarbeitet:
Beim Ausführen von tex4ebook wird es jedoch ignoriert.
Ich denke, dass es ein inkonsistentes Verhalten zwischen der intoc-Option und der \addcontentsline{toc}{chapter}{Index}-Option gibt. Die intoc-Option wird beim Ausführen von tex4ebook ignoriert.
Der Indexlink im Inhaltsverzeichnis verweist auf eine leere Seite und nicht auf die Stelle, an der sich die Indexüberschrift befindet.
In der PDF-Datei ist es korrekt.
- Die Verwendung einer automatischen Option im Befehl makeindex erzeugt keine Hyperlinks:
Die Verwendung der Option „noautomatic“ funktioniert. Das ist kein großes Problem, unterscheidet sich aber vom Verhalten eines normalen Latex-Laufs und wirkt seltsam.
Haben andere diese Probleme erlebt und gibt es Lösungsvorschläge oder Möglichkeiten, konsistente Ergebnisse zu erzielen?
Ich vermute, dass dies auf @Michal.h21 zurückzuführen ist, und danke ihm daher im Voraus.
Antwort1
Die vorherige Konfigurationsversion für imakeidx
das Paket berücksichtigte einige Funktionen dieses Pakets nicht, sondern verwendete die Standardkonfiguration tex4ht
zur Verarbeitung des \printindex
Befehls. Wir können die geänderte Version der imakeidx
Definition verwenden, um Unterstützung für einige dieser Funktionen zu erhalten.
Dies ist die neue Version der imakeidx.4ht
Datei:
\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*}
Die wichtige Änderung ist folgende:
\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>}}{}{}
Dabei wird die Inhaltsverzeichnisunterstützung \reneenwironment{theindex}
berücksichtigt und es werden Elemente um den Indexinhalt herum hinzugefügt .\indexprologue
\ConfigureEnv{theindex}
<div class="theindex">
\addcontentsline{toc}{chapter}{Index}
Mit dieser Änderung müssen Sie in Ihrem Dokument nicht mehr den Link vom Inhaltsverzeichnis verwenden , der korrekt auf den Index verweist.
Zu Ihrer letzten Frage: Die automatic
Option von imakeidx
funktioniert nicht, da Sie beim Kompilieren mit pdflatex
und mit unterschiedliche Optionen verwenden müssen tex4ht
. Aus diesem Grund xindy
wird von der Build-Datei aus aufgerufen. Der andere Grund ist, dass LaTeX bei jedem tex4ebook-Lauf mehrmals aufgerufen wird und es keinen Sinn ergibt, den Index bei jedem dieser Aufrufe zu kompilieren.