This seems like a bug in TeX4ht support for the Colortbl package. It assumes that the \arrayrulecolor
command is used inside tabular
or other similar environment. When you use it outside, like in your case, it will break.
The fixed redefinition of the command may look like this:
\newcommand\tmp:arrayrulecolor[2][named]{%
\ifvoid\@arstrutbox% test if we are inside a tabular environment
\convertcolorspec{#1}{#2}{HTML}\:tmp\global\let\hline:color\:tmp% we are not
\else%
\noalign{\convertcolorspec{#1}{#2}{HTML}\:tmp\global\let\hline:color\:tmp}% we are
\fi
}
\HLet\arrayrulecolor\tmp:arrayrulecolor
This version of \arrayrulecolor
saves the declared color in the form that is usable in CSS styling for array lines.
The \ifvoid\@arstrutbox
is used to detect if we are inside tabular, when we need to wrap the color extraction in \noalign
command to prevent compilation errors.
Here is a full version of colortbl.4ht
:
% colortbl.4ht (2021-05-06-14:12), generated from tex4ht-4ht.tex
% Copyright 1997-2009 Eitan M. Gurari
% Copyright 2009-2021 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 2021-05-06-14:12}
\RequirePackage{xcolor}
\CT@everycr{\o:noalign:{\global\let\CT@row@color\relax}\the\everycr}
\def\columncolor#1{{\def\current@color{#1}%
\csname a:cell-colortbl\endcsname}}
\Odef\columncolor[#1]#2{{\if :#1:\def\current@color{#2}%
\else
\gHAdvance\tblcol:N by 1
\convertcolorspec{#1}{#2}{HTML}\tmp:tblcolor
\Configure{HColor}{tblcol-\tblcol:N}{\#\tmp:tblcolor}%
\def\current@color{tblcol-\tblcol:N}%
\fi
\csname a:cell-colortbl\endcsname}%
\futurelet\:temp\left:colcol}
\def\left:colcol{%
\ifx [\:temp \expandafter\left::colcol \fi
}
\def\left::colcol[#1]{
\futurelet\:temp\right:colcol
}
\def\right:colcol{%
\ifx [\:temp \expandafter\right::colcol \fi
}
\def\right::colcol[#1]{}
\HAssign\tblcol:N = 0
\def\CT@cellc#1[#2]#3{{\if :#2:\def\current@color{#3}%
\else
\gHAdvance\tblcol:N by 1
\convertcolorspec{#2}{#3}{HTML}\tmp:tblcolor
\Configure{HColor}{tblcol-\tblcol:N}{\#\tmp:tblcolor}%
\def\current@color{tblcol-\tblcol:N}%
\fi
\csname a:cell-colortbl\endcsname}%
\futurelet\:temp\left:colcol}
\NewConfigure{@classz}{4}
\pend:def\@classz{\pic:gobble\a:@classz}
\append:def\@classz{\pic:gobble\b:@classz}
\pend:def\insert@column{\pic:gobble\c:@classz}
\append:def\insert@column{\pic:gobble\d:@classz}
\def\:temp{\global\let\CT@do@color\relax}
\HLet\CT@@do@color\:temp
\let\::maketitle\o:maketitle:
\def\o:maketitle:{%
\ifx \EndPicture\:UnDef
\NewConfigure{@classz}{4}%
\Configure{@classz}{}{}{}{}%
\fi
\::maketitle }
\def\rowcolor{%
\o:noalign:{\ifnum0=`}\fi
\global\let\CT@do@color\CT@@do@color
\relax
\ifx\LT@head\Un:Def\else
\ifnum \HRow=0\relax
\expandafter\ifx\csname lt:sv\endcsname\relax
\HAssign\HRow = 1\relax
\ifvoid\LT@head
\ifvoid\LT@firsthead \else \HAdvance\HRow by 1\relax\fi
\else \HAdvance\HRow by 1\relax\fi
\else
\HAssign\HRow = \lt:sv \relax
\HAdvance\HRow by 1\relax
\fi
\fi\fi
%
\@ifnextchar[\CT@rowa\CT@rowb}
\def\CT@rowa[#1]#2{%
\save:color#1 #2//%
\pic:gobbleII\a:rowcolor{#2}%
\gdef\CT@row@color{\CT@color{#2}}%
\CT@rowc}
\def\CT@rowb#1{%
\pic:gobbleII\a:rowcolor{#1}%
\gdef\CT@row@color{\CT@color{#1}}%
\CT@rowc}
\NewConfigure{rowcolor}{1}
% default hline color is black
\def\hline:color{000}
% save rule color in format usable in CSS
\newcommand\tmp:arrayrulecolor[2][named]{%
\ifvoid\@arstrutbox% test if we are inside a tabular environment
\convertcolorspec{#1}{#2}{HTML}\:tmp\global\let\hline:color\:tmp% we are not
\else%
\noalign{\convertcolorspec{#1}{#2}{HTML}\:tmp\global\let\hline:color\:tmp}% we are
\fi
}
\HLet\arrayrulecolor\tmp:arrayrulecolor
\def\convert:colorspec#1 #2 #3 #4{%
\edef\current:color{%
\ifx\relax#1\relax\else%
#1\ifx\relax#2\relax\else%
, #2\ifx\relax#3\relax\else%
, #3\ifx\relax#4\relax\else%
, #4%
\fi%
\fi%
\fi%
\fi%
}%
}
\def\save:color#1 #2//{%
\convert:colorspec#2 {} {} {} {}
\convertcolorspec{#1}{\current:color}{HTML}\tmp:col
\def\current@color{#2}
\Configure{HColor}{\current@color}{\#\tmp:col}
}
\def\begin:current@color{\let\sv:curcolor\current@color}
\def\end:current@color{%
\ifx \current@color\sv:curcolor
\else%
\expandafter\save:color\current@color//%
\csname a:text-colortbl\endcsname
\fi
}
\NewConfigure{text-colortbl}{1}
\def\GET@column@color{}
\def\color:ii[#1]#2#3!*?: {\def\:temp{#1 #2}}
\def\color:i#1#2!*?: {\def\:temp{#1}}
\let\ctbl:mcol\multicolumn
\def\multicolumn#1#2#3{%
\ctbl:mcol{#1}{#2}{#3}%
\expand:after{\expandafter\MUL:LMN\meaning\@preamble}\MUL:PA//%
\ignorespaces}
{
\def\MUL:PA{\gdef\MUL:PA}
\def\MUL:LMN{%
\catcode`\C=12
\catcode`\T=12
\catcode`\@=12
\catcode`\c=12
\catcode`\o=12
\catcode`\l=12
\catcode`\r=12
\catcode`\t=12
\catcode`\e=12
\catcode`\m=12
\catcode`\p=12
\catcode`\d=12
\catcode`\i=12
\catcode`\b=12
\gdef\MUL:LMN}
\MUL:LMN#1CT@color #2@tempdimb#3//{\::KOLOR{#2}}
\MUL:PA{CT@color @tempdimb}
}
\def\::KOLOR#1{\if :#1:\else \:KOLOR#1//%
\fi}
\def\:KOLOR{\@ifnextchar[\mc:clr{\mc:clr[]}}
{
\catcode`\{=12
\catcode`\}=12
\catcode`\(=1
\catcode`\)=2
\gdef\mc:clr[#1]{#2}((%
\def\current@color(\if :#1:\else #1 \fi #2)%
\csname a:cell-colortbl\endcsname
)\def\:temp##1//()\:temp)
)
\NewConfigure{cell-colortbl}{1}
\Hinput{colortbl}
\endinput
There is also an issue caused by use of \textbf
inside \caption
. Try this version of nameref.4ht
:
% nameref.4ht (2022-06-27-13:57), generated from tex4ht-4ht.tex
% Copyright 2005-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-06-27-13:57}
\let\NR:Type\relax
\let\ltx@label\label
\def\prf:label{{\ifx \NR:Title\:UnDef \else \NR:Title\fi}%
{\ifx \NR:Type\relax \else \NR:Type .1\fi}{}}%
\let\NR:StartSec\:StartSec
\let\NR:no@sect\no@sect
\def\no@sect#1#2#3#4#5#6[#7]#8{\gdef\NR:Title{\a:newlabel{#7}}%
\gdef\NR:Type{#1}%
\NR:no@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}}
\def\:StartSec#1#2#3{%
\gdef\NR:Title{\a:newlabel{#3}}%
\gdef\NR:Type{#1}%
\NR:StartSec{#1}{#2}{#3}%
}
\def\:tempc#1#2#3#4#5#6[#7]#8{%
\gdef\NR:Title{\a:newlabel{#7}}%
\gdef\NR:Type{#1}%
\o:NR@sect:{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}}
\HLet\NR@sect\:tempc
\def\:tempc#1#2#3#4#5{%
\gdef\NR:Title{\a:newlabel\ssect:ttl}%
\gdef\NR:Type{#1}%
\o:NR@ssect:{#1}{#2}{#3}{#4}{#5}%
}
\HLet\NR@ssect\:tempc
\def\:tempc[#1]#2{%
\gdef\NR:Title{\a:newlabel{#1}}%
\gdef\NR:Type{part}%
\o:no@part:[{#1}]{#2}}
% this definition clashes with asmart and amsproc classes, so we
% need to skip if these are active
\@ifundefined{opt@amsart.cls}{%
\@ifundefined{opt@amsproc.cls}{%
\HLet\no@part\:tempc
}{}}{}
\def\:tempc#1{%
\gdef\NR:Title{\a:newlabel{#1}}%
\gdef\NR:Type{part}%
\o:no@spart:{#1}}
\HLet\no@spart\:tempc
\def\:tempc[#1]#2{%
\gdef\NR:Title{\a:newlabel{#1}}%
\gdef\NR:Type{chapter}%
\o:NR@chapter:[{#1}]{#2}}
\HLet\NR@chapter\:tempc
\def\:tempc#1{%
\gdef\NR:Title{\a:newlabel\sch:ttl}%
\o:NR@schapter:{#1}%
\gdef\NR:Type{chapter}%
}
\HLet\NR@schapter\:tempc
\let\o:NR@@caption\@caption
%
%
% Keith Andrews <kandrews@iicm.edu> reported that \@captype as
% \NR:Type threw an undefined control sequence error. I think
% \@currenvir is safe, there is nothing special about \@captype.
%
% use of \index and \label inside caption results in a fatal error
% we need to disable them in \NR:Title
\long\def\@caption#1[#2]{%
\gdef\NR:Type{\@currenvir}%
\begingroup%
\let\index\:gobble%
\let\label\:gobble%
\protected@xdef\NR:Title{\a:newlabel{#2}}%
\endgroup%
\o:NR@@caption{#1}[{#2}]%
}
\let\o:NRorg@opargbegintheorem\@opargbegintheorem
\def\@opargbegintheorem#1#2#3{%
\gdef\NR:Title{\a:newlabel{#3}}%
\gdef\NR:Type{\@currenvir}%
\NR@gettitle{#3}%
\defineautorefname{\@currenvir}{#1}%
\o:NRorg@opargbegintheorem{#1}{#2}{#3}%
}%
\let\o:NRorg@begintheorem\@begintheorem
\def\@begintheorem#1#2{%
\gdef\NR:Title{\a:newlabel{#1 #2}}%
\gdef\NR:Type{\@currenvir}%
\defineautorefname{\@currenvir}{#1}%
\NR@gettitle{}%
\o:NRorg@begintheorem{#1}{#2}%
}%
% I don't know if this was useful for anything
% but we cannot use it anymore
% \AtBeginDocument{%
\@ifpackageloaded{listings}{%
\def\:tempc#1{%
\gdef\NR:Title{\a:newlabel{listing}}%
\gdef\NR:Type{lstlisting}%
\o:NROrg@lst@MakeCaption:{#1}%
\gdef\@currentlabelname{listing}}
\HLet\NROrg@lst@MakeCaption\:tempc
}{}%
% bug [348]
\def\:tempams{%
\gdef\NR:Title{\a:newlabel{equation}}%
\gdef\NR:Type{equation}%
\gdef\@currentlabelname{equation}%
}
% https://tex.stackexchange.com/a/581856/2891
\@ifpackageloaded{caption}{
\pend:defIII\caption@beginex{%
\gdef\NR:Type{\@currenvir}%
\gdef\NR:Title{\a:newlabel{##2}}%
}
}{}
\@ifpackageloaded{amsmath}{%
\Configure{@begin}{align}{\:tempams}
\Configure{@begin}{multline}{\:tempams}
\Configure{@begin}{equation}{\:tempams}
\Configure{@begin}{boxed}{\:tempams}
\Configure{@begin}{equations}{\:tempams}
\Configure{@begin}{equation}{\:tempams}
\Configure{@begin}{gather*}{\:tempams}
\Configure{@begin}{gather}{\:tempams}
\Configure{@begin}{genfrac}{\:tempams}
\Configure{@begin}{measure@}{\:tempams}
\Configure{@begin}{multline*}{\:tempams}
\Configure{@begin}{multline}{\:tempams}
\Configure{@begin}{overset}{\:tempams}
\Configure{@begin}{smallmatrix}{\:tempams}
\Configure{@begin}{split}{\:tempams}
\Configure{@begin}{subarray}{\:tempams}
\Configure{@begin}{substack}{\:tempams}
\Configure{@begin}{underset}{\:tempams}
\Configure{@begin}{xleftarrow}{\:tempams}
\Configure{@begin}{xrightarrow}{\:tempams}
}{
\Configure{@begin}{equation}{\:tempams}
}
\let\T:ref=\::ref
\def\::ref{\@ifstar{\protect\T@ref}{\protect\T@ref}}
\def\T@ref#1{%
\@safe@activestrue
\let\::ref \T:ref
\expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}%
\def\::ref{\@ifstar{\protect\T@ref}{\protect\T@ref}}
\@safe@activesfalse
}
\gdef\defineautorefname#1#2{%
\expandafter\gdef\csname #1autorefname\endcsname{#2}}
\defineautorefname{theorem}{Theorem}
\Configure{newlabel}
{\csname cur:th\endcsname \csname :currentlabel\endcsname}
{\string\csname\space :autoref\string\endcsname
{\NR:Type}#1}
\ifx \@currentlabelname\:UnDef
\let\@currentlabelname\empty
\fi
\pend:defIII\@setref{\edef\RefArg{##3}}
\append:defIII\@setref{\let\:autoref\:gobble}
\let\:autoref\:gobble
\Hinput{nameref}
\endinput
And your document then looks like this:

book
class (I don't haveacm-book
) 2)\caption{MIPS machine code instruction types} \label{tab:4.1}
instead of your\caption
line, and 3)\arrayrulecolor{black}
commented out (don't ask me why!). The UTF-8 curly quotes look fine in Firefox.