2

I tried to compile an article, the source code of which is downloadable, to an ebook with tex4ebook. After some trivial modifications:

--- ../formal.orig.tex  2018-11-23 17:05:07.032134691 +0100
+++ formal.tex  2018-11-23 17:06:05.760497686 +0100
@@ -1,8 +1,9 @@
-\documentclass{conm-p-l}
+%\documentclass{conm-p-l}
+\documentclass{amsart}
 \usepackage{%

 amssymb,%
 %fullpage,%
-righttag,%
+%righttag,%
 pb-diagram,%
 lamsarrow,%
 pb-lams%

with an installation of fonts (I feel very sorry, this tex file uses a lot of very ancient stuff, usually no longer available in modern tex suites), from https://ctan.org/tex-archive/macros/lamstex/tfm?lang=en and http://jardine.math.uwo.ca/lams/

I succeed to compile it with pdflatex. However, when I use tex4ebook to compile it, with configure file collected from the post where I delete the option pic-m to reduce the size of the ebook file, I met an error while running dvisvgm

DVI error: stack not empty at end of page

looking at the error log, I also see

--- warning --- Couldn't find font `lams4.htf' (char codes: 0--122)
--- warning --- Couldn't find font `lams3.htf' (char codes: 0--123)
--- warning --- Couldn't find font `lams2.htf' (char codes: 0--122)
--- warning --- Couldn't find font `lams1.htf' (char codes: 0--125)
--- warning --- Page break within a ch map/picture
--- warning --- Improper groups in \special{t4ht+}... idv[276]
--- warning --- Improper groups in \special{t4ht+}... idv[770]
--- warning --- Improper groups in \special{t4ht+}... idv[857]
--- warning --- Improper groups in \special{t4ht+}... idv[1099]
--- warning --- Improper groups in \special{t4ht+}... idv[1124]
--- warning --- Improper groups in \special{t4ht+}... idv[1131]
--- warning --- Improper groups in \special{t4ht+}... idv[1134]
--- warning --- Improper groups in \special{t4ht+}... idv[1142]
--- warning --- Improper groups in \special{t4ht+}... idv[1238]
--- warning --- Improper groups in \special{t4ht+}... idv[1238]
--- warning --- Improper groups in \special{t4ht+}... idv[1238]

I don't know how to fix this properly, without introducing pic-m to enlarge the ebook file extensively. Thanks for suggestions.

Update: I have a new test case. The source code could be downloaded at https://arxiv.org/format/1707.01799

In order to pass to tex4ebook, I made some modifications (generated by diff):

11c11
< \usepackage{bibgerm}               % Deutsches BibTex
---
> %\usepackage{bibgerm}              % Deutsches BibTex
1625c1625
< is given by sending $X\in G\Sp^O$ to the orthogonal $G/H$-spectrum $\Phi^H_\mathcal U X$ whose $n$-th term is given by
---
> is given by sending $X\in G\Sp^O$ to the orthogonal $G/H$-spectrum $\Phi^H_{\mathcal U} X$ whose $n$-th term is given by
1856,1857c1856,1857
< \item Let $X\in \Cyc$ be a genuine cyclotomic spectrum whose underlying spectrum is bounded below. Then there is an equivalence of spectra $\TC^\mathrm{gen}(X)\simeq \TC(X)$.
< \item Let $X \in \Cyc_p$ be a genuine $p$-cyclotomic spectrum whose underlying spectrum is bounded below. Then there is an equivalence of spectra $\TC^\mathrm{gen}(X,p) \simeq \TC(X,p)$.
---
> \item Let $X\in \Cyc$ be a genuine cyclotomic spectrum whose underlying spectrum is bounded below. Then there is an equivalence of spectra $\TC^{\mathrm{gen}}(X)\simeq \TC(X)$.
> \item Let $X \in \Cyc_p$ be a genuine $p$-cyclotomic spectrum whose underlying spectrum is bounded below. Then there is an equivalence of spectra $\TC^{\mathrm{gen}}(X,p) \simeq \TC(X,p)$.
1869c1869
< \TC^\mathrm{gen}(X)\simeq \TC(X)\ .
---
> \TC^{\mathrm{gen}}(X)\simeq \TC(X)\ .
1871c1871
< We recall the  definition of $\TC^\mathrm{gen}(X)$ in Definition \ref{def:TCpgen}  and diagram \eqref{tcgen} below.
---
> We recall the  definition of $\TC^{\mathrm{gen}}(X)$ in Definition \ref{def:TCpgen}  and diagram \eqref{tcgen} below.
1934c1934
< Now let $X$ be a genuine $p$-cyclotomic spectrum in the sense of Definition~\ref{def:genuinepcyclo}. Let us recall the definition of $\TC^\mathrm{gen}(X,p)$ by B\"okstedt--Hsiang--Madsen, \cite{BHM}. First, $X$ has genuine $C_{p^n}$-fixed points $X^{C_{p^n}}$ for all $n\geq 0$, and there are maps $F: X^{C_{p^n}}\to X^{C_{p^{n-1}}}$ for $n\geq 1$ which are the inclusion of fixed points. Moreover, for all $n\geq 1$ there are maps $R: X^{C_{p^n}}\to X^{C_{p^{n-1}}}$, and the maps $R$ and $F$ commute (coherently). The maps $R: X^{C_{p^n}}\to X^{C_{p^{n-1}}}$ arise as the composition of the map $X^{C_{p^n}}\to (\Phi^{C_p} X)^{C_{p^{n-1}}}$ that exists for any genuine $C_{p^n}$-equivariant spectrum, and the equivalence $(\Phi^{C_p} X)^{C_{p^{n-1}}}\simeq X^{C_{p^{n-1}}}$ which comes from the genuine cyclotomic structure on $X$.
---
> Now let $X$ be a genuine $p$-cyclotomic spectrum in the sense of Definition~\ref{def:genuinepcyclo}. Let us recall the definition of $\TC^{\mathrm{gen}}(X,p)$ by B\"okstedt--Hsiang--Madsen, \cite{BHM}. First, $X$ has genuine $C_{p^n}$-fixed points $X^{C_{p^n}}$ for all $n\geq 0$, and there are maps $F: X^{C_{p^n}}\to X^{C_{p^{n-1}}}$ for $n\geq 1$ which are the inclusion of fixed points. Moreover, for all $n\geq 1$ there are maps $R: X^{C_{p^n}}\to X^{C_{p^{n-1}}}$, and the maps $R$ and $F$ commute (coherently). The maps $R: X^{C_{p^n}}\to X^{C_{p^{n-1}}}$ arise as the composition of the map $X^{C_{p^n}}\to (\Phi^{C_p} X)^{C_{p^{n-1}}}$ that exists for any genuine $C_{p^n}$-equivariant spectrum, and the equivalence $(\Phi^{C_p} X)^{C_{p^{n-1}}}\simeq X^{C_{p^{n-1}}}$ which comes from the genuine cyclotomic structure on $X$.
1936c1936
< These structures determine $\TC^\mathrm{gen}(X,p)$ as follows.
---
> These structures determine $\TC^{\mathrm{gen}}(X,p)$ as follows.
1941c1941,1942
< \TC^\mathrm{gen}(X,p) & := \mathrm{Eq}\left( \xymatrix{\TR(X,p) \ar^-{\mathrm{id}}[r]<2pt> \ar_-F[r]<-2pt> & \TR(X,p) }\right)\\ 
---
> \TC^{\mathrm{gen}}(X,p)
> & := \mathrm{Eq}\left( \xymatrix{\TR(X,p) \ar^-{\mathrm{id}}[r]<2pt> \ar_-F[r]<-2pt> & \TR(X,p) }\right)\\ 
2087c2088
< \newcommand{\Prl}{\mathcal{P}\mathrm{r}^\mathrm{L}}
---
> \newcommand{\Prl}{\mathcal{P}\mathrm{r}^{\mathrm{L}}}
4048,4050c4049,4050
< \begin{altenumerate} $ $
< \item
< For every  compact space $X$ the Tate valued Frobenius (or rather its refinement as in Corollary \ref{refinement}) of $\KU^X$ is given on $\pi_{0}$ by 
---
> \begin{altenumerate}
> \item For every  compact space $X$ the Tate valued Frobenius (or rather its refinement as in Corollary \ref{refinement}) of $\KU^X$ is given on $\pi_{0}$ by 
4057,4058c4057
< \item
< Under the identification \eqref{identification}, the Frobenius
---
> \item Under the identification \eqref{identification}, the Frobenius
4552c4551
< \item The cyclic bar construction $\B^\mathrm{cyc}M$ admits a canonical $\T$-action and a canonical $\T$-equivariant map
---
> \item The cyclic bar construction $\B^{\mathrm{cyc}}M$ admits a canonical $\T$-action and a canonical $\T$-equivariant map
4554c4553
< \psi_p: \B^\mathrm{cyc}M \to (\B^\mathrm{cyc}M)^{hC_p}
---
> \psi_p: \B^{\mathrm{cyc}}M \to (\B^{\mathrm{cyc}}M)^{hC_p}
4560,4561c4559,4560
< M \ar[d]^{\Delta}\ar[r]^{i} &   \B^\mathrm{cyc}M\ar[d]^{\psi_p}  \\
< (M \times \ldots \times M)^{hC_p} \ar[r] &  \B^\mathrm{cyc}M^{hC_p}
---
> M \ar[d]^{\Delta}\ar[r]^{i} &   \B^{\mathrm{cyc}}M\ar[d]^{\psi_p}  \\
> (M \times \ldots \times M)^{hC_p} \ar[r] &  \B^{\mathrm{cyc}}M^{hC_p}
4688c4687
< The upper map is given by the canonical inclusion, since in the equivalence $\B^\mathrm{cyc} \Omega Y \simeq LY$ this corresponds to the inclusion of the bottom cell of the simplicial diagram $\B^\mathrm{cyc} \Omega_\bullet Y$. The lower line is also equivalent to the inclusion $\Omega Y \to LY$ under the obvious identifications, as one sees similarly. Under these identifications the left hand map corresponds to the identity map $\Omega Y \to \Omega Y$. As a result the map $LY \to LY^{hC_p} = LY$ cannot be the trivial map which sends every map to the constant map. Thus it has to be equivalent to the identity which finishes to proof.  
---
> The upper map is given by the canonical inclusion, since in the equivalence $\B^{\mathrm{cyc}} \Omega Y \simeq LY$ this corresponds to the inclusion of the bottom cell of the simplicial diagram $\B^{\mathrm{cyc}} \Omega_\bullet Y$. The lower line is also equivalent to the inclusion $\Omega Y \to LY$ under the obvious identifications, as one sees similarly. Under these identifications the left hand map corresponds to the identity map $\Omega Y \to \Omega Y$. As a result the map $LY \to LY^{hC_p} = LY$ cannot be the trivial map which sends every map to the constant map. Thus it has to be equivalent to the identity which finishes to proof.  
6387c6386
< \end{document}
\ No newline at end of file
---
> \end{document}
  • I cannot get it to compile even with pdflatex, it seems to use really old packages and fonts. It may be easier to redefine the arrow commands using modern packages. The fonts don't use any information which could be used for their mapping to Unicode, so it would be quite hard to get theirs support done for tex4ht – michal.h21 Nov 23 '18 at 20:00
  • @michal.h21 I struggled to install fonts. After the installation and the patch I gave, it compiles. Now I have another test case (the same "stack not empty": I will upload in several minutes. – Yai0Phah Nov 23 '18 at 20:17
  • I guess the issues are still related to fonts, it would be quite hard to provide the correct support files for these fonts – michal.h21 Nov 23 '18 at 20:20
  • @michal.h21 The second test case is about bbm font. However, I also tried to remove all usages of mathbbm in the tex file (newcommand \mathbbm to be just #1), the problem remains, and I cannot see any complains in the output, but still "stack not empty". – Yai0Phah Nov 23 '18 at 20:22
  • @michal.h21 Updated, but I leave mathbbm untouched. – Yai0Phah Nov 23 '18 at 20:25
3

In this particular case, the issue was caused by wrong redefinition of the \xrightarrow command. The amsmath.4ht contained this definition:

\newcommand\:temp#1#2{\a:xrightarrow \o:xrightarrow:{#1}\b:xrightarrow}
\HLet\xrightarrow\:temp
\NewConfigure{xrightarrow}{2}

This may seem to be little bit to understand, so I will explain it. The \NewConfigure{xrightarrow}{2} command defines two configurable hooks named \a:xrightarrow and \b:xrightarrow. The \HLet is similar to \let, but in addition to redefining of the command in the first argument, it also saves its original form in the \o:xrightarrow command. All these commands are used in the first command, the two hooks are used to insert the HTML code around the original command results. In the default configuration, they are used for the request of the image conversion. There is one issue - the command declares two arguments, but uses only one. This results in a discard of the second argument. This lead to the Stack not empty message. In fact, original \xrightarrow uses optional argument, so the correct form of the redefined command is quite different:

 \newcommand\:temp:xrightarrow[2][]{\a:xrightarrow {\o:xrightarrow:[#1]{#2}}\b:xrightarrow}
\HLet\xrightarrow|=\:temp:xrightarrow
\NewConfigure{xrightarrow}{2}

I've posted the fix to the tex4ht sources, so it should be updated soon. In the meanwhile, here is the fixed version of amsmath.4ht:

% amsmath.4ht (2019-01-24-20:48), generated from tex4ht-4ht.tex
% Copyright 1997-2009 Eitan M. Gurari
% Copyright 2009-2019 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 2019-01-24-20:48}

\HRestore\cases
\HRestore\matrix
\HRestore\pmatrix
\append:def\a:display{\@displaytrue}
\expandafter\append:defIII\csname
    c:$$:\endcsname{\append:def\a:display{\@displaytrue}}



\def\above:tbinom#1#2#3#4{\a:tbinom}
\def\:temp{%
   \expandafter \ifx\csname a:tbinom\endcsname\relax \else
   \ifx\a:tbinom\empty \else
      \Configure{abovewithdelims}{\above:tbinom}{}%
   \fi\fi
   \o:tbinom:}
\HLet\tbinom\:temp
\NewConfigure{tbinom}{1}
\def\above:dbinom#1#2#3#4{\a:dbinom}
\def\:temp{%
   \expandafter \ifx\csname a:dbinom\endcsname\relax \else
   \ifx\a:dbinom\empty \else
      \Configure{abovewithdelims}{\above:dbinom}{}%
   \fi\fi
   \o:dbinom:}
\HLet\dbinom\:temp
\NewConfigure{dbinom}{1}
\def\above:binom#1#2#3#4{\a:binom}
\def\:temp#1{%
   \def\:temp{%
      \expandafter \ifx\csname a:binom\endcsname\relax \else
      \ifx\a:binom\empty \else
         \Configure{abovewithdelims}{\above:binom}{}%
      \fi\fi
      #1}}
\expandafter\:temp\expandafter{\csname o:binom :\endcsname}
\expandafter\HLet\csname binom \endcsname\:temp
\NewConfigure{binom}{1}
\pend:def\subequations{\SkipRefstepAnchor }
\def\hdots@for#1#2{\multicolumn{#2}c%
  {\m@th \hdots:for{#1}\hfil}}
\def\hdots:for#1{\dotsspace@1.5mu\mkern-#1\dotsspace@
   \xleaders\hbox{$\m@th\mkern#1\dotsspace@.\mkern#1\dotsspace@$}%
           \hfill
   \mkern-#1\dotsspace@}
\NewConfigure{hdotsfor}[1]{\def\a:hdotsfor##1{#1}}
\let\a:hdotsfor=\hdots:for
\def\:tempc{\a:hdotsfor}
\HLet\hdots:for\:tempc
\expandafter\ifx \csname tmp:muskip\endcsname\relax
   \csname newmuskip\endcsname \tmp:muskip
\fi
\expandafter\def\csname tmspace \endcsname#1#2#3{%
  \ifmmode
    \bgroup
      \tmp:muskip #1#2\edef\mathglue{\the\tmp:muskip}%
      \tmp:dim #1#3\edef\textspace{\the\tmp:dim}\a:tmspace
    \egroup
  \else \kern #1#3\fi \relax
}
\edef\:tempc{\noexpand\protect
             \expandafter\noexpand\csname tmspace \endcsname}
\HLet\tmspace=\:tempc
\NewConfigure{tmspace}{1}
\Configure{tmspace}{\mskip\mathglue}
\HRestore\over
\def\:tempc{\pic:gobble\a:over \o:@@over: \pic:gobble\b:over}
\HLet\@@over\:tempc
\HRestore\atop
\def\:tempc{\pic:gobble\a:atop \o:@@atop: \pic:gobble\b:atop}
\HLet\@@atop\:tempc
\def\::above{\pic:gobble\a:above \o:@@above:\tmp:dim
            \pic:gobble\b:above }
\def\:above{\afterassignment\::above}
\def\:tempc{\Protect\:above \tmp:dim=}
\HLet\@@above\:tempc
\HRestore\abovewithdelims
\def\::abovewithdelims#1#2{\pic:gobble\a:abovewithdelims
   \o:@@abovewithdelims:#1#2\tmp:dim\pic:gobble\b:abovewithdelims}
\def\:abovewithdelims#1#2{\def\:temp{\::abovewithdelims#1#2}%
   \afterassignment\:temp\tmp:dim}
\def\:tempc{\Protect\:abovewithdelims }
\HLet\@@abovewithdelims\:tempc
\NewConfigure{abovewithdelims}{2}
\HRestore\overwithdelims
\def\:overwithdelims#1#2{\pic:gobble\a:overwithdelims
   \o:@@overwithdelims:#1#2\pic:gobble\b:overwithdelims}
\def\:tempc{\Protect\:overwithdelims}
\HLet\@@overwithdelims\:tempc
\NewConfigure{overwithdelims}{2}
\HRestore\atopwithdelims
\def\:atopwithdelims#1#2{\pic:gobble\a:atopwithdelims
   \o:@@atopwithdelims:#1#2\pic:gobble\b:atopwithdelims}
\def\:tempc{\Protect\:atopwithdelims}
\HLet\@@atopwithdelims\:tempc
\NewConfigure{atopwithdelims}{2}
\let\ltx@label\lb:l
\let\Mathaccent:\mathaccent@
\def\mathaccent@#1#2{\ifx \EndPicture\:UnDef
     \DN@{\Picture+{}\Mathaccent:{#1}{#2}\EndPicture}%
  \else\DN@{\Mathaccent:{#1}{#2}}\fi\next@}
\def\:tempc#1#2#3{\a:underarrow@
   \hbox{$\m@th#2#3$}\b:underarrow@
   \hbox{#1#2}\c:underarrow@
}
\HLet\underarrow@\:tempc
\def\:tempc#1#2#3{\a:overarrow@
   \hbox{#1#2}\b:overarrow@
   \hbox{$\m@th#2#3$}\c:overarrow@
}
\HLet\overarrow@\:tempc
\NewConfigure{underarrow@}{3}
\NewConfigure{overarrow@}{3}
\def\:temp#1#2{\a:overset\binrel@{#2}%
  \binrel@@{\mathop{\kern\z@#2}\limits^{#1}}\b:overset}
\HLet\overset\:temp
\NewConfigure{overset}{2}
\def\:temp#1#2{\a:underset\binrel@{#2}%
  \binrel@@{\mathop{\kern\z@#2}\limits_{#1}}\b:underset}
\HLet\underset\:temp
\NewConfigure{underset}{2}

\MathSymbol\mathop{dotsc}
\MathSymbol\mathop{dotso}
\MathSymbol\mathrel{longleftarrow}
\MathSymbol\mathrel{longrightarrow}

\def\:temp#1{{\a:boxed\leavevmode
   \vbox{\m@th$\displaystyle#1$}\b:boxed}}
\HLet\boxed\:temp
\NewConfigure{boxed}{2}
\newcommand\:temp:xrightarrow[2][]{\a:xrightarrow {\o:xrightarrow:[#1]{#2}}\b:xrightarrow}
\HLet\xrightarrow\:temp:xrightarrow
\NewConfigure{xrightarrow}{2}
\newcommand\:temp:xleftarrow[2][]{\a:xleftarrow {\o:xleftarrow:[#1]{#2}}\b:xleftarrow}
\HLet\xleftarrow\:temp:xleftarrow
\NewConfigure{xleftarrow}{2}
\def\:tempc#1{\a:eqref\o:eqref:{#1}\b:eqref}
\NewConfigure{eqref}{2}

\def\equation{\bgroup \@fleqnfalse
%
  \ifx \EndPicture\:Undef
     \def\endequation{%
       \let\tagform@=\:gobble
       \if@eqnsw \expand:after{%
          %
          \o:endequation:\b:equation\equ:no}%
       \else \expand:after{%
          \ifx\df@tag\@empty \expand:after{\o:endequation:\egroup}%
          \else
             \global\let\df:tag=\df@tag
             \expand:after{\o:endequation: \expandafter\b:equation\df:tag
             }\fi
        }\fi
        \c:equation\egroup
      }%
      \expandafter\a:equation
   \else
      \def\endequation{\o:endequation:\egroup}%
   \fi
   \o:equation:}
\expandafter\let\csname o:equation*:\expandafter
       \endcsname \csname equation*\endcsname
\expandafter\let\csname o:endequation*:\expandafter
       \endcsname \csname endequation*\endcsname
\expandafter\def\csname equation*\endcsname{\bgroup
  \ifx \EndPicture\:Undef
     \expandafter\def\csname endequation*\endcsname {%
        \csname o:endequation*:\endcsname\egroup%
        \csname b:equation*\endcsname\egroup
      }%
      \csname a:equation*\endcsname
   \else
      \expandafter\def\csname endequation*\endcsname{\csname
                                 o:endequation*:\endcsname\egroup}%
   \fi
   \csname o:equation*:\endcsname}
\NewConfigure{equation*}[2]{
   \expandafter\c:def \csname a:equation*\endcsname {#1\bgroup \let \@eqnnum \empty }%
   \expandafter\c:def \csname b:equation*\endcsname {#2}%
}
\expandafter\def\csname genfrac \endcsname#1#2#3#4{%
  \def\@tempa{#1#2}%
  \edef\@tempb{\@nx\@genfrac\@mathstyle{#4}%
    \expandafter\noexpand\csname @@\ifx @#3@over\else above\fi
    \ifx\@tempa\@empty \else withdelims\fi\endcsname}%
  \@tempb{#1#2#3}}
\def\:tempc#1#2#3#4#5{{\a:genfrac#1\b:genfrac{\c:genfrac#4#2#3\relax
   {\d:genfrac#5\e:genfrac}}\f:genfrac}}
\HLet\@genfrac\:tempc
\NewConfigure{genfrac}{6}
\HRestore\frac
\def\:temp#1#2{{\a:frac\begingroup
   #1\endgroup\b:frac \@@over \c:frac #2\d:frac}}
\expandafter\HLet\csname frac \endcsname\:temp
\def\math@cr@@[#1]{\ifnum0=`{\fi \iffalse}\fi\math@cr@@@
   \o:noalign:{\vskip#1\relax}}
                                    \catcode`\#13 \catcode`\!6
\def\reg:align!1!2{%
   \ifx \ifinany@\:Undef\else  \inany@true\fi
  \inalign@true \ifx \displaybreak@\:UnDef
   \chardef\dspbrk@context\z@
\else
   \displaybreak@
\fi
\intertext@
   \ifingather@\else\displ@y@\fi\Let@  \let\math@cr@@@\math@cr@@@align
   \ifxxat@\else \let\tag\tag@in@align \fi
   \let\label\label@in@display !1% set st@r
   \ifst@rred\else \global\@eqnswtrue  \fi   \measure@{!2}%
   \global\row@\z@ \tabskip\eqnshift@
   \Configure{PauseMkHalign}
  {\Configure{PauseMkHalign}{}{}{}{}\expandafter\clean:span}{}{}{}%
%
   \SaveMkHalignConf:g{\align:type}\HRestore\noalign
\MkHalign#{\span
   &\@lign$\m@th\displaystyle{{\HCode{}}%
#}$%
   &\@lign$\m@th\displaystyle{{\HCode{}}%
#}$%
}!2%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\clean:span#1\c:halign{%
  \TeXhalign \bgroup \:span}
\ifx \ifinany@\:Undef
   \def\:tempc{%
        \math@cr
    \EndMkHalign \RecallMkHalignConfig \csname b:\align:type\endcsname
    \ifingather@  \restorealignstate@  \egroup \nonumber
      \ifnum0=`{\fi\iffalse}\fi%
    \else         $$\fi
    \global\@ignoretrue
}

\else
   \def\:tempc{%
        \math@cr
    \EndMkHalign \RecallMkHalignConfig \csname b:\align:type\endcsname
    \ifingather@  \restorealignstate@  \egroup \nonumber
      \ifnum0=`{\fi}%
    \else         $$\fi
    \global\@ignoretrue
}

\fi
\HLet\endalign\:tempc
\def\:tempc{\pic:MkHalign{\align:type}}
\HLet\align@\:tempc
\def\Config:alg#1#2#3#4#5#6#7{%
   \expandafter\c:def\csname a:#7\endcsname{\global
      \let\sv:amps\add:amps #1}%
   \expandafter\c:def\csname b:#7\endcsname{#2\global
      \let\add:amps\sv:amps}%
   \expandafter\c:def\csname c:#7\endcsname{#3}%
   \expandafter\c:def\csname d:#7\endcsname{#4}%
   \expandafter\c:def\csname e:#7\endcsname{\expandafter\align:td
      \expandafter{\csname f:#7\endcsname}{#5}{#6}}%
}
\def\align:td#1#2#3{\iftag@
     \ifnum \add:amps>0
        \gHAdvance\add:amps  -1   \gHAdvance\HCol  -1
        \global\let#1\empty
        \ifnum \add:amps=0 \gHAdvance\HCol1 #2\gdef#1{#3}\fi
     \else #2\gdef#1{#3}\fi
   \else \gHAssign\add:amps\HCol\relax #2\gdef#1{#3}\fi}%

\def\:tempc#1{%
   \expandafter\pend:def\csname #1\endcsname{\def\align:type{#1}}%
   \NewConfigure{#1}[6]{\Config:alg{##1}{##2}{##3}{##4}{##5}{##6}{#1}}%
   \Configure{#1}{}{}{}{}{}{}%
   \def\:temp{#1}\def\:tempa{align}\ifx \:temp\:tempa\else
      \@xp\let\csname reg:#1\endcsname\reg:align
      \@xp\let\csname end#1\endcsname\endalign
   \fi }
\:tempc{alignat}
\:tempc{alignat*}
\:tempc{xalignat}
\:tempc{xalignat*}
\:tempc{xxalignat}
\:tempc{align}
\:tempc{align*}
\:tempc{flalign}
\:tempc{flalign*}
\pend:defIII\start@align{\Configure{$$}{}{}{}}
                                    \catcode`\#13 \catcode`\!6
\def\reg:start@aligned!1!2{%
   \savecolumn@
   \vcenter \bgroup
        \maxfields@!2\relax
        \ifnum\maxfields@>\m@ne
            \multiply\maxfields@\tw@
            \let\math@cr@@@\math@cr@@@alignedat
        \else
            \let\math@cr@@@\math@cr@@@aligned
        \fi
        \Let@ \chardef\dspbrk@context\@ne
        \default@tag
        \global\column@\z@
   \SaveMkHalignConf:g{start@aligned}\HRestore\noalign
\MkHalign#{&\column@plus $\m@th\displaystyle{{\HCode{}}#}$%
           &\column@plus $\m@th\displaystyle{{\HCode{}}#}$}%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\al:gned#1{%
   \Configure{start@aligned}{\csname a:#1\endcsname}%
       {\csname b:#1\endcsname}{\csname c:#1\endcsname}%
       {\csname d:#1\endcsname}{\csname e:#1\endcsname}%
       {\csname f:#1\endcsname}\pic:MkHalign{#1}}
\NewConfigure{start@aligned}{6}
\def\:tempc{\crcr\EndMkHalign
    \RecallMkHalignConfig \restorecolumn@
    \egroup  \b:start@aligned}
\HLet\endaligned\:tempc
\def\:temp{%
  \let\@testopt\alignsafe@testopt
  \futurelet\:temp\aligned:a}
\def\aligned:a{\ifx [\:temp \expandafter\aligned:b
   \else \def\:temp{\aligned:b[c]}\expandafter\:temp \fi}
\def\aligned:b[#1]{%
   \al:gned{aligned}{#1}\m@ne}
\HLet\aligned\:temp
\def\reg:aligned{\reg:start@aligned}
\NewConfigure{aligned}{6}
\def\:temp{\futurelet\:temp\alignedat:a}
\def\alignedat:a{\ifx [\:temp \expandafter\alignedat:b
   \else \def\:temp{\alignedat:b[c]}\expandafter\:temp \fi}
\def\alignedat:b[#1]{%
    \let\@testopt\alignsafe@testopt
    \al:gned{alignedat}{#1}\m@ne}
\HLet\alignedat\:temp
\def\reg:alignedat{\reg:start@aligned}
\NewConfigure{alignedat}{6}
                                    \catcode`\#13 \catcode`\!6
\def\reg:gathered[!1]{%
  \RIfM@\else
      \nonmatherr@{\begin{gathered}}%
  \fi
  \null  \vcenter\bgroup
    \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
    \SaveMkHalignConf:g{gathered}%
\MkHalign#{$\m@th\displaystyle{\HCode{}}#$}%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\:tempc{\crcr\EndMkHalign
    \RecallMkHalignConfig \egroup\b:gathered}
\HLet\endgathered\:tempc
\def\:temp{\pic:MkHalign{gathered}}
\expandafter\HLet\csname \string\gathered\endcsname\:temp
\NewConfigure{gathered}{6}
                                    \catcode`\#13 \catcode`\!6
\def\reg:multline!1{%
  \ifx \ifinany@\:Undef\else  \inany@true\fi
    \Let@
  \@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}%
  \ifx \displaybreak@\:UnDef
   \chardef\dspbrk@context\z@
\else
   \displaybreak@
\fi
    \restore@math@cr    \let\tag\tag@in@align
  \global\tag@false \global\let\raise@tag\@empty   
  \let\tag\gobble@tag \ifst@rred  \let\label\@gobble  \else
   \stepcounter{equation}%
   \def\label{\let\cnt:currentlabel\@currentlabel
      \def\:@currentlabel{\ifx \cnt:currentlabel\@currentlabel
      \the\c@equation\else \@currentlabel\fi}%
      \anc:lbl r{equation}\ltx@label}%
   \edef\@currentlabel{\the\c@equation}%
\fi
%
  \ifst@rred
  \expandafter\let\csname e:multline*\endcsname\empty
  \expandafter\let\csname f:multline*\endcsname\empty
\fi
\SaveMkHalignConf:g{multline\ifst@rred *\fi}\HRestore\noalign
\MkHalign#{\hbox{$\m@th\displaystyle{\HCode{}}%
#$}}!1%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\:tempc{\ifst@rred\else
   \e:multline\csname a:multline-num\endcsname
   \tagform@\theequation\csname b:multline-num\endcsname\f:multline
\fi
\math@cr \EndMkHalign
   \RecallMkHalignConfig \csname b:multline\ifst@rred *\fi\endcsname
   $$\global\@ignoretrue  }
\HLet\endmultline\:tempc
\def\:tempc{\pic:MkHalign{multline\ifst@rred *\fi}}
\HLet\multline@\:tempc
\NewConfigure{multline}{6}
\NewConfigure{multline-num}{2}
\@xp\let\csname reg:multline*\endcsname\reg:multline
\@xp\let\csname endmultline*\endcsname\endmultline
\NewConfigure{multline*}{4}
                                    \catcode`\#13 \catcode`\!6
\def\reg:gather!1{%
   \ingather@true  \ifx \ifinany@\:Undef
   \let\split\insplit@   \chardef\dspbrk@context\z@
\else
   \inany@true
\fi
%
   \let\tag\tag@in@align  \let\label\label@in@display
   \intertext@ \displ@y@
   \Let@  \let\math@cr@@@\math@cr@@@gather  
   \global\shifttag@false    \global\row@\@ne
  \SaveMkHalignConf:g{gather\ifst@rred *\fi}\HRestore\noalign
\MkHalign#{\hbox{$\m@th\displaystyle{{\HCode{}}%
#}$}%
&\hbox{{\HCode{}}%
#}%
}!1%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\:tempc{\math@cr \EndMkHalign
   \RecallMkHalignConfig \csname b:gather\ifst@rred *\fi\endcsname
   $$\global\@ignoretrue  }
\HLet\endgather\:tempc
\def\:tempc{\pic:MkHalign{gather\ifst@rred *\fi}}
\HLet\gather@\:tempc
\NewConfigure{gather}{6}
\@xp\let\csname reg:gather*\endcsname\reg:gather
\@xp\let\csname endgather*\endcsname\endgather
\NewConfigure{gather*}{6}
\def\:tempc{%
  \def\intertext##1{%
    \ifvmode\else\\\@empty\fi
    \noalign{%
      \penalty\postdisplaypenalty\vskip\belowdisplayskip
      \vbox{\normalbaselines
        \ifdim\linewidth=\columnwidth
        \else \parshape\@ne \@totalleftmargin \linewidth
        \fi
       \a:intertext \noindent##1\b:intertext\par}%
      \penalty\predisplaypenalty\vskip\abovedisplayskip%
    }%
}}
\HLet\intertext@=\:tempc
\NewConfigure{intertext}{2}
\HLet\leftroot\:gobble
\HLet\uproot\:gobble
                                    \catcode`\#13 \catcode`\!6
\def\reg:smallmatrix{%
  \vcenter\bgroup \Let@\restore@math@cr\default@tag
  \SaveMkHalignConf:g{smallmatrix}%
\MkHalign#{$\m@th\scriptstyle#$&&%
           $\m@th\scriptstyle#$}%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\:tempc{\crcr\EndMkHalign
    \RecallMkHalignConfig \egroup\b:smallmatrix}
\HLet\endsmallmatrix\:tempc
\def\:temp{\pic:MkHalign{smallmatrix}}
\HLet\smallmatrix\:temp
\NewConfigure{smallmatrix}{6}
\pend:defI\substack{\a:substack}
\append:defI\substack{\b:substack}
\NewConfigure{substack}{2}
                                    \catcode`\#13 \catcode`\!6
\def\reg:subarray!1{%
  \vcenter\bgroup
  \Let@ \restore@math@cr \default@tag
  \baselineskip\fontdimen10 \scriptfont\tw@
  \advance\baselineskip\fontdimen12 \scriptfont\tw@
  \lineskip\thr@@\fontdimen8 \scriptfont\thr@@
  \let\e:subarray\empty \let\f:subarray\empty
\everycr{}\SaveMkHalignConf:g{subarray}%
\MkHalign#{$\m@th\scriptstyle#$}%
}
                                    \catcode`\#=6 \catcode`\!=12
\def\:tempc{\crcr\EndMkHalign
    \RecallMkHalignConfig \egroup\b:subarray}
\HLet\endsubarray\:tempc
\def\:temp#1{\def\Hlcr{#1}\pic:MkHalign{subarray}{#1}}
\HLet\subarray\:temp
\NewConfigure{subarray}{4}
\NewConfigure{split}{6}
                                    \catcode`\#13 \catcode`\!6
\def\:tempc{%
   \vbox\bgroup
        \ifx \ifinany@\:Undef
   \chardef\dspbrk@context\@ne
\fi
%
        \Let@  \restore@math@cr  \default@tag \everycr{}\a:split
        \SaveMkHalignConf:g{split}\HRestore\noalign
        \MkHalign#{ $\m@th\displaystyle{{\HCode{}}%
#}$%
&$\m@th\displaystyle{{\HCode{}}%
#}$%
}}
\HLet\insplit@\:tempc
                                    \catcode`\#6 \catcode`\!12
\def\:tempc{%
   \crcr\EndMkHalign \b:split \egroup }
\HLet\endsplit\:tempc
\Configure{@begin}
  {split}
  {\relax
   \ifx  \split\insplit@ \else
   \def\choose:begin{\global\let\choose:begin\@firstoftwo
                     \@secondoftwo}%
   \fi
  }
\NewConfigure{equations}[2]{\def\pic:equa{#1}\def\pic:equb{#2}}
\def\str:pic{\ifx \EndPicture\:UnDef
      \expandafter\Picture\pic:equa{ \pic:equb}%
   \else \let\EndPicture\empty  \fi
   \let\halign\TeXhalign}
\def\make@df@tag@@#1{%
  \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}%
               \let\cnt:currentlabel\@currentlabel
\def\:@currentlabel{\ifx \cnt:currentlabel\@currentlabel
   \expandafter\the\csname c@equation\endcsname\else \@currentlabel\fi}%
%
               \anc:lbl r{}%
}}
\def\make@df@tag@@@#1{\gdef\df@tag{\tagform@{#1}%
  \toks@\@xp{\p@equation{#1}}\edef\@currentlabel{\the\toks@}%
  \let\cnt:currentlabel\@currentlabel
\def\:@currentlabel{\ifx \cnt:currentlabel\@currentlabel
   \expandafter\the\csname c@equation\endcsname\else \@currentlabel\fi}%
%
  \anc:lbl r{}%
  }}

\:CheckOption{new-accents}     \if:Option \else
   \HLet\Hat\hat
\HLet\Check\check
\HLet\Tilde\tilde
\HLet\Acute\acute
\HLet\Grave\grave
\HLet\Dot\dot
\HLet\Ddot\ddot
\HLet\Breve\breve
\HLet\Bar\bar
\HLet\Vec\vec

\fi
\expandafter\def\csname [ \endcsname{\st:Math}
\expandafter\def\csname ] \endcsname{\ed:Math}
\let\:tempc\measure@
\pend:defI\:tempc{\bgroup
   \RecallTeXcr \HRestore\noalign \let\EndPicture\empty
   \let\halign\TeXhalign \let\span\:span  \HRestore\begin
   \HRestore\end   \a:measure@ }
\append:defI\:tempc{\egroup}
\HLet\measure@\:tempc
\NewConfigure{measure@}{1}
\HLet\savealignstate@\empty
\renewcommand{\n:smash:}[2][tb]{%
  \def\smash@{#1}%
  \ifmmode\@xp\o:mathpalette:\@xp\mathsm@sh\else
        \@xp\makesm@sh\fi{#2}}
\let\:tempc\maketag@@@
\pend:defI\:tempc{\a:maketag}
\append:defI\:tempc{\b:maketag}
\NewConfigure{maketag}{2}
\HLet\maketag@@@\:tempc
\MathSymbol\mathrel{@cdots}
\MathSymbol\mathop{doteq}
   \def\n:doteq:{\expandafter\:same \math:sym\mathop{doteq}\nolimits}
\HLet\dotsb@=\@cdots
\HLet\intdots@=\@cdots
\HRestore\cdots
\MathSymbol\mathop{iint}
   \def\n:iint:{\expandafter\:same \math:sym\mathop{iint}\nolimits}
\MathSymbol\mathop{iiint}
   \def\n:iiint:{\expandafter\:same \math:sym\mathop{iiint}\nolimits}
\MathSymbol\mathop{iiiint}
   \def\n:iiiint:{\expandafter\:same \math:sym\mathop{iiiint}\nolimits}
\MathSymbol\mathop{idotsint}
   \def\n:idotsint:{\expandafter\:same \math:sym\mathop{idotsint}\nolimits}
\def\:tempc#1{\a:underrightarrow
   \o:underrightarrow:{#1}\b:underrightarrow}
\HLet\underrightarrow\:tempc
\NewConfigure{underrightarrow}{2}
\def\:tempc#1{\a:underleftarrow
   \o:underleftarrow:{#1}\b:underleftarrow}
\HLet\underleftarrow\:tempc
\NewConfigure{underleftarrow}{2}
\def\:tempc#1{\a:overleftrightarrow
   \o:overleftrightarrow:{#1}\b:overleftrightarrow}
\HLet\overleftrightarrow\:tempc
\NewConfigure{overleftrightarrow}{2}
\def\:tempc#1{\a:underleftrightarrow
   \o:underleftrightarrow:{#1}\b:underleftrightarrow}
\HLet\underleftrightarrow\:tempc
\NewConfigure{underleftrightarrow}{2}

\def\:tempc#1#2#3{\a:underarrow@
   \hbox{$\m@th#2#3$}\b:underarrow@
   \hbox{#1#2}\c:underarrow@
}
\HLet\underarrow@\:tempc
\def\:tempc#1#2#3{\a:overarrow@
   \hbox{#1#2}\b:overarrow@
   \hbox{$\m@th#2#3$}\c:overarrow@
}
\HLet\overarrow@\:tempc
\NewConfigure{underarrow@}{3}
\NewConfigure{overarrow@}{3}
\def\:temp#1#2{\a:overset\binrel@{#2}%
  \binrel@@{\mathop{\kern\z@#2}\limits^{#1}}\b:overset}
\HLet\overset\:temp
\NewConfigure{overset}{2}
\def\:temp#1#2{\a:underset\binrel@{#2}%
  \binrel@@{\mathop{\kern\z@#2}\limits_{#1}}\b:underset}
\HLet\underset\:temp
\NewConfigure{underset}{2}

\MathSymbol\mathop{dotsc}
\MathSymbol\mathop{dotso}
\MathSymbol\mathrel{longleftarrow}
\MathSymbol\mathrel{longrightarrow}

\ifx \ifinany@\:Undef
   \let\:tempc\gather@split
\append:defIII\:tempc{%
   \def\endmathdisplay@a{%
     \math@cr \EndMkHalign
     \RecallMkHalignConfig \csname b:gather\ifst@rred *\fi\endcsname
     \egroup 
   }%
}
\HLet\gather@split\:tempc

\else
   \:warning{ams files too old for TeX4ht}
\fi
\Hinput{amsmath}
\endinput
  • It seems to me that this version doesn't work for something like x\xrightarrow1\mathbb S? (pdflatex succeeds to compile this) – Yai0Phah Jan 24 at 18:19
  • @FrankScience ah, it seems that the fix was wrong as well, I've updated the answer with hopefully correct solution. – michal.h21 Jan 24 at 19:57
  • I compared amsmath.4ht and amsmath.sty. I found many commands defined by \newcommand in .sty is defined by \def in .4ht. So far, I see \overset, \underset, \boxed, \eqref, \underrightarrow, \underleftarrow, \overleftrightarrow, \underleftrightarrow. – Yai0Phah Jan 24 at 21:06
  • By the way, there are duplicate definitions of \underarrow, \overarrow, \underset, \overset, etc. You see that, lines 614-638 are identical to line 123-147. I suggest to delete the duplicate from line 614 to line 638. – Yai0Phah Jan 24 at 21:13
  • And several definitions about binom like \dbinom are also defined by \def in .4ht but \newcommand in .sty. – Yai0Phah Jan 24 at 21:18

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.