2

I am trying to convert my PhD dissertation (\documentclass{report}) from LaTeX to HTML using make4ht. It uses the amsmath, hyperref, and cleveref packages, which are causing a problem when used with make4ht and report or book documentclass (but not when using article). Note that it compiles successfully using pdflatex. Following is a minimal working example to show the error:

% If I use the article class below, then it compiles with make4ht.
% It does not compile with report and book classes, however.
\documentclass{report}

% If I comment out any one (!) of the following three, then make4ht compilation goes smoothly.
% FML if the following order is wrong.
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cleveref}

\begin{document}
    Lorem ipsum.
\end{document}

If I comment out any one of the \usepackage commands above, then make4ht compilation using make4ht -u mwe.tex works. When attempting to compile the MWE as shown with make4ht, however, I get an error. Following is the last part of the log file, which also shows the version of cleveref I have:

Package: cleveref 2018/02/08 v0.21.1 Intelligent cross-referencing
Package cleveref Info: `hyperref' support loaded on input line 2301.
LaTeX Info: Redefining \cref on input line 2301.
LaTeX Info: Redefining \Cref on input line 2301.
LaTeX Info: Redefining \crefrange on input line 2301.
LaTeX Info: Redefining \Crefrange on input line 2301.
LaTeX Info: Redefining \cpageref on input line 2301.
LaTeX Info: Redefining \Cpageref on input line 2301.
LaTeX Info: Redefining \cpagerefrange on input line 2301.
LaTeX Info: Redefining \Cpagerefrange on input line 2301.
LaTeX Info: Redefining \labelcref on input line 2301.
LaTeX Info: Redefining \labelcpageref on input line 2301.

! Undefined control sequence.
<argument> ...esult \relax \else \cref@addtoreset
                                                  {parentequation}{\cref@res...
l.2885 }{}
          %  end of \@ifpackageloaded{amsmath}
?

It appears this has something to do with equations/subequations and the following lines in cleveref.dtx:

\@ifpackageloaded{amsmath}{%
  % I am skipping many lines here...
  \let\cref@old@endsubequations\endsubequations%
  \cref@resetby{equation}{\cref@result}%
  \ifx\cref@result\relax\else%
    \cref@addtoreset{parentequation}{\cref@result}%
  \fi%
  \renewenvironment{subequations}{%
  % I am skipping some lines here again...
}

Adding a basic make4ht *.cfg file does not help. Using \AtBeginDocument{\usepackage{cleveref}} does not help either. I am guessing that something must be added/modified in the cleveref.4ht file that I picked up from another answer), but I do not know how to go about this without digging in too deep. Please help!

2

This is some deep package interaction, the stuff that is a nightmare to debug. You use both hyperref and cleveref. cleveref uses the following code to define the \cref@addtoreset macro:

\let\if@cref@hyperrefloaded\iffalse%
\global\let\cref@addtoreset\@addtoreset%

\@ifpackageloaded{hyperref}{%
  \@ifpackagewith{hyperref}{implicit=false}{%
    \let\if@cref@hyperrefloaded\iftrue%
    \PackageWarning{cleveref}{hyperref package loaded with
      implicit=false option - disabling cleveref's hyperref support.
      This situation is not supported by cleveref, and there's no guarantee
      anything will work. You're on your own!}%
  }{%
    \let\if@cref@hyperrefloaded\iftrue%
    \PackageInfo{cleveref}{`hyperref' support loaded}%
    \let\cref@addtoreset\HyOrg@addtoreset%

Important line is this one:

    \let\cref@addtoreset\HyOrg@addtoreset%

When you insert \show\HyOrg@addtoreset at that place, you can see that it is undefined. The reason for that is that hyperref package exit its loading early when it detect tex4ht, before \HyOrg@addtoreset is defined.

To fix that, we need to patch the package loading mechanism in TeX4ht and define \HyOrg@addtoreset before it is loaded. Package fixes are included in usepackage.4ht. The fix can look like this:

\def\:temp{cleveref}\ifx \@currname\:temp
\let\HyOrg@addtoreset\@addtoreset
\fi

The full usepackage.4ht file:

% usepackage.4ht (2020-04-15-14:52), generated from tex4ht-4ht.tex
% Copyright 2003-2009 Eitan M. Gurari
% Copyright 2009-2020 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 2020-04-15-14:52}

   \def\:temp{tex4ht}\ifx \:temp\@currname
   \:warning{\string\usepackage{tex4ht} again?}
   \def\:temp#1htex4ht.def,tex4ht.sty#2!*?: {\def\:temp{#2}}
\expandafter\:temp \@filelist htex4ht.def,tex4ht.sty!*?: %
\ifx \:temp\empty  \else
   \:warning{if
    \string\RequirePackage[tex4ht]{hyperref} or
    \string\usepackage[tex4ht]{hyperref} was
    used try instead, repectively,
    \string\RequirePackage{hyperref} or
    \string\usepackage{hyperref}}
\fi

\fi
\gdef\a:usepackage{\use:package xr,xr-hyper,eso-pic,showframe,expl3,savetrees,cleveref,biblatex,xeCJK,polyglossia,fontspec,tikz,pdfbase,caption,graphics,xcolor,imakeidx,minted,fancyhdr,,!*?: }
\gdef\use:package#1,{%
   \if :#1:\def\:temp##1!*?: {}\else
      \def\:temp{#1}\ifx \@currname\:temp
             \def\:temp##1!*?: {\input usepackage.4ht  }%
      \else \let\:temp=\use:package \fi
   \fi \:temp}
\def\:temp{xr}\ifx \@currname\:temp
   \:AtEndOfPackage{\let\XR:\XR@
   \def\XR@[#1]#2{%
    \Configure{AtBeginDocument}{\XR:[#1]{#2}}{}}%
}

\fi
\def\:temp{cleveref}\ifx \@currname\:temp
\let\HyOrg@addtoreset\@addtoreset
\fi
\def\:temp{xr-hyper}\ifx \@currname\:temp
   \:AtEndOfPackage{\let\XR:\XR@
    \def\XR@[#1][#2]#3{%
      \AtBeginDocument{\XR:[#1][#2]{#3}}
    }%
}

\fi
\def\:temp{eso-pic}\ifx \@currname\:temp
\:dontusepackage{eso-pic}
\newcommand\AddToShipoutPicture{\@ifstar{}{}}
\let\AddToShipoutPictureBG\AddToShipoutPicture
\let\AddToShipoutPictureFG\AddToShipoutPicture
\fi
\def\:temp{showframe}\ifx \@currname\:temp
\:dontusepackage{showframe}
\fi
\def\:temp{expl3}\ifx \@currname\:temp
\ifdefined\XeTeXversion%
\xenunidelblock{Latin-expl3}%
\:AtEndOfPackage{\xeuniuseblock{Latin-expl3}}
\fi
\fi
\def\:temp{savetrees}\ifx \@currname\:temp
\:dontusepackage{savetrees}
\fi
\def\:temp{biblatex}\ifx \@currname\:temp
\:AtEndOfPackage{%
  \def\blx@mknoautolang{%
    \blx@lbxinput{\blx@languagename}%
    {}{}%
  }%
  \def\blx@lbxinput@iii#1#2{%
  \global\csundef{blx@lng@#2}%
  \:IfFileExists{#1.lbx}
    {\blx@lbxinput@iv{#2}{#1}{language '#2' -> '#1'}}
    {\ifcsdef{blx@suffmaptried@#2}
      {}
      {\blx@warning@noline{%
          File '#1.lbx' not found!\MessageBreak
          Ignoring mapping '#2' -> '#1'}%
       \global\cslet{blx@suffmaptried@#2}\@empty}%
     \blx@lbxinput@iv{#2}{#2}{language '#2'}}}

}
\fi
\def\:temp{xeCJK}\ifx \@currname\:temp
\:dontusepackage{xeCJK}
\:AtEndOfPackage{%
  \RequirePackage{fontspec}
}
\DeclareDocumentCommand\setCJKmainfont{o m o}{}
\let\setCJKsansfont\setCJKmainfont
\let\setCJKmonofont\setCJKmainfont

\DeclareDocumentCommand\setCJKfamilyfont {m o m }{}
\DeclareDocumentCommand\newCJKfontfamily {o m o m}{\expandafter\gdef\csname #2\endcsname{\relax}}

\DeclareDocumentCommand\xeCJKsetup{m}{}
% }
\AtBeginDocument{%
  \xeuniuseblock{CJK}
}
\fi
\def\:temp{polyglossia}\ifx \@currname\:temp
\ExplSyntaxOn
\:AtEndOfPackage{

\cs_set_eq:NN\orig_polyglossia@keys_define_lang:n\polyglossia@keys_define_lang:n
\cs_set_protected:Npn \polyglossia@keys_define_lang:n #1 {
  \orig_polyglossia@keys_define_lang:n{#1}
  \keys_define:nn {polyglossia}{
    #1 / direction
    .  code:n = {}
  }
}
\def\RequireBidi{}%
}
\ExplSyntaxOff
\fi
\def\:temp{fontspec}\ifx \@currname\:temp
  \ifdefined\fontspec
    \:dontusepackage{fontspec}
  \else
    \input usepackage-fontspec.4ht
  \fi
\fi
\def\:temp{tikz}\ifx \@currname\:temp
\:AtEndOfPackage{%
\let\use:tikzlibrary\usetikzlibrary
\def\find:externalize#1external#2\@nil{%
\if\relax#2\relax\else
  \let\tikz:externalize\tikzexternalize
  \renewcommand\tikzexternalize[1][]{\tikz:externalize[##1,mode=only graphics]}
    \tikzset{%
      tex4ht inc/.style={%
        /pgf/images/include external/.code={%
          \includegraphics[]{####1.pdf}%
        }%
      }
    }
    \tikzset{tex4ht inc}
  \fi
}
\append:defI\use@@tikzlibrary{\find:externalize##1external\@nil}%
}
\fi
\def\:temp{pdfbase}\ifx\@currname\:temp
\:AtEndOfPackage{%
  \let\old:outputpage\@outputpage
  \def\@outputpage{\old:outputpage{}}
}
\fi
\def\:temp{caption}\ifx\@currname\:temp
\:AtEndOfPackage{%
  \long\def\caption@If@Package@Loaded#1[#2]#3#4{}
}
\fi
\def\:temp{graphics}\ifx\@currname\:temp
  \ifdefined\XeTeXversion
    \PassOptionsToPackage{dvips}{graphics}
  \fi
\fi
\def\:temp{xcolor}\ifx\@currname\:temp
  \ifdefined\XeTeXversion
    \PassOptionsToPackage{dvips}{xcolor}
  \fi
\fi
\def\:temp{imakeidx}\ifx\@currname\:temp
  \PassOptionsToPackage{noautomatic}{imakeidx}
\fi
\def\:temp{minted}\ifx\@currname\:temp
  \:AtEndOfPackage{%
    \define@booleankey{minted@opt@g}{breaklines}{}{}{}%
  }
\fi
\def\:temp{fancyhdr}\ifx\@currname\:temp
  \:AtEndOfPackage{%
  \def\ps@fancy{}%
  }
\fi


\endinput

Your sample now compiles without errors.

I will update TeX4ht sources to include this fix, so it should be available in TL 2020 soon.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.