[Tex/LaTex] Convert LaTeX to HTML with MathJax

circuitikzmake4htmathjaxpandoc

I'm student for Computer science. I prefer to write my home work assignments in LaTeX. I'm utilizing tikZ pretty heavily in my specialized science courses. My goal now is to convert my TeX files to HTML+CSS+MathJax. I want everything that is supported by MathJax to be converted to MathJax and everything else (complex diagrams and drawings) to be simple converted to images (SVG/PGF).
I have tried to use Pandoc and Make4ht to achieve this goal with no success.
Pandoc makes a pretty good job of converting my common LaTeX to HTML+MathJax, but fell short when it comes to TikZ diagrams.
With Make4ht I have a great success with TikZ diagrams but I have several problems with the TeX itself.
Currently I have 2 problems:

  1. make4ht doesn't convert my \newcommand macros.
  2. make4ht can't use HTML color codes for cell filling in tables.
  3. make4ht gnerates SVG images of TikZ diagrams but without text.

Here I'm providing a sample code and its result as it appears on my computer after invoking: make4ht -ux file.tex "mathjax"

\documentclass [11pt, a4paper]{article}
\usepackage[margin=2 cm]{geometry} %
\usepackage{polyglossia}
\usepackage{listings}
\usepackage{fontspec}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{parskip} 
\usepackage{graphicx} 
\usepackage[table,xcdraw]{xcolor}
\usepackage[american]{circuitikz}

\newcommand{\n}[1]{\overline{#1}}

\begin{document}

\begin{table}[h!]

                \begin{tabular}{|c|c|c|c|c|}
                    \hline 
                    \rowcolor[HTML]{C0C0C0} 
                    \( \mathbf{x} \) & \( \mathbf{y} \) & \( \mathbf{(\n{x + y})} \) & \( \mathbf{\left( \n{\n{x} + \n{y}}\right)} \) & \( \mathbf{F} \)\\ \hline
                    0 & 0 & 1 & 0 & \cellcolor[HTML]{67FD9A}0 \\ \hline
                    0 & 1 & 0 & 0 & \cellcolor[HTML]{67FD9A}0 \\ \hline
                    1 & 0 & 0 & 0 & \cellcolor[HTML]{67FD9A}0 \\ \hline
                    1 & 1 & 0 & 1 & \cellcolor[HTML]{67FD9A}0 \\ \hline
                \end{tabular}%

            \end{table}


\( (\n{A} + B) \cdot \n{B} + \n{A}\n{C} + A \)


                \begin{circuitikz} \draw
(0,0) node[] (A) {A}
(0,-0.5) node[] (B) {B}
(0,-1.5) node[] (C) {C}
(4,-0.5) node[or port] (myor) {}
(2,-1) node[nand port] (mynand) {}

(A) -| (myor.in 1)
(B) -| (mynand.in 1)
(C) -| (mynand.in 2)
(mynand.out) -| (myor.in 2)
(myor.out) node[anchor=west] {F}
;\end{circuitikz} 

\end{document}

Result from PDF
enter image description here

Result of HTML file:
enter image description here
enter image description here

As you can see make4ht did'nt interpreted \n macro. Also while running the command I did get this warning message:

    Argument of \c:HColor: has an extra }.
<inserted text> 
                \par 
l.27 ...                   \rowcolor[HTML]{C0C0C0}

?

Best Answer

Update:

It is possible to use the direct colors now. Try this version of colortbl.4ht:

% colortbl.4ht (2019-11-21-17:51), 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-11-21-17:51}


   \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}%
  %\pic:gobbleII\a:rowcolor{#1 #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}
\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//{%
  \typeout{*******************}
  \typeout{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

Original answer:

I can compile your file with tex4ht with small changes.

There are three issues that need to be fixed: missing definition of the \n command in MathJax, color issues and issues with the TikZ graphics.

For TikZ, I would use the alternative driver. It uses Dvisvgm for the conversion and produces much better result than the default driver. Especially for the text nodes.

The issue with \n command is caused by the fact that tex4ht cannot process the math content in the MathJax mode. It can be fixed with a simple configuration for MathJax.

The color issues can be fixed using named colours instead of use of the direct values. It is also necessary to provide an alternative definition for the \cellcolor command, because it is not supported by tex4ht by default.

Here is the modified TeX file:

\documentclass [11pt, a4paper]{article}
\usepackage[margin=2 cm]{geometry} %
\usepackage{polyglossia}
\usepackage{listings}
\usepackage{fontspec}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{parskip} 
\usepackage{graphicx} 
\ifdefined\HCode
  \def\pgfsysdriver{pgfsys-dvisvgm4ht.def}
\fi 
\usepackage[table,xcdraw]{xcolor}
\usepackage[american]{circuitikz}

\newcommand{\n}[1]{\overline{#1}}
% \definecolor[HTML]{lightgreen}{rgb}{67FD9A}


\begin{document}

\begin{table}[h!]

                \begin{tabular}{|c|c|c|c|c|}
                    \hline 
                    \rowcolor{lightgray} 
                    \( \mathbf{x} \) & \( \mathbf{y} \) & \( \mathbf{(\n{x + y})} \) & \( \mathbf{\left( \n{\n{x} + \n{y}}\right)} \) & \( \mathbf{F} \)\\ \hline
                    0 & 0 & 1 & 0 & \cellcolor{lightgreen}0 \\ \hline
                    0 & 1 & 0 & 0 & \cellcolor{lightgreen}0 \\ \hline
                    1 & 0 & 0 & 0 & \cellcolor{lightgreen}0 \\ \hline
                    1 & 1 & 0 & 1 & \cellcolor{lightgreen}0 \\ \hline
                \end{tabular}%

            \end{table}


\( (\n{A} + B) \cdot \n{B} + \n{A}\n{C} + A \)


                \begin{circuitikz} \draw
(0,0) node[] (A) {A}
(0,-0.5) node[] (B) {B}
(0,-1.5) node[] (C) {C}
(4,-0.5) node[or port] (myor) {}
(2,-1) node[nand port] (mynand) {}

(A) -| (myor.in 1)
(B) -| (mynand.in 1)
(C) -| (mynand.in 2)
(mynand.out) -| (myor.in 2)
(myor.out) node[anchor=west] {F}
;\end{circuitikz} 

\end{document}

The main changes are the use of the alternative driver:

\ifdefined\HCode
  \def\pgfsysdriver{pgfsys-dvisvgm4ht.def}
\fi 

and use of the named colours:

\rowcolor{lightgray} 
\( \mathbf{x} \) & \( \mathbf{y} \) & \( \mathbf{(\n{x + y})} \) & \( \mathbf{\left( \n{\n{x} + \n{y}}\right)} \) & \( \mathbf{F} \)\\ \hline
0 & 0 & 1 & 0 & \cellcolor{lightgreen}0 \\ \hline

Here is the configuration file:

\Preamble{xhtml}
\Configure{HColor}{lightgreen}{\#67FD9A;} 
\makeatletter
\def\CT@cellc#1[#2]#3{{\def\current@color{#3}%
                    \csname a:cell-colortbl\endcsname}}
\makeatother

\Configure{@HEAD}{\HCode{\detokenize{%
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    TeX: {
      Macros: {
        n : "\\overline",
      }
    },
    }
  );
</script>
}}}
\begin{document}
\EndPreamble

It defines the lightgreen color, because all colors must be configured for tex4ht. lightgray is defined by default:

\Configure{HColor}{lightgreen}{\#67FD9A;} 

the next lines redefine a macro used by \cellcolor internally to use the tex4ht configurations for cell colors:

\def\CT@cellc#1[#2]#3{{\def\current@color{#3}%
                    \csname a:cell-colortbl\endcsname}}
\makeatother

And finally, using the following configuration we define the \n macro for MathJax:

\Configure{@HEAD}{\HCode{\detokenize{%
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    TeX: {
      Macros: {
        n : "\\overline",
      }
    },
    }
  );
</script>
}}}

Compile your file using

 make4ht -ul -c config.cfg filename.tex "mathjax,svg"

This is the result:

enter image description here

Related Question