texlive[60345] trunk: lwarp (28aug21)

commits+karl at tug.org commits+karl at tug.org
Sat Aug 28 22:38:00 CEST 2021


Revision: 60345
          http://tug.org/svn/texlive?view=revision&revision=60345
Author:   karl
Date:     2021-08-28 22:38:00 +0200 (Sat, 28 Aug 2021)
Log Message:
-----------
lwarp (28aug21)

Modified Paths:
--------------
    trunk/Build/source/texk/texlive/linked_scripts/lwarp/lwarpmk.lua
    trunk/Master/texmf-dist/doc/latex/lwarp/README.txt
    trunk/Master/texmf-dist/doc/latex/lwarp/lwarp.pdf
    trunk/Master/texmf-dist/scripts/lwarp/lwarpmk.lua
    trunk/Master/texmf-dist/source/latex/lwarp/lwarp.dtx
    trunk/Master/texmf-dist/source/latex/lwarp/lwarp.ins
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-array.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-centernot.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-colortbl.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-dcolumn.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-gensymb.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-graphics.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-keyfloat.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-longtable.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mathtools.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-nicematrix.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-siunitx-v2.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-statex2.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabularx.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabulary.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-textcomp.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-upgreek.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-xcolor.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-lltjp-tascmac.sty
    trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mwe.sty

Modified: trunk/Build/source/texk/texlive/linked_scripts/lwarp/lwarpmk.lua
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/lwarp/lwarpmk.lua	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Build/source/texk/texlive/linked_scripts/lwarp/lwarpmk.lua	2021-08-28 20:38:00 UTC (rev 60345)
@@ -2,7 +2,7 @@
 
 -- Copyright 2016-2021 Brian Dunn
 
-printversion = "v0.900"
+printversion = "v0.901"
 requiredconfversion = "2" -- also at *lwarpmk.conf
 
 function printhelp ()

Modified: trunk/Master/texmf-dist/doc/latex/lwarp/README.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/lwarp/README.txt	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/doc/latex/lwarp/README.txt	2021-08-28 20:38:00 UTC (rev 60345)
@@ -1,5 +1,5 @@
 
-LaTeX lwarp package v0.900   README.txt
+LaTeX lwarp package v0.901   README.txt
 
 Files included are:
 

Modified: trunk/Master/texmf-dist/doc/latex/lwarp/lwarp.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/scripts/lwarp/lwarpmk.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/lwarp/lwarpmk.lua	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/scripts/lwarp/lwarpmk.lua	2021-08-28 20:38:00 UTC (rev 60345)
@@ -2,7 +2,7 @@
 
 -- Copyright 2016-2021 Brian Dunn
 
-printversion = "v0.900"
+printversion = "v0.901"
 requiredconfversion = "2" -- also at *lwarpmk.conf
 
 function printhelp ()

Modified: trunk/Master/texmf-dist/source/latex/lwarp/lwarp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/lwarp/lwarp.dtx	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/source/latex/lwarp/lwarp.dtx	2021-08-28 20:38:00 UTC (rev 60345)
@@ -16,7 +16,7 @@
 % \iffalse
 %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
 %<package>\ProvidesPackage{lwarp}
-%<package>    [2021/07/17 v0.900  Allows LaTeX to directly produce HTML5 output.]
+%<package>    [2021/08/27 v0.901  Allows LaTeX to directly produce HTML5 output.]
 %
 %<*driver>
 \documentclass{ltxdoc}
@@ -1602,11 +1602,6 @@
         \end{sourcedisplay}
     \item \optn{showonlyrefs} does not work in \brand{MathJax}, and will result
         in a difference in equation numbering compared to the print version.
-    \item Due to \brand{MathJax} limitations, the following do not render well:
-        \cs{overbracket}, \cs{underbracket}, \cs{overbrace}, \cs{underbrace},
-        \env{rcases}, \env{drcases}, \cs{Aboxed}, and \linebreak \cs{ArrowBetweenLines}.
-    \item For the new \env{cases}-like environments,
-        \cs{text} must be used to set the normal roman font if desired.
     \item \env{alignat} in \brand{MathJax} requires math mode, but
         in \LaTeX\ it doesn't.  It may be required to use \env{warpHTML} and
         \env{warpprint} to isolate a version for each mode.
@@ -1698,9 +1693,11 @@
 \newcommand{\limitsgraphics}{%
 Per \cref{tab:includegraphicsfilenames},
 image filenames may be specified either with or without an extension.
-\trouble[case sensitive]{image>not displayed}
-\trouble{image>extension case}
+\trouble{image>not displayed>extension}
+\trouble{image>filename extension}
 \trouble{filename>image extension}
+\trouble{graphics>image not displayed>extension}
+\trouble{graphics>\cs{graphicspath}}
 \gindex{image>file names}
 \gindex{graphics>file names}
 \gindex{includegraphics=\cs{includegraphics}>file names}
@@ -1708,9 +1705,11 @@
 \gindex{filename>images}
 If an extension is given it will be used as-is, for either print or \HTML\ output.
 If no extension is given, a list of possible extensions is tried, which depends
+\margintag{file extensions}
 on whether print or \HTML\ is being generated.  This allows a \PDF\ file for
 print and a \SVG\ file for \HTML, for example.
 If no extension is given, the automatic search will only return lowercase extensions,
+\watchout[case sensitive]
 even if the filename actually has an uppercase extension, and \pkg{lwarp} cannot
 get around this problem, so image file extensions must be lowercase
 to be seen by the \HTML\ browser with \pkg{lwarp}.
@@ -1789,6 +1788,18 @@
 for \HTML\ the file extension priorities
 are: \SVG, \GIF, \PNG, then \JPG.
 
+A complication occurs if a file of the same name exists elsewhere in the \TeX\ tree,
+\margintag{duplicate files}
+\trouble[image not displayed]{graphics>image not displayed>duplicate file}
+\trouble{image>not displayed>duplicate file}
+\trouble{graphicspath=\cs{graphicspath}}
+such as a test image from some \LaTeX\ package.
+\TeX\ looks in the local document directory before considering the directories
+specified by \cs{graphicspath}, but the \TeX\ tree is found as ``local'', so any
+file in the tree is found before the directories in \cs{graphicspath}.
+To use such an image, it must be copied to the document's directory to be used for \HTML,
+and furthermore must be in the document's base directory instead of an images subdirectory.
+
 If using the older \pkg{graphics} syntax, use both optional arguments
 \trouble[\pkg{graphics} vs. \pkg{graphicx}]{graphics>optional arguments}
 \trouble{includegraphics=\cs{includegraphics}>optional arguments}
@@ -1796,7 +1807,7 @@
 A single optional parameter is interpreted as the newer \pkg{graphicx} syntax.
 Note that viewports are not supported by \pkg{lwarp} \Dash
 \trouble[viewport]{graphics>viewport}
-\trouble[viewport]{image>viewport}
+\trouble{image>viewport}
 \trouble{viewport}
 the entire image will be shown.
 
@@ -1857,7 +1868,9 @@
 \newcommand{\limitssvgimages}{%
 When a math expression, \env{picture}, or \tikz\ environment is added or
 \trouble[adding/removing]{SVG image>out of order}
-\trouble{graphics>images out of order}
+\trouble{graphics>incorrect>added or removed}
+\trouble{image>incorrect>added or removed}
+\trouble{math>incorrect>added or removed}
 removed, the \SVG\ images must be re-created by entering \cmds{lwarpmk limages}
 to maintain the proper image-file associations.
 Inline \SVG\ math may be hashed and thus not need to be recreated, but
@@ -1886,9 +1899,9 @@
 Incorrect \SVG\ images will also occur if the document
 changes the \progcode{page} counter:
 \trouble[page counter]{page counter>SVG images}
-\trouble{SVG image>incorrect}
-\trouble{math>incorrect}
-\trouble{image>incorrect}
+\trouble{SVG image>incorrect>page counter}
+\trouble{image>incorrect>page counter}
+\trouble{graphics>incorrect>page counter}
 \begin{sourcedisplay}
 \cs{setcounter}\{page\}\{<value>\}
 \end{sourcedisplay}
@@ -2102,7 +2115,7 @@
     \item When defining environments or macros which include \env{tabular} and
         \trouble[Misplaced alignment tab character \&]%
             {Misplaced alignment tab character \&>tabular>macros}
-        \trouble{tabular>Misplaced alignment tab character \&>macros}
+        \trouble{tabular=\env{tabular}>Misplaced alignment tab character \&>macros}
         instances of the \texttt{\&} character, it may be
         necessary to make \texttt{\&} active before the environment or macro is defined,
         then restore \texttt{\&} to its default catcode after, using the following commands.
@@ -2118,8 +2131,8 @@
     \item \limitsresumetabular
     \item To automate the use of \cs{StartDefiningTabulars}
         \gindex{StartDefiningTabulars=\cs{StartDefiningTabulars}}
-        \gindex{tabular>StartDefiningTabulars=\cs{StartDefiningTabulars}}
-        \gindex{tabular>in environments, catcode of \&}
+        \gindex{tabular=\env{tabular}>StartDefiningTabulars=\cs{StartDefiningTabulars}}
+        \gindex{tabular=\env{tabular}>in environments, catcode of \&}
         \margintag{For developers:}
         and \cs{EndDefiningTabulars},
         these macros may be embedded inside an \HTML\ environment definition
@@ -2151,9 +2164,9 @@
 \item [Cell contents:] \
     \begin{itemize}
     \item Using a custom macro inside a tabular data cell
-        \trouble[macro in a table]{tabular>macro inside}
-        \trouble{tabular>row corruption}
-        \gindex{tabular>macros inside}
+        \trouble[macro in a table]{tabular=\env{tabular}>macro inside}
+        \trouble{tabular=\env{tabular}>row corruption}
+        \gindex{tabular=\env{tabular}>macros inside}
         may result in an extra \HTML\ data cell tag, corrupting the \HTML\ table.
         To avoid this, use \cs{TabularMacro} just before the macro.
         This is ignored in print mode.
@@ -2164,7 +2177,14 @@
     \end {itemize}
 
 \item [Column specifiers:] \
+    \gindex{tabular=\env{tabular}>column specifier}
+    \trouble{tabular=\env{tabular}>column specifier}
     \begin{itemize}
+    \item Due to the way math is gathered for processing,
+        \watchout[math]
+        column specifiers such as \progcode{>\{\$\}c<\{\$\}} do not work with \pkg{lwarp}.
+        Instead, each cell must specify math mode individually.
+
     \item Only one each of \texttt{@} and \texttt{!}
         \margintag{\texttt{@} and \texttt{!}}
         is used at each column, and they are used in that order.
@@ -2175,8 +2195,30 @@
         and \texttt{!} cells on the second and later rows in the \cs{multirow}
         which do not appear in the \HTML\ version.
 
-    \item \cs{newcolumntype} is ignored; unknown column types are set to \texttt{l}.
-        \trouble[\cs{newcolumntype}]{tabular>newcolumntype=\cs{newcolumntype}}
+    \item If \cs{newcolumntype} does not work for \HTML,
+        \trouble[\cs{newcolumntype}]{tabular=\env{tabular}>newcolumntype=\cs{newcolumntype} and \cs{HTMLnewcolumntype}}
+        \trouble{newcolumntype=\cs{newcolumntype}}
+        add a simplified column type using \cs{HTMLnewcolumntype}.
+
+    \item \pkg{lwarp} detects each of the following,
+        \margintag{font and alignment}
+        \trouble{tabular=\env{tabular}>text-align=\progcode{text-align}}
+        \trouble{text-align=\progcode{text-align}}
+        \gindex{text-align=\progcode{text-align}}
+        \gindex{tabular=\env{tabular}>text-align=\progcode{text-align}}
+        and sets \HTML\ \CSS\ appropriately:
+        \begin{sourcedisplay}
+        >\{\cs{centering}\cs{arraybackslash}\} \\
+        >\{\cs{raggedright}\cs{arraybackslash}\} \\
+        >\{\cs{raggedleft}\cs{arraybackslash}\} \\
+        >\{\cs{itshape}\} \\
+        >\{\cs{bfseries}\} \\
+        >\{\cs{bfseries}\cs{itshape}\}
+        \end{sourcedisplay}
+        These may be used with \cs{newcolumntype}, such as:
+        \begin{sourcedisplay}
+        \cs{newcolumntype}\{P\}[1]\{>\{\cs{centering}\cs{arraybackslash}\}p\{\#1\}\} \\
+        \end{sourcedisplay}
     \end{itemize}
 
 \item [Rules:] \
@@ -2208,9 +2250,9 @@
 
     \item For \cs{toprule} and \cs{bottomrule},
         \trouble[\cs{warpprintonly}]{Misplaced \cs{noalign}>tabular>rules}
-        \trouble{tabular>rules}
+        \trouble{tabular=\env{tabular}>rules}
         when combined with a \env{warpprint} or \env{warpHTML} environment,
-        \trouble[Misplaced \cs{noalign}]{tabular>Misplaced \protect\cs{noalign}}%
+        \trouble[Misplaced \cs{noalign}]{tabular=\env{tabular}>Misplaced \protect\cs{noalign}}%
         if a ``Misplaced \cs{noalign}'' error occurs,
         change
         \begin{sourcedisplay}
@@ -2234,7 +2276,7 @@
         do not apply to \HTML\ inside \cs{warpprintonly\{\}}.
     \item For S columns (from the \pkg{siunitx} package),
         \trouble[S columns]{siunitx=\pkg{siunitx}>S column}
-        \trouble{tabular>S column}
+        \trouble{tabular=\env{tabular}>S column}
         while producing print output,
         anything non-numeric must be placed
         inside \{ \} braces, including commands such as \cs{multirow}.
@@ -2321,8 +2363,8 @@
 
 \newcommand{\limitsresumetabular}{%
 When creating a new environment
-\trouble[\env{tabular} inside another environment]{tabular>inside an environment}
-\trouble{tabular>corrupt rows}
+\trouble[\env{tabular} inside another environment]{tabular=\env{tabular}>inside an environment}
+\trouble{tabular=\env{tabular}>corrupt rows}
 which contains a \env{tabular} environment,
 \pkg{lwarp}'s emulation of the tabular does not automatically resume
 when the containing enviroment ends, resulting in corrupted \HTML\ rows.
@@ -2349,7 +2391,7 @@
 and use a \cs{warpprintonly} macro to disable the other head phrase,
 and also the \cs{endfoot} and \cs{endfirstfoot} phrases.
 (See \cref{sec:limitsthreeparttablex} if using \pkg{threeparttablex}.)
-\trouble{tabular>endhead=\cs{endhead}, \cs{endfoot}, \cs{endlastfoot}}
+\trouble{tabular=\env{tabular}>endhead=\cs{endhead}, \cs{endfoot}, \cs{endlastfoot}}
 \begin{sourcedisplay}
 \cs{begin}\{longtable\}\{ [column specifiers] \} \\
 {[} \dots ] \cs{endfirsthead} \quad \textgreen{\% or \cs{endhead}, for print and HTML} \\
@@ -2371,7 +2413,7 @@
 Doing so helps avoid ``Misplaced \cs{noalign}.'' when using \cs{begin}\{warpprint\}.
 
 \cs{kill} is ignored, place a \cs{kill} line inside
-\trouble[\cs{kill}]{tabular>kill=\cs{kill}}
+\trouble[\cs{kill}]{tabular=\env{tabular}>kill=\cs{kill}}
     \begin{sourcedisplay}
     \cs{begin}\{warpprint\} \ldots\  \cs{end}\{warpprint\}
     \end{sourcedisplay}
@@ -2798,7 +2840,7 @@
 See \cref{sec:limitstabular}.
 
 When combined with the \pkg{subfig} package,
-\trouble[\pkg{subfig} package]{floatrow>with \pkg{subfig}}
+\trouble[\pkg{subfig} package]{floatrow=\pkg{floatrow}>with \pkg{subfig}}
 \trouble{subfig=\pkg{subfig}>with \pkg{floatrow}}
 while inside a \env{subfloatrow} \cs{ffigbox} and \cs{ttabbox}
 must have the caption in the first of the two of the mandatory arguments.
@@ -2805,7 +2847,7 @@
 
 The emulation of \pkg{floatrow} does not support \cs{FBwidth} or \cs{FBheight}.
 These values are pre-set to \texttt{.3\cs{linewidth}} and \texttt{2in}.
-\trouble[\cs{FBwidth}, \cs{FBheight}]{floatrow>\cs{FBwidth} and \cs{FBheight}}
+\trouble[\cs{FBwidth}, \cs{FBheight}]{floatrow=\pkg{floatrow}>\cs{FBwidth} and \cs{FBheight}}
 Possible solutions include:
 \begin{itemize}
 \item Use fixed lengths.  \pkg{lwarp} will scale the \HTML\ lengths appropriately.
@@ -2848,9 +2890,8 @@
 Some units will require that the expression be placed inside math mode.
 \trouble[math mode required]{siunitx=\pkg{siunitx}}
 
-Tabular \texttt{S} columns are rendered as simple \texttt{c} columns,
+Tabular \texttt{S} and {s} columns are rendered as simple \texttt{c} columns.
 \trouble[\env{tabular}]{siunitx=\pkg{siunitx}>tabular S and s columns}
-and tabular \texttt{s} columns are not supported.
 These may be replaced by \texttt{c} columns with each cell contained in
 \cs{num} or \cs{si}.
 
@@ -3100,7 +3141,7 @@
 %<*package>
 % \fi
 %
-% \CheckSum{54342}
+% \CheckSum{53937}
 %
 % \CharacterTable
 % {Upper-case     \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -3242,6 +3283,7 @@
 % \changes{v0.898}{2021/05/29}{\ 2021/05/29}
 % \changes{v0.899}{2021/06/29}{\ 2021/06/29}
 % \changes{v0.900}{2021/07/17}{\ 2021/07/17}
+% \changes{v0.901}{2021/08/27}{\ 2021/08/27}
 
 
 
@@ -3467,6 +3509,26 @@
 %
 % \begin{description}
 % \needspace{2\baselineskip}
+% \item[v0.901:] Tabular columns, float caption \CSS, \brand{MathJax} packages.
+%   \begin{itemize}
+%       \item Added \env{warpsvg} to isolate \SVG\ math, as opposed to \env{warpMathJax}.
+%       \margintag{core}
+%       \item Improved float caption \CSS\ for newer browsers.
+%       \item Improved emulation of \cs{newcolumntype}.
+%       \item Added \cs{HTMLnewcolumntype}.  See \cref{sec:htmlsettings},
+%       \item \progcode{>\{\cs{centering}\cs{arraybackslash}\}}, etc.
+%           now sets \HTML\ \CSS\ \progcode{text-align}.
+%           Also detects \cs{itshape}, \cs{bfseries}, and \cs{bfseries}\cs{itshape}.
+%           See \cref{sec:limitstabular}.
+%       \item Now uses \brand{MathJax} 3.2 packages for \pkg{centernot}, \pkg{colortbl},
+%           \margintag{\brand{MathJax}}
+%           \pkg{gensymb}, \pkg{mathtools}, \pkg{textcomp}, \pkg{upgreek}.
+%       \item \pkg{dcolumn}: Now works inside a \env{lateximage}.
+%       \margintag{packages}
+%       \item Added \pkg{mwe}.
+%       \item Added \pkg{lltjp-tascmac}, which fixed \pkg{ascmac}.
+%   \end{itemize}
+% \needspace{2\baselineskip}
 % \item[v0.900:] Package updates.
 %   \begin{itemize}
 %       \item Fix for detecting |\usepackage{lwarp}|.
@@ -5777,7 +5839,7 @@
 %   \spkg{accents}\ejax, \spkg{amscd}\sjax, \spkg{amscdx}, \spkg{autobreak}\ejax, \ipkg{autonum},
 %   \mpkg{backnaur}\ejax, \mpkg{bm}\ejax, \spkg{braket}\sjax,
 %   \mpkg{breqn}\ijax, \mpkg{bussproofs}\sjax, \mpkg{cases}\ijax,
-%   \spkg{centernot}\ejax, \spkg{cmbright}\ejax,
+%   \spkg{centernot}\sjax, \spkg{cmbright}\ejax,
 %   \spkg{colonequals}\ejax, \spkg{decimal}\ejax,
 %   \spkg{delarray}, \mpkg{DotArrow}\ejax, \spkg{dotlessi}\ejax, \spkg{dotlessj}\sjax,
 %   \spkg{esvect}\ejax, \spkg{extarrows}\ejax, \spkg{fixmath}\ejax,
@@ -5790,7 +5852,7 @@
 %   \spkg{mathdots}\ejax, \spkg{mathfixs}\ejax,
 %   \spkg{mathpazo}\ejax, \spkg{mathptmx}\ejax,
 %   \spkg{mathpunctspace}\ijax,
-%   \spkg{mathspec}\ejax, \mpkg{mathtools}\ejax, \spkg{mattens}\ejax,
+%   \spkg{mathspec}\ejax, \mpkg{mathtools}\sjax, \spkg{mattens}\ejax,
 %   \spkg{maybemath}\ijax, \spkg{mdwmath}\ejax,
 %   \mpkg{mismath}\ejax, \spkg{mleftright}\ejax,
 %   \spkg{multiobjective}\ejax, \mpkg{nccmath}\ejax,
@@ -5804,7 +5866,7 @@
 %   \spkg{subsupscripts}\ejax, \spkg{tensind}, \spkg{tensor}\ejax,
 %   \spkg{textualicomma}\ijax,
 %   \spkg{txfonts}\ejax, \spkg{txgreeks}\ejax,
-%   \spkg{unicode-math}\ejax, \spkg{upgreek}\ejax,
+%   \spkg{unicode-math}\ejax, \spkg{upgreek}\sjax,
 %   \spkg{ushort}\ejax, \mpkg{witharrows}\ejax,
 %   \mpkg{xfakebold}\ejax, \mpkg{xy}.
 %   Many others work as-is. \\
@@ -5836,7 +5898,8 @@
 % Tabular: &
 %   \env{tabular} environment, \mpkg{array}\ejax, \epkg{arydshln}\ejax,
 %   \mpkg{bigdelim}\ejax, \mpkg{bigstrut}\ejax, \mpkg{booktabs}\ejax,
-%   \mpkg{colortbl}\ijax, \mpkg{ctable}, \mpkg{diagbox}, \mpkg{hhline}\ejax, \epkg{longtable},
+%   \mpkg{colortbl}\sjax, \mpkg{ctable}, \mpkg{dcolumn}, \mpkg{diagbox},
+%   \mpkg{hhline}\ejax, \epkg{longtable},
 %   \epkg{ltablex}, \epkg{ltxtable},
 %   \mpkg{multirow}\ejax, \epkg{supertabular}, \epkg{tabularx}, \epkg{tabulary},
 %   \epkg{threeparttable}, \mpkg{threeparttablex},
@@ -5959,12 +6022,12 @@
 % Symbols: & Native \LaTeX\ diacriticals, \mpkg{academicons}, \spkg{amssymb}\sjax,
 %   \mpkg{bbding}, \mpkg{ccicons},
 %   \mpkg{chemgreek}, \mpkg{dingbat}, \spkg{euro}, \mpkg{eurosym},
-%   \mpkg{fontawesome}, \mpkg{fontawesome5}, \spkg{gensymb}\ejax, \spkg{latexsym}\sjax,
+%   \mpkg{fontawesome}, \mpkg{fontawesome5}, \spkg{gensymb}\sjax, \spkg{latexsym}\sjax,
 %   \mpkg{marvosym},
 %   \mpkg{metalogo}, \mpkg{metalogox},
 %   \mpkg{pifont},
 %   \spkg{textalpha},
-%   \mpkg{textcomp}, \spkg{textgreek},
+%   \mpkg{textcomp}\sjax, \spkg{textgreek},
 %   \mpkg{typicons},
 %   \mpkg{xunicode}.
 %   \\
@@ -6033,7 +6096,7 @@
 % Package handling: & \spkg{catoptions}. \\
 %
 % Debug: & \ipkg{chkfloat}, \ipkg{cmdtrack}, \ipkg{dprogress}, \mpkg{lipsum},
-%   \ipkg{lua-visual-debug}, \ipkg{refcheck},
+%   \ipkg{lua-visual-debug}, \mpkg{mwe}, \ipkg{refcheck},
 %   \ipkg{srcltx}, \ipkg{srctex}, \ipkg{vpe}, \ipkg{xbmks}. \\
 %
 % \midrule
@@ -8183,6 +8246,8 @@
 % \cs{HTMLPageTop} & PS & Heading for the other pages. \\
 % \cs{HTMLPageBottom} & PS & Footer for the other pages. \\
 % \midrule
+% \cs{HTMLnewcolumntype} & D & \cs{newcolumntype} for \HTML. \\
+% \midrule
 % \cs{IndexPageSeparator} & P & Index page list separator. \\
 % \cs{IndexRangeSeparator} & P & Index page range separator. \\
 % \midrule
@@ -8547,6 +8612,20 @@
 %   Redefine with \cs{renewcommand}.
 %   \describeAltTextOpenClose
 %
+% \ItemDescribeMacro{\HTMLnewcolumntype}
+%   \cs{newcolumntype} may not always work with \pkg{lwarp} for \HTML\ output,
+%   \trouble{newcolumntype=\cs{newcolumntype}}
+%   \trouble{htmlnewcolumntype=\cs{HTMLnewcolumntype}}
+%   \trouble{array=\env{array}>newcolumntype=\cs{newcolumntype} and \cs{HTMLnewcolumntype}}
+%   \trouble{tabular=\env{tabular}>newcolumntype=\cs{newcolumntype} and \cs{HTMLnewcolumntype}}
+%   \gindex{array=\env{array}>newcolumntype=\cs{newcolumntype} and \cs{HTMLnewcolumntype}}
+%   \gindex{tabular=\env{tabular}>newcolumntype=\cs{newcolumntype} and \cs{HTMLnewcolumntype}}
+%   \gindex{newcolumntype=\cs{newcolumntype} and \cs{HTMLnewcolumntype}}
+%   \gindex{HTMLnewcolumntype=\cs{HTMLnewcolumntype} and \cs{newcolumntype}}
+%   since it often involves \TeX\ boxes and fills.
+%   To provide a simplified column type for \HTML,
+%   add \cs{HTMLnewcolumntype} in addition.
+%
 % \ItemDescribeEnv{warpprint} An environment which is only used
 %   while generating print output.  Place inside anything which does not
 %   apply to \HTML\ and which may cause problems with \pkg{lwarp}.
@@ -8811,7 +8890,17 @@
 % Do not nest \env{warpMathJax} inside itself. \watchout[nesting]
 % \env{warpMathJax} may be used inside \env{warpHTML}.
 %
+% \DescribeEnv{warpsvg}
+% Anything which is to be done only while using print output or
+% \HTML\ output with \SVG\ math
+% is surrounded by a \env{warpsvg} environment.
+% |\end{warpsvg}| must appear on its own line.
+% \trouble[\texttt{\cs{end}\{warpsvg\}}]{warpsvg}
+% Do not nest \env{warpsvg} inside itself. \watchout[nesting]
+% \env{warpsvg} may be used inside \env{warpHTML}.
 %
+%
+%
 % \subsection{Commands to be placed into the \env{warpprint} environment}
 % \label{sec:printcommands}
 %
@@ -10543,7 +10632,6 @@
 %
 % \DescribePackage{graphics}%
 % \DescribePackage{graphicx}%
-%
 % \begin{table}
 % \caption{\cs{includegraphics} and file names}
 % \label{tab:includegraphicsfilenames}
@@ -10570,7 +10658,6 @@
 % \end{threeparttable}
 % \end{center}
 % \end{table}
-%
 % \limitsgraphics
 %
 %
@@ -10677,17 +10764,17 @@
 %
 % \subsubsection{\pkg{multirow} package}
 % \gindex{multirow=\pkg{multirow}>mrowcell=\cs{mrowcell} and \cs{mcolrowcell}}
-% \gindex{tabular>multirow=\pkg{multirow} \cs{mrowcell} and \cs{mcolrowcell}}
+% \gindex{tabular=\env{tabular}>multirow=\pkg{multirow} \cs{mrowcell} and \cs{mcolrowcell}}
 % \gindex{mrowcell=\cs{mrowcell}}
 % \gindex{mcolrowcell=\cs{mcolrowcell}}
 % \trouble{multirow=\pkg{multirow}>mrowcell=\cs{mrowcell} and \cs{mcolrowcell}}
-% \trouble{tabular>multirow=\pkg{multirow} \cs{mrowcell} and \cs{mcolrowcell}}
+% \trouble{tabular=\env{tabular}>multirow=\pkg{multirow} \cs{mrowcell} and \cs{mcolrowcell}}
 % \trouble{mrowcell=\cs{mrowcell}}
 % \trouble{mcolrowcell=\cs{mcolrowcell}}
 % \gindex{multicolumn=\cs{multicolumn}>with \cs{multirow}}
 % \gindex{multirow=\cs{multirow}>with \cs{multicolumn}}
-% \gindex{tabular>multicolumn=\cs{multicolumn} with \cs{multirow}}
-% \trouble{tabular>multicolumn=\cs{multicolumn} with \cs{multirow}}
+% \gindex{tabular=\env{tabular}>multicolumn=\cs{multicolumn} with \cs{multirow}}
+% \trouble{tabular=\env{tabular}>multicolumn=\cs{multicolumn} with \cs{multirow}}
 % \limitsmultirow
 %
 % \subsubsection{\pkg{longtable} package}
@@ -12302,10 +12389,13 @@
 %	\end{description}
 %
 % \item [Images are appearing in strange places:] ~
-% \trouble{image>incorrect}
-% \trouble{SVG image>incorrect}
+% \trouble{image>incorrect>added or removed}
+% \trouble{graphics>incorrect>added or removed}
+% \trouble{SVG image>incorrect>added or removed}
+% \trouble{math>incorrect>added or removed}
 %	\begin{itemize}
-%	\item Enter \cmds{lwarpmk limages} to refresh the \env{lateximage} images.
+%	\item When images are added or removed,
+%       Enter \cmds{lwarpmk limages} to refresh the \env{lateximage} images.
 %	\end{itemize}
 %
 % \item[\SVG\ images:] \
@@ -12503,9 +12593,9 @@
 %       In order to make it easier to locate a solution,
 %       the same issue may be addressed by more than one entry.
 %
-%       Entries with higher page numbers are often duplicates of entries with
+%       Entries starting with page \pageref{source} are often duplicates of entries with
 %       lower page numbers, as the same warning may occur within the user manual
-%       and again within the source code for a given package.
+%       and again within the source code.
 %   }
 %
 %   \printindex[trb][Troubleshooting Index]
@@ -12630,6 +12720,7 @@
 % \section{Source code}
 %
 % ^^A *source
+% \label{source}
 %
 % This is where the documented source code for \pkg{lwarp} begins,
 % continuing through the following sections all the way to the
@@ -13036,6 +13127,7 @@
 \LWR at checkloadnever{cals}{}
 \LWR at checkloadnever{cellspace}{}
 \LWR at checkloadnever{cgloss4e}{}
+\LWR at checkloadnever{collcell}{}
 \LWR at checkloadnever{colophon}{}
 \LWR at checkloadnever{cooltooltips}{}
 \LWR at checkloadnever{covington}{}
@@ -13421,6 +13513,7 @@
 \LWR at loadafter{lips}
 \LWR at loadafter{listings}
 \LWR at loadafter{listliketab}
+\LWR at loadafter{lltjp-tascmac}
 \LWR at loadafter{longtable}
 \LWR at loadafter{lpic}
 \LWR at loadafter{lscape}
@@ -13485,6 +13578,7 @@
 \LWR at loadafter{multirow}
 \LWR at loadafter{multitoc}
 \LWR at loadafter{musicography}
+\LWR at loadafter{mwe}
 \LWR at loadafter{nameauth}
 \LWR at loadafter{nameref}
 \LWR at loadafter{natbib}
@@ -15153,6 +15247,24 @@
 % \end{environment}
 
 
+% \begin{environment}{warpsvg}
+% Only if \SVG\ math is being used along with \HTML,
+% or in print mode.
+% \changes{v0.901}{2021/08/26}{Added.}
+%    \begin{macrocode}
+\begin{warpprint}
+\LWR at includecomment{warpsvg}{mathsvg}
+\end{warpprint}
+
+\begin{warpHTML}
+\ifbool{mathjax}
+    {\LWR at excludecomment{warpsvg}{mathsvg}}
+    {\LWR at includecomment{warpsvg}{mathsvg}}
+\end{warpHTML}
+%    \end{macrocode}
+% \end{environment}
+
+
 % \begin{environment}{LWRcreatelwarpmk}
 % Optionally generate a local copy of \prog{lwarpmk}.
 % Default to no.
@@ -16640,14 +16752,26 @@
 %
 % \begin{macro}{\LWR at formatted@checkname} \marg{name}
 % \changes{v0.893}{2020/11/15}{Added.}
+% \changes{v0.901}{2021/08/18}{Improved error handling.}
 %    \begin{macrocode}
 \newcommand*{\LWR at formatted@checkname}[1]{%
+    \ifcsundef{#1}{%
+        \ifcsundef{LWR at print@#1}{%
+            \PackageError{lwarp}
+            {%
+                \LWRbackslash#1 or \protect\LWR at print@#1\MessageBreak
+                must be defined before using \protect\LWR at formatted, etc%
+            }
+            {Perhaps #1 is misspelled.}
+        }{\relax}%
+    }{\relax}%
     \ifcsundef{LWR at HTML@#1}{%
         \PackageError{lwarp}
         {%
-            \protect\LWR at HTML@#1 is not defined%
+            \protect\LWR at HTML@#1 must be defined
+            before using \protect\LWR at formatted, etc%
         }
-        {Perhaps it is misspelled.}
+        {Perhaps #1 is misspelled.}
     }{\relax}%
 }
 %    \end{macrocode}
@@ -16655,14 +16779,26 @@
 %
 % \begin{macro}{\LWR at formatted@checkendname} \marg{name}
 % \changes{v0.893}{2020/11/15}{Added.}
+% \changes{v0.901}{2021/08/18}{Improved error handling.}
 %    \begin{macrocode}
 \newcommand*{\LWR at formatted@checkendname}[1]{%
+    \ifcsundef{end#1}{%
+        \ifcsundef{endLWR at print@#1}{%
+            \PackageError{lwarp}
+            {%
+                \protect\end#1 or \protect\endLWR at print@#1\MessageBreak
+                must be defined before using \protect\LWR at formatted, etc%
+            }
+            {Perhaps #1 is misspelled.}
+        }{\relax}%
+    }{\relax}%
     \ifcsundef{endLWR at HTML@#1}{%
         \PackageError{lwarp}
         {%
-            \protect\endLWR at HTML@#1 is not defined%
+            \protect\endLWR at HTML@#1 must be defined
+            before using \protect\LWR at formatted, etc%
         }
-        {Perhaps it is misspelled.}
+        {Perhaps #1 is misspelled.}
     }{\relax}%
 }
 %    \end{macrocode}
@@ -16783,8 +16919,26 @@
 %    \end{macrocode}
 
 
+% Print versions.
+%
+% \codeprint
+%    \begin{macrocode}
+\begin{warpprint}
+%    \end{macrocode}
 
+% \changes{v0.901}{2021/08/20}{Added print versions of \cs{LWR at formatted}, etc.}
+%    \begin{macrocode}
+\newcommand*{\LWR at formatted}[1]{}
+\newcommand*{\LWR at expandableformatted}[1]{}
+\newcommand*{\LWR at formattedenv}[1]{}
+\newcommand*{\LWR at expandableformattedenv}[1]{}
+%    \end{macrocode}
 
+%    \begin{macrocode}
+\end{warpprint}
+%    \end{macrocode}
+
+
 % \section{\HTML-conversion output modifications}
 %
 % These booleans modify the \HTML\ output in various ways
@@ -17761,6 +17915,8 @@
 % \changes{v0.894}{2020/12/15}{\filenm{lwarp.css}: \TeX\ logos no longer below baseline.}
 % \changes{v0.896}{2021/03/04}{\filenm{lwarp.css}: Added \element{main}, adjusted \element{sidetoccontainer} margin.}
 % \changes{v0.899}{2021/06/25}{\filenm{lwarp.css}: Improved \pkg{multicol}.}
+% \changes{v0.901}{2021/08/20}{\filenm{lwarp.css}: Tabular cell text alignment.}
+% \changes{v0.901}{2021/08/20}{\filenm{lwarp.css}: Improved captions.}
 %
 % ^^A *lwarp.css
 %
@@ -17841,10 +17997,12 @@
 
 pre { padding: 3pt ; }
 
-span.strong, span.textbf, div.strong, div.textbf { font-weight: bold; }
+span.strong, span.textbf, div.strong, div.textbf, table td.tdbfseries { font-weight: bold; }
 
-span.textit, div.textit { font-style: italic; }
+span.textit, div.textit, table td.tditshape { font-style: italic; }
 
+table td.tdbfit { font-weight: bold ; font-style:italic }
+
 span.textmd, div.textmd { font-weight: normal; }
 
 span.textup, div.textup {
@@ -18758,6 +18916,12 @@
 
 div.figurecaption .minipage { margin:0 ; padding: 0 }
 
+/* for subcaptions: */
+figure div.minipage div.figurecaption {
+    max-width: 100% ;   /* fallback if min() does not work */
+    max-width: min(30em,100%)
+}
+
 div.minipage figure { border: none ; box-shadow: none ; }
 div.minipage figure.table { margin: 0ex }
 div.minipage div.footnotes { margin: 1ex 2em 0ex 2em }
@@ -18769,14 +18933,22 @@
 div.floatfoot { font-size: .85em ;
     border-top: 1px solid silver ; line-height: 1.2 ; }
 
+/* Center if only one line, "start" align if more than one line: */
 div.figurecaption , .lstlistingtitle {
     font-size: .85em ;
-    text-align: center ;
     font-weight: bold ;
-    margin-top: 1ex ;
-    margin-bottom: 1ex ;
+    text-align: start ;
+    margin: 1ex auto;
+    width: max-content;
+    max-width: 100%;
 }
 
+/* A marginblock is small, so always center and don't mess with the width. */
+div.marginblock div.figurecaption {
+    width: 100% ;
+    text-align: center ;
+}
+
 figure.subfigure div.figurecaption, figure.subtable div.figurecaption  {
     border-bottom: none ; background: none ;
 }
@@ -18840,9 +19012,6 @@
 table td.tdp { text-align: left ; vertical-align: bottom ; }
 table td.tdm { text-align: left ; vertical-align: middle ; }
 table td.tdb { text-align: left ; vertical-align: top ; }
-table td.tdP { text-align: center ; vertical-align: bottom ; }
-table td.tdM { text-align: center ; vertical-align: middle ; }
-table td.tdB { text-align: center ; vertical-align: top ; }
 
 table td.tvertbarl { border-left: 1px solid black }
 table td.tvertbarldouble { border-left: 4px double black }
@@ -18854,7 +19023,11 @@
 table td.tvertbarrdash { border-right: 1px dashed black }
 table td.tvertbarrdoubledash { border-right: 2px dashed black }
 
+table td.tdcenter { text-align: center}
+table td.tdleft { text-align: left}
+table td.tdright { text-align: right}
 
+
 /* for cmidrules: */
 table td.tdrule {
     border-top: 1px solid #A0A0A0 ;
@@ -20578,7 +20751,7 @@
 -- Copyright 2016-2021 Brian Dunn
 
 
-printversion = "v0.900"
+printversion = "v0.901"
 requiredconfversion = "2" -- also at *lwarpmk.conf
 
 function printhelp ()
@@ -21874,7 +22047,7 @@
 %   \cs{StopDefiningTabulars}
 %   \trouble[Misplaced alignment tab character \&]
 %       {Misplaced alignment tab character \&>tabular>macros}
-%   \trouble{tabular>Misplaced alignment tab character \&>rules}
+%   \trouble{tabular=\env{tabular}>Misplaced alignment tab character \&>rules}
 % before and after defining macros or environments which include
 % the tabular |&| character in their definitions.
 %
@@ -21939,9 +22112,9 @@
 
 % \section{Localizing dynamic math}
 % \label{sec:localizingdynamicmath}
-% \trouble{SVG image>math incorrect}
+% \trouble{SVG image>math incorrect>dymamic}
 % \gindex{SVG>dynamic math}
-% \trouble{math>incorrect}
+% \trouble{math>incorrect>dynamic}
 % \trouble{math>dynamic}
 % \trouble{mathjax=\brand{MathJax}>errors}
 % \gindex{math>dynamic}
@@ -29621,13 +29794,13 @@
 % See \cref{sec:dataarray}.
 % 
 % \DescribeObject{LWR at colbeforespec} A data array of specifications for |>| columns.
-% 
+%
 % \DescribeObject{LWR at colafterspec} A data array of specifications for |<| columns.
 %
 % \DescribeObject{LWR at colbarspec} A data array of specifications for vertical rules.
 
-
-
+% \DescribeObject{LWR at coladdclass} A data array of extra \CSS\ class, as set by |>|.
+% 
 % \DescribeCounter{LWR at cellcolordepth}
 % Counts how many cell color \element{div}s were added to the current tabular data cell.
 %    \begin{macrocode}
@@ -29635,7 +29808,6 @@
 %    \end{macrocode}
 
 
-
 % \subsubsection{Multicolumn variables}
 
 %    \begin{macrocode}
@@ -29678,7 +29850,7 @@
 
 
 
-% \subsection{Handling \&, @, !, and bar}
+% \subsection{Handling \progcode{\&}, \progcode{@}, \progcode{!}, and bar}
 %
 % \begin{minipage}{\linewidth}
 % For technical discussion regarding problems redefining |\&|, See: \\
@@ -29864,7 +30036,7 @@
 
 
 
-% \subsubsection{Filling an unfinished row}
+% \subsection{Filling an unfinished row}
 
 % \begin{macro}{\LWR at tabularfinishrow}
 % Adds empty table cells if necessary to finish the row.
@@ -30059,14 +30231,17 @@
 %    \end{macrocode}
 %
 %
-% \begin{macro}{\LWR at parseatcolumn}
+% \begin{macro}{\LWR at parseatcolumn} \marg{this column type}
 %
 % Handles |@{text}| columns.
 %
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 % \changes{v0.33}{2017/07/07}{Fix: Column alignment with leftmost \progcode{@}.}
 %
 %    \begin{macrocode}
-\newcommand*{\LWR at parseatcolumn}{%
+\newcommand*{\LWR at parseatcolumn}[1]{%
 %    \end{macrocode}
 % Move to the next token after the '@':
 %    \begin{macrocode}
@@ -30110,13 +30285,16 @@
 % \end{macro}
 %
 %
-% \begin{macro}{\LWR at parsebangcolumn}
+% \begin{macro}{\LWR at parsebangcolumn} \marg{this column type}
 % Handles |!{text}| columns.
 %
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 % \changes{v0.22}{2017/02/28}{Added tabular \progcode{!!} column.}
 %
 %    \begin{macrocode}
-\newcommand*{\LWR at parsebangcolumn}{%
+\newcommand*{\LWR at parsebangcolumn}[1]{%
 %    \end{macrocode}
 % Move to the next token after the '!':
 %    \begin{macrocode}
@@ -30157,18 +30335,58 @@
 % \end{macro}
 %
 %
+% \begin{macro}{\LWR at checkbeforeaddclass} \marg{compared csname} \marg{\CSS\ class to add}
+%    \begin{macrocode}
+\newcommand*{\LWR at checkbeforeaddclass}[2]{%
+    \ifcsstrequal{LWR at tempone}{#1}%
+        {%
+            \LWR at setexparray{LWR at coladdclass}%
+                {\arabic{LWR at tabletotalLaTeXcolsnext}}%
+                { #2}% space is intentional
+        }{}%
+}
+%    \end{macrocode}
+% \end{macro}
 %
-% \begin{macro}{\LWR at parsebeforecolumn}
 %
+% \begin{macro}{\LWR at checkmathcolpar} Error if using math in column parameters.
+% \changes{v0.901}{2021/08/21}{Error if math in column specifier.}
+%    \begin{macrocode}
+\newcommand*{\LWR at checkmathcolpar}{%
+    \IfSubStr{\detokenize\expandafter{\LWR at colparameter}}{\LWRdollar}%
+        {%
+            \PackageError{lwarp}%
+                {%
+                    Lwarp does not support `$' in column specifiers.\MessageBreak
+                    Specify `$' math for each cell in the column.\MessageBreak
+                    Enter 'h' for more info%
+                }%
+                {%
+                    For example, replace `>{$}c<{$}' with `c', and then\MessageBreak
+                    use `$cell contents$' for each cell in the column.%
+                }%
+        }{}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\LWR at parsebeforecolumn} \marg{this column type}
+%
 % Handles |>{text}| columns.
 %
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 %    \begin{macrocode}
-\newcommand*{\LWR at parsebeforecolumn}{%
+\newcommand*{\LWR at parsebeforecolumn}[1]{%
 %    \end{macrocode}
+%
 % Move to the next token after the '>':
 %    \begin{macrocode}
     \defaddtocounter{LWR at tablecolspecindex}{1}%
 %    \end{macrocode}
+%
 % Read the next token, expanding once into \cs{LWR at colparameter}:
 %    \begin{macrocode}
     \expandarg%
@@ -30176,6 +30394,13 @@
         {\arabic{LWR at tablecolspecindex}}[\LWR at colparameter]%
     \fullexpandarg%
 %    \end{macrocode}
+%
+% Error if using |>{$}|, which is not supported by \pkg{lwarp}.
+% \changes{v0.901}{2021/08/21}{Error if math in column specifier.}
+%    \begin{macrocode}
+    \LWR at checkmathcolpar%
+%    \end{macrocode}
+%
 % Store the result into a data array, expanding once out of \cs{LWR at colparameter}:
 % \changes{v0.79}{2020/01/16}{Remove outermost braces.}
 %    \begin{macrocode}
@@ -30182,6 +30407,21 @@
     \LWR at setexparray{LWR at colbeforespec}%
         {\arabic{LWR at tabletotalLaTeXcolsnext}}%
         {\expandafter\@firstofone\LWR at colparameter}%
+%
+    \edef\LWR at tempone{\expandafter\@firstofone\LWR at colparameter}%
+%    \end{macrocode}
+%
+% If detect |>{\centering\arraybackslash}| or related, add a \CSS\ class.
+% \changes{v0.901}{2021/08/20}{Tabular cell text alignment.}
+%    \begin{macrocode}
+    \LWR at checkbeforeaddclass{LWR at detect@centeringarraybackslash}{tdcenter}
+    \LWR at checkbeforeaddclass{LWR at detect@raggedrightarraybackslash}{tdleft}
+    \LWR at checkbeforeaddclass{LWR at detect@raggedleftarraybackslash}{tdright}
+    \LWR at checkbeforeaddclass{LWR at detect@itshape}{tditshape}
+    \LWR at checkbeforeaddclass{LWR at detect@bfseries}{tdbfseries}
+    \LWR at checkbeforeaddclass{LWR at detect@bfit}{tdbfit}
+%    \end{macrocode}
+%    \begin{macrocode}
     \let\LWR at colparameter\relax%
     \booltrue{LWR at validtablecol}%
 }
@@ -30188,17 +30428,22 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\LWR at parseaftercolumn}
+% \begin{macro}{\LWR at parseaftercolumn} \marg{this column type}
 %
 % Handles |<{text}| columns.
 %
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 %    \begin{macrocode}
-\newcommand*{\LWR at parseaftercolumn}{%
+\newcommand*{\LWR at parseaftercolumn}[1]{%
 %    \end{macrocode}
+%
 % Move to the next token after the '<':
 %    \begin{macrocode}
     \defaddtocounter{LWR at tablecolspecindex}{1}%
 %    \end{macrocode}
+%
 % Read the next token, expanding once into \cs{LWR at colparameter}:
 %    \begin{macrocode}
     \expandarg%
@@ -30206,6 +30451,13 @@
         {\arabic{LWR at tablecolspecindex}}[\LWR at colparameter]%
     \fullexpandarg%
 %    \end{macrocode}
+%
+% Error if using |>{$}|, which is not supported by \pkg{lwarp}.
+% \changes{v0.901}{2021/08/21}{Error if math in column specifier.}
+%    \begin{macrocode}
+    \LWR at checkmathcolpar%
+%    \end{macrocode}
+%
 % Store the result into a data array, expanding once out of \cs{LWR at colparameter}:
 % \changes{v0.79}{2020/01/16}{Remove outermost braces.}
 %    \begin{macrocode}
@@ -30219,15 +30471,21 @@
 % \end{macro}
 %
 %
-% \begin{macro}{\LWR at parsebarcolumn} \qquad Handles vertical rules.
+% \begin{macro}{\LWR at parsebarcolumn}  \marg{this column type}
 %
+% Handles vertical rules.
+%
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 % \changes{v0.41}{2017/10/07}{Added vertical rules.}
 % \changes{v0.56}{2018/04/30}{Adds support for double vertical rules.}
 %
 %    \begin{macrocode}
-\newcommand*{\LWR at parsebarcolumn}{%
+\newcommand*{\LWR at parsebarcolumn}[1]{%
     \LWR at traceinfo{LWR at parsebarcolumn}%
 %    \end{macrocode}
+%
 % Remember the bar at this position:
 %    \begin{macrocode}
     \ifnumcomp{\value{LWR at tabletotalLaTeXcols}}{=}{0}%
@@ -30257,13 +30515,19 @@
 % \end{macro}
 %
 %
-% \begin{macro}{\LWR at parsecoloncolumn} \qquad Handles vertical rules.
+% \begin{macro}{\LWR at parsecoloncolumn}  \marg{this column type}
 %
+% Handles vertical rules.
+%
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 % \changes{v0.56}{2018/05/04}{\pkg{arydshln}: Added.}
 %    \begin{macrocode}
-\newcommand*{\LWR at parsecoloncolumn}{%
+\newcommand*{\LWR at parsecoloncolumn}[1]{%
     \LWR at traceinfo{LWR at parsecoloncolumn}%
 %    \end{macrocode}
+%
 % Remember the bar at this position:
 %    \begin{macrocode}
     \ifnumcomp{\value{LWR at tabletotalLaTeXcols}}{=}{0}%
@@ -30289,32 +30553,46 @@
 % \end{macro}
 %
 %
-% \begin{macro}{\LWR at parsesemicoloncolumn} \qquad Handles vertical rules.
+% \begin{macro}{\LWR at parsesemicoloncolumn} \marg{this column type}
 %
+% Handles vertical rules.
+%
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
+% The arguments to the column type are absorbed by \cs{LWR at columntype@<char>},
+% defined by \cs{LWR at modifycolumntype}.
+%
 % \changes{v0.56}{2018/05/04}{\pkg{arydshln}: Added.}
 %    \begin{macrocode}
-\newcommand*{\LWR at parsesemicoloncolumn}{%
+\newcommand*{\LWR at parsesemicoloncolumn}[1]{%
 %    \end{macrocode}
+%
 % Treat |;| as a |:| column:
 %    \begin{macrocode}
-    \LWR at parsecoloncolumn%
-%    \end{macrocode}
-% Skip the following width token:
-%    \begin{macrocode}
-    \defaddtocounter{LWR at tablecolspecindex}{1}%
+    \LWR at parsecoloncolumn{}%
 }
 %    \end{macrocode}
 % \end{macro}
 %
 %
-% \subsection{Parsing `l', `c', or `r' columns}
+% \subsection{Parsing common column types}
 %
-% \begin{macro}{\LWR at parsenormalcolumn} \marg{thiscolumn}
+% \begin{macro}{\LWR at parsenormalcolumn} \marg{this column type}
 %
 % Add to the accumulated column specs, advance counters,
 % and pre-clear another column of at, before, and after specs.
+%
+% \cs{newcolumntype} definitons use \cs{LWR at parsenormalcolumn},
+% so an \HTML\ and print version are given so that they may work inside
+% a \env{lateximage}.
+%
+% The arguments to the column type are absorbed by \cs{LWR at columntype@<char>},
+% defined by \cs{LWR at modifycolumntype}.
+%
+% \changes{v0.901}{2021/08/12}{Improved \cs{newcolumntype} emulation.}
 %    \begin{macrocode}
-\newcommand*{\LWR at parsenormalcolumn}[1]{%
+\newcommand*{\LWR at HTML@LWR at parsenormalcolumn}[1]{%
     \defaddtocounter{LWR at tabletotalLaTeXcols}{1}%
     \defaddtocounter{LWR at tabletotalLaTeXcolsnext}{1}%
 %    \end{macrocode}
@@ -30329,45 +30607,33 @@
     \LWR at setexparray{LWR at colbeforespec}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
     \LWR at setexparray{LWR at colafterspec}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
     \LWR at setexparray{LWR at colbarspec}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
+    \LWR at setexparray{LWR at coladdclass}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
     \booltrue{LWR at validtablecol}%
 }
-%    \end{macrocode}
-% \end{macro}
 
+\newcommand*{\LWR at print@LWR at parsenormalcolumn}[1]{}
 
-% \subsection{Parsing `p', `m', or `b' columns}
-%
-% \begin{macro}{\LWR at parsepcolumn} \marg{thiscolumn}
-% The width will be ignored.
-%    \begin{macrocode}
-\newcommand*{\LWR at parsepcolumn}[1]{%
+\LWR at formatted{LWR at parsenormalcolumn}
 %    \end{macrocode}
-% Converts to the given column type:
-%    \begin{macrocode}
-    \LWR at parsenormalcolumn{#1}%
-%    \end{macrocode}
-% Skips the following width token:
-%    \begin{macrocode}
-    \defaddtocounter{LWR at tablecolspecindex}{1}%
-}
-%    \end{macrocode}
 % \end{macro}
 
 
+
 % \subsection{Parsing `w' columns}
 %
-% \begin{macro}{\LWR at parsewcolumn}
+% \begin{macro}{\LWR at parsewcolumn} \marg{this column type}
 % The width will be ignored.
+%
+% The arguments to the column type are absorbed by \cs{LWR at columntype@<char>},
+% defined by \cs{LWR at modifycolumntype}.
+%
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
+%
 %    \begin{macrocode}
-\newcommand*{\LWR at parsewcolumn}{%
-%    \end{macrocode}
-%    \begin{macrocode}
+\newcommand*{\LWR at parsewcolumn}[1]{%
     \LWR at columnspeclookahead{1}%
     \expandafter\LWR at parsenormalcolumn\expandafter{\LWR at strresulttwo}%
-%    \end{macrocode}
-% Skips the following width and alignment tokens:
-%    \begin{macrocode}
-    \defaddtocounter{LWR at tablecolspecindex}{2}%
 }
 %    \end{macrocode}
 % \end{macro}
@@ -30375,143 +30641,41 @@
 
 % \subsection{Parsing '*' columns}
 %
-% \begin{macro}{\LWR at parsestarcolumn}
+% \begin{macro}{\LWR at parsestarcolumn} \marg{this column type}
 % Star columns should already have been expanded, so this should never be used.
-%    \begin{macrocode}
-\newcommand*{\LWR at parsestarcolumn}{%
-    \defaddtocounter{LWR at tablecolspecindex}{2}%
-}
-%    \end{macrocode}
-% \end{macro}
-
-
-% \subsection{Parsing `D' columns}
 %
-% From the \pkg{dcolumn} package.
+% The arguments to the column type are absorbed by \cs{LWR at columntype@<char>},
+% defined by \cs{LWR at modifycolumntype}.
 %
-% \begin{macro}{\LWR at parseDcolumn} \marg{thiscolumn}
-% The three parameters will be ignored.
+% The argument is ignored,
+% but provided for compatibility with \cs{LWR at parsenormalcolumn}.
 %
-% \changes{v0.22}{2017/02/24}{Added tabular \progcode{D} column.}
-%
 %    \begin{macrocode}
-\newcommand*{\LWR at parseDcolumn}[1]{%
+\newcommand*{\LWR at parsestarcolumn}[1]{}
 %    \end{macrocode}
-% Converts to the given column type.
-%    \begin{macrocode}
-    \LWR at parsenormalcolumn{#1}%
-%    \end{macrocode}
-% Skips the following three parameters.
-%    \begin{macrocode}
-    \defaddtocounter{LWR at tablecolspecindex}{3}%
-}
-%    \end{macrocode}
 % \end{macro}
 
 
+
 % \subsection{Expanding the star column specifications}
 
-% \DescribeCounter{LWR at starcount}
-% Internal count for duplicating star columns.
-%    \begin{macrocode}
-\newcount\LWR at starcount
-%    \end{macrocode}
+
+% \begin{macro}{\LWR at expandpreamble} \marg{tabular preamble}
 %
-% \begin{macro}{\LWR at expcolspec}
-% Temporary storage used to build the expanded column specifier.
-%    \begin{macrocode}
-\newcommand*{\LWR at expcolspec}{}
-%    \end{macrocode}
-% \end{macro}
+% From \pkg{array} \cs{@mkpream}.
 %
-% \DescribeCounter{LWR at splitstarindex}
-% Indexes into the column specifiers.
+% The resulting expanded preamble is stored in \cs{the}\cs{@temptokena}.
+% Assign as:
+% \begin{sourceverb}
+% \edef\destination{\the\@temptokena}
+% \end{sourceverb}
 %    \begin{macrocode}
-\newcounter{LWR at splitstarindex}
-%    \end{macrocode}
-%
-% \DescribeCounter{LWR at splitstarcopies}
-% Number of copies.
-%    \begin{macrocode}
-\newcounter{LWR at splitstarcopies}
-%    \end{macrocode}
-%
-% \begin{macro}{\LWR at splitstarcontents}
-% Contents to duplicate.
-%    \begin{macrocode}
-\newcommand*{\LWR at splitstarcontents}{}
-%    \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\expandcolspec} Expands \cs{LWR at origcolspec} for star columns.
-% \changes{v0.71}{2019/04/26}{Added support for tabular `\texttt{*}' column.}
-%    \begin{macrocode}
-\newcommand*{\expandcolspec}{%
-%    \end{macrocode}
-%
-% Find the position of any star token.
-%    \begin{macrocode}
-    \StrPosition{\LWR at origcolspec}{*}[\LWR at tempone]%
-%    \end{macrocode}
-%
-% Expand until no stars are found:
-%    \begin{macrocode}
-    \whileboolexpr{ test {\ifnumgreater{\LWR at tempone}{0}}}%
-    {%
-%    \end{macrocode}
-%
-% Begin with any characters to the left of the star.
-%    \begin{macrocode}
-        \setcounter{LWR at splitstarindex}{\LWR at tempone}%
-        \addtocounter{LWR at splitstarindex}{-1}%
-        \StrLeft{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\LWR at expcolspec]%
-%    \end{macrocode}
-%
-% Move past the star to remember its number of copies.
-%    \begin{macrocode}
-        \addtocounter{LWR at splitstarindex}{2}%
-        \StrChar{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\LWR at tempone]%
-        \setcounter{LWR at splitstarcopies}{\expandafter\@firstofone\LWR at tempone}%
-%    \end{macrocode}
-%
-% Move past the number of copies and remember the contents.
-%    \begin{macrocode}
-        \addtocounter{LWR at splitstarindex}{1}%
-        \StrChar{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\LWR at splitstarcontents]%
-%    \end{macrocode}
-%
-% For each copy, append the contents.
-%    \begin{macrocode}
-        \ifnumgreater{\value{LWR at splitstarcopies}}{0}%
-        {%
-            \LWR at starcount=\value{LWR at splitstarcopies}%
-            \loop
-                \appto\LWR at expcolspec{%
-%    \end{macrocode}
-% (Remove the enclosing braces.)
-%    \begin{macrocode}
-                    \expandafter\@firstofone\LWR at splitstarcontents%
-                }%
-                \advance \LWR at starcount -1
-            \ifnum \LWR at starcount>0 \repeat
-        }{}%
-%    \end{macrocode}
-%
-% Remove any token to the left, and append the rightmost remainding tokens.
-%    \begin{macrocode}
-        \StrGobbleLeft{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\colspecremainder]%
-        \appto{\LWR at expcolspec}{\colspecremainder}%
-%    \end{macrocode}
-%
-% Remember the final result.
-%    \begin{macrocode}
-        \edef\LWR at origcolspec{\LWR at expcolspec}%
-%    \end{macrocode}
-%
-% See if more stars exist.
-%    \begin{macrocode}
-        \StrPosition{\LWR at origcolspec}{*}[\LWR at tempone]%
+\newcommand*{\LWR at expandpreamble}[1]{%
+    \edef\@tempa{\@temptokena={#1}}%
+    \@tempa%
+    \@tempswatrue%
+    \@whilesw\if at tempswa\fi{%
+        \@tempswafalse\the\NC at list%
     }%
 }
 %    \end{macrocode}
@@ -30522,7 +30686,7 @@
 
 % \HTML\ \CSS\ cannot exactly match the \LaTeX{} concept of a baseline for
 % a table row.
-% \trouble[tabular baselines]{tabular>baselines}
+% \trouble[tabular baselines]{tabular=\env{tabular}>baselines}
 % \Cref{tab:baseline} shows the \LaTeX{} results for various
 % vertical-alignment choices, with the baseline of the first column drawn across
 % all the columns for comparison.
@@ -30530,7 +30694,7 @@
 %
 % \begin{table}
 % \caption{Tabular baseline\label{tab:baseline}}
-% \gindex{tabular>baseline}\gindex{baseline>tabular}
+% \gindex{tabular=\env{tabular}>baseline}\gindex{baseline>tabular}
 % \centering
 % \smallskip
 % \begin{tabular}{lp{.25in}m{.25in}b{.25in}r}
@@ -30546,16 +30710,22 @@
 % \end{tabular}
 % \end{table}
 %
+%
 % \Cref{tab:columnconversions} describes how each kind of column is
 % converted to \HTML.
 %
+%
 % \begin{table}
 % \caption{Tabular \HTML\ column conversions\label{tab:columnconversions}}
-% \gindex{tabular>HTML colummn conversion}
+% \gindex{tabular=\env{tabular}>HTML colummn conversion}
 % \gindex{HTML>tabular column conversion}
 %
 % \medskip
 %
+% Each cell is given a \CSS\ class of \attribute{td<columntype>}.
+%
+% \medskip
+%
 % \hrule
 % \begin{description}[parsep=.5ex]
 % \item [l, r, c:] Converted to table cells without paragraph tags. \\
@@ -30575,19 +30745,198 @@
 % \item [m:] With paragraph tags, \CSS\ |vertical-align:middle|.
 % \item [b:] With paragraph tags, \CSS\ |vertical-align:top| so that the bottom of the
 % text is closest to the middle of the text line.
+% \item [w and W:] Converted to |l|, |c|, or |r|.  No paragraph tags.
 % \item [P, M, B:] Horizontally-centered versions.
-% \item [S:] Converted to 'r'.  Ignores optional argument.  From the \pkg{siunitx} package.
-% \item [D:] Converted to 'c'.  From the \pkg{dcolumn} package.
+% \item [S:] Treated as '|c|'.  Ignores optional argument.  From the \pkg{siunitx} package.
+% \item [D:] Treated as '|c|'.  From the \pkg{dcolumn} package.
 % \item [@, !, \textgreater{}, \textless{}:] One each, in that order.
 % \item [\textbar:] Vertical rule.
-% \item [Unknown:] Converted to 'l'.
-% \item [\cs{newcolumn}:] Currently treated as unknown.
+% \item [Unknown:] Converted to '|l|'.
+% \item [\cs{newcolumntype}:] Expands to its replacement text.
+% \item [\cs{HTMLnewcolumntype}:] Provides simplified replacement text for \HTML.
 % \end{description}
 % \hrule
 % \end{table}
 %
+% \Cref{tab:columnmacros} shows the various internal macros generated for
+% each column type.
 %
+% \begin{table}
+% \caption{HTML column type internal macros}
+% \label{tab:columnmacros}
+% \hrule
+% \begin{description}
+% \item[\texttt{<coltype>}:] The single-letter column type,
+%       such as \texttt{c} or \texttt{X}.
+% \item[Created by \cs{LWR at modifycolumntype}:] Used by \pkg{lwarp} to add
+%       \HTML\ functionality to each built-in column type.
+%       \begin{description}
+%           \item[\cs{LWR at columntype@<coltype>}:] Handles tabular columns
+%               depending on the type.
+%               Calls \cs{LWR at parsenormalcolumn} or related,
+%               then advances \cs{LWR at tablecolspecindex}.
+%           \item[\cs{LWR at columntype@mctype@<coltype>}:] Generates the
+%               \cs{multicolumn} \HTML\ cell \CSS\ class.
+%               Calls \cs{LWR at printmccoltype@normal} or related.
+%           \item[\cs{LWR at columntype@mcdata@<coltype>}:] Generates the
+%               \cs{multicolumn} \HTML\ cell data.
+%               Calls \cs{LWR at printmccoldata@normal} or related.
+%       \end{description}
+% \item[Created by \cs{newcolumntype}:] From \pkg{array}.
+%       \begin{description}
+%           \item[\cs{NC at find@<coltype>}:] Internally used to parse
+%               the column specifier.
+%           \item[\cs{NC at rewrite@<coltype>}:] Stores the print-mode replacement text.
+%       \end{description}
+% \item[Created by \cs{HTMLnewcolumntype}:] From \pkg{lwarp}.
+%       \begin{description}
+%           \item[\cs{LWR at print@NC at rewrite@<coltype>}:] Copied
+%               from \cs{NC at rewrite@<type>}.
+%           \item[\cs{LWR at HTML@NC at rewrite@<coltype>}:] Stores the
+%               \HTML-mode replacement text.
+%           \item[\cs{NC at rewrite@<coltype>}:] Redefined to use
+%               the print or \HTML\ version.
+%       \end{description}
+% \end{description}
+% \hrule
+% \end{table}
 %
+%
+% \begin{macro}{\LWR at modifycolumntype}
+%       \marg{1: column type letter}
+%       \marg{2: number args to ignore}
+%       \marg{3: csname of the cell action}
+%       \marg{4: csname of the multicolumn print type action}
+%       \marg{5: csname of the multicolumn print data action}
+%
+% Add \HTML\ functionality to an existing print version column type.
+%
+% \changes{v0.901}{2021/08/17}{Improved \cs{newcolumntype} emulation.}
+%    \begin{macrocode}
+\newcommand*{\LWR at modifycolumntype}[5]{%
+    \LWR at traceinfo{LWR at modifycolumntype !#1!#2!#3!#4!#5!}%
+            \LWR at traceinfo{LWR at modifycolumntype #1}%
+            \edef\@tempa{%
+                \noexpand\csdef{LWR at columntype@#1}{%
+                    \noexpand\@nameuse{#3}{#1}%
+                    \noexpand\defaddtocounter{LWR at tablecolspecindex}{#2}%
+                }%
+                \noexpand\csdef{LWR at columntype@mctype@#1}{%
+                    \noexpand\@nameuse{#4}{#1}%
+                }%
+                \noexpand\csdef{LWR at columntype@mcdata@#1}{%
+                    \noexpand\@nameuse{#5}{#2}%
+                }%
+            }%
+            \@tempa%
+    \LWR at traceinfo{LWR at modifycolumntype done}%
+}
+%    \end{macrocode}
+% \end{macro}
+
+%    \begin{macrocode}
+\LWR at modifycolumntype{l}{0}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+
+\LWR at modifycolumntype{c}{0}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+
+\LWR at modifycolumntype{r}{0}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+%    \end{macrocode}
+%    \begin{macrocode}
+\LWR at modifycolumntype{@}{0}{LWR at parseatcolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{!}{0}{LWR at parsebangcolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{>}{0}{LWR at parsebeforecolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{<}{0}{LWR at parseaftercolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{|}{0}{LWR at parsebarcolumn}
+    {LWR at printmccoltype@vertbar}{LWR at printmccoldata@skip}
+
+\LWR at modifycolumntype{:}{0}{LWR at parsecoloncolumn}
+    {LWR at printmccoltype@colon}{LWR at printmccoldata@skip}
+
+\LWR at modifycolumntype{;}{1}{LWR at parsesemicoloncolumn}
+    {LWR at printmccoltype@semicolon}{LWR at printmccoldata@skip}
+%    \end{macrocode}
+%    \begin{macrocode}
+\LWR at modifycolumntype{p}{1}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@paragraph}
+
+\LWR at modifycolumntype{m}{1}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@paragraph}
+
+\LWR at modifycolumntype{b}{1}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@paragraph}
+%    \end{macrocode}
+% \changes{v0.56}{2018/05/10}{Added \pkg{array} \texttt{W} column.}
+%    \begin{macrocode}
+\LWR at modifycolumntype{w}{2}{LWR at parsewcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+
+\LWR at modifycolumntype{W}{2}{LWR at parsewcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+%    \end{macrocode}
+% A star column:
+%    \begin{macrocode}
+\LWR at modifycolumntype{*}{2}{LWR at parsestarcolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@skip}
+%    \end{macrocode}
+%
+%
+%
+% \begin{macro}{\HTMLnewcolumntype} \marg{col type} \oarg{num args} \marg{replacement text}
+%
+% A user-level macro to creates an \HTML\ version
+% of the replacement text for the column type.
+%
+% This is the equivalent to:
+% \begin{sourceverb}
+% \newcommand*{\LWR at HTML@NC at rewrite@<columntype>}[<num args>]
+%       {\NC at find <replacement text>}
+% \LWR at formatted{NC at rewrite@<columntype>}
+% \end{sourceverb}
+%
+% \changes{v0.901}{2021/08/17}{Improved \cs{newcolumntype} emulation.}
+%    \begin{macrocode}
+\NewDocumentCommand{\HTMLnewcolumntype}{m O{0} m}{%
+    \expandafter\newcommand\expandafter*%
+        \csname LWR at HTML@NC at rewrite@#1\endcsname[#2]{\NC at find #3}%
+    \LWR at formatted{NC at rewrite@#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\end{warpHTML}
+%    \end{macrocode}
+%
+% \codeprint
+%    \begin{macrocode}
+\begin{warpprint}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\NewDocumentCommand{\HTMLnewcolumntype}{m O{0} m}{}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\end{warpprint}
+%    \end{macrocode}
+%
+% \codehtml
+%    \begin{macrocode}
+\begin{warpHTML}
+%    \end{macrocode}
+%
+%
 % \begin{macro}{\LWR at parsetablecols} \marg{colspecs}
 %
 % Scans the column specification left to right.
@@ -30621,7 +30970,8 @@
 %
 % Expand any star columns:
 %    \begin{macrocode}
-    \expandcolspec%
+    \LWR at expandpreamble{\LWR at origcolspec}%
+    \edef\LWR at origcolspec{\the\@temptokena}%
 %    \end{macrocode}
 %
 % The parsed column spec data array, |LWR at tablecolspec|,
@@ -30650,6 +31000,9 @@
     \LWR at setexparray{LWR at colbarspec}{1}{}%
     \LWR at setexparray{LWR at colbarspec}{2}{}%
     \LWR at setexparray{LWR at colbarspec}{3}{}%
+    \LWR at setexparray{LWR at coladdclass}{1}{}%
+    \LWR at setexparray{LWR at coladdclass}{2}{}%
+    \LWR at setexparray{LWR at coladdclass}{3}{}%
 %    \end{macrocode}
 % Starting at the first column specification:
 %    \begin{macrocode}
@@ -30703,70 +31056,18 @@
     {% not an optional tabular argument
 %    \end{macrocode}
 % Not inside an optional argument, so consider the column type:
+% \changes{v0.901}{2021/08/12}{Improved \cs{newcolumntype} emulation.}
 %    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{l}{\LWR at parsenormalcolumn{l}}{}%
-    \IfStrEq{\LWR at strresult}{c}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{r}{\LWR at parsenormalcolumn{r}}{}%
-    \IfStrEq{\LWR at strresult}{L}{\LWR at parsenormalcolumn{l}}{}%
-    \IfStrEq{\LWR at strresult}{C}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{R}{\LWR at parsenormalcolumn{r}}{}%
-    \IfStrEq{\LWR at strresult}{J}{\LWR at parsenormalcolumn{l}}{}%
+        \ifcsdef{LWR at columntype@\LWR at strresult}%
+            {\csuse{LWR at columntype@\LWR at strresult}}%
+            {}%
 %    \end{macrocode}
+% If an unknown column type, use |l|:
 %    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{S}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{s}{\LWR at parsenormalcolumn{c}}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{\detokenize{@}}{\LWR at parseatcolumn}{}%
-    \IfStrEq{\LWR at strresult}{!}{\LWR at parsebangcolumn}{}%
-    \IfStrEq{\LWR at strresult}{>}{\LWR at parsebeforecolumn}{}%
-    \IfStrEq{\LWR at strresult}{<}{\LWR at parseaftercolumn}{}%
-    \IfStrEq{\LWR at strresult}{|}{\LWR at parsebarcolumn}{}%
-    \IfStrEq{\LWR at strresult}{:}{\LWR at parsecoloncolumn}{}%
-    \IfStrEq{\LWR at strresult}{;}{\LWR at parsesemicoloncolumn}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{p}{\LWR at parsepcolumn{p}}{}%
-    \IfStrEq{\LWR at strresult}{m}{\LWR at parsepcolumn{m}}{}%
-    \IfStrEq{\LWR at strresult}{b}{\LWR at parsepcolumn{b}}{}%
-%    \end{macrocode}
-% \changes{v0.56}{2018/05/10}{Added \pkg{array} \texttt{W} column.}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{w}{\LWR at parsewcolumn}{}%
-    \IfStrEq{\LWR at strresult}{W}{\LWR at parsewcolumn}{}%
-%    \end{macrocode}
-% A star column:
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{*}{\LWR at parsestarcolumn}{}%
-%    \end{macrocode}
-% From the \pkg{dcolumn} package:
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{D}{\LWR at parseDcolumn{c}}{}%
-%    \end{macrocode}
-% From the \pkg{tabularx} package.
-% X column has no parameter, but will be given paragraph tags.
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{X}{\LWR at parsenormalcolumn{X}}{}%
-%    \end{macrocode}
-% \begin{docsidebar}
-%	\raggedright
-% Many people define centered versions ``|P|'', ``|M|'', and ``|B|'':
-% \begin{Verbatim}[tabsize=4,gobble=2]
-%   \newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
-% \end{Verbatim}
-% \vspace{-\baselineskip}
-% \end{docsidebar}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{P}{\LWR at parsepcolumn{P}}{}%
-    \IfStrEq{\LWR at strresult}{M}{\LWR at parsepcolumn{M}}{}%
-    \IfStrEq{\LWR at strresult}{B}{\LWR at parsepcolumn{B}}{}%
-%    \end{macrocode}
-% If this column was an invalid column type, convert it to an |l| column:
-%    \begin{macrocode}
-    \ifbool{LWR at validtablecol}{}{%
-        \LWR at traceinfo{invalid column type: \LWR at strresult}%
-        \LWR at parsenormalcolumn{l}%
-    }%
+        \ifbool{LWR at validtablecol}{}{%
+            \LWR at traceinfo{invalid column type: \LWR at strresult}%
+            \LWR at parsenormalcolumn{l}%
+        }%
     }% not an optional column argument
 %    \end{macrocode}
 % If read the closing bracket, no longer inside the optional argument:
@@ -30985,8 +31286,8 @@
 % Create an empty cell if muting for the \cs{bottomrule}:
 %    \begin{macrocode}
         \ifboolexpr{bool{LWR at tabularmutemods} or bool{LWR at emptyatbang}}%
-        {}%
-        {\LWR at atbangspec}%
+            {}%
+            {\LWR at atbangspec}%
 %
         \LWR at htmltag{/td}\LWR at orignewline%
         \global\booltrue{LWR at tabularcelladded}%
@@ -31022,7 +31323,7 @@
 
 
 
-% \subsection{Data opening tag}
+% \subsection{Cell opening tag}
 
 
 % \begin{macro}{\LWR at thiscolspec} Temporary storage.
@@ -31045,20 +31346,24 @@
     \LWR at traceinfo{LWR at tabledatasinglecolumntag}%
     \LWR at maybenewtablerow%
 %    \end{macrocode}
+%
 % Don't start a new paragraph tag if have already started one:
 %    \begin{macrocode}
     \ifbool{LWR at intabularmetadata}%
     {%
 %    \end{macrocode}
+%
 % If have found the end of tabular command, do not create the next data cell:
 %    \begin{macrocode}
         \ifbool{LWR at exitingtabular}{}%
         {% not exiting tabular
 %    \end{macrocode}
+%
 % Print the |@| and |!| contents before first column:
 %    \begin{macrocode}
             \LWR at tabularleftedge%
 %    \end{macrocode}
+%
 % Fetch the current column's alignment character into \cs{LWR at strresult}:
 % \changes{v0.60}{2018/09/17}{\env{tabular}: Improved memory management: Not using \pkg{xstring}.}
 %    \begin{macrocode}
@@ -31066,6 +31371,7 @@
                 \LWR at getexparray{LWR at tablecolspec}{\arabic{LWR at tableLaTeXcolindex}}%
             }%
 %    \end{macrocode}
+%
 % Print the start of a new table data cell:
 % \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
@@ -31073,10 +31379,12 @@
             \LWR at htmltag{%
                 td class=\textquotedbl{}td%
 %    \end{macrocode}
+%
 % Append this column's spec:
 %    \begin{macrocode}
                 \LWR at strresult%
 %    \end{macrocode}
+%
 % If this column has a cmidrule, add ``rule'' to the end of the \HTML\ class tag.
 % Also add vertical bar tags.
 %    \begin{macrocode}
@@ -31083,8 +31391,20 @@
                 \LWR at addcmidruletrim%
                 \LWR at addleftmostbartag%
                 \LWR at printbartag{\arabic{LWR at tableLaTeXcolindex}}%
+%    \end{macrocode}
+%
+% Add any tabular |>| column text alignment or font control \CSS:
+% \changes{v0.901}{2021/08/20}{Tabular cell text alignment.}
+%    \begin{macrocode}
+                \LWR at getexparray{LWR at coladdclass}%
+                    {\arabic{LWR at tableLaTeXcolindex}}%
+%    \end{macrocode}
+%
+% Close the class description:
+%    \begin{macrocode}
                 \textquotedbl{}%
 %    \end{macrocode}
+%
 % Add styles for rules, alignment:
 % \changes{v0.42}{2017/10/26}{If \progcode{FormatWP} add cell alignment.}
 %    \begin{macrocode}
@@ -31092,6 +31412,7 @@
                 \LWR at addcmidrulewidth%
                 \LWR at addcdashline%
 %    \end{macrocode}
+%
 % \changes{v0.60}{2018/09/17}{\env{tabular}: Improved memory management: Not using \pkg{xstring}.}
 %    \begin{macrocode}
                 \xdef\LWR at thiscolspec{%
@@ -31100,6 +31421,7 @@
                 }% 
                 \LWR at addformatwpalignment{\LWR at thiscolspec}%
 %    \end{macrocode}
+%
 % Add styles for cell and rule colors:
 % \changes{v0.48}{2018/02/08}{\pkg{colortbl}: Added.}
 %    \begin{macrocode}
@@ -31106,21 +31428,19 @@
                 \LWR at addtabularrowcolor%
                 \LWR at addtabularrulecolors%
 %    \end{macrocode}
+%
 %    \begin{macrocode}
                 \LWR at tdendstyles%
             }% HTML td
             \LWR at traceinfo{LWR at tabledatasinglecolumntag: done printing td tag}%
 %    \end{macrocode}
+%
 % If this is a |p|, |m|, |b|, or X column, allow paragraphs:
 %    \begin{macrocode}
             \ifboolexpr{%
                 test{ \ifdefstring{\LWR at strresult}{p} } or
                 test{ \ifdefstring{\LWR at strresult}{m} } or 
-                test{ \ifdefstring{\LWR at strresult}{b} } or
-                test{ \ifdefstring{\LWR at strresult}{P} } or
-                test{ \ifdefstring{\LWR at strresult}{M} } or
-                test{ \ifdefstring{\LWR at strresult}{B} } or
-                test{ \ifdefstring{\LWR at strresult}{X} }
+                test{ \ifdefstring{\LWR at strresult}{b} }
             }%
             {% allow pars
                 \LWR at traceinfo{LWR at tabledatasinglecolumntag: about to LWR at startpars}%
@@ -31130,6 +31450,7 @@
             }% allow pars
             {}% no pars
 %    \end{macrocode}
+%
 % Print the |>| contents unless muted for the \cs{bottomrule}:
 %    \begin{macrocode}
             \ifboolexpr{bool{LWR at tabularmutemods} or bool{LWR at emptyatbang}}%
@@ -31503,7 +31824,8 @@
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\LWR at addformatwpalignment}
+% \begin{macro}{\LWR at addformatwpalignment} \marg{colspec}
+%
 % If |FormatWP|, adds a \attribute{style} for the alignment.
 %
 % Must be placed between \cs{LWR at tdstartstyles} and \cs{LWR at tdendstyles}.
@@ -31520,9 +31842,6 @@
         \IfSubStr{#1}{p}{\LWR at WPcell{left}{bottom}}{}%
         \IfSubStr{#1}{m}{\LWR at WPcell{left}{middle}}{}%
         \IfSubStr{#1}{b}{\LWR at WPcell{left}{top}}{}%
-        \IfSubStr{#1}{P}{\LWR at WPcell{center}{bottom}}{}%
-        \IfSubStr{#1}{M}{\LWR at WPcell{center}{middle}}{}%
-        \IfSubStr{#1}{B}{\LWR at WPcell{center}{top}}{}%
     }{}%
 }
 %    \end{macrocode}
@@ -31750,96 +32069,106 @@
 
 % \subsubsection{Parsing multicolumns}
 
+% \begin{macro}{\LWR at printmccoltype@normal} \marg{col type}
+%
+% Prints the column type, and remembers that any vertical bars
+% are no longer on the left edge.
+%    \begin{macrocode}
+\newcommand*{\LWR at printmccoltype@normal}[1]{%
+    #1%
+    \boolfalse{LWR at mcolvertbaronleft}%
+}
+%    \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\LWR at printmccoltype@ignore} \marg{col type}
+%
+% This type does not print a multi-column data cell.
+%    \begin{macrocode}
+\newcommand*{\LWR at printmccoltype@ignore}[1]{}%
+%    \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\LWR at printmccoltype@vertbar} \marg{col type}
+%
+% Adds a left or right vertical bar.
+%    \begin{macrocode}
+\newcommand*{\LWR at printmccoltype@vertbar}[1]{%
+    \ifbool{LWR at mcolvertbaronleft}%
+        {\defaddtocounter{LWR at mcolvertbarsl}{1}}% left edge
+        {\defaddtocounter{LWR at mcolvertbarsr}{1}}% not left edge
+}
+%    \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\LWR at printmccoltype@colon} \marg{col type}
+%
+% Adds a left or right vertical bar.
+%    \begin{macrocode}
+\newcommand*{\LWR at printmccoltype@colon}[1]{%
+    \ifbool{LWR at mcolvertbaronleft}%
+        {\defaddtocounter{LWR at mcolvertbarsldash}{1}}% left edge
+        {\defaddtocounter{LWR at mcolvertbarsrdash}{1}}% not left edge
+}
+%    \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\LWR at printmccoltype@semicolon} \marg{col type}
+%
+% Adds a left or right vertical bar.
+%    \begin{macrocode}
+\let\LWR at printmccoltype@semicolon\LWR at printmccoltype@colon
+%    \end{macrocode}
+% \end{macro}
+
+
 % \begin{macro}{\LWR at printmccoltype} \marg{colspec}
 % Print any valid column type found.  Does not print |@|, |!|, |>|, or |<| columns
 % or their associated tokens.
 %
 % This is printed as part of the table data tag's |class|.
+%
+% \cs{LWR at columntype@mctype@<type>} is defined by \cs{LWR at modifycolumntype}.
 %    \begin{macrocode}
 \newcommand*{\LWR at printmccoltype}[1]{%
     \LWR at traceinfo{lwr at printmccoltype -#1-}%
 %    \end{macrocode}
+%
 % Get one token of the column spec:
 %    \begin{macrocode}
     \StrChar{#1}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
 %    \end{macrocode}
-% Add to the \HTML\ tag depending on which column type is found:
+%
+% Detokenize to avoid problems with special characters:
 %    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{l}{l}{}%
-    \IfStrEq{\LWR at strresult}{c}{c}{}%
-    \IfStrEq{\LWR at strresult}{r}{r}{}%
-    \IfStrEq{\LWR at strresult}{p}{p}{}%
-    \IfStrEq{\LWR at strresult}{m}{m}{}%
-    \IfStrEq{\LWR at strresult}{b}{b}{}%
-    \IfStrEq{\LWR at strresult}{P}{P}{}%
-    \IfStrEq{\LWR at strresult}{M}{M}{}%
-    \IfStrEq{\LWR at strresult}{B}{B}{}%
+    \edef\LWR at strresult{\detokenize\expandafter{\LWR at strresult}}%
 %    \end{macrocode}
-% \changes{v0.56}{2018/05/10}{Added \pkg{array} \texttt{W} column.}
+%
+% Add to the \HTML\ tag depending on which column type is found:
+% \changes{v0.901}{2021/08/17}{Improved \cs{newcolumntype} emulation.}
+%
 %    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{w}{w}{}%
-    \IfStrEq{\LWR at strresult}{W}{W}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{S}{c}{}%
-    \IfStrEq{\LWR at strresult}{s}{c}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{X}{p}{}%
-%    \end{macrocode}
-% \changes{v0.43}{2017/11/07}{Added vertical rules.}
-% \changes{v0.56}{2018/04/30}{Adds support for double vertical rules.}
-% \changes{v0.56}{2018/05/05}{Adds support for dashed vertical rules.}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at strresult}{|}%
-    {%
-        \ifbool{LWR at mcolvertbaronleft}%
-            {\defaddtocounter{LWR at mcolvertbarsl}{1}}% left edge
-            {\defaddtocounter{LWR at mcolvertbarsr}{1}}% not left edge
-    }%
-    {%
-        \IfStrEq{\LWR at strresult}{:}%
-        {%
-            \ifbool{LWR at mcolvertbaronleft}%
-                {\defaddtocounter{LWR at mcolvertbarsldash}{1}}% left edge
-                {\defaddtocounter{LWR at mcolvertbarsrdash}{1}}% not left edge
-        }%
-        {%
-            \IfStrEq{\LWR at strresult}{;}%
-            {%
-                \ifbool{LWR at mcolvertbaronleft}%
-                    {\defaddtocounter{LWR at mcolvertbarsldash}{1}}% left edge
-                    {\defaddtocounter{LWR at mcolvertbarsrdash}{1}}% not left edge
-            }%
-            {\boolfalse{LWR at mcolvertbaronleft}}%
-        }%
-    }%
+    \ifcsdef{LWR at columntype@mctype@\LWR at strresult}%
+        {\csuse{LWR at columntype@mctype@\LWR at strresult}}%
+        {\boolfalse{LWR at mcolvertbaronleft}}%
     \LWR at traceinfo{lwr at printmccoltype done}%
 }
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\LWR at multicolpartext} \marg{num parameters}
-% Print the data with paragraph tags, advance to bypass the given number of parameters.
-% \changes{v0.56}{2018/05/12}{Fix: \cs{multicolumn} parameters.}
-%    \begin{macrocode}
-\newcommand*{\LWR at multicolpartext}[1]{%
-    \LWR at startpars%
-    \LWR at multicoltext%
-    \defaddtocounter{LWR at tablemulticolspos}{#1}%
-    \LWR at stoppars%
-}
-%    \end{macrocode}
-% \end{macro}
 
-% \begin{macro}{\LWR at multicolother} \marg{colspec}
+% \begin{macro}{\LWR at printmccoldata@other}  \marg{num args to skip} \marg{entire colspec}
+%
 % For |@|, |!|, |>|, |<|, print the next token without paragraph tags:
 %    \begin{macrocode}
-\newcommand*{\LWR at multicolother}[1]{%
+\newcommand*{\LWR at printmccoldata@other}[2]{%
     \defaddtocounter{LWR at tablemulticolspos}{1}%
-    \StrChar{#1}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
+    \StrChar{#2}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
     \LWR at strresult%
 %    \end{macrocode}
+%
 % A valid column data type was found:
 %    \begin{macrocode}
     \booltrue{LWR at validtablecol}%
@@ -31847,11 +32176,14 @@
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\LWR at multicolskip}
+% \begin{macro}{\LWR at printmccoldata@skip}  \marg{num args to skip} \marg{entire colspec}
+%
 % Nothing to print for this column type.
 %    \begin{macrocode}
-\newcommand*{\LWR at multicolskip}{%
+\newcommand*{\LWR at printmccoldata@skip}[2]{%
+    \defaddtocounter{LWR at tablemulticolspos}{#1}%
 %    \end{macrocode}
+%
 % A valid column data type was found:
 %    \begin{macrocode}
     \booltrue{LWR at validtablecol}%
@@ -31859,7 +32191,36 @@
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\LWR at printmccoldata} \marg{colspec}
+
+% For \cs{LWR at printmccoldata@...>}, \marg{num args to skip} is provided by
+% \cs{LWR at columntype@mcdata@<coltype>} when it was defined by
+% \cs{LWR at modifycolumntype}.
+% \cs{entire colspec} is provided by \cs{LWR at printmccoldata} when it uses
+% \cs{LWR at columntype@mcdata@<coltype>}.
+
+% \begin{macro}{\LWR at printmccoldata@normal} \marg{num args to skip} \marg{entire colspec}
+%    \begin{macrocode}
+\newcommand*{\LWR at printmccoldata@normal}[2]{%
+    \LWR at multicoltext%
+    \defaddtocounter{LWR at tablemulticolspos}{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\LWR at printmccoldata@paragraph} \marg{num args to skip} \marg{entire colspec}
+%    \begin{macrocode}
+\newcommand*{\LWR at printmccoldata@paragraph}[2]{%
+    \LWR at startpars%
+    \LWR at multicoltext%
+    \defaddtocounter{LWR at tablemulticolspos}{#1}%
+    \LWR at stoppars%
+}
+%    \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\LWR at printmccoldata} \marg{entire colspec}
+%
 % Print the data for any valid column type found.
 %
 % \changes{v0.22}{2017/02/28}{Added tabular \progcode{D}, \progcode{!!},
@@ -31866,67 +32227,37 @@
 %	and \progcode{X} columns.}
 %
 % \changes{v0.23}{2017/03/02}{Fix for vert bar column type.}
+% \changes{v0.901}{2021/08/17}{Improved \cs{newcolumntype} emulation.}
 %
 %    \begin{macrocode}
 \newcommand*{\LWR at printmccoldata}[1]{%
     \LWR at traceinfo{lwr at printmccoldata -#1}%
 %    \end{macrocode}
+%
 % Not yet found a valid column type:
 %    \begin{macrocode}
     \boolfalse{LWR at validtablecol}%
 %    \end{macrocode}
+%
 % Get one token of the column spec, into a local copy in case nested.
 %    \begin{macrocode}
     \StrChar{#1}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
     \edef\LWR at printmccoldatatoken{\LWR at strresult}%
 %    \end{macrocode}
+%
 % Print the text depending on which column type is found.
 % Also handles |@|, |>|, |<| as it comes to them.
 %    \begin{macrocode}
-    \IfStrEq{\LWR at printmccoldatatoken}{l}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{c}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{r}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{D}{%
-        \defaddtocounter{LWR at tablemulticolspos}{3}% skip parameters
-        \LWR at multicoltext%
-    }{}%
+    \ifcsdef{LWR at columntype@mcdata@\LWR at printmccoldatatoken}%
+        {\csuse{LWR at columntype@mcdata@\LWR at printmccoldatatoken}{#1}}%
+        {}%
 %    \end{macrocode}
-% \changes{v0.56}{2018/05/12}{Fix: \cs{multicolumn} parameters.}
-% \changes{v0.72}{2019/06/07}{Fix: \cs{multicolumn} parameters.}
+%
+% If an unknown column type, print the text:
 %    \begin{macrocode}
-    \IfStrEq{\LWR at printmccoldatatoken}{p}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{m}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{b}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{P}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{M}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{B}{\LWR at multicolpartext{2}}{}%
-%    \end{macrocode}
-% \changes{v0.56}{2018/05/10}{Added \pkg{array} \texttt{W} column.}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at printmccoldatatoken}{w}{\LWR at multicolpartext{3}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{W}{\LWR at multicolpartext{3}}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at printmccoldatatoken}{S}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{s}{\LWR at multicoltext}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-    \IfStrEq{\LWR at printmccoldatatoken}{X}{\LWR at multicolpartext{1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{|}{\LWR at multicolskip}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{:}{\LWR at multicolskip}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{;}{%
-        \LWR at multicolskip%
-        \defaddtocounter{LWR at tablemulticolspos}{1}% skip parameter
-    }{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{@}}{\LWR at multicolother{#1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{!}}{\LWR at multicolother{#1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{>}}{\LWR at multicolother{#1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{<}}{\LWR at multicolother{#1}}{}%
-%    \end{macrocode}
-% If an invalid column type:
-%    \begin{macrocode}
     \ifbool{LWR at validtablecol}{}{\LWR at multicoltext{}}%
 %    \end{macrocode}
+%
 % Tracing:
 %    \begin{macrocode}
     \LWR at traceinfo{lwr at printmccoldata done}%
@@ -31938,7 +32269,7 @@
 
 
 % \begin{macro}{\parsemulticolumnalignment}
-%		\marg{1: colspec} \marg{2: printresults}
+%		\marg{1: colspec} \marg{2: printresults csname}
 %
 % Scan the multicolumn specification and execute the printfunction
 % for each entry.
@@ -31951,6 +32282,7 @@
     \StrLen{#1}[\LWR at strresult]%
     \defcounter{LWR at tablemulticolswidth}{\LWR at strresult}%
 %    \end{macrocode}
+%
 % Scan across the tokens in the column spec:
 %    \begin{macrocode}
     \whileboolexpr{%
@@ -31961,10 +32293,12 @@
     }%
     {%
 %    \end{macrocode}
+%
 % Execute the assigned print function for each token in the column spec:
 %    \begin{macrocode}
-        #2{#1}%
+        \csuse{#2}{#1}%
 %    \end{macrocode}
+%
 % Move to the next token in the column spec:
 %    \begin{macrocode}
         \defaddtocounter{LWR at tablemulticolspos}{1}%
@@ -32052,7 +32386,8 @@
 \NewDocumentCommand{\LWR at domulticolumn}{o o m m m +m}{%
     \LWR at traceinfo{LWR at domulticolumn -#1- -#2- -#4- -#5-}%
 %    \end{macrocode}
-% Remember the text to be inserted, and
+%
+% Remember the text to be inserted, and when used
 % remember that a valid column type was found:
 %    \begin{macrocode}
     \renewcommand{\LWR at multicoltext}{%
@@ -32060,6 +32395,13 @@
         \booltrue{LWR at validtablecol}%
     }%
 %    \end{macrocode}
+%
+% Expand the preamble and save it.
+%    \begin{macrocode}
+    \LWR at expandpreamble{#5}%
+    \edef\LWR at origmccolspec{\the\@temptokena}%
+%    \end{macrocode}
+%
 % Compute the rightmost column to be included.
 % This is used to create the right trim.
 % \changes{v0.43}{2017/11/07}{Fix: Multicolumn trim.}
@@ -32068,10 +32410,12 @@
     \defaddtocounter{LWR at lastmulticolumn}{#3}%
     \defaddtocounter{LWR at lastmulticolumn}{-1}%
 %    \end{macrocode}
+%
 % Row processing:
 %    \begin{macrocode}
     \LWR at maybenewtablerow%
 %    \end{macrocode}
+%
 % Begin the opening table data tag:
 % \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
@@ -32090,6 +32434,7 @@
 %    \begin{macrocode}
         class=\textquotedbl{}td%
 %    \end{macrocode}
+%
 % Print the column type and vertical bars:
 %    \begin{macrocode}
         \defcounter{LWR at mcolvertbarsl}{0}%
@@ -32097,8 +32442,9 @@
         \defcounter{LWR at mcolvertbarsldash}{0}%
         \defcounter{LWR at mcolvertbarsrdash}{0}%
         \booltrue{LWR at mcolvertbaronleft}%
-        \LWR at parsemulticolumnalignment{#5}{\LWR at printmccoltype}%
+        \LWR at parsemulticolumnalignment{\LWR at origmccolspec}{LWR at printmccoltype}%
 %    \end{macrocode}
+%
 % If this column has a cmidrule, add ``rule'' to the end of the \HTML\ class tag.
 %
 % If this position had a ``Y'' then add ``rule'' for a horizontal rule:
@@ -32114,6 +32460,7 @@
                     {\arabic{LWR at lastmulticolumn}}%
             }%
 %    \end{macrocode}
+%
 % Also add vertical bar class.
 % \changes{v0.41}{2017/10/07}{Added vertical rules.}
 % \changes{v0.43}{2017/11/07}{Fix for vertical rules.}
@@ -32131,11 +32478,13 @@
         \ifnumcomp{\value{LWR at mcolvertbarsrdash}}{>}{1}%
             { tvertbarrdoubledash}{}%
 %    \end{macrocode}
+%
 % Close the class tag's opening quote:
 % \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
         \textquotedbl{}%
 %    \end{macrocode}
+%
 % \changes{v0.42}{2017/10/26}{If \progcode{FormatWP} add cell alignment.}
 %    \begin{macrocode}
         \LWR at tdstartstyles%
@@ -32163,6 +32512,7 @@
 %    \begin{macrocode}
         \LWR at addtabularrowcolor%
 %    \end{macrocode}
+%
 % Other styles:
 %    \begin{macrocode}
         \LWR at addcmidrulewidth%
@@ -32169,11 +32519,11 @@
         \LWR at addcdashline%
         \LWR at addtabularhrulecolor%
         \LWR at addmulticolvertrulecolor%
-        \LWR at addformatwpalignment{#5}%
+        \LWR at addformatwpalignment{\LWR at origmccolspec}%
         \LWR at tdendstyles%
     }% end of the opening table data tag
     \boolfalse{LWR at intabularmetadata}%
-    \LWR at parsemulticolumnalignment{#5}{\LWR at printmccoldata}%
+    \LWR at parsemulticolumnalignment{\LWR at origmccolspec}{LWR at printmccoldata}%
 }
 %    \end{macrocode}
 % \end{macro}
@@ -32228,6 +32578,7 @@
 \NewDocumentCommand{\LWR at longtabledatacaptiontag}{s o +m}
 {%
 %    \end{macrocode}
+%
 % Remember the latest name for \cs{nameref}:
 %    \begin{macrocode}
     \IfValueTF{#2}{% optional given?
@@ -32237,6 +32588,7 @@
     }% optional given
     {\LWR at setlatestname{#3}}% no optional
 %    \end{macrocode}
+%
 % Create a multicolumn across all the columns:
 %
 % Figure out how many extra \HTML\ columns to add for |@| and |!| columns
@@ -32244,14 +32596,16 @@
 %    \begin{macrocode}
     \LWR at tabularhtmlcolumns{1}{\arabic{LWR at tabletotalLaTeXcols}}%
 %    \end{macrocode}
-% Create the multicolumn tag:
+%
+% Create the multicolumn tag.  The caption will be centered by the \CSS\ caption class.
 %    \begin{macrocode}
     \LWR at domulticolumn{\arabic{LWR at tabletotalLaTeXcols}}%
         {\arabic{LWR at tabhtmlcoltotal}}%
-        {P}%
+        {p}%
     {% \LWR at domulticolumn
     \IfBooleanTF{#1}% star?
 %    \end{macrocode}
+%
 % Star version, show a caption but do not make a LOT entry:
 %    \begin{macrocode}
     {% yes star
@@ -32261,6 +32615,7 @@
     }%
     {% No star:
 %    \end{macrocode}
+%
 % Not the star version:
 %
 % Don't step the counter if |\caption[]{A caption.}|
@@ -32277,6 +32632,7 @@
             }%
         }{}%
 %    \end{macrocode}
+%
 % Create an \HTML\ caption.  Afterwards, maybe make a LOT entry.
 %    \begin{macrocode}
         \LWR at figcaption%
@@ -32285,19 +32641,23 @@
         \LWR at isolate{#3}%
         \endLWR at figcaption%
 %    \end{macrocode}
+%
 % See if an optional caption was given:
 %    \begin{macrocode}
         \ifblank{#2}% TOC entry empty
 %    \end{macrocode}
+%
 % if the optional caption was given, but empty, do not form a \TOC\ entry
 %    \begin{macrocode}
         {}%
 %    \end{macrocode}
+%
 % If the optional caption was given, but might only be |[]|:
 %    \begin{macrocode}
         {% TOC entry not empty
             \IfNoValueTF{#2}% No TOC entry?
 %    \end{macrocode}
+%
 % The optional caption is |[]|:
 %    \begin{macrocode}
             {% No TOC entry
@@ -32311,6 +32671,7 @@
                 }%
             }% end of No TOC entry
 %    \end{macrocode}
+%
 % The optional caption has text enclosed:
 %    \begin{macrocode}
             {% yes TOC entry
@@ -32326,6 +32687,7 @@
         }% end of TOC entry not empty
     }% end of no star
 %    \end{macrocode}
+%
 % Skip any trailing |@| or |!| columns for this cell:
 %    \begin{macrocode}
     \booltrue{LWR at skipatbang}%
@@ -38123,7 +38485,7 @@
 % the environment's contents which
 % were automatically captured by the \AmS{} environment.
 %
-% For \brand{MathJax}: Each environment is syched with \LaTeX's equation numbers,
+% For \brand{MathJax}: Each environment is synched with \LaTeX's equation numbers,
 % typeset with \LaTeX\ inside an \HTML\ comment, then
 % printed to \HTML\ output for \brand{MathJax} to process.
 %
@@ -39527,7 +39889,20 @@
 %    \end{macrocode}
 % \end{environment}
 
+
+% \pkg{xcolor} is known to have been loaded, and provided
+% \HTML\ versions of the following, and the print versions are provide above,
+% so now they may be \cs{LW at formatted}.
+% \changes{v0.901}{2021/08/20}{\pkg{xcolor}: Moved \cs{LWR at formatted}.}
 %    \begin{macrocode}
+\LWR at formatted{colorbox}
+\LWR at formatted{colorboxBlock}
+\LWR at formatted{fcolorbox}
+\LWR at formatted{fcolorboxBlock}
+\LWR at formattedenv{fcolorminipage}
+%    \end{macrocode}
+
+%    \begin{macrocode}
 \LWR at traceinfo{xcolor patches done}
 }{}% xcolor loaded
 }% AtBeginDocument
@@ -40530,6 +40905,7 @@
 % \begin{macro}{\texteb} \marg{text} \qquad From \pkg{nfssext-cfr}.
 % \changes{v0.72}{2019/05/26}{\pkg{nfssext-cfr}: Added.}
 %    \begin{macrocode}
+\@ifpackageloaded{nfssext-cfr}{
 \DeclareRobustCommand{\LWR at HTML@texteb}[1]{%
     {%
         \LWR at HTML@ebweight%
@@ -40538,6 +40914,9 @@
 }
 
 \LWR at formatted{texteb}
+}{% if not loaded
+    \providerobustcmd{\texteb}[1]{}
+}
 %    \end{macrocode}
 % \end{macro}
 
@@ -40545,6 +40924,7 @@
 % \begin{macro}{\textlg} \marg{text} \qquad From \pkg{nfssext-cfr}.
 % \changes{v0.72}{2019/05/26}{\pkg{nfssext-cfr}: Added.}
 %    \begin{macrocode}
+\@ifpackageloaded{nfssext-cfr}{
 \DeclareRobustCommand{\LWR at HTML@textlg}[1]{%
     {%
         \LWR at HTML@lgweight%
@@ -40553,6 +40933,9 @@
 }
 
 \LWR at formatted{textlg}
+}{% if not loaded
+    \providerobustcmd{\textlg}[1]{}
+}
 %    \end{macrocode}
 % \end{macro}
 
@@ -40830,11 +41213,13 @@
 % \begin{macro}{\ebweight} From \pkg{nfssext-cfr}.
 % \changes{v0.72}{2019/05/26}{\pkg{nfssext-cfr}: Added.}
 %    \begin{macrocode}
+\@ifpackageloaded{nfssext-cfr}{
 \newrobustcmd*{\LWR at HTML@ebweight}{%
     \LWR at print@ebweight%
     \renewcommand*{\LWR at f@series}{eb}%
 }
 \LWR at formatted{ebweight}
+}{}
 %    \end{macrocode}
 % \end{macro}
 
@@ -40841,11 +41226,13 @@
 % \begin{macro}{\lgweight} From \pkg{nfssext-cfr}.
 % \changes{v0.72}{2019/05/26}{\pkg{nfssext-cfr}: Added.}
 %    \begin{macrocode}
+\@ifpackageloaded{nfssext-cfr}{
 \newrobustcmd*{\LWR at HTML@lgweight}{%
     \LWR at print@lgweight%
     \renewcommand*{\LWR at f@series}{lg}%
 }
 \LWR at formatted{lgweight}
+}{}
 %    \end{macrocode}
 % \end{macro}
 
@@ -42111,6 +42498,34 @@
 %    \end{macrocode}
 
 
+
+% \section{Loading \pkg{array}}
+%
+% \pkg{array} is required for \pkg{lwarp}'s column parsing.
+% It and its patches are now loaded.
+%
+% \changes{v0.901}{2021/08/19}{\pkg{array}: Now required.}
+%
+% \codehtml
+%    \begin{macrocode}
+\begin{warpHTML}
+\RequirePackage{array}
+%    \end{macrocode}
+%
+% The following are compared with the tabular preamble |>| to add \CSS\ classes
+% to adjust tabular cells.
+% Defined here now that \cs{arraybackslash} is defined after \pkg{array} is loaded.
+%    \begin{macrocode}
+\edef\LWR at detect@centeringarraybackslash{\centering\arraybackslash}
+\edef\LWR at detect@raggedrightarraybackslash{\raggedright\arraybackslash}
+\edef\LWR at detect@raggedleftarraybackslash{\raggedleft\arraybackslash}
+\def\LWR at detect@itshape{\itshape}
+\def\LWR at detect@bfseries{\bfseries}
+\def\LWR at detect@bfit{\bfseries\itshape}
+\end{warpHTML}
+%    \end{macrocode}
+
+
 % \section{Loading \pkg{everyshi} patches}
 %
 % \pkg{everyshi} is emulated by the \LaTeX\ core, so its patches are loaded
@@ -42594,6 +43009,7 @@
             {Keys/values are ignored in MathJax.\MessageBreak
             \protect\Cdots, etc. do not span multiple cells.\MessageBreak
             AutoNiceMatrix, etc. are not supported for MathJax.\MessageBreak
+            \protect\CodeBefore\space cannot be done with MathJax.\MessageBreak
             \LWR at forceSVGmessage{nicematrix}%
             }
         \LWR at nomathjaxwarn{pb-diagram}
@@ -44981,15 +45397,26 @@
 %
 % \codehtml
 %
-% Remove the default nullfied macros:
+% If \pkg{array} is not yet loaded, remove the default nullfied macros:
+% \changes{v0.901}{2021/08/20}{\pkg{array}: Fixed if \pkg{array} already loaed.}
 %    \begin{macrocode}
-\let\firsthline\relax
-\let\lasthline\relax
+\@ifpackageloaded{array}{}{%
+    \let\firsthline\relax
+    \let\lasthline\relax
+}
 
 \LWR at ProvidesPackagePass{array}[2018/12/30]
 %    \end{macrocode}
 %
+% Provide simplified column types for \HTML:
+% \changes{v0.901}{2021/08/12}{\pkg{array}: Improved \cs{newcolumntype} emulation.}
 %    \begin{macrocode}
+\HTMLnewcolumntype{w}[2]{#1}
+\HTMLnewcolumntype{W}[2]{#1}
+%    \end{macrocode}
+%
+% More \HTML\ versions:
+%    \begin{macrocode}
 \newcommand*{\LWR at HTML@firsthline}{\LWR at HTMLhline}%
 \LWR at expandableformatted{firsthline}
 
@@ -44999,6 +45426,7 @@
 %
 % \changes{v0.69}{2019/03/09}{\pkg{array}: Fix for \cs{tabularnewline}.}
 %    \begin{macrocode}
+\let\tabularnewline\\
 \providecommand*{\LWR at HTML@tabularnewline}{\LWR at tabularendofline}
 \LWR at formatted{tabularnewline}
 %    \end{macrocode}
@@ -48107,8 +48535,8 @@
 % \DescribePackage{cases}
 % \pkg{cases} is patched for use by \pkg{lwarp}.
 %
-% 
 % While using \brand{MathJax}, \pkg{cases} objects are converted to \SVG\ math images.
+% The MathJax 3.2 \pkg{cases} package does not yet work with \pkg{lwarp}.
 %
 % \changes{v0.58}{2018/06/08}{\pkg{cases}: Added.}
 %
@@ -48241,6 +48669,7 @@
 %
 % \changes{v0.80}{2020/02/08}{\pkg{centernot}: Added.}
 % \changes{v0.89}{2020/08/17}{\pkg{centernot}: Improved.}
+% \changes{v0.901}{2021/08/26}{\pkg{centernot}: Now uses \brand{MathJax} 3.2 package.}
 %
 % \codehtml
 %
@@ -48248,17 +48677,9 @@
 \LWR at ProvidesPackagePass{centernot}[2016/05/16]
 %    \end{macrocode}
 %
-% Based on \href{https://github.com/mathjax/MathJax/issues/2107}
-%   {\texttt{https://github.com/mathjax/MathJax/issues/2107}}
-%   with \cs{textstyle} removed to work with sub \Slash super scripts.
-%
 %    \begin{macrocode}
-\LWR at origRequirePackage{lwarp-common-mathjax-overlaysymbols}
-
 \begin{warpMathJax}
-\CustomizeMathJax{\newcommand{\centernot}[1]{%
-    \LWRoverlaysymbols{\unicode{x2215}}{#1}
-}}
+\CustomizeMathJax{\require{centernot}}
 \end{warpMathJax}
 %    \end{macrocode}
 %
@@ -51204,7 +51625,12 @@
 % inside the data area of the tabular.
 %
 % \changes{v0.57}{2018/06/02}{\pkg{colortbl}: New system for switching print and \HTML\ outputs.}
+%
+% \cs{columncolor} is provided here to satisfy \cs{LWR at formatted}'s test for
+% the existence of the print-mode macro.
 %    \begin{macrocode}
+\ProvideDocumentCommand{\columncolor}{O{named} m o o}{}%
+
 \NewDocumentCommand{\LWR at HTML@columncolor}{O{named} m o o}{%
     \convertcolorspec{#1}{#2}{HTML}\LWR at columnHTMLcolor%
     \LWR at addtabularcellcolor%
@@ -51296,13 +51722,31 @@
 %    \end{macrocode}
 % \end{noindmacro}
 
-% For \brand{MathJax}, colors are discarded.
+% For \brand{MathJax}, use the \brand{MathJax} package.
+% The unused macro options are ignored.
 % \changes{v0.894}{2020/12/22}{\pkg{colortbl}: Added \brand{MathJax} emulation.}
 %    \begin{macrocode}
 \begin{warpMathJax}
-\CustomizeMathJax{\newcommand{\columncolor}[2][]{\LWRabsorbtwooptions}}
-\CustomizeMathJax{\let\rowcolor\columncolor}
-\CustomizeMathJax{\let\cellcolor\columncolor}
+
+\CustomizeMathJax{\require{colortbl}}
+\CustomizeMathJax{\let\LWRorigcolumncolor\columncolor}
+\CustomizeMathJax{\renewcommand{\columncolor}[2][named]{%
+    \LWRorigcolumncolor[#1]{#2}%
+    \LWRabsorbtwooptions%
+}}
+
+\CustomizeMathJax{\let\LWRorigrowcolor\rowcolor}
+\CustomizeMathJax{\renewcommand{\rowcolor}[2][named]{%
+    \LWRorigrowcolor[#1]{#2}%
+    \LWRabsorbtwooptions%
+}}
+
+\CustomizeMathJax{\let\LWRorigcellcolor\cellcolor}
+\CustomizeMathJax{\renewcommand{\cellcolor}[2][named]{%
+    \LWRorigcellcolor[#1]{#2}%
+    \LWRabsorbtwooptions%
+}}
+
 \end{warpMathJax}
 %    \end{macrocode}
 
@@ -51775,14 +52219,31 @@
 % \label{sec:dcolumn}
 %
 % \changes{v0.22}{2017/02/24}{\pkg{dcolumn}: Added.}
+% \changes{v0.901}{2021/08/12}{\pkg{dcolumn}: Works inside \env{lateximage}.}
 %
 % \DescribePackage{dcolumn}
-% \pkg{dcolumn} is emulated by the \pkg{lwarp} core.
+% \pkg{dcolumn} is used as-is in a \env{lateximage}, and
+% is emulated by the \pkg{lwarp} core.
 %
+% \pkg{dcolumn} used to be \cs{LWR at ProvidesPackageDrop} in prior versions of \pkg{lwarp},
+% but is now supported for print mode.
+%
 %    \begin{macrocode}
-\LWR at ProvidesPackageDrop{dcolumn}[2014/10/28]
+\LWR at ProvidesPackagePass{dcolumn}[2014/10/28]
 %    \end{macrocode}
 %
+% Due to how the |D| column is created, cannot use \cs{HTMLnewcolumntype} here.
+% An \HTML\ version neutralizes the lower-level macros, leaving a |c| column type.
+%    \begin{macrocode}
+\newcommand*{\LWR at HTML@DC@}[3]{}
+\LWR at formatted{DC@}
+
+\providecommand*{\DC at end}{}
+
+\newcommand*{\LWR at HTML@DC at end}{}
+\LWR at formatted{DC at end}
+%    \end{macrocode}
+%
 % \iffalse
 %</dcolumn>
 % \fi
@@ -58169,9 +58630,10 @@
 %
 % \DescribePackage{gensymb}
 % \pkg{gensymb} works as-is for \SVG\ math, and
-% is emulated for \brand{MathJax}.
+% uses the \brand{MathJax} package.
 %
 % \changes{v0.80}{2020/02/09}{\pkg{gensymb}: Added.}
+% \changes{v0.901}{2021/08/26}{\pkg{gensymb}: Use \brand{MathJax} 3.2 package.}
 %
 % \codehtml
 %
@@ -58181,11 +58643,7 @@
 %
 %    \begin{macrocode}
 \begin{warpMathJax}
-\CustomizeMathJax{\newcommand{\degree}{\mathrm{^\circ}}}
-\CustomizeMathJax{\newcommand{\celsius}{\unicode{x2103}}}
-\CustomizeMathJax{\newcommand{\perthousand}{\unicode{x2030}}}
-\CustomizeMathJax{\newcommand{\ohm}{\mathrm{\Omega}}}
-\CustomizeMathJax{\newcommand{\micro}{\mathrm{\unicode{x00B5}}}}
+\CustomizeMathJax{\require{gensymb}}
 \end{warpMathJax}
 %    \end{macrocode}
 %
@@ -58620,6 +59078,7 @@
 \DeclareGraphicsRule{.SVG}{svg}{.SVG}{}
 }
 %    \end{macrocode}
+%
 % Inside a \env{lateximage}, allow \PDF\ instead of \SVG:
 % \changes{v0.61}{2018/10/06}{Fix: \EPS\ for \DVI\ \LaTeX.}
 %    \begin{macrocode}
@@ -59039,6 +59498,7 @@
 %    \begin{macrocode}
     \textquotedbl\LWR at indentHTML%
 %    \end{macrocode}
+%
 % Only include a style tag if a width, height, angle, or scale was given:
 % \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
@@ -59086,6 +59546,7 @@
         \textquotedbl\LWR at indentHTML%
     }{}%
 %    \end{macrocode}
+%
 % Set the class and alt tag:
 % \changes{v0.65}{2018/12/19}{\pkg{graphics}: Added \cs{includegraphics} \attribute{alt} key.}
 % \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
@@ -59195,11 +59656,18 @@
     \begingroup%
     \LetLtxMacro\Gin at setfile\LWR at HTML@Gin at setfile%
     \edef\LWR at tempone{#4}%
-    \StrSubstitute{\LWR at tempone}{.pdf}{.svg}[\LWR at tempone]%
-    \StrSubstitute{\LWR at tempone}{.PDF}{.SVG}[\LWR at tempone]%
+%    \end{macrocode}
+%
+% \PDF\ extensions are removed to allow a search for another
+% graphics format such as \SVG\ or \PNG.
+%    \begin{macrocode}
+    \StrSubstitute{\LWR at tempone}{.pdf}{}[\LWR at tempone]%
+    \StrSubstitute{\LWR at tempone}{.PDF}{}[\LWR at tempone]%
+%    \end{macrocode}
+%    \begin{macrocode}
     \LWR at replaceEPSSVG%
     \xdef\LWR at parsedfilename{\LWR at tempone}%
-    \Ginclude at graphics{\detokenize\expandafter{\LWR at tempone}}%
+    \Ginclude at graphics{\detokenize\expandafter{\LWR at parsedfilename}}%
     \endgroup%
     \filename at parse{\LWR at parsedfilename}%
 %    \end{macrocode}
@@ -62316,6 +62784,7 @@
 % \begin{noindenvironment}{KFLT at marginfloat} \oarg{offset} \marg{type}
 % \changes{v0.42}{2017/10/26}{\pkg{keyfloat}: If \progcode{FormatWP} add explicit \HTML\ style.}
 % \changes{v0.896}{2021/03/05}{\pkg{keyfloat}: Added \ARIA\ role.}
+% \changes{v0.901}{2021/08/22}{\pkg{keyfloat}: More room.}
 %    \begin{macrocode}
 \DeclareDocumentEnvironment{KFLT at marginfloat}{O{-1.2ex} m}
 {%
@@ -62326,7 +62795,7 @@
         (note)%
         {marginblock}%
     \renewcommand*{\@captype}{#2}%
-    \minipage{\LWR at usersmarginparwidth}%
+    \minipage{1.2\LWR at usersmarginparwidth}%
     \setlength{\marginparwidth}{.95\LWR at usersmarginparwidth}%
 }
 {%
@@ -64226,9 +64695,33 @@
 %
 %
 %
+% \iffalse
+%<*lltjp-tascmac>
+% \fi
 %
+% \part{lwarp-lltjp-tascmac.sty}
 %
+% \section{lltjp-tascmac}
+%
+% \DescribePackage{lltjp-tascmac}
+% \pkg{lltjp-tascmac} is a patch for \pkg{tascmac}, and is ignored.
+%
+% \changes{v0.901}{2021/08/19}{\pkg{lltjp-tascmac}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR at ProvidesPackageDrop{lltjp-tascmac}[2020/12/24]
+%    \end{macrocode}
+%
 % \iffalse
+%</lltjp-tascmac>
+% \fi
+%
+%
+%
+%
+% \iffalse
 %<*longtable>
 % \fi
 
@@ -64370,8 +64863,9 @@
 \def\endlastfoot{\LWR at longtable@headerror}
 %    \end{macrocode}
 %
-% \changes{v0.69}{2019/03/09}{\pkg{array}: Fix for \cs{tabularnewline}.}
+% \changes{v0.69}{2019/03/09}{\pkg{longtable}: Fix for \cs{tabularnewline}.}
 %    \begin{macrocode}
+\let\tabularnewline\\
 \providecommand*{\LWR at HTML@tabularnewline}{\LWR at tabularendofline}
 \LWR at formatted{tabularnewline}
 %    \end{macrocode}
@@ -64635,6 +65129,7 @@
 %    \end{macrocode}
 % \end{noindmacro}
 %
+%
 % \iffalse
 %</ltxtable>
 % \fi
@@ -66297,89 +66792,31 @@
 %    \end{macrocode}
 %
 %
-% For \brand{MathJax}:
+% For \brand{MathJax}.
 %
+% The \brand{MathJax} package is used, and improvements are added.
+%
 % \changes{v0.79}{2020/01/26}{\pkg{mathtools}: Added \brand{MathJax} emulation.}
 % \changes{v0.87}{2020/05/20}{\pkg{mathtools}: Updated starred macros.}
 % \changes{v0.87}{2020/05/20}{\pkg{mathtools}: Improved \cs{underbraket}, \cs{overbracket}.}
 % \changes{v0.891}{2020/09/19}{\pkg{mathtools}: Improved \cs{underbraket}, \cs{overbracket}.}
+% \changes{v0.901}{2021/08/26}{\pkg{mathtools}: Uses \brand{MathJax} 3.2 package.}
 %    \begin{macrocode}
 \begin{warpMathJax}
+\CustomizeMathJax{\require{mathtools}}
+
 \LWR at infoprocessingmathjax{mathtools}
 
-\CustomizeMathJax{\newcommand{\mathllap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\mathrlap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\mathclap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\mathmbox}[1]{#1}}
-\CustomizeMathJax{\newcommand{\clap}[1]{#1}}
-\CustomizeMathJax{\newcommand{\LWRmathmakebox}[2][]{#2}}
-\CustomizeMathJax{\newcommand{\mathmakebox}[1][]{\LWRmathmakebox}}
-\CustomizeMathJax{\newcommand{\cramped}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\crampedllap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\crampedrlap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\crampedclap}[2][]{{#1#2}}}
 \CustomizeMathJax{\newenvironment{crampedsubarray}[1]{}{}}
-\CustomizeMathJax{\newcommand{\crampedsubstack}{}}
-%    \end{macrocode}
-% \changes{v0.89}{2020/08/21}{\pkg{mathtools}: Minor improvements.}
-%    \begin{macrocode}
+
 \CustomizeMathJax{\newcommand{\smashoperator}[2][]{#2\limits}}
-%    \end{macrocode}
-% \changes{v0.89}{2020/08/21}{\pkg{mathtools}: Added \cs{adjustlimits}.}
-%    \begin{macrocode}
-\CustomizeMathJax{\newcommand{\adjustlimits}{}}
-%    \end{macrocode}
-%    \begin{macrocode}
+
 \CustomizeMathJax{\newcommand{\SwapAboveDisplaySkip}{}}
 
-\CustomizeMathJax{\require{extpfeil}}
-\CustomizeMathJax{\Newextarrow\xleftrightarrow{10,10}{0x2194}}
-\CustomizeMathJax{\Newextarrow\xLeftarrow{10,10}{0x21d0}}
-\CustomizeMathJax{\Newextarrow\xhookleftarrow{10,10}{0x21a9}}
-\CustomizeMathJax{\Newextarrow\xmapsto{10,10}{0x21a6}}
-\CustomizeMathJax{\Newextarrow\xRightarrow{10,10}{0x21d2}}
-\CustomizeMathJax{\Newextarrow\xLeftrightarrow{10,10}{0x21d4}}
-\CustomizeMathJax{\Newextarrow\xhookrightarrow{10,10}{0x21aa}}
-\CustomizeMathJax{\Newextarrow\xrightharpoondown{10,10}{0x21c1}}
-\CustomizeMathJax{\Newextarrow\xleftharpoondown{10,10}{0x21bd}}
-\CustomizeMathJax{\Newextarrow\xrightleftharpoons{10,10}{0x21cc}}
-\CustomizeMathJax{\Newextarrow\xrightharpoonup{10,10}{0x21c0}}
-\CustomizeMathJax{\Newextarrow\xleftharpoonup{10,10}{0x21bc}}
-\CustomizeMathJax{\Newextarrow\xleftrightharpoons{10,10}{0x21cb}}
-
-\CustomizeMathJax{\newcommand{\LWRdounderbracket}[3]{%
-    \mathinner{\underset{#3}{\underline{\llcorner{#1}\lrcorner}}}%
-}}
-\CustomizeMathJax{\newcommand{\LWRunderbracket}[2][]{\LWRdounderbracket{#2}}}
-\CustomizeMathJax{\newcommand{\underbracket}[1][]{\LWRunderbracket}}
-\CustomizeMathJax{\newcommand{\LWRdooverbracket}[3]{%
-    \mathinner{\overset{#3}{\overline{\ulcorner{#1}\urcorner}}}%
-}}
-\CustomizeMathJax{\newcommand{\LWRoverbracket}[2][]{\LWRdooverbracket{#2}}}
-\CustomizeMathJax{\newcommand{\overbracket}[1][]{\LWRoverbracket}}
-
 \CustomizeMathJax{\newcommand{\LaTeXunderbrace}[1]{\underbrace{#1}}}
 \CustomizeMathJax{\newcommand{\LaTeXoverbrace}[1]{\overbrace{#1}}}
 
-\CustomizeMathJax{\newenvironment{matrix*}[1][]{\begin{matrix}}{\end{matrix}}}
-\CustomizeMathJax{\newenvironment{pmatrix*}[1][]{\begin{pmatrix}}{\end{pmatrix}}}
-\CustomizeMathJax{\newenvironment{bmatrix*}[1][]{\begin{bmatrix}}{\end{bmatrix}}}
-\CustomizeMathJax{\newenvironment{Bmatrix*}[1][]{\begin{Bmatrix}}{\end{Bmatrix}}}
-\CustomizeMathJax{\newenvironment{vmatrix*}[1][]{\begin{vmatrix}}{\end{vmatrix}}}
-\CustomizeMathJax{\newenvironment{Vmatrix*}[1][]{\begin{Vmatrix}}{\end{Vmatrix}}}
-\CustomizeMathJax{\newenvironment{smallmatrix*}[1][]{\begin{matrix}}{\end{matrix}}}
-\CustomizeMathJax{\newenvironment{psmallmatrix*}[1][]{\begin{pmatrix}}{\end{pmatrix}}}
-\CustomizeMathJax{\newenvironment{bsmallmatrix*}[1][]{\begin{bmatrix}}{\end{bmatrix}}}
-\CustomizeMathJax{\newenvironment{Bsmallmatrix*}[1][]{\begin{Bmatrix}}{\end{Bmatrix}}}
-\CustomizeMathJax{\newenvironment{vsmallmatrix*}[1][]{\begin{vmatrix}}{\end{vmatrix}}}
-\CustomizeMathJax{\newenvironment{Vsmallmatrix*}[1][]{\begin{Vmatrix}}{\end{Vmatrix}}}
-\CustomizeMathJax{\newenvironment{psmallmatrix}[1][]{\begin{pmatrix}}{\end{pmatrix}}}
-\CustomizeMathJax{\newenvironment{bsmallmatrix}[1][]{\begin{bmatrix}}{\end{bmatrix}}}
-\CustomizeMathJax{\newenvironment{Bsmallmatrix}[1][]{\begin{Bmatrix}}{\end{Bmatrix}}}
-\CustomizeMathJax{\newenvironment{vsmallmatrix}[1][]{\begin{vmatrix}}{\end{vmatrix}}}
-\CustomizeMathJax{\newenvironment{Vsmallmatrix}[1][]{\begin{Vmatrix}}{\end{Vmatrix}}}
 
-
 \CustomizeMathJax{\newcommand{\LWRmultlined}[1][]{\begin{multline*}}}
 \CustomizeMathJax{\newenvironment{multlined}[1][]{\LWRmultlined}{\end{multline*}}}
 
@@ -66388,50 +66825,8 @@
 \CustomizeMathJax{\let\LWRorigshoveright\shoveright}
 \CustomizeMathJax{\renewcommand{\shoveright}[1][]{\LWRorigshoveright}}
 
-\CustomizeMathJax{\newenvironment{dcases}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{dcases*}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{rcases}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{rcases*}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{drcases}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{drcases*}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{cases*}{\begin{cases}}{\end{cases}}}
-
-\CustomizeMathJax{\newcommand{\MoveEqLeft}[1][]{}}
-
-\CustomizeMathJax{% special parsing to handle '&' in argument
-    \def\LWRAboxed#1&#2&#3!|!{\fbox{\(#1\)}&\fbox{\(#2\)}}
-    \newcommand{\Aboxed}[1]{\LWRAboxed#1&&!|!}
-}
-%    \end{macrocode}
-%
-% \changes{v0.86}{2020/05/09}{\pkg{mathtools}: Added \cs{ArrowBetweenLines*}.}
-%    \begin{macrocode}
-\CustomizeMathJax{
-    \newcommand{\LWRABLines}[1][\Updownarrow]{#1 \notag \\}% star/nostar the same
-    \newcommand{\ArrowBetweenLines}{\ifstar\LWRABLines\LWRABLines}
-}
-%    \end{macrocode}
-%
-% \changes{v0.85}{2020/05/01}{\pkg{mathtools}: Fixed: \cs{shortintertext}.}
-% \changes{v0.86}{2020/05/09}{\pkg{mathtools}: Added starred delimited macros.}
-%    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\shortintertext}[1]{\text{#1}\notag \\}}
 
-\CustomizeMathJax{\newcommand{\vdotswithin}[1]{\hspace{.5em}\vdots}}
-%    \end{macrocode}
-%
-% \changes{v0.86}{2020/05/09}{\pkg{mathtools}: Added \cs{shortvdotswithin*}.}
-%    \begin{macrocode}
-\CustomizeMathJax{\newcommand{\LWRshortvdotswithinstar}[1]{\vdots \hspace{.5em} & \\}}
-\CustomizeMathJax{\newcommand{\LWRshortvdotswithinnostar}[1]{& \hspace{.5em}\vdots \\}}
-\CustomizeMathJax{%
-    \newcommand{\shortvdotswithin}%
-        {\ifstar\LWRshortvdotswithinstar\LWRshortvdotswithinnostar}%
-}
-
-\CustomizeMathJax{\newcommand{\MTFlushSpaceAbove}{}}
-\CustomizeMathJax{\newcommand{\MTFlushSpaceBelow}{\\}}
-
 \LetLtxMacro\LWR at mathtools@orig at DeclarePairedDelimiter\DeclarePairedDelimiter
 \renewcommand{\DeclarePairedDelimiter}[3]{
     \LWR at mathtools@orig at DeclarePairedDelimiter{#1}{#2}{#3}
@@ -66537,44 +66932,8 @@
 \@onlypreamble\DeclareParedDelimiterXPP
 \@onlypreamble\DeclareParedDelimiterX
 
-\CustomizeMathJax{\newcommand\lparen{(}}
-\CustomizeMathJax{\newcommand\rparen{)}}
-\CustomizeMathJax{\newcommand{\ordinarycolon}{:}}
-%    \end{macrocode}
-% \changes{v0.89}{2020/08/21}{\pkg{mathtools}: Minor improvements.}
-% \changes{v0.891}{2020/09/08}{\pkg{mathtools}: Uses Unicode and \cs{mathrel}.}
-%    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\vcentcolon}{\mathrel{\unicode{x2236}}}}
 
-\CustomizeMathJax{\newcommand\dblcolon{\mathrel{\unicode{x2237}}}}
-\CustomizeMathJax{\newcommand\coloneqq{\mathrel{\unicode{x2236}\!=}}}
-\CustomizeMathJax{\newcommand\Coloneqq{\mathrel{\unicode{x2237}\!=}}}
-\CustomizeMathJax{\newcommand\coloneq{\mathrel{\unicode{x2236}-}}}
-\CustomizeMathJax{\newcommand\Coloneq{\mathrel{\unicode{x2237}-}}}
-
-\CustomizeMathJax{\newcommand\eqqcolon{\mathrel{=\!\unicode{x2236}}}}
-\CustomizeMathJax{\newcommand\Eqqcolon{\mathrel{=\!\unicode{x2237}}}}
-\CustomizeMathJax{\newcommand\eqcolon{\mathrel{-\unicode{x2236}}}}
-\CustomizeMathJax{\newcommand\Eqcolon{\mathrel{-\unicode{x2237}}}}
-
-\CustomizeMathJax{\newcommand\colonapprox{\mathrel{\unicode{x2236}\!\approx}}}
-\CustomizeMathJax{\newcommand\Colonapprox{\mathrel{\unicode{x2237}\!\approx}}}
-\CustomizeMathJax{\newcommand\colonsim{\mathrel{\unicode{x2236}\!\sim}}}
-\CustomizeMathJax{\newcommand\Colonsim{\mathrel{\unicode{x2237}\!\sim}}}
-
-%    \end{macrocode}
-% \changes{v0.89}{2020/08/21}{\pkg{mathtools}: Minor improvements.}
-%    \begin{macrocode}
-\CustomizeMathJax{\newcommand{\nuparrow}{\mathrel{\cancel{\uparrow}}}}
-\CustomizeMathJax{\newcommand{\ndownarrow}{\mathrel{\cancel{\downarrow}}}}
-\CustomizeMathJax{\newcommand{\bigtimes}{\mathop{\Large\times}\limits}}
-
-\CustomizeMathJax{\newcommand{\prescript}[3]{{}^{#1}_{#2}#3}}
-
-
-\CustomizeMathJax{\newenvironment{lgathered}{\begin{gathered}}{\end{gathered}}}
-\CustomizeMathJax{\newenvironment{rgathered}{\begin{gathered}}{\end{gathered}}}
-
 \LetLtxMacro\LWR at mathtools@orig at newgathered\newgathered
 \renewcommand{\newgathered}[4]{%
     \LWR at mathtools@orig at newgathered{#1}{#2}{#3}{#4}%
@@ -66586,8 +66945,6 @@
 }
 \@onlypreamble\newgathered
 
-\CustomizeMathJax{\newcommand{\splitfrac}[2]{{}^{#1}_{#2}}}
-\CustomizeMathJax{\let\splitdfrac\splitfrac}
 \end{warpMathJax}
 %    \end{macrocode}
 %
@@ -67773,7 +68130,7 @@
 % \pkg{lwarp} does not support
 % \trouble[nested math]{mhchem=\pkg{mhchem}>nested dollar signs}
 % the use of nested dollar signs in \pkg{mhchem} expressions.
-% \gindex{array>mhchem=\pkg{mhchem}}
+% \gindex{array=\env{array}>mhchem=\pkg{mhchem}}
 % \gindex{math>mhchem=\pkg{mhchem}}
 %
 % For some examples from the \pkg{mhchem} manual, change as follows:
@@ -69471,8 +69828,48 @@
 %
 %
 %
+% \iffalse
+%<*mwe>
+% \fi
 %
+% \part{lwarp-mwe.sty}
+%
+% \section{mwe}
+%
+% \credits{Martin Scharrer}
+%
+% \DescribePackage{mwe}
+% \pkg{mwe} is used as-is, but a warning is issued to copy the images
+% to the local directory.
+%
+% \changes{v0.901}{2021/08/02}{\pkg{mwe}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR at ProvidesPackagePass{mwe}[2018/03/30]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\AtEndDocument{%
+    \PackageWarningNoLine{lwarp}{%
+        For package mwe, copy any mwe images to be used for\MessageBreak
+        HTML, such as PNG or JPG, to the document's base\MessageBreak
+        directory.  Neither a subdirectory nor the mwe\MessageBreak
+        directory will work, due to the TeX file search\MessageBreak
+        algorithm%
+    }%
+}%
+%    \end{macrocode}
+%
 % \iffalse
+%</mwe>
+% \fi
+%
+%
+%
+%
+% \iffalse
 %<*nameauth>
 % \fi
 %
@@ -70790,6 +71187,11 @@
 % More approximations:
 %    \begin{macrocode}
 \CustomizeMathJax{\let\hdottedline\hdashline}
+%    \end{macrocode}
+%
+% \changes{v0.901}{2021/08/26}{\pkg{nicematrix}: Added \cs{Hline}.}
+%    \begin{macrocode}
+\CustomizeMathJax{\let\Hline\hline}
 
 \CustomizeMathJax{\newcommand{\ldots}[1][]{\dots}}
 \CustomizeMathJax{\newcommand{\Cdots}[1][]{\cdots}}
@@ -73027,8 +73429,8 @@
 %
 % Option \optn{link} and \optn{linkname} work:
 % \begin{Verbatim}[tabsize=4,gobble=2,frame=lines]
-% \hyperlink{<filename>.pdf.<pagenubmer}}{some text}
-% \hyperlink{<linkname>.<pagenubmer}}{some text}
+% \hyperlink{<filename>.pdf.<pagenubmer}{some text}
+% \hyperlink{<linkname>.<pagenubmer}{some text}
 % \end{Verbatim}
 %
 % Options which make no sense in \HTML\ are disabled.
@@ -77975,6 +78377,16 @@
     \DeclareSIUnit\planckbar{\LWR at siunitx@textplanckbar}
 }% AtBeginDocument
 %    \end{macrocode}
+
+% Support the |S| and |s| column types:
+% \changes{v0.901}{2021/08/18}{\pkg{siunitx}: Improved \cs{newcolumntype} emulation.}
+%    \begin{macrocode}
+\AtBeginDocument{
+\HTMLnewcolumntype{S}{c}
+\HTMLnewcolumntype{s}{c}
+}
+%    \end{macrocode}
+
 %
 % \cs{@ensuredmath} is not supported inside an \cs{hbox}, so it must
 % temporarily be restored to its original.
@@ -80006,7 +80418,7 @@
 \CustomizeMathJax{\newcommand{\iid}{\;\stackrel{\mb{\mathrm{iid}}}{\sim}\;}}
 \CustomizeMathJax{\newcommand{\ind}{\;\stackrel{\mb{\mathrm{ind}}}{\sim}\;}}
 \CustomizeMathJax{\newcommand{\indpr}{%
-    \;\stackrel{\mb{\mathrm{ind}}}{\stackrel{\mb{\mathrm{prior}}}{\sim}}\;%
+    \;\stackrel{\mb{\mathrm{ind}}}{\stackrel{\mb{\mathrm{prior}}}{\sim}}\;
 }}
 \CustomizeMathJax{\newcommand{\post}{\;\stackrel{\mb{\mathrm{post}}}{\sim}\;}}
 \CustomizeMathJax{\newcommand{\prior}{\;\stackrel{\mb{\mathrm{prior}}}{\sim}\;}}
@@ -81606,16 +82018,25 @@
 \RequirePackage{array}
 %    \end{macrocode}
 
+% \cs{tabularxcolumn} is ignored.
+% All |X| columns will be |p| for now.  The width is ignored.
+% \changes{v0.901}{2021/08/17}{\pkg{tabularx}: Improved \cs{newcolumntype} emulation.}
 %    \begin{macrocode}
+\def\tabularxcolumn#1{p{#1}}
+\newcolumntype{X}{p{1in}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \DeclareDocumentEnvironment{tabularx}{m o m}
-{\tabular{#3}}
-{\endtabular}
+    {\tabular{#3}}
+    {\endtabular}
 
 \DeclareDocumentEnvironment{tabularx*}{m o m}
-{\tabular{#3}}
-{\endtabular}
+    {\tabular{#3}}
+    {\endtabular}
 %    \end{macrocode}
-
+%
+%
 % \iffalse
 %</tabularx>
 % \fi
@@ -81659,7 +82080,17 @@
 \NewDocumentEnvironment{tabulary*}{m o m}
 {\tabular{#3}}
 {\endtabular}
-
+%    \end{macrocode}
+%
+% \changes{v0.901}{2021/08/17}{\pkg{tabulary}: Improved \cs{newcolumntype} emulation.}
+%    \begin{macrocode}
+\newcolumntype{L}{l}
+\newcolumntype{C}{c}
+\newcolumntype{R}{r}
+\newcolumntype{J}{l}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \newdimen\tymin
 \newdimen\tymax
 \def\tyformat{}
@@ -82484,6 +82915,9 @@
 % \DescribePackage{textcomp}
 % \pkg{textcomp} is patched for use by \pkg{lwarp}.
 %
+% For \brand{MathJax}, the \brand{MathJax} packge is used.
+%
+%
 % \subsection{Limitations}
 %
 % \limitstextcomp
@@ -82677,6 +83111,11 @@
 %    \end{macrocode}
 %
 %
+% For \brand{MathJax}:
+% \changes{v0.901}{2021/08/26}{\pkg{textcomp}: Uses \pkg{MathJax} 3.2 package.}
+%    \begin{macrocode}
+\CustomizeMathJax{\require{textcomp}}
+%    \end{macrocode}
 %
 % \iffalse
 %</textcomp>
@@ -86674,6 +87113,7 @@
 % emulated for \brand{MathJax}.
 %
 % \changes{v0.89}{2020/08/10}{\pkg{upgreek}: Added.}
+% \changes{v0.901}{2021/08/26}{\pkg{upgreek}: Use \brand{MathJax} package.}
 %
 % \codehtml
 %
@@ -86683,14 +87123,8 @@
 %
 % For \brand{MathJax}:
 %    \begin{macrocode}
-\LWR at origRequirePackage{lwarp-common-mathjax-letters}
-
 \begin{warpMathJax}
-\LWR at infoprocessingmathjax{upgreek}
-
-\LWR at mathjax@addgreek at l@up{up}{}
-\LWR at mathjax@addgreek at u@up{Up}{}
-
+\CustomizeMathJax{\require{upgreek}}
 \end{warpMathJax}
 %    \end{macrocode}
 %
@@ -88111,10 +88545,6 @@
 ]{colorbox}{#3}%
 \endgroup%
 }
-
-\AtBeginDocument{
-    \LWR at formatted{colorbox}
-}
 %    \end{macrocode}
 % \end{macro}
 
@@ -88148,10 +88578,6 @@
 %    \begin{macrocode}
 \global\booltrue{LWR at minipagethispar}%
 }
-
-\AtBeginDocument{
-    \LWR at formatted{colorboxBlock}
-}
 %    \end{macrocode}
 % \end{macro}
 
@@ -88185,10 +88611,6 @@
     }%
 \endgroup%
 }
-
-\AtBeginDocument{
-    \LWR at formatted{fcolorbox}
-}
 %    \end{macrocode}
 % \end{macro}
 
@@ -88239,10 +88661,6 @@
 \global\booltrue{LWR at minipagethispar}%
 \LWR at traceinfo{HTML fcolorboxBlock done}%
 }
-
-\AtBeginDocument{
-    \LWR at formatted{fcolorboxBlock}
-}
 %    \end{macrocode}
 % \end{macro}
 
@@ -88306,10 +88724,6 @@
 %    \begin{macrocode}
     \global\booltrue{LWR at minipagethispar}%
 }
-
-\AtBeginDocument{
-\LWR at formattedenv{fcolorminipage}
-}
 %    \end{macrocode}
 % \end{environment}
 %
@@ -88841,7 +89255,7 @@
 % Relies on \pkg{tabularx}.
 %
 % At present, an \env{xltabular} without a caption or with only a \cs{caption*}
-% \trouble[table numbering]{tabular>numbering}
+% \trouble[table numbering]{tabular=\env{tabular}>numbering}
 % \trouble{xltabular=\pkg{xltabular}>numbering}
 % may be misnumbered in \HTML, so it may be necessary to place at the end
 % of the table:

Modified: trunk/Master/texmf-dist/source/latex/lwarp/lwarp.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/lwarp/lwarp.ins	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/source/latex/lwarp/lwarp.ins	2021-08-28 20:38:00 UTC (rev 60345)
@@ -285,6 +285,7 @@
 \file{lwarp-listings.sty}{\from{lwarp.dtx}{listings}}
 \file{lwarp-listliketab.sty}{\from{lwarp.dtx}{listliketab}}
 \file{lwarp-lltjext.sty}{\from{lwarp.dtx}{lltjext}}
+\file{lwarp-lltjp-tascmac.sty}{\from{lwarp.dtx}{lltjp-tascmac}}
 \file{lwarp-longtable.sty}{\from{lwarp.dtx}{longtable}}
 \file{lwarp-lpic.sty}{\from{lwarp.dtx}{lpic}}
 \file{lwarp-lscape.sty}{\from{lwarp.dtx}{lscape}}
@@ -350,6 +351,7 @@
 \file{lwarp-multirow.sty}{\from{lwarp.dtx}{multirow}}
 \file{lwarp-multitoc.sty}{\from{lwarp.dtx}{multitoc}}
 \file{lwarp-musicography.sty}{\from{lwarp.dtx}{musicography}}
+\file{lwarp-mwe.sty}{\from{lwarp.dtx}{mwe}}
 \file{lwarp-nameauth.sty}{\from{lwarp.dtx}{nameauth}}
 \file{lwarp-nameref.sty}{\from{lwarp.dtx}{nameref}}
 \file{lwarp-natbib.sty}{\from{lwarp.dtx}{natbib}}

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-array.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-array.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-array.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -15,15 +15,20 @@
 %%   http://www.latex-project.org/lppl.txt
 %% and version 1.3 or later is part of all distributions of LaTeX
 %% version 2005/12/01 or later.
-\let\firsthline\relax
-\let\lasthline\relax
+\@ifpackageloaded{array}{}{%
+    \let\firsthline\relax
+    \let\lasthline\relax
+}
 
 \LWR at ProvidesPackagePass{array}[2018/12/30]
+\HTMLnewcolumntype{w}[2]{#1}
+\HTMLnewcolumntype{W}[2]{#1}
 \newcommand*{\LWR at HTML@firsthline}{\LWR at HTMLhline}%
 \LWR at expandableformatted{firsthline}
 
 \newcommand*{\LWR at HTML@lasthline}{\LWR at HTMLhline}%
 \LWR at expandableformatted{lasthline}
+\let\tabularnewline\\
 \providecommand*{\LWR at HTML@tabularnewline}{\LWR at tabularendofline}
 \LWR at formatted{tabularnewline}
 \CustomizeMathJax{

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-centernot.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-centernot.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-centernot.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -16,12 +16,8 @@
 %% and version 1.3 or later is part of all distributions of LaTeX
 %% version 2005/12/01 or later.
 \LWR at ProvidesPackagePass{centernot}[2016/05/16]
-\LWR at origRequirePackage{lwarp-common-mathjax-overlaysymbols}
-
 \begin{warpMathJax}
-\CustomizeMathJax{\newcommand{\centernot}[1]{%
-    \LWRoverlaysymbols{\unicode{x2215}}{#1}
-}}
+\CustomizeMathJax{\require{centernot}}
 \end{warpMathJax}
 \endinput
 %%

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-colortbl.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-colortbl.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-colortbl.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -18,6 +18,8 @@
 \let\rowcolor\relax
 
 \LWR at ProvidesPackagePass{colortbl}[2018/12/12]
+\ProvideDocumentCommand{\columncolor}{O{named} m o o}{}%
+
 \NewDocumentCommand{\LWR at HTML@columncolor}{O{named} m o o}{%
     \convertcolorspec{#1}{#2}{HTML}\LWR at columnHTMLcolor%
     \LWR at addtabularcellcolor%
@@ -59,9 +61,26 @@
 \AtBeginDocument{\LWR at expandableformatted{doublerulesepcolornexttoken}}
 
 \begin{warpMathJax}
-\CustomizeMathJax{\newcommand{\columncolor}[2][]{\LWRabsorbtwooptions}}
-\CustomizeMathJax{\let\rowcolor\columncolor}
-\CustomizeMathJax{\let\cellcolor\columncolor}
+
+\CustomizeMathJax{\require{colortbl}}
+\CustomizeMathJax{\let\LWRorigcolumncolor\columncolor}
+\CustomizeMathJax{\renewcommand{\columncolor}[2][named]{%
+    \LWRorigcolumncolor[#1]{#2}%
+    \LWRabsorbtwooptions%
+}}
+
+\CustomizeMathJax{\let\LWRorigrowcolor\rowcolor}
+\CustomizeMathJax{\renewcommand{\rowcolor}[2][named]{%
+    \LWRorigrowcolor[#1]{#2}%
+    \LWRabsorbtwooptions%
+}}
+
+\CustomizeMathJax{\let\LWRorigcellcolor\cellcolor}
+\CustomizeMathJax{\renewcommand{\cellcolor}[2][named]{%
+    \LWRorigcellcolor[#1]{#2}%
+    \LWRabsorbtwooptions%
+}}
+
 \end{warpMathJax}
 
 \endinput

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-dcolumn.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-dcolumn.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-dcolumn.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -15,7 +15,14 @@
 %%   http://www.latex-project.org/lppl.txt
 %% and version 1.3 or later is part of all distributions of LaTeX
 %% version 2005/12/01 or later.
-\LWR at ProvidesPackageDrop{dcolumn}[2014/10/28]
+\LWR at ProvidesPackagePass{dcolumn}[2014/10/28]
+\newcommand*{\LWR at HTML@DC@}[3]{}
+\LWR at formatted{DC@}
+
+\providecommand*{\DC at end}{}
+
+\newcommand*{\LWR at HTML@DC at end}{}
+\LWR at formatted{DC at end}
 \endinput
 %%
 %% End of file `lwarp-dcolumn.sty'.

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-gensymb.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-gensymb.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-gensymb.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -17,11 +17,7 @@
 %% version 2005/12/01 or later.
 \LWR at ProvidesPackagePass{gensymb}[2003/07/02]
 \begin{warpMathJax}
-\CustomizeMathJax{\newcommand{\degree}{\mathrm{^\circ}}}
-\CustomizeMathJax{\newcommand{\celsius}{\unicode{x2103}}}
-\CustomizeMathJax{\newcommand{\perthousand}{\unicode{x2030}}}
-\CustomizeMathJax{\newcommand{\ohm}{\mathrm{\Omega}}}
-\CustomizeMathJax{\newcommand{\micro}{\mathrm{\unicode{x00B5}}}}
+\CustomizeMathJax{\require{gensymb}}
 \end{warpMathJax}
 \endinput
 %%

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-graphics.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-graphics.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -334,11 +334,11 @@
     \begingroup%
     \LetLtxMacro\Gin at setfile\LWR at HTML@Gin at setfile%
     \edef\LWR at tempone{#4}%
-    \StrSubstitute{\LWR at tempone}{.pdf}{.svg}[\LWR at tempone]%
-    \StrSubstitute{\LWR at tempone}{.PDF}{.SVG}[\LWR at tempone]%
+    \StrSubstitute{\LWR at tempone}{.pdf}{}[\LWR at tempone]%
+    \StrSubstitute{\LWR at tempone}{.PDF}{}[\LWR at tempone]%
     \LWR at replaceEPSSVG%
     \xdef\LWR at parsedfilename{\LWR at tempone}%
-    \Ginclude at graphics{\detokenize\expandafter{\LWR at tempone}}%
+    \Ginclude at graphics{\detokenize\expandafter{\LWR at parsedfilename}}%
     \endgroup%
     \filename at parse{\LWR at parsedfilename}%
     \StrSubstitute{\LWR at parsedfilename}{//}{/}[\LWR at parsedfilename]%

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-keyfloat.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-keyfloat.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-keyfloat.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -230,7 +230,7 @@
         (note)%
         {marginblock}%
     \renewcommand*{\@captype}{#2}%
-    \minipage{\LWR at usersmarginparwidth}%
+    \minipage{1.2\LWR at usersmarginparwidth}%
     \setlength{\marginparwidth}{.95\LWR at usersmarginparwidth}%
 }
 {%

Added: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-lltjp-tascmac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-lltjp-tascmac.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-lltjp-tascmac.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -0,0 +1,21 @@
+%%
+%% This is file `lwarp-lltjp-tascmac.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lwarp.dtx  (with options: `lltjp-tascmac')
+%% This is a generated file.
+%% Copyright 2016-2020 Brian Dunn
+%% 
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% 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.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+\LWR at ProvidesPackageDrop{lltjp-tascmac}[2020/12/24]
+\endinput
+%%
+%% End of file `lwarp-lltjp-tascmac.sty'.


Property changes on: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-lltjp-tascmac.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-longtable.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-longtable.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-longtable.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -93,6 +93,7 @@
 \def\endfirsthead{\LWR at longtable@maybeheaderror}
 \def\endfoot{\LWR at longtable@headerror}
 \def\endlastfoot{\LWR at longtable@headerror}
+\let\tabularnewline\\
 \providecommand*{\LWR at HTML@tabularnewline}{\LWR at tabularendofline}
 \LWR at formatted{tabularnewline}
 \newcommand{\setlongtables}{}% Obsolete command, does nothing.

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mathtools.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mathtools.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mathtools.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -35,72 +35,19 @@
 \mathtoolsset{mathic=false}
 \MHInternalSyntaxOff
 \begin{warpMathJax}
+\CustomizeMathJax{\require{mathtools}}
+
 \LWR at infoprocessingmathjax{mathtools}
 
-\CustomizeMathJax{\newcommand{\mathllap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\mathrlap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\mathclap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\mathmbox}[1]{#1}}
-\CustomizeMathJax{\newcommand{\clap}[1]{#1}}
-\CustomizeMathJax{\newcommand{\LWRmathmakebox}[2][]{#2}}
-\CustomizeMathJax{\newcommand{\mathmakebox}[1][]{\LWRmathmakebox}}
-\CustomizeMathJax{\newcommand{\cramped}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\crampedllap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\crampedrlap}[2][]{{#1#2}}}
-\CustomizeMathJax{\newcommand{\crampedclap}[2][]{{#1#2}}}
 \CustomizeMathJax{\newenvironment{crampedsubarray}[1]{}{}}
-\CustomizeMathJax{\newcommand{\crampedsubstack}{}}
+
 \CustomizeMathJax{\newcommand{\smashoperator}[2][]{#2\limits}}
-\CustomizeMathJax{\newcommand{\adjustlimits}{}}
+
 \CustomizeMathJax{\newcommand{\SwapAboveDisplaySkip}{}}
 
-\CustomizeMathJax{\require{extpfeil}}
-\CustomizeMathJax{\Newextarrow\xleftrightarrow{10,10}{0x2194}}
-\CustomizeMathJax{\Newextarrow\xLeftarrow{10,10}{0x21d0}}
-\CustomizeMathJax{\Newextarrow\xhookleftarrow{10,10}{0x21a9}}
-\CustomizeMathJax{\Newextarrow\xmapsto{10,10}{0x21a6}}
-\CustomizeMathJax{\Newextarrow\xRightarrow{10,10}{0x21d2}}
-\CustomizeMathJax{\Newextarrow\xLeftrightarrow{10,10}{0x21d4}}
-\CustomizeMathJax{\Newextarrow\xhookrightarrow{10,10}{0x21aa}}
-\CustomizeMathJax{\Newextarrow\xrightharpoondown{10,10}{0x21c1}}
-\CustomizeMathJax{\Newextarrow\xleftharpoondown{10,10}{0x21bd}}
-\CustomizeMathJax{\Newextarrow\xrightleftharpoons{10,10}{0x21cc}}
-\CustomizeMathJax{\Newextarrow\xrightharpoonup{10,10}{0x21c0}}
-\CustomizeMathJax{\Newextarrow\xleftharpoonup{10,10}{0x21bc}}
-\CustomizeMathJax{\Newextarrow\xleftrightharpoons{10,10}{0x21cb}}
-
-\CustomizeMathJax{\newcommand{\LWRdounderbracket}[3]{%
-    \mathinner{\underset{#3}{\underline{\llcorner{#1}\lrcorner}}}%
-}}
-\CustomizeMathJax{\newcommand{\LWRunderbracket}[2][]{\LWRdounderbracket{#2}}}
-\CustomizeMathJax{\newcommand{\underbracket}[1][]{\LWRunderbracket}}
-\CustomizeMathJax{\newcommand{\LWRdooverbracket}[3]{%
-    \mathinner{\overset{#3}{\overline{\ulcorner{#1}\urcorner}}}%
-}}
-\CustomizeMathJax{\newcommand{\LWRoverbracket}[2][]{\LWRdooverbracket{#2}}}
-\CustomizeMathJax{\newcommand{\overbracket}[1][]{\LWRoverbracket}}
-
 \CustomizeMathJax{\newcommand{\LaTeXunderbrace}[1]{\underbrace{#1}}}
 \CustomizeMathJax{\newcommand{\LaTeXoverbrace}[1]{\overbrace{#1}}}
 
-\CustomizeMathJax{\newenvironment{matrix*}[1][]{\begin{matrix}}{\end{matrix}}}
-\CustomizeMathJax{\newenvironment{pmatrix*}[1][]{\begin{pmatrix}}{\end{pmatrix}}}
-\CustomizeMathJax{\newenvironment{bmatrix*}[1][]{\begin{bmatrix}}{\end{bmatrix}}}
-\CustomizeMathJax{\newenvironment{Bmatrix*}[1][]{\begin{Bmatrix}}{\end{Bmatrix}}}
-\CustomizeMathJax{\newenvironment{vmatrix*}[1][]{\begin{vmatrix}}{\end{vmatrix}}}
-\CustomizeMathJax{\newenvironment{Vmatrix*}[1][]{\begin{Vmatrix}}{\end{Vmatrix}}}
-\CustomizeMathJax{\newenvironment{smallmatrix*}[1][]{\begin{matrix}}{\end{matrix}}}
-\CustomizeMathJax{\newenvironment{psmallmatrix*}[1][]{\begin{pmatrix}}{\end{pmatrix}}}
-\CustomizeMathJax{\newenvironment{bsmallmatrix*}[1][]{\begin{bmatrix}}{\end{bmatrix}}}
-\CustomizeMathJax{\newenvironment{Bsmallmatrix*}[1][]{\begin{Bmatrix}}{\end{Bmatrix}}}
-\CustomizeMathJax{\newenvironment{vsmallmatrix*}[1][]{\begin{vmatrix}}{\end{vmatrix}}}
-\CustomizeMathJax{\newenvironment{Vsmallmatrix*}[1][]{\begin{Vmatrix}}{\end{Vmatrix}}}
-\CustomizeMathJax{\newenvironment{psmallmatrix}[1][]{\begin{pmatrix}}{\end{pmatrix}}}
-\CustomizeMathJax{\newenvironment{bsmallmatrix}[1][]{\begin{bmatrix}}{\end{bmatrix}}}
-\CustomizeMathJax{\newenvironment{Bsmallmatrix}[1][]{\begin{Bmatrix}}{\end{Bmatrix}}}
-\CustomizeMathJax{\newenvironment{vsmallmatrix}[1][]{\begin{vmatrix}}{\end{vmatrix}}}
-\CustomizeMathJax{\newenvironment{Vsmallmatrix}[1][]{\begin{Vmatrix}}{\end{Vmatrix}}}
-
 \CustomizeMathJax{\newcommand{\LWRmultlined}[1][]{\begin{multline*}}}
 \CustomizeMathJax{\newenvironment{multlined}[1][]{\LWRmultlined}{\end{multline*}}}
 
@@ -109,37 +56,8 @@
 \CustomizeMathJax{\let\LWRorigshoveright\shoveright}
 \CustomizeMathJax{\renewcommand{\shoveright}[1][]{\LWRorigshoveright}}
 
-\CustomizeMathJax{\newenvironment{dcases}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{dcases*}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{rcases}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{rcases*}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{drcases}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{drcases*}{\begin{cases}}{\end{cases}}}
-\CustomizeMathJax{\newenvironment{cases*}{\begin{cases}}{\end{cases}}}
-
-\CustomizeMathJax{\newcommand{\MoveEqLeft}[1][]{}}
-
-\CustomizeMathJax{% special parsing to handle '&' in argument
-    \def\LWRAboxed#1&#2&#3!|!{\fbox{\(#1\)}&\fbox{\(#2\)}}
-    \newcommand{\Aboxed}[1]{\LWRAboxed#1&&!|!}
-}
-\CustomizeMathJax{
-    \newcommand{\LWRABLines}[1][\Updownarrow]{#1 \notag \\}% star/nostar the same
-    \newcommand{\ArrowBetweenLines}{\ifstar\LWRABLines\LWRABLines}
-}
 \CustomizeMathJax{\newcommand{\shortintertext}[1]{\text{#1}\notag \\}}
 
-\CustomizeMathJax{\newcommand{\vdotswithin}[1]{\hspace{.5em}\vdots}}
-\CustomizeMathJax{\newcommand{\LWRshortvdotswithinstar}[1]{\vdots \hspace{.5em} & \\}}
-\CustomizeMathJax{\newcommand{\LWRshortvdotswithinnostar}[1]{& \hspace{.5em}\vdots \\}}
-\CustomizeMathJax{%
-    \newcommand{\shortvdotswithin}%
-        {\ifstar\LWRshortvdotswithinstar\LWRshortvdotswithinnostar}%
-}
-
-\CustomizeMathJax{\newcommand{\MTFlushSpaceAbove}{}}
-\CustomizeMathJax{\newcommand{\MTFlushSpaceBelow}{\\}}
-
 \LetLtxMacro\LWR at mathtools@orig at DeclarePairedDelimiter\DeclarePairedDelimiter
 \renewcommand{\DeclarePairedDelimiter}[3]{
     \LWR at mathtools@orig at DeclarePairedDelimiter{#1}{#2}{#3}
@@ -236,36 +154,8 @@
 \@onlypreamble\DeclareParedDelimiterXPP
 \@onlypreamble\DeclareParedDelimiterX
 
-\CustomizeMathJax{\newcommand\lparen{(}}
-\CustomizeMathJax{\newcommand\rparen{)}}
-\CustomizeMathJax{\newcommand{\ordinarycolon}{:}}
 \CustomizeMathJax{\newcommand{\vcentcolon}{\mathrel{\unicode{x2236}}}}
 
-\CustomizeMathJax{\newcommand\dblcolon{\mathrel{\unicode{x2237}}}}
-\CustomizeMathJax{\newcommand\coloneqq{\mathrel{\unicode{x2236}\!=}}}
-\CustomizeMathJax{\newcommand\Coloneqq{\mathrel{\unicode{x2237}\!=}}}
-\CustomizeMathJax{\newcommand\coloneq{\mathrel{\unicode{x2236}-}}}
-\CustomizeMathJax{\newcommand\Coloneq{\mathrel{\unicode{x2237}-}}}
-
-\CustomizeMathJax{\newcommand\eqqcolon{\mathrel{=\!\unicode{x2236}}}}
-\CustomizeMathJax{\newcommand\Eqqcolon{\mathrel{=\!\unicode{x2237}}}}
-\CustomizeMathJax{\newcommand\eqcolon{\mathrel{-\unicode{x2236}}}}
-\CustomizeMathJax{\newcommand\Eqcolon{\mathrel{-\unicode{x2237}}}}
-
-\CustomizeMathJax{\newcommand\colonapprox{\mathrel{\unicode{x2236}\!\approx}}}
-\CustomizeMathJax{\newcommand\Colonapprox{\mathrel{\unicode{x2237}\!\approx}}}
-\CustomizeMathJax{\newcommand\colonsim{\mathrel{\unicode{x2236}\!\sim}}}
-\CustomizeMathJax{\newcommand\Colonsim{\mathrel{\unicode{x2237}\!\sim}}}
-
-\CustomizeMathJax{\newcommand{\nuparrow}{\mathrel{\cancel{\uparrow}}}}
-\CustomizeMathJax{\newcommand{\ndownarrow}{\mathrel{\cancel{\downarrow}}}}
-\CustomizeMathJax{\newcommand{\bigtimes}{\mathop{\Large\times}\limits}}
-
-\CustomizeMathJax{\newcommand{\prescript}[3]{{}^{#1}_{#2}#3}}
-
-\CustomizeMathJax{\newenvironment{lgathered}{\begin{gathered}}{\end{gathered}}}
-\CustomizeMathJax{\newenvironment{rgathered}{\begin{gathered}}{\end{gathered}}}
-
 \LetLtxMacro\LWR at mathtools@orig at newgathered\newgathered
 \renewcommand{\newgathered}[4]{%
     \LWR at mathtools@orig at newgathered{#1}{#2}{#3}{#4}%
@@ -277,8 +167,6 @@
 }
 \@onlypreamble\newgathered
 
-\CustomizeMathJax{\newcommand{\splitfrac}[2]{{}^{#1}_{#2}}}
-\CustomizeMathJax{\let\splitdfrac\splitfrac}
 \end{warpMathJax}
 \endinput
 %%

Added: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mwe.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mwe.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mwe.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -0,0 +1,30 @@
+%%
+%% This is file `lwarp-mwe.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lwarp.dtx  (with options: `mwe')
+%% This is a generated file.
+%% Copyright 2016-2020 Brian Dunn
+%% 
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% 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.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+\LWR at ProvidesPackagePass{mwe}[2018/03/30]
+\AtEndDocument{%
+    \PackageWarningNoLine{lwarp}{%
+        For package mwe, copy any mwe images to be used for\MessageBreak
+        HTML, such as PNG or JPG, to the document's base\MessageBreak
+        directory.  Neither a subdirectory nor the mwe\MessageBreak
+        directory will work, due to the TeX file search\MessageBreak
+        algorithm%
+    }%
+}%
+\endinput
+%%
+%% End of file `lwarp-mwe.sty'.


Property changes on: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-mwe.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-nicematrix.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-nicematrix.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-nicematrix.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -97,6 +97,7 @@
     }%
 }
 \CustomizeMathJax{\let\hdottedline\hdashline}
+\CustomizeMathJax{\let\Hline\hline}
 
 \CustomizeMathJax{\newcommand{\ldots}[1][]{\dots}}
 \CustomizeMathJax{\newcommand{\Cdots}[1][]{\cdots}}

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-siunitx-v2.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-siunitx-v2.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-siunitx-v2.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -29,6 +29,12 @@
     \DeclareSIUnit\planckbar{\LWR at siunitx@textplanckbar}
 }% AtBeginDocument
 
+\AtBeginDocument{
+\HTMLnewcolumntype{S}{c}
+\HTMLnewcolumntype{s}{c}
+}
+
+
 \ExplSyntaxOn
 \cs_set_protected:Npn \__siunitx_print_aux:
   {

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-statex2.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-statex2.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-statex2.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -86,7 +86,7 @@
 \CustomizeMathJax{\newcommand{\iid}{\;\stackrel{\mb{\mathrm{iid}}}{\sim}\;}}
 \CustomizeMathJax{\newcommand{\ind}{\;\stackrel{\mb{\mathrm{ind}}}{\sim}\;}}
 \CustomizeMathJax{\newcommand{\indpr}{%
-    \;\stackrel{\mb{\mathrm{ind}}}{\stackrel{\mb{\mathrm{prior}}}{\sim}}\;%
+    \;\stackrel{\mb{\mathrm{ind}}}{\stackrel{\mb{\mathrm{prior}}}{\sim}}\;
 }}
 \CustomizeMathJax{\newcommand{\post}{\;\stackrel{\mb{\mathrm{post}}}{\sim}\;}}
 \CustomizeMathJax{\newcommand{\prior}{\;\stackrel{\mb{\mathrm{prior}}}{\sim}\;}}

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabularx.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabularx.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabularx.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -20,14 +20,15 @@
 \LWR at ProvidesPackageDrop{tabularx}[2016/02/03]
 \RequirePackage{array}
 
+\def\tabularxcolumn#1{p{#1}}
+\newcolumntype{X}{p{1in}}
 \DeclareDocumentEnvironment{tabularx}{m o m}
-{\tabular{#3}}
-{\endtabular}
+    {\tabular{#3}}
+    {\endtabular}
 
 \DeclareDocumentEnvironment{tabularx*}{m o m}
-{\tabular{#3}}
-{\endtabular}
-
+    {\tabular{#3}}
+    {\endtabular}
 \endinput
 %%
 %% End of file `lwarp-tabularx.sty'.

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabulary.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabulary.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-tabulary.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -27,7 +27,10 @@
 \NewDocumentEnvironment{tabulary*}{m o m}
 {\tabular{#3}}
 {\endtabular}
-
+\newcolumntype{L}{l}
+\newcolumntype{C}{c}
+\newcolumntype{R}{r}
+\newcolumntype{J}{l}
 \newdimen\tymin
 \newdimen\tymax
 \def\tyformat{}

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-textcomp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-textcomp.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-textcomp.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -153,6 +153,7 @@
 }% FilenameNullify
 
 }% AtBeginDocument
+\CustomizeMathJax{\require{textcomp}}
 \endinput
 %%
 %% End of file `lwarp-textcomp.sty'.

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-upgreek.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-upgreek.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-upgreek.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -16,14 +16,8 @@
 %% and version 1.3 or later is part of all distributions of LaTeX
 %% version 2005/12/01 or later.
 \LWR at ProvidesPackagePass{upgreek}[2003/02/12]
-\LWR at origRequirePackage{lwarp-common-mathjax-letters}
-
 \begin{warpMathJax}
-\LWR at infoprocessingmathjax{upgreek}
-
-\LWR at mathjax@addgreek at l@up{up}{}
-\LWR at mathjax@addgreek at u@up{Up}{}
-
+\CustomizeMathJax{\require{upgreek}}
 \end{warpMathJax}
 \endinput
 %%

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-xcolor.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-xcolor.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp-xcolor.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -111,10 +111,6 @@
 \endgroup%
 }
 
-\AtBeginDocument{
-    \LWR at formatted{colorbox}
-}
-
 \NewDocumentCommand{\LWR at HTML@colorboxBlock}{O{named} m +m}{%
 \begingroup%
 \LWR at hook@processingtags%
@@ -129,10 +125,6 @@
 \global\booltrue{LWR at minipagethispar}%
 }
 
-\AtBeginDocument{
-    \LWR at formatted{colorboxBlock}
-}
-
 \NewDocumentCommand{\LWR at HTML@fcolorbox}{O{named} m O{#1} m +m}{%
 \LWR at traceinfo{HTML fcolorbox #2 #4}%
 \begingroup%
@@ -153,10 +145,6 @@
 \endgroup%
 }
 
-\AtBeginDocument{
-    \LWR at formatted{fcolorbox}
-}
-
 \NewDocumentCommand{\LWR at HTML@fcolorboxBlock}{O{named} m O{#1} m +m}{%
 \LWR at traceinfo{HTML fcolorboxBlock #2 #4}%
 \begingroup%
@@ -185,10 +173,6 @@
 \LWR at traceinfo{HTML fcolorboxBlock done}%
 }
 
-\AtBeginDocument{
-    \LWR at formatted{fcolorboxBlock}
-}
-
 \NewDocumentCommand{\LWR at subfcolorminipage}{m m m m}{%
 \LWR at stoppars%
 \begin{BlockClass}[%
@@ -218,10 +202,6 @@
     \end{BlockClass}%
     \global\booltrue{LWR at minipagethispar}%
 }
-
-\AtBeginDocument{
-\LWR at formattedenv{fcolorminipage}
-}
 \newcommand*{\LWR at HTML@boxframe}[3]{%
 {%
 \setlength{\LWR at tempwidth}{#1}%

Modified: trunk/Master/texmf-dist/tex/latex/lwarp/lwarp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/lwarp/lwarp.sty	2021-08-28 20:36:53 UTC (rev 60344)
+++ trunk/Master/texmf-dist/tex/latex/lwarp/lwarp.sty	2021-08-28 20:38:00 UTC (rev 60345)
@@ -17,7 +17,7 @@
 %% version 2005/12/01 or later.
 \NeedsTeXFormat{LaTeX2e}[1999/12/01]
 \ProvidesPackage{lwarp}
-    [2021/07/17 v0.900  Allows LaTeX to directly produce HTML5 output.]
+    [2021/08/27 v0.901  Allows LaTeX to directly produce HTML5 output.]
 
 
 
@@ -195,6 +195,7 @@
 \LWR at checkloadnever{cals}{}
 \LWR at checkloadnever{cellspace}{}
 \LWR at checkloadnever{cgloss4e}{}
+\LWR at checkloadnever{collcell}{}
 \LWR at checkloadnever{colophon}{}
 \LWR at checkloadnever{cooltooltips}{}
 \LWR at checkloadnever{covington}{}
@@ -508,6 +509,7 @@
 \LWR at loadafter{lips}
 \LWR at loadafter{listings}
 \LWR at loadafter{listliketab}
+\LWR at loadafter{lltjp-tascmac}
 \LWR at loadafter{longtable}
 \LWR at loadafter{lpic}
 \LWR at loadafter{lscape}
@@ -568,6 +570,7 @@
 \LWR at loadafter{multirow}
 \LWR at loadafter{multitoc}
 \LWR at loadafter{musicography}
+\LWR at loadafter{mwe}
 \LWR at loadafter{nameauth}
 \LWR at loadafter{nameref}
 \LWR at loadafter{natbib}
@@ -1330,6 +1333,16 @@
     {\LWR at excludecomment{warpMathJax}{mathjax}}
 \end{warpHTML}
 
+\begin{warpprint}
+\LWR at includecomment{warpsvg}{mathsvg}
+\end{warpprint}
+
+\begin{warpHTML}
+\ifbool{mathjax}
+    {\LWR at excludecomment{warpsvg}{mathsvg}}
+    {\LWR at includecomment{warpsvg}{mathsvg}}
+\end{warpHTML}
+
 \ifbool{LWR at creatinglwarpmk}
     {\LWR at includecomment{LWRcreatelwarpmk}{lwarpmk}}
     {\LWR at excludecomment{LWRcreatelwarpmk}{lwarpmk}}
@@ -1816,21 +1829,43 @@
 \begin{warpHTML}
 \newcommand*{\LWR at formatting}{HTML}
 \newcommand*{\LWR at formatted@checkname}[1]{%
+    \ifcsundef{#1}{%
+        \ifcsundef{LWR at print@#1}{%
+            \PackageError{lwarp}
+            {%
+                \LWRbackslash#1 or \protect\LWR at print@#1\MessageBreak
+                must be defined before using \protect\LWR at formatted, etc%
+            }
+            {Perhaps #1 is misspelled.}
+        }{\relax}%
+    }{\relax}%
     \ifcsundef{LWR at HTML@#1}{%
         \PackageError{lwarp}
         {%
-            \protect\LWR at HTML@#1 is not defined%
+            \protect\LWR at HTML@#1 must be defined
+            before using \protect\LWR at formatted, etc%
         }
-        {Perhaps it is misspelled.}
+        {Perhaps #1 is misspelled.}
     }{\relax}%
 }
 \newcommand*{\LWR at formatted@checkendname}[1]{%
+    \ifcsundef{end#1}{%
+        \ifcsundef{endLWR at print@#1}{%
+            \PackageError{lwarp}
+            {%
+                \protect\end#1 or \protect\endLWR at print@#1\MessageBreak
+                must be defined before using \protect\LWR at formatted, etc%
+            }
+            {Perhaps #1 is misspelled.}
+        }{\relax}%
+    }{\relax}%
     \ifcsundef{endLWR at HTML@#1}{%
         \PackageError{lwarp}
         {%
-            \protect\endLWR at HTML@#1 is not defined%
+            \protect\endLWR at HTML@#1 must be defined
+            before using \protect\LWR at formatted, etc%
         }
-        {Perhaps it is misspelled.}
+        {Perhaps #1 is misspelled.}
     }{\relax}%
 }
 \newcommand*{\LWR at formatted}[1]{%
@@ -1899,6 +1934,15 @@
 }
 \end{warpHTML}
 
+\begin{warpprint}
+
+\newcommand*{\LWR at formatted}[1]{}
+\newcommand*{\LWR at expandableformatted}[1]{}
+\newcommand*{\LWR at formattedenv}[1]{}
+\newcommand*{\LWR at expandableformattedenv}[1]{}
+
+\end{warpprint}
+
 \begin{warpall}
 \newbool{FormatEPUB}
 \boolfalse{FormatEPUB}
@@ -2430,10 +2474,12 @@
 
 pre { padding: 3pt ; }
 
-span.strong, span.textbf, div.strong, div.textbf { font-weight: bold; }
+span.strong, span.textbf, div.strong, div.textbf, table td.tdbfseries { font-weight: bold; }
 
-span.textit, div.textit { font-style: italic; }
+span.textit, div.textit, table td.tditshape { font-style: italic; }
 
+table td.tdbfit { font-weight: bold ; font-style:italic }
+
 span.textmd, div.textmd { font-weight: normal; }
 
 span.textup, div.textup {
@@ -3311,6 +3357,12 @@
 
 div.figurecaption .minipage { margin:0 ; padding: 0 }
 
+/* for subcaptions: */
+figure div.minipage div.figurecaption {
+    max-width: 100% ;   /* fallback if min() does not work */
+    max-width: min(30em,100%)
+}
+
 div.minipage figure { border: none ; box-shadow: none ; }
 div.minipage figure.table { margin: 0ex }
 div.minipage div.footnotes { margin: 1ex 2em 0ex 2em }
@@ -3322,14 +3374,22 @@
 div.floatfoot { font-size: .85em ;
     border-top: 1px solid silver ; line-height: 1.2 ; }
 
+/* Center if only one line, "start" align if more than one line: */
 div.figurecaption , .lstlistingtitle {
     font-size: .85em ;
-    text-align: center ;
     font-weight: bold ;
-    margin-top: 1ex ;
-    margin-bottom: 1ex ;
+    text-align: start ;
+    margin: 1ex auto;
+    width: max-content;
+    max-width: 100%;
 }
 
+/* A marginblock is small, so always center and don't mess with the width. */
+div.marginblock div.figurecaption {
+    width: 100% ;
+    text-align: center ;
+}
+
 figure.subfigure div.figurecaption, figure.subtable div.figurecaption  {
     border-bottom: none ; background: none ;
 }
@@ -3391,9 +3451,6 @@
 table td.tdp { text-align: left ; vertical-align: bottom ; }
 table td.tdm { text-align: left ; vertical-align: middle ; }
 table td.tdb { text-align: left ; vertical-align: top ; }
-table td.tdP { text-align: center ; vertical-align: bottom ; }
-table td.tdM { text-align: center ; vertical-align: middle ; }
-table td.tdB { text-align: center ; vertical-align: top ; }
 
 table td.tvertbarl { border-left: 1px solid black }
 table td.tvertbarldouble { border-left: 4px double black }
@@ -3405,6 +3462,10 @@
 table td.tvertbarrdash { border-right: 1px dashed black }
 table td.tvertbarrdoubledash { border-right: 2px dashed black }
 
+table td.tdcenter { text-align: center}
+table td.tdleft { text-align: left}
+table td.tdright { text-align: right}
+
 /* for cmidrules: */
 table td.tdrule {
     border-top: 1px solid #A0A0A0 ;
@@ -4762,7 +4823,7 @@
 
 -- Copyright 2016-2021 Brian Dunn
 
-printversion = "v0.900"
+printversion = "v0.901"
 requiredconfversion = "2" -- also at *lwarpmk.conf
 
 function printhelp ()
@@ -9104,7 +9165,7 @@
 }
 
 \newcommand*{\LWR at colparameter}{}
-\newcommand*{\LWR at parseatcolumn}{%
+\newcommand*{\LWR at parseatcolumn}[1]{%
     \LWR at traceinfo{at column}%
     \defaddtocounter{LWR at tablecolspecindex}{1}%
     \LWR at traceinfo{about to read the next token:}%
@@ -9134,7 +9195,7 @@
     \let\LWR at colparameter\relax%
     \booltrue{LWR at validtablecol}%
 }
-\newcommand*{\LWR at parsebangcolumn}{%
+\newcommand*{\LWR at parsebangcolumn}[1]{%
     \LWR at traceinfo{bang column}%
     \defaddtocounter{LWR at tablecolspecindex}{1}%
     \LWR at traceinfo{about to read the next token:}%
@@ -9160,24 +9221,56 @@
     \let\LWR at colparameter\relax%
     \booltrue{LWR at validtablecol}%
 }
-\newcommand*{\LWR at parsebeforecolumn}{%
+\newcommand*{\LWR at checkbeforeaddclass}[2]{%
+    \ifcsstrequal{LWR at tempone}{#1}%
+        {%
+            \LWR at setexparray{LWR at coladdclass}%
+                {\arabic{LWR at tabletotalLaTeXcolsnext}}%
+                { #2}% space is intentional
+        }{}%
+}
+\newcommand*{\LWR at checkmathcolpar}{%
+    \IfSubStr{\detokenize\expandafter{\LWR at colparameter}}{\LWRdollar}%
+        {%
+            \PackageError{lwarp}%
+                {%
+                    Lwarp does not support `$' in column specifiers.\MessageBreak
+                    Specify `$' math for each cell in the column.\MessageBreak
+                    Enter 'h' for more info%
+                }%
+                {%
+                    For example, replace `>{$}c<{$}' with `c', and then\MessageBreak
+                    use `$cell contents$' for each cell in the column.%
+                }%
+        }{}%
+}
+\newcommand*{\LWR at parsebeforecolumn}[1]{%
     \defaddtocounter{LWR at tablecolspecindex}{1}%
     \expandarg%
     \StrChar{\LWR at origcolspec}%
         {\arabic{LWR at tablecolspecindex}}[\LWR at colparameter]%
     \fullexpandarg%
+    \LWR at checkmathcolpar%
     \LWR at setexparray{LWR at colbeforespec}%
         {\arabic{LWR at tabletotalLaTeXcolsnext}}%
         {\expandafter\@firstofone\LWR at colparameter}%
+    \edef\LWR at tempone{\expandafter\@firstofone\LWR at colparameter}%
+    \LWR at checkbeforeaddclass{LWR at detect@centeringarraybackslash}{tdcenter}
+    \LWR at checkbeforeaddclass{LWR at detect@raggedrightarraybackslash}{tdleft}
+    \LWR at checkbeforeaddclass{LWR at detect@raggedleftarraybackslash}{tdright}
+    \LWR at checkbeforeaddclass{LWR at detect@itshape}{tditshape}
+    \LWR at checkbeforeaddclass{LWR at detect@bfseries}{tdbfseries}
+    \LWR at checkbeforeaddclass{LWR at detect@bfit}{tdbfit}
     \let\LWR at colparameter\relax%
     \booltrue{LWR at validtablecol}%
 }
-\newcommand*{\LWR at parseaftercolumn}{%
+\newcommand*{\LWR at parseaftercolumn}[1]{%
     \defaddtocounter{LWR at tablecolspecindex}{1}%
     \expandarg%
     \StrChar{\LWR at origcolspec}%
         {\arabic{LWR at tablecolspecindex}}[\LWR at colparameter]%
     \fullexpandarg%
+    \LWR at checkmathcolpar%
     \LWR at setexparray{LWR at colafterspec}%
         {\arabic{LWR at tabletotalLaTeXcols}}%
         {\expandafter\@firstofone\LWR at colparameter}%
@@ -9184,7 +9277,7 @@
     \let\LWR at colparameter\relax%
     \booltrue{LWR at validtablecol}%
 }
-\newcommand*{\LWR at parsebarcolumn}{%
+\newcommand*{\LWR at parsebarcolumn}[1]{%
     \LWR at traceinfo{LWR at parsebarcolumn}%
     \ifnumcomp{\value{LWR at tabletotalLaTeXcols}}{=}{0}%
     {% left edge of the table:
@@ -9209,7 +9302,7 @@
     }%
     \booltrue{LWR at validtablecol}%
 }
-\newcommand*{\LWR at parsecoloncolumn}{%
+\newcommand*{\LWR at parsecoloncolumn}[1]{%
     \LWR at traceinfo{LWR at parsecoloncolumn}%
     \ifnumcomp{\value{LWR at tabletotalLaTeXcols}}{=}{0}%
     {% left edge of the table:
@@ -9230,11 +9323,10 @@
     }%
     \booltrue{LWR at validtablecol}%
 }
-\newcommand*{\LWR at parsesemicoloncolumn}{%
-    \LWR at parsecoloncolumn%
-    \defaddtocounter{LWR at tablecolspecindex}{1}%
+\newcommand*{\LWR at parsesemicoloncolumn}[1]{%
+    \LWR at parsecoloncolumn{}%
 }
-\newcommand*{\LWR at parsenormalcolumn}[1]{%
+\newcommand*{\LWR at HTML@LWR at parsenormalcolumn}[1]{%
     \defaddtocounter{LWR at tabletotalLaTeXcols}{1}%
     \defaddtocounter{LWR at tabletotalLaTeXcolsnext}{1}%
     \LWR at setexparray{LWR at tablecolspec}{\arabic{LWR at tabletotalLaTeXcols}}{#1}%
@@ -9244,71 +9336,111 @@
     \LWR at setexparray{LWR at colbeforespec}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
     \LWR at setexparray{LWR at colafterspec}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
     \LWR at setexparray{LWR at colbarspec}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
+    \LWR at setexparray{LWR at coladdclass}{\arabic{LWR at tabletotalLaTeXcolsnext}}{}%
     \booltrue{LWR at validtablecol}%
 }
 
-\newcommand*{\LWR at parsepcolumn}[1]{%
-    \LWR at parsenormalcolumn{#1}%
-    \defaddtocounter{LWR at tablecolspecindex}{1}%
-}
+\newcommand*{\LWR at print@LWR at parsenormalcolumn}[1]{}
 
-\newcommand*{\LWR at parsewcolumn}{%
+\LWR at formatted{LWR at parsenormalcolumn}
+
+\newcommand*{\LWR at parsewcolumn}[1]{%
     \LWR at columnspeclookahead{1}%
     \expandafter\LWR at parsenormalcolumn\expandafter{\LWR at strresulttwo}%
-    \defaddtocounter{LWR at tablecolspecindex}{2}%
 }
 
-\newcommand*{\LWR at parsestarcolumn}{%
-    \defaddtocounter{LWR at tablecolspecindex}{2}%
-}
+\newcommand*{\LWR at parsestarcolumn}[1]{}
 
-\newcommand*{\LWR at parseDcolumn}[1]{%
-    \LWR at parsenormalcolumn{#1}%
-    \defaddtocounter{LWR at tablecolspecindex}{3}%
+
+\newcommand*{\LWR at expandpreamble}[1]{%
+    \edef\@tempa{\@temptokena={#1}}%
+    \@tempa%
+    \@tempswatrue%
+    \@whilesw\if at tempswa\fi{%
+        \@tempswafalse\the\NC at list%
+    }%
 }
 
 
-\newcount\LWR at starcount
-\newcommand*{\LWR at expcolspec}{}
-\newcounter{LWR at splitstarindex}
-\newcounter{LWR at splitstarcopies}
-\newcommand*{\LWR at splitstarcontents}{}
-\newcommand*{\expandcolspec}{%
-    \StrPosition{\LWR at origcolspec}{*}[\LWR at tempone]%
-    \whileboolexpr{ test {\ifnumgreater{\LWR at tempone}{0}}}%
-    {%
-        \setcounter{LWR at splitstarindex}{\LWR at tempone}%
-        \addtocounter{LWR at splitstarindex}{-1}%
-        \StrLeft{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\LWR at expcolspec]%
-        \addtocounter{LWR at splitstarindex}{2}%
-        \StrChar{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\LWR at tempone]%
-        \setcounter{LWR at splitstarcopies}{\expandafter\@firstofone\LWR at tempone}%
-        \addtocounter{LWR at splitstarindex}{1}%
-        \StrChar{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\LWR at splitstarcontents]%
-        \ifnumgreater{\value{LWR at splitstarcopies}}{0}%
-        {%
-            \LWR at starcount=\value{LWR at splitstarcopies}%
-            \loop
-                \appto\LWR at expcolspec{%
-                    \expandafter\@firstofone\LWR at splitstarcontents%
+\newcommand*{\LWR at modifycolumntype}[5]{%
+    \LWR at traceinfo{LWR at modifycolumntype !#1!#2!#3!#4!#5!}%
+            \LWR at traceinfo{LWR at modifycolumntype #1}%
+            \edef\@tempa{%
+                \noexpand\csdef{LWR at columntype@#1}{%
+                    \noexpand\@nameuse{#3}{#1}%
+                    \noexpand\defaddtocounter{LWR at tablecolspecindex}{#2}%
                 }%
-                \advance \LWR at starcount -1
-            \ifnum \LWR at starcount>0 \repeat
-        }{}%
-        \StrGobbleLeft{\LWR at origcolspec}{\value{LWR at splitstarindex}}[\colspecremainder]%
-        \appto{\LWR at expcolspec}{\colspecremainder}%
-        \edef\LWR at origcolspec{\LWR at expcolspec}%
-        \StrPosition{\LWR at origcolspec}{*}[\LWR at tempone]%
-    }%
+                \noexpand\csdef{LWR at columntype@mctype@#1}{%
+                    \noexpand\@nameuse{#4}{#1}%
+                }%
+                \noexpand\csdef{LWR at columntype@mcdata@#1}{%
+                    \noexpand\@nameuse{#5}{#2}%
+                }%
+            }%
+            \@tempa%
+    \LWR at traceinfo{LWR at modifycolumntype done}%
 }
 
+\LWR at modifycolumntype{l}{0}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
 
+\LWR at modifycolumntype{c}{0}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+
+\LWR at modifycolumntype{r}{0}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+\LWR at modifycolumntype{@}{0}{LWR at parseatcolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{!}{0}{LWR at parsebangcolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{>}{0}{LWR at parsebeforecolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{<}{0}{LWR at parseaftercolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@other}
+
+\LWR at modifycolumntype{|}{0}{LWR at parsebarcolumn}
+    {LWR at printmccoltype@vertbar}{LWR at printmccoldata@skip}
+
+\LWR at modifycolumntype{:}{0}{LWR at parsecoloncolumn}
+    {LWR at printmccoltype@colon}{LWR at printmccoldata@skip}
+
+\LWR at modifycolumntype{;}{1}{LWR at parsesemicoloncolumn}
+    {LWR at printmccoltype@semicolon}{LWR at printmccoldata@skip}
+\LWR at modifycolumntype{p}{1}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@paragraph}
+
+\LWR at modifycolumntype{m}{1}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@paragraph}
+
+\LWR at modifycolumntype{b}{1}{LWR at parsenormalcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@paragraph}
+\LWR at modifycolumntype{w}{2}{LWR at parsewcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+
+\LWR at modifycolumntype{W}{2}{LWR at parsewcolumn}
+    {LWR at printmccoltype@normal}{LWR at printmccoldata@normal}
+\LWR at modifycolumntype{*}{2}{LWR at parsestarcolumn}
+    {LWR at printmccoltype@ignore}{LWR at printmccoldata@skip}
+\NewDocumentCommand{\HTMLnewcolumntype}{m O{0} m}{%
+    \expandafter\newcommand\expandafter*%
+        \csname LWR at HTML@NC at rewrite@#1\endcsname[#2]{\NC at find #3}%
+    \LWR at formatted{NC at rewrite@#1}%
+}
+\end{warpHTML}
+\begin{warpprint}
+\NewDocumentCommand{\HTMLnewcolumntype}{m O{0} m}{}
+\end{warpprint}
+\begin{warpHTML}
 \newcommand*{\LWR at parsetablecols}[1]{%
     \LWR at traceinfo{LWR at parsetablecols}%
     \renewcommand*{\LWR at origcolspec}{#1}%
     \expandarg%
     \StrSubstitute{\LWR at origcolspec}{ }{}[\LWR at origcolspec]%
-    \expandcolspec%
+    \LWR at expandpreamble{\LWR at origcolspec}%
+    \edef\LWR at origcolspec{\the\@temptokena}%
     \defcounter{LWR at tabletotalLaTeXcols}{0}%
     \defcounter{LWR at tabletotalLaTeXcolsnext}{1}%
     \LWR at setexparray{LWR at colatspec}{leftedge}{}%
@@ -9329,6 +9461,9 @@
     \LWR at setexparray{LWR at colbarspec}{1}{}%
     \LWR at setexparray{LWR at colbarspec}{2}{}%
     \LWR at setexparray{LWR at colbarspec}{3}{}%
+    \LWR at setexparray{LWR at coladdclass}{1}{}%
+    \LWR at setexparray{LWR at coladdclass}{2}{}%
+    \LWR at setexparray{LWR at coladdclass}{3}{}%
     \defcounter{LWR at tablecolspecindex}{1}%
     \expandarg%
     \StrLen{\LWR at origcolspec}[\LWR at strresult]%
@@ -9352,37 +9487,13 @@
     \ifbool{LWR at opttablecol}%
     {}% inside an optional argument
     {% not an optional tabular argument
-    \IfStrEq{\LWR at strresult}{l}{\LWR at parsenormalcolumn{l}}{}%
-    \IfStrEq{\LWR at strresult}{c}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{r}{\LWR at parsenormalcolumn{r}}{}%
-    \IfStrEq{\LWR at strresult}{L}{\LWR at parsenormalcolumn{l}}{}%
-    \IfStrEq{\LWR at strresult}{C}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{R}{\LWR at parsenormalcolumn{r}}{}%
-    \IfStrEq{\LWR at strresult}{J}{\LWR at parsenormalcolumn{l}}{}%
-    \IfStrEq{\LWR at strresult}{S}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{s}{\LWR at parsenormalcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{\detokenize{@}}{\LWR at parseatcolumn}{}%
-    \IfStrEq{\LWR at strresult}{!}{\LWR at parsebangcolumn}{}%
-    \IfStrEq{\LWR at strresult}{>}{\LWR at parsebeforecolumn}{}%
-    \IfStrEq{\LWR at strresult}{<}{\LWR at parseaftercolumn}{}%
-    \IfStrEq{\LWR at strresult}{|}{\LWR at parsebarcolumn}{}%
-    \IfStrEq{\LWR at strresult}{:}{\LWR at parsecoloncolumn}{}%
-    \IfStrEq{\LWR at strresult}{;}{\LWR at parsesemicoloncolumn}{}%
-    \IfStrEq{\LWR at strresult}{p}{\LWR at parsepcolumn{p}}{}%
-    \IfStrEq{\LWR at strresult}{m}{\LWR at parsepcolumn{m}}{}%
-    \IfStrEq{\LWR at strresult}{b}{\LWR at parsepcolumn{b}}{}%
-    \IfStrEq{\LWR at strresult}{w}{\LWR at parsewcolumn}{}%
-    \IfStrEq{\LWR at strresult}{W}{\LWR at parsewcolumn}{}%
-    \IfStrEq{\LWR at strresult}{*}{\LWR at parsestarcolumn}{}%
-    \IfStrEq{\LWR at strresult}{D}{\LWR at parseDcolumn{c}}{}%
-    \IfStrEq{\LWR at strresult}{X}{\LWR at parsenormalcolumn{X}}{}%
-    \IfStrEq{\LWR at strresult}{P}{\LWR at parsepcolumn{P}}{}%
-    \IfStrEq{\LWR at strresult}{M}{\LWR at parsepcolumn{M}}{}%
-    \IfStrEq{\LWR at strresult}{B}{\LWR at parsepcolumn{B}}{}%
-    \ifbool{LWR at validtablecol}{}{%
-        \LWR at traceinfo{invalid column type: \LWR at strresult}%
-        \LWR at parsenormalcolumn{l}%
-    }%
+        \ifcsdef{LWR at columntype@\LWR at strresult}%
+            {\csuse{LWR at columntype@\LWR at strresult}}%
+            {}%
+        \ifbool{LWR at validtablecol}{}{%
+            \LWR at traceinfo{invalid column type: \LWR at strresult}%
+            \LWR at parsenormalcolumn{l}%
+        }%
     }% not an optional column argument
     \IfStrEq{\LWR at strresult}{]}{\boolfalse{LWR at opttablecol}}{}%
     \defaddtocounter{LWR at tablecolspecindex}{1}%
@@ -9471,8 +9582,8 @@
             \LWR at tdendstyles%
         }%
         \ifboolexpr{bool{LWR at tabularmutemods} or bool{LWR at emptyatbang}}%
-        {}%
-        {\LWR at atbangspec}%
+            {}%
+            {\LWR at atbangspec}%
         \LWR at htmltag{/td}\LWR at orignewline%
         \global\booltrue{LWR at tabularcelladded}%
     }% not empty
@@ -9515,6 +9626,8 @@
                 \LWR at addcmidruletrim%
                 \LWR at addleftmostbartag%
                 \LWR at printbartag{\arabic{LWR at tableLaTeXcolindex}}%
+                \LWR at getexparray{LWR at coladdclass}%
+                    {\arabic{LWR at tableLaTeXcolindex}}%
                 \textquotedbl{}%
                 \LWR at tdstartstyles%
                 \LWR at addcmidrulewidth%
@@ -9532,11 +9645,7 @@
             \ifboolexpr{%
                 test{ \ifdefstring{\LWR at strresult}{p} } or
                 test{ \ifdefstring{\LWR at strresult}{m} } or
-                test{ \ifdefstring{\LWR at strresult}{b} } or
-                test{ \ifdefstring{\LWR at strresult}{P} } or
-                test{ \ifdefstring{\LWR at strresult}{M} } or
-                test{ \ifdefstring{\LWR at strresult}{B} } or
-                test{ \ifdefstring{\LWR at strresult}{X} }
+                test{ \ifdefstring{\LWR at strresult}{b} }
             }%
             {% allow pars
                 \LWR at traceinfo{LWR at tabledatasinglecolumntag: about to LWR at startpars}%
@@ -9725,9 +9834,6 @@
         \IfSubStr{#1}{p}{\LWR at WPcell{left}{bottom}}{}%
         \IfSubStr{#1}{m}{\LWR at WPcell{left}{middle}}{}%
         \IfSubStr{#1}{b}{\LWR at WPcell{left}{top}}{}%
-        \IfSubStr{#1}{P}{\LWR at WPcell{center}{bottom}}{}%
-        \IfSubStr{#1}{M}{\LWR at WPcell{center}{middle}}{}%
-        \IfSubStr{#1}{B}{\LWR at WPcell{center}{top}}{}%
     }{}%
 }
 
@@ -9872,100 +9978,70 @@
 
 
 
+\newcommand*{\LWR at printmccoltype@normal}[1]{%
+    #1%
+    \boolfalse{LWR at mcolvertbaronleft}%
+}
+
+\newcommand*{\LWR at printmccoltype@ignore}[1]{}%
+
+\newcommand*{\LWR at printmccoltype@vertbar}[1]{%
+    \ifbool{LWR at mcolvertbaronleft}%
+        {\defaddtocounter{LWR at mcolvertbarsl}{1}}% left edge
+        {\defaddtocounter{LWR at mcolvertbarsr}{1}}% not left edge
+}
+
+\newcommand*{\LWR at printmccoltype@colon}[1]{%
+    \ifbool{LWR at mcolvertbaronleft}%
+        {\defaddtocounter{LWR at mcolvertbarsldash}{1}}% left edge
+        {\defaddtocounter{LWR at mcolvertbarsrdash}{1}}% not left edge
+}
+
+\let\LWR at printmccoltype@semicolon\LWR at printmccoltype@colon
+
 \newcommand*{\LWR at printmccoltype}[1]{%
     \LWR at traceinfo{lwr at printmccoltype -#1-}%
     \StrChar{#1}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
-    \IfStrEq{\LWR at strresult}{l}{l}{}%
-    \IfStrEq{\LWR at strresult}{c}{c}{}%
-    \IfStrEq{\LWR at strresult}{r}{r}{}%
-    \IfStrEq{\LWR at strresult}{p}{p}{}%
-    \IfStrEq{\LWR at strresult}{m}{m}{}%
-    \IfStrEq{\LWR at strresult}{b}{b}{}%
-    \IfStrEq{\LWR at strresult}{P}{P}{}%
-    \IfStrEq{\LWR at strresult}{M}{M}{}%
-    \IfStrEq{\LWR at strresult}{B}{B}{}%
-    \IfStrEq{\LWR at strresult}{w}{w}{}%
-    \IfStrEq{\LWR at strresult}{W}{W}{}%
-    \IfStrEq{\LWR at strresult}{S}{c}{}%
-    \IfStrEq{\LWR at strresult}{s}{c}{}%
-    \IfStrEq{\LWR at strresult}{X}{p}{}%
-    \IfStrEq{\LWR at strresult}{|}%
-    {%
-        \ifbool{LWR at mcolvertbaronleft}%
-            {\defaddtocounter{LWR at mcolvertbarsl}{1}}% left edge
-            {\defaddtocounter{LWR at mcolvertbarsr}{1}}% not left edge
-    }%
-    {%
-        \IfStrEq{\LWR at strresult}{:}%
-        {%
-            \ifbool{LWR at mcolvertbaronleft}%
-                {\defaddtocounter{LWR at mcolvertbarsldash}{1}}% left edge
-                {\defaddtocounter{LWR at mcolvertbarsrdash}{1}}% not left edge
-        }%
-        {%
-            \IfStrEq{\LWR at strresult}{;}%
-            {%
-                \ifbool{LWR at mcolvertbaronleft}%
-                    {\defaddtocounter{LWR at mcolvertbarsldash}{1}}% left edge
-                    {\defaddtocounter{LWR at mcolvertbarsrdash}{1}}% not left edge
-            }%
-            {\boolfalse{LWR at mcolvertbaronleft}}%
-        }%
-    }%
+    \edef\LWR at strresult{\detokenize\expandafter{\LWR at strresult}}%
+    \ifcsdef{LWR at columntype@mctype@\LWR at strresult}%
+        {\csuse{LWR at columntype@mctype@\LWR at strresult}}%
+        {\boolfalse{LWR at mcolvertbaronleft}}%
     \LWR at traceinfo{lwr at printmccoltype done}%
 }
 
-\newcommand*{\LWR at multicolpartext}[1]{%
-    \LWR at startpars%
-    \LWR at multicoltext%
-    \defaddtocounter{LWR at tablemulticolspos}{#1}%
-    \LWR at stoppars%
-}
-
-\newcommand*{\LWR at multicolother}[1]{%
+\newcommand*{\LWR at printmccoldata@other}[2]{%
     \defaddtocounter{LWR at tablemulticolspos}{1}%
-    \StrChar{#1}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
+    \StrChar{#2}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
     \LWR at strresult%
     \booltrue{LWR at validtablecol}%
 }
 
-\newcommand*{\LWR at multicolskip}{%
+\newcommand*{\LWR at printmccoldata@skip}[2]{%
+    \defaddtocounter{LWR at tablemulticolspos}{#1}%
     \booltrue{LWR at validtablecol}%
 }
 
+
+\newcommand*{\LWR at printmccoldata@normal}[2]{%
+    \LWR at multicoltext%
+    \defaddtocounter{LWR at tablemulticolspos}{#1}%
+}
+
+\newcommand*{\LWR at printmccoldata@paragraph}[2]{%
+    \LWR at startpars%
+    \LWR at multicoltext%
+    \defaddtocounter{LWR at tablemulticolspos}{#1}%
+    \LWR at stoppars%
+}
+
 \newcommand*{\LWR at printmccoldata}[1]{%
     \LWR at traceinfo{lwr at printmccoldata -#1}%
     \boolfalse{LWR at validtablecol}%
     \StrChar{#1}{\arabic{LWR at tablemulticolspos}}[\LWR at strresult]%
     \edef\LWR at printmccoldatatoken{\LWR at strresult}%
-    \IfStrEq{\LWR at printmccoldatatoken}{l}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{c}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{r}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{D}{%
-        \defaddtocounter{LWR at tablemulticolspos}{3}% skip parameters
-        \LWR at multicoltext%
-    }{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{p}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{m}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{b}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{P}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{M}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{B}{\LWR at multicolpartext{2}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{w}{\LWR at multicolpartext{3}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{W}{\LWR at multicolpartext{3}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{S}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{s}{\LWR at multicoltext}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{X}{\LWR at multicolpartext{1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{|}{\LWR at multicolskip}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{:}{\LWR at multicolskip}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{;}{%
-        \LWR at multicolskip%
-        \defaddtocounter{LWR at tablemulticolspos}{1}% skip parameter
-    }{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{@}}{\LWR at multicolother{#1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{!}}{\LWR at multicolother{#1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{>}}{\LWR at multicolother{#1}}{}%
-    \IfStrEq{\LWR at printmccoldatatoken}{\detokenize{<}}{\LWR at multicolother{#1}}{}%
+    \ifcsdef{LWR at columntype@mcdata@\LWR at printmccoldatatoken}%
+        {\csuse{LWR at columntype@mcdata@\LWR at printmccoldatatoken}{#1}}%
+        {}%
     \ifbool{LWR at validtablecol}{}{\LWR at multicoltext{}}%
     \LWR at traceinfo{lwr at printmccoldata done}%
 }
@@ -9981,7 +10057,7 @@
         }%
     }%
     {%
-        #2{#1}%
+        \csuse{#2}{#1}%
         \defaddtocounter{LWR at tablemulticolspos}{1}%
     }%
 }
@@ -10034,6 +10110,8 @@
         #6%
         \booltrue{LWR at validtablecol}%
     }%
+    \LWR at expandpreamble{#5}%
+    \edef\LWR at origmccolspec{\the\@temptokena}%
     \defcounter{LWR at lastmulticolumn}{\value{LWR at tableLaTeXcolindex}}%
     \defaddtocounter{LWR at lastmulticolumn}{#3}%
     \defaddtocounter{LWR at lastmulticolumn}{-1}%
@@ -10049,7 +10127,7 @@
         \defcounter{LWR at mcolvertbarsldash}{0}%
         \defcounter{LWR at mcolvertbarsrdash}{0}%
         \booltrue{LWR at mcolvertbaronleft}%
-        \LWR at parsemulticolumnalignment{#5}{\LWR at printmccoltype}%
+        \LWR at parsemulticolumnalignment{\LWR at origmccolspec}{LWR at printmccoltype}%
         \LWR at subaddcmidruletrim%
             {%
                 \LWR at getexparray{LWR at trimlrules}%
@@ -10088,11 +10166,11 @@
         \LWR at addcdashline%
         \LWR at addtabularhrulecolor%
         \LWR at addmulticolvertrulecolor%
-        \LWR at addformatwpalignment{#5}%
+        \LWR at addformatwpalignment{\LWR at origmccolspec}%
         \LWR at tdendstyles%
     }% end of the opening table data tag
     \boolfalse{LWR at intabularmetadata}%
-    \LWR at parsemulticolumnalignment{#5}{\LWR at printmccoldata}%
+    \LWR at parsemulticolumnalignment{\LWR at origmccolspec}{LWR at printmccoldata}%
 }
 
 
@@ -10117,7 +10195,7 @@
     \LWR at tabularhtmlcolumns{1}{\arabic{LWR at tabletotalLaTeXcols}}%
     \LWR at domulticolumn{\arabic{LWR at tabletotalLaTeXcols}}%
         {\arabic{LWR at tabhtmlcoltotal}}%
-        {P}%
+        {p}%
     {% \LWR at domulticolumn
     \IfBooleanTF{#1}% star?
     {% yes star
@@ -13190,6 +13268,12 @@
     {\LWR at print@fcolorminipage}
     {\endLWR at print@fcolorminipage}
 
+\LWR at formatted{colorbox}
+\LWR at formatted{colorboxBlock}
+\LWR at formatted{fcolorbox}
+\LWR at formatted{fcolorboxBlock}
+\LWR at formattedenv{fcolorminipage}
+
 \LWR at traceinfo{xcolor patches done}
 }{}% xcolor loaded
 }% AtBeginDocument
@@ -13597,6 +13681,7 @@
 
 \LWR at formatted{textbf}
 
+\@ifpackageloaded{nfssext-cfr}{
 \DeclareRobustCommand{\LWR at HTML@texteb}[1]{%
     {%
         \LWR at HTML@ebweight%
@@ -13605,7 +13690,11 @@
 }
 
 \LWR at formatted{texteb}
+}{% if not loaded
+    \providerobustcmd{\texteb}[1]{}
+}
 
+\@ifpackageloaded{nfssext-cfr}{
 \DeclareRobustCommand{\LWR at HTML@textlg}[1]{%
     {%
         \LWR at HTML@lgweight%
@@ -13614,6 +13703,9 @@
 }
 
 \LWR at formatted{textlg}
+}{% if not loaded
+    \providerobustcmd{\textlg}[1]{}
+}
 
 \DeclareRobustCommand{\LWR at HTML@textrm}[1]{%
     {%
@@ -13776,17 +13868,21 @@
 }
 \LWR at formatted{bfseries}
 
+\@ifpackageloaded{nfssext-cfr}{
 \newrobustcmd*{\LWR at HTML@ebweight}{%
     \LWR at print@ebweight%
     \renewcommand*{\LWR at f@series}{eb}%
 }
 \LWR at formatted{ebweight}
+}{}
 
+\@ifpackageloaded{nfssext-cfr}{
 \newrobustcmd*{\LWR at HTML@lgweight}{%
     \LWR at print@lgweight%
     \renewcommand*{\LWR at f@series}{lg}%
 }
 \LWR at formatted{lgweight}
+}{}
 
 \newrobustcmd*{\LWR at HTML@rmfamily}{%
     \LWR at print@rmfamily%
@@ -14316,6 +14412,16 @@
 \end{warpHTML}
 
 \begin{warpHTML}
+\RequirePackage{array}
+\edef\LWR at detect@centeringarraybackslash{\centering\arraybackslash}
+\edef\LWR at detect@raggedrightarraybackslash{\raggedright\arraybackslash}
+\edef\LWR at detect@raggedleftarraybackslash{\raggedleft\arraybackslash}
+\def\LWR at detect@itshape{\itshape}
+\def\LWR at detect@bfseries{\bfseries}
+\def\LWR at detect@bfit{\bfseries\itshape}
+\end{warpHTML}
+
+\begin{warpHTML}
 \AtBeginDocument{
     \@ifpackageloaded{everyshi}{
         \RequirePackage{lwarp-everyshi}
@@ -14595,6 +14701,7 @@
             {Keys/values are ignored in MathJax.\MessageBreak
             \protect\Cdots, etc. do not span multiple cells.\MessageBreak
             AutoNiceMatrix, etc. are not supported for MathJax.\MessageBreak
+            \protect\CodeBefore\space cannot be done with MathJax.\MessageBreak
             \LWR at forceSVGmessage{nicematrix}%
             }
         \LWR at nomathjaxwarn{pb-diagram}



More information about the tex-live-commits mailing list.