¿Cómo hacer que tex4ht incluya un enlace de navegación en la página de título del libro al índice?

¿Cómo hacer que tex4ht incluya un enlace de navegación en la página de título del libro al índice?

Al archivo fuente doc.texa continuación, estoy aplicando el comando

make4ht doc.tex "3"

para producir una versión html que tenga una página separada para cada sección.

Cuando el archivo resultante doc.htmlse abre en un navegador, muestra la página de título doc.html.

Pregunta:¿Cómo puedo modificar la make4htllamada, usar un archivo de configuración o modificar la fuente para obtener un enlace de navegación en esa doc.htmlpágina de título que apunte a la tabla de contenido, al igual que los enlaces de navegación en todas las demás páginas?

\documentclass[oneside]{book}
\usepackage[parfill]{parskip} 
\usepackage{blindtext}
\usepackage{hyperref}

\title{A Book}
\author{A. Non}

\begin{document}

\maketitle
\tableofcontents

\chapter{In the Beginning}
  \section{Introduction}
    \blindtext
  \section{What's coming next}
    \blindtext
\chapter{We Continue}
  \blindtext
\chapter{In the End}
  \blindtext

\end{document}

Respuesta1

La solución más sencilla es no utilizar \tableofcontentsTeX4ht en absoluto. En ese caso, se producirá un TOC:

\documentclass[oneside]{book}
\usepackage[parfill]{parskip} 
\usepackage{blindtext}
\usepackage{hyperref}

\title{A Book}
\author{A. Non}

\begin{document}

\maketitle
\ifdefined\HCode\else
\tableofcontents
\fi

\chapter{In the Beginning}
  \section{Introduction}
    \blindtext
  \section{What's coming next}
    \blindtext
\chapter{We Continue}
  \blindtext
\chapter{In the End}
  \blindtext

\end{document}

En este caso utilicé el siguiente código para prevenir \tableofcontentscon TeX4ht:

\ifdefined\HCode\else
\tableofcontents
\fi

Resultará en esta página principal:

ingrese la descripción de la imagen aquí

Pero estoy de acuerdo en que el comportamiento original no es bueno, por lo que aquí hay una versión fija de book.4ht, que debería producir TOC incluso en presencia de \tableofcontents. Tenga en cuenta que de todos modos se producirá una página separada con TOC:

ingrese la descripción de la imagen aquí

El código de book.4htlo siguiente:

% book.4ht (2022-12-16-13:29), generated from tex4ht-4ht.tex
% Copyright 1997-2009 Eitan M. Gurari
% Copyright 2009-2022 TeX Users Group
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any
% later version. The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions
% of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work
% is the TeX4ht Project <http://tug.org/tex4ht>.
%
% If you modify this program, changing the
% version identification would be appreciated.
\immediate\write-1{version 2022-12-16-13:29}

\Configure{UndefinedSec}{likepart}
\Configure{UndefinedSec}{likechapter}
\Configure{UndefinedSec}{likesection}
\Configure{UndefinedSec}{likesubsection}

\def\tableofcontents{%
   \ifx\contentsname\empty \else
      %
\chapter*{\contentsname}%
      %
%
   \fi
   \:tableofcontents}

\let\:tempb\chapter
\Def:Section\chapter{\thechapter}{#1}
\let\:chapter\chapter
\let\chapter\:tempb
\def\@makechapterhead#1{}
\let\no@chapter\@chapter
\def\@chapter[#1]#2{%
   \gHAdvance\:mpNum by 1
\HAssign\minipageNum=\:mpNum \relax
%
   {\SkipRefstepAnchor \let\addcontentsline\:gobbleIII\no@chapter[#1]{}}%
   \HtmlEnv   \Toc:Title{#1}\:chapter{#2}}
\Def:Section\likechapter{}{#1}
\let\:likechapter\likechapter
\let\likechapter\:UnDef
\let\no@schapter\@schapter
\def\@schapter#1{%
   \gdef\sch:ttl{#1}%
%
   {\let\addcontentsline\:gobbleIII\no@schapter{}}%
   \HtmlEnv   \:likechapter{#1}}
\let\no@appendix\appendix
\Def:Section\appendix{\thechapter}{#1}
\let\:appendix\appendix
\def\appendix{%
   \def\@chapter[##1]##2{%
      \gHAdvance\:mpNum by 1
\HAssign\minipageNum=\:mpNum \relax
%
      {\def\addcontentsline####1####2####3{}\no@chapter[##1]{}}%
      \HtmlEnv \Toc:Title{##1}\:appendix{##2}}%
   \no@appendix}


\edef\:TOC{%
   \noexpand\ifx [\noexpand\:temp
      \noexpand\expandafter\noexpand\:TableOfContents
   \noexpand\else
      \noexpand\Auto:ent{\ifnum \c@tocdepth >-2 part,\fi
\expandafter\ifx \csname @chapter\endcsname\relax
   \ifnum \c@tocdepth >\z@  section,\fi
\else
   \ifnum \c@tocdepth >\m@ne chapter,appendix,\fi
   \ifnum \c@tocdepth>0 section,\fi
\fi
\ifnum \c@tocdepth>1 subsection,\fi
\ifnum \c@tocdepth>2 subsubsection,\fi
\ifnum \c@tocdepth>3 paragraph,\fi
\ifnum \c@tocdepth>4 subparagraph,\fi
UnDFexyz}%
   \noexpand\fi}
\def\:tableofcontents{\futurelet\:temp\:TOC}
\def\Auto:ent#1{%
   \edef\auto:toc{\noexpand\:TableOfContents[\ifx \auto:toc\:UnDef
      #1\else \auto:toc \fi]}  \auto:toc
   \global\let\auto:toc\:UnDef }

\def\:tocs{\noexpand\:tableofcontents}
\pend:defIII\addcontentsline{%
   \def\:temp{##1}\def\:tempa{toc}\ifx \:temp\:tempa
   \gHAdvance\TitleCount  1 \fi }
\def\@dottedtocline#1#2#3#4#5{\hbox{\def\numberline##1{\e:listof
                ##1\f:listof}\c:listof#4\d:listof}\ignorespaces}
\def\@starttoc#1{%
  \begingroup
    \makeatletter   \Configure{cite}{}{}{}{}%
    \def\:temp{#1}\def\:tempa{toc}%
    \a:listof\par
    \@input{\jobname.\ifx \:temp\:tempa 4ct\else #1\fi}%
    \b:listof
    \if@filesw
      \expandafter\expandafter\csname
          newwrite\endcsname\csname tf@#1\endcsname
      \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
    \fi
    \global\@nobreakfalse
  \endgroup}



\NewConfigure{tableofcontents*}[1]{%
   \def\:tempa{#1}\ifx\empty\:tempa
      \ifx \au:StartSec\:UnDef \else \gdef\:StartSec{\au:StartSec}\fi
   \else
      \edef\auto:toc{#1}%
         \ifx \au:StartSec\:UnDef
            \let\au:StartSec\:StartSec
            \def\:StartSec{\:tableofcontents
              %\global\let\auto:toc|=\:UnDef \:StartSec}%
               \global\let\auto:toc\:UnDef \global\let\:StartSec\au:StartSec\:StartSec}%
            %\pend:def\tableofcontents{\gdef\:StartSec{\au:StartSec}}%
            \append:def\tableofcontents{\gdef\:StartSec{\au:StartSec}}%
   \fi  \fi
}
     
\ifx \@openbib@code\:UnDef \else
 \pend:def\@openbib@code{\labelsep\z@}
\fi
\ifx \part\:UnDef\else
   \def\@part[#1]#2{%
    \ifnum \c@secnumdepth >-2\relax
      \SkipRefstepAnchor \refstepcounter{part}%
      \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
    \else
      \addcontentsline{toc}{part}{#1}%
    \fi
    \csname @endpart\endcsname}
\let\:tempb\part
\Def:Section\part{\thepart}{#1}
\let\:part\part
\let\part\:tempb
\let\no@part\@part
\def\@part[#1]#2{%
   {\let\addcontentsline\:gobbleIII\no@part[#1]{}}%
   \HtmlEnv   \Toc:Title{#1}\:part{#2}}
\Def:Section\likepart{}{#1}
\let\:likepart\likepart
\let\likepart\:UnDef
\let\no@spart\@spart
\def\@spart#1{%
   {\let\addcontentsline\:gobbleIII\no@spart{}}%
   \HtmlEnv   \:likepart{#1}}

\fi
\ifx \section\:UnDef\else
   \let\no@section\section
\Def:Section\section{\ifnum \c:secnumdepth>\c@secnumdepth   \else
   \thesection \fi}{#1}
\let\no:section\section
\def\section{\rdef:sec{section}}
\Def:Section\likesection{}{#1}
\let\:likesection\likesection
\let\likesection\:UnDef

\fi
\let\no@subsection\subsection
\Def:Section\subsection{\ifnum \c:secnumdepth>\c@secnumdepth   \else
   \thesubsection \fi}{#1}
\let\no:subsection\subsection
\def\subsection{\rdef:sec{subsection}}
\Def:Section\likesubsection{}{#1}
\let\:likesubsection\likesubsection
\let\likesubsection\:UnDef

\let\no@subsubsection\subsubsection
\Def:Section\subsubsection{\ifnum \c:secnumdepth>\c@secnumdepth   \else
   \thesubsubsection \fi}{#1}
\let\no:subsubsection\subsubsection
\def\subsubsection{\rdef:sec{subsubsection}}
\Def:Section\likesubsubsection{}{#1}
\let\:likesubsubsection\likesubsubsection
\let\likesubsubsection\:UnDef

\let\no@paragraph\paragraph
\Def:Section\paragraph{\ifnum \c:secnumdepth>\c@secnumdepth   \else
   \theparagraph \fi}{#1}
\let\no:paragraph\paragraph
\def\paragraph{\rdef:sec{paragraph}}
\Def:Section\likeparagraph{}{#1}
\let\:likeparagraph\likeparagraph
\let\likeparagraph\:UnDef
\let\no@subparagraph\subparagraph
\Def:Section\subparagraph{\ifnum \c:secnumdepth>\c@secnumdepth   \else
   \thesubparagraph \fi}{#1}
\let\no:subparagraph\subparagraph
\def\subparagraph{\rdef:sec{subparagraph}}
\Def:Section\likesubparagraph{}{#1}
\let\:likesubparagraph\likesubparagraph
\let\likesubparagraph\:UnDef

  \let\:tempc\listoffigures
\pend:def\:tempc{\begingroup \a:listoffigures
   \def\@starttoc{\:tableofcontents[lof]\:gobble}}
\append:def\:tempc{\b:listoffigures \endgroup}
\HLet\listoffigures\:tempc
\let\:tempc\listoftables
\pend:def\:tempc{\begingroup \a:listoftables
   \def\@starttoc{\:tableofcontents[lot]\:gobble}}
\append:def\:tempc{\b:listoftables \endgroup}
\HLet\listoftables\:tempc

  \NewConfigure{listoffigures}{2}
\NewConfigure{listoftables}{2}



\append:def\quote{\par\@totalleftmargin\z@}
\NewConfigure{caption}[4]{\c:def\cptA:{#1}\c:def\cptB:{#2}%
   \c:def\cptC:{#3}\c:def\cptD:{#4}}
\long\def\@makecaption#1#2{%   
{\cptA: \cap:ref{#1}%
\if :#1:\else\cptB:\fi}{\cptC:{#2}\cptD:}}


\pend:def\caption{\SkipRefstepAnchor}
\long\def\c:theindex:#1#2#3#4#5#6#7#8#9{%
   \def\theindex{%
      \def\idx:item{\SaveEverypar\ht:everypar{}#1}%
      \def\endtheindex{\idx:item#2\RecallEverypar}%
      \def\item{\idx:item\def\idx:item{#4}\let\index\@gobble #3}%
      \def\subitem{\idx:item\def\idx:item{#6}\let\index\@gobble #5}%
      \def\subsubitem{\idx:item\def\idx:item{#8}\let\index\@gobble #7}}%
   \def\indexspace{\idx:item#9\let\idx:item\empty}}
\def\warn:idx#1{%
  \expandafter\ifx \csname #1warn:idx\endcsname\relax
     \expandafter\global
         \expandafter\let \csname #1warn:idx\endcsname\def
     \writesixteen
        {---------------------------------------------------------}%
     \:warning{If not done so, the index is to be processed by
      ^^J\space\space tex '\string\def\string\filename
         {{#1}{idx}{4dx}{ind}} \noexpand\input\space idxmake.4ht'
      ^^J\space\space  makeindex -o #1.ind #1.4dx
      ^^Jinstead of
      ^^J\space\space  makeindex -o #1.ind #1.idx
      ^^JOn some platforms, the quotation marks ' should be
      ^^J      replaced by double quotation marks " or eliminated.
      ^^J---------------------------------------------------------
     }%
     {\Configure{Needs}{File: #1.4idx}\Needs{}}%
  \fi}
\ifOption{info}{\Log:Note{
A script of the form
^^Jtex '\def\string\filename{{\%\%1}{idx}{4dx}{ind}}
                                       \string\input\space  idxmake.4ht'
^^Jmakeindex -o \%\%1.ind \%\%1.4dx
^^Jin the env file, automatically calls to the revised makeindex
^^Jcommand.  An extra compilation of the source LaTeX file is required,
^^Jto get the index correctly into the output.}}{}
\def\ind:defs{\let\LNKidx\empty
   \def\LNK##1##2##3##4{\ifx\NewConfigure\:UnDef\else
        \def\LNK:number{##4}%
        \a:LNK[##1]{##2}{}\gHAdvance\:LNKno1
           \def\:THIrd{##3}\ifx\:THIrd\empty
              \LNKidx{\ifx\c:LNK\empty\:LNKno\else \c:LNK\fi}\else
              \LNKidx{##3}\fi
           \global\let\LNKidx\empty
        \b:LNK
      \fi}%
   \def\:LNKno{0}}
\NewConfigure{LNK}{3}
\Configure{LNK}{\Link}{\EndLink}{}
\def\yhbLNK#1{\expandafter\let\expandafter\LNKidx\csname
          #1\endcsname\LNK}

\Configure{@begin}{theindex}{\ind:defs}


\let\o:maketitle:\maketitle
\def\maketitle{\bgroup
   \gHAdvance\:mpNum by 1
\HAssign\minipageNum=\:mpNum \relax
%
   \ifx \EndPicture\:UnDef
      \def\sec:typ{title}%
      \Configure{HtmlPar}{}{}{}{}%
      \Configure{newpage}{}%
      \ConfigureEnv{center}{\empty}{}{\empty}{\empty}
      \let\a:tabular:sv\a:tabular \let\b:tabular:sv\b:tabular
\let\c:tabular:sv\c:tabular \let\d:tabular:sv\d:tabular
\let\e:tabular:sv\e:tabular \let\f:tabular:sv\f:tabular
\let\before:begintabular:sv\before:begintabular
%
      \Configure{HBorder}{}{}{}{}{}{}{}{}{}{}%
      \Configure{tabular}{}{}{}{\e:mktl}
        {\bgroup \let\a:tabular\a:tabular:sv \let\b:tabular\b:tabular:sv
\let\c:tabular\c:tabular:sv \let\d:tabular\d:tabular:sv
\let\e:tabular\e:tabular:sv \let\f:tabular\f:tabular:sv
\let\before:begintabular\before:begintabular:sv
}{\egroup}
      \ConfigureEnv{tabular}{\empty}{}{}{}%
      %
      \pend:def\@title{\a:ttl}\append:def\@title{\b:ttl}%
      \pend:def\@date{\a:date}\append:def\@date{\b:date}%
      \pend:def\@author{\a:author}\append:def\@author{\b:author}%
      \def\and{\a:and}
%
   \fi
   \pic:gobble\a:mktl  \o:maketitle:  \pic:gobble\b:mktl
   \egroup \let\maketitle\empty}
\NewConfigure{maketitle}[4]{\c:def\a:mktl{#1}\c:def\b:mktl{#2}%
   \c:def\a:ttl{#3}\c:def\b:ttl{#4}}
\NewConfigure{thanks author date and}[8]{%
   \c:def\a:thanks{#1}\c:def\b:thanks{#2}\c:def\a:author{#3}\c:def\b:author{#4}%
   \c:def\a:date{#5}\c:def\b:date{#6}\c:def\a:and{#7}\c:def\e:mktl{#8}}

\long\def\:tempc{\@roman \c@enumiii}
\ifx \theenumiii\:tempc
   \def\:tempc{\a:enumiii\@roman\c@enumiii\b:enumiii}
   \HLet\theenumiii\:tempc
\fi
\NewConfigure{enumiii}{2}
\append:def\quotation{\a:quotation\par\@totalleftmargin\z@}
\NewConfigure{quotation}{1}
\NewConfigure{listof}{6}

\ConfigureToc{likeparagraph} {}{\empty}{}{\newline}
\ConfigureToc{likepart} {}{\empty}{}{\newline}
\ConfigureToc{likesection} {}{\empty}{}{\newline}
\ConfigureToc{likesubparagraph} {}{\empty}{}{\newline}
\ConfigureToc{likesubsection} {}{\empty}{}{\newline}
\ConfigureToc{likesubsubsection} {}{\empty}{}{\newline}
\ConfigureToc{paragraph} {\empty}{\ }{}{\newline}
\ConfigureToc{part} {\empty}{\ }{}{\newline}
\ConfigureToc{section} {\empty}{\ }{}{\newline}
\ConfigureToc{subparagraph} {\empty}{\ }{}{\newline}
\ConfigureToc{subsection} {\empty}{\ }{}{\newline}
\ConfigureToc{subsubsection} {\empty}{\ }{}{\newline}

\ConfigureToc{appendix} {\empty}{\ }{}{\newline}
\ConfigureToc{chapter} {\empty}{\ }{}{\newline}
\ConfigureToc{likechapter} {}{\empty}{}{\newline}

\Hinput{book}
\endinput

información relacionada