From f670508774c35b585b520fa9217d156664b4cb2a Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Fri, 19 Feb 2021 03:01:02 +0000
Subject: CTAN sync 202102190301

---
 macros/latex/contrib/lwarp/lwarp.dtx | 2873 ++++++++++++++++++++++++++++------
 1 file changed, 2404 insertions(+), 469 deletions(-)

(limited to 'macros/latex/contrib/lwarp/lwarp.dtx')

diff --git a/macros/latex/contrib/lwarp/lwarp.dtx b/macros/latex/contrib/lwarp/lwarp.dtx
index 397c835190..51892df0c1 100644
--- a/macros/latex/contrib/lwarp/lwarp.dtx
+++ b/macros/latex/contrib/lwarp/lwarp.dtx
@@ -1,7 +1,7 @@
 %
 % \iffalse meta-comment
 %
-% Copyright 2016-2020 Brian Dunn
+% Copyright 2016-2021 Brian Dunn
 %
 % This work may be distributed and/or modified under the
 % conditions of the LaTeX Project Public License, either version 1.3
@@ -16,7 +16,7 @@
 % \iffalse
 %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
 %<package>\ProvidesPackage{lwarp}
-%<package>    [2020/12/24 v0.894  Allows LaTeX to directly produce HTML5 output.]
+%<package>    [2021/02/18 v0.895  Allows LaTeX to directly produce HTML5 output.]
 %
 %<*driver>
 \documentclass{ltxdoc}
@@ -25,7 +25,7 @@
 
 \usepackage{lmodern}
 \usepackage{libertine}
-\usepackage[space]{erewhon}
+% *88* \usepackage[space]{erewhon}
 \usepackage[varqu,varl]{inconsolata} % typewriter
 % \usepackage{roboto}% conflicts with \textsc inside a float
 % \usepackage{sourcecodepro}
@@ -85,7 +85,8 @@
 \newunicodechar{฿}{\textbaht}
 \newunicodechar{℠}{\textservicemark}
 
-\usepackage[log-declarations=false]{xparse}
+% \usepackage[log-declarations=false]{xparse}
+\usepackage{xparse}
 
 \usepackage{ifptex}% *8* remove later
 
@@ -1315,7 +1316,7 @@ Limitations when using \brand{MathJax} include:
 \item Math appearing inside a lateximage,
     \margintag{lateximage}
     and therefore also inside a \tikz\ or \env{picture}
-    environment, is rendered as SVG math even if \brand{MathJax}
+    environment, is rendered as \SVG\ math even if \brand{MathJax}
     is used in the rest of the document.
 
 \item For \pkg{siunitx},
@@ -1375,7 +1376,7 @@ package.
 \DescribeMacro{\inlinemathnormal}
 \DescribeMacro{\inlinemathother}
 An inline math expression is usually converted to a reusable hashed \SVG\ math
-image, or a MathJax expression.  The hash or expression depends on the contents
+image, or a \brand{MathJax} expression.  The hash or expression depends on the contents
 of the math expression.  In most cases this math expression is static, such as \texttt{\$x+1\$},
 so the image can be reused for multiples instances of the same expression.
 In some cases,
@@ -1390,7 +1391,7 @@ Yet another problem is math packages which are only partially emulated
 in \brand{MathJax}.
 The macro \cs{inlinemathother} may be used before a sequence of dynamic or complicated
 math expressions, and \cs{inlinemathnormal} after.  Doing so tells \pkg{lwarp} to
-use unhashed \SVG\ math images for those particular expressins, even if MathJax
+use unhashed \SVG\ math images for those particular expressins, even if \brand{MathJax}
 is otherwise in use.
 See \cref{sec:localizingdynamicmath}.
 }
@@ -1410,7 +1411,7 @@ When selecting \cs{displaymathother},
 it is assumed that the contents are more complicated than ``pure''
 math.
 An example is an elaborate \tikz\ picture,
-\margintag{MathJax unsupported}
+\margintag{\brand{MathJax} unsupported}
 which will not render in \brand{MathJax} and
 will not make sense as an \HTML\ \attribute{alt} tag.
 \margintag{complicated \attribute{alt} tag}
@@ -1715,7 +1716,7 @@ the extension will be changed to \filenm{.svg} for \HTML:
 \end{sourcedisplay}
 
 \DescribeProgram{pdftocairo}
-\margintag{PDF to SVG}
+\margintag{\PDF\ to \SVG}
 To convert a \PDF\ image to \SVG, use the utility \prog{pdftocairo}:
 \userentry{pdftocairo -svg filename.pdf}
 For a large number of images, use \prog{lwarpmk}:
@@ -1729,14 +1730,14 @@ For \EPS\ images converted to \PDF\ using the package \pkg{epstopdf},
 use \userentry{lwarpmk pdftosvg *.PDF} to convert to \SVG\ images.
 
 When using \DVI\ \prog{latex},
-\margintag{DVI latex}
+\margintag{\DVI\ \LaTeX}
 it is necessary to convert \EPS\ to \PDF\ and then to \SVG:
 \gindex{image>PDF or EPS>converting}
 \userentry{lwarpmk epstopdf *.eps\qquad \textrm{(or a list of filenames)}}
 \userentry{lwarpmk pdftosvg *.pdf\qquad \textrm{(or a list of filenames)}}
 
 For \PNG\ or \JPG
-\margintag{PNG and JPG}
+\margintag{\PNG\ and \JPG}
 \gindex{image>PNG and JPG}
 \gindex{PNG images}
 \gindex{JPG images}
@@ -1745,8 +1746,8 @@ the same file may be used in both print or \HTML\ versions, and may be used with
 but will also be used without the file extension if it is the only file of
 its base name.
 
-GIF files may be used for \HTML,
-\margintag{GIF}
+\GIF\ files may be used for \HTML,
+\margintag{\GIF}
 \gindex{image>GIF}
 \gindex{GIF images}
 but another format must also be provided for print output.
@@ -2820,18 +2821,17 @@ For math expressions while using \brand{MathJax},
 \trouble[MathJax]{mathjax=\brand{MathJax}>siunitx=\pkg{siunitx}}
 a limited emulation is used.
 Most functions work reasonably well, but many options cannot be emulated.
-\pkg{siunitx} macros with more than one optional value cannot absorb the second optional
-value, and complicated parsing such as for \cs{ang} is not supported.
+Complicated parsing such as for \cs{ang} is not supported.
 The result usually looks fine, and otherwise is enough to get the meaning across.
 
-\pkg{lwarp}'s \brand{MathJax} emulation for \pkg{siunitx} is meant to be a
-stop-gap measure until an extension is included in \brand{MathJax}.
-As of this writing, the third-party \pkg{siunitx} extension
-for \brand{MathJax} is not currently hosted at any public CDN,
-thus \pkg{siunitx} is not usable with this extension unless a local copy
-of this extension is created first.
-See \cs{MathJaxFilename} to select a custom MathJax script, but \pkg{lwarp}'s
-emulation would have to be diabled as well.
+% \pkg{lwarp}'s \brand{MathJax} emulation for \pkg{siunitx} is meant to be a
+% stop-gap measure until an extension is included in \brand{MathJax}.
+% As of this writing, the third-party \pkg{siunitx} extension
+% for \brand{MathJax} is not currently hosted at any public CDN,
+% thus \pkg{siunitx} is not usable with this extension unless a local copy
+% of this extension is created first.
+% See \cs{MathJaxFilename} to select a custom \brand{MathJax} script, but \pkg{lwarp}'s
+% emulation would have to be diabled as well.
 
 Document modifications required for \brand{MathJax}:
 \begin{itemize}
@@ -2911,12 +2911,12 @@ changes do not affect the \HTML\ output.
 }
 
 \newcommand{\limitspolyglossia}{%
-\trouble{Undefined control sequence>polyglossia=\pkg{polyglossia}}
-\trouble{polyglossia=\pkg{polyglossia}>Undefined control sequence}
+\trouble{Undefined control sequence \dots begindocument>polyglossia=\pkg{polyglossia}}
+\trouble{polyglossia=\pkg{polyglossia}>Undefined control sequence \dots begindocument}
 \pkg{lwarp} uses \pkg{cleveref}, which has some limitations when using
 \pkg{polyglossia}, possibly resulting in the error
 \begin{sourcedisplay}
-!~Undefined control sequence. \dots\ \cs{@begindocumenthook}
+!~Undefined control sequence. \dots\ \cs{\_\_hook} begindocument
 \end{sourcedisplay}
 
 To test compatibility, add
@@ -2973,14 +2973,6 @@ The defaults are as follows, and may be changed in the preamble after
 \bigskip
 }
 
-\newcommand{\limitsxparse}{%
-\trouble{xparse=\pkg{xparse}}
-To remove from the log any warnings about redeclaring objects,
-place the following before \pkg{lwarp} is loaded:
-\begin{sourcedisplay}
-\cs{usepackage}[log-declarations=false]\{xparse\}
-\end{sourcedisplay}
-}
 
 
 % For use in the documentation update section:
@@ -3061,7 +3053,7 @@ This boolean may be tested by the user for later use.
 %<*package>
 % \fi
 %
-% \CheckSum{51622}
+% \CheckSum{53146}
 %
 % \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
@@ -3197,6 +3189,7 @@ This boolean may be tested by the user for later use.
 % \changes{v0.892}{2020/10/07}{\ 2020/10/07}
 % \changes{v0.893}{2020/11/26}{\ 2020/11/26}
 % \changes{v0.894}{2020/12/24}{\ 2020/12/24}
+% \changes{v0.895}{2021/02/18}{\ 2021/02/18}
 
 
 
@@ -3220,7 +3213,7 @@ This boolean may be tested by the user for later use.
 %
 % \fileversion{} \Dash \filedate
 %
-% {\small\textcopyright{} 2016--2020} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}
+% {\small\textcopyright{} 2016--2021} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}
 %
 % \end{center}
 %
@@ -3420,6 +3413,32 @@ This boolean may be tested by the user for later use.
 %
 % \begin{description}
 % \needspace{2\baselineskip}
+% \item[v0.895:] Vector packages, greatly improved \brand{MathJax} for \pkg{siunitx}.
+%   \begin{itemize}
+%       \item Fixed quotes in \HTML\ tags while using old font packages with
+%           \margintag{core}
+%           \XeLaTeX\ and \LuaLaTeX.
+%       \item Added \cs{ifblank} and \cs{ifstrequal} to \brand{MathJax} emulation.
+%           \margintag{\brand{MathJax}}
+%       \item \pkg{multirow}: Allow \cs{par} per v2.7.
+%           \margintag{packages}
+%       \item \pkg{acro}: Updated to v3.5.
+%       \item \pkg{fancyhdr}: Updated to v4.0.
+%       \item \pkg{changes}: Updated to v4.0.1.
+%       \item \pkg{epsfig}, \pkg{rotating}: Now work inside \env{lateximage}.
+%       \item \pkg{amscdx}: Verified to work with \SVG\ math.
+%               Warning added about use with \brand{MathJax}.
+%       \item Added \brand{MathJax} emulation for \pkg{isomath}, \pkg{mattens},
+%               \pkg{maybemath}, \pkg{skmath}, \pkg{tensor}.
+%       \item Improved \brand{MathJax} emulation for \pkg{siunitx} \cs{ang},
+%               \cs{num}, \cs{SI}.
+%       \item Added \pkg{epsf}, \pkg{impnattypo}, \pkg{isotope},
+%           \pkg{lpic}, \pkg{luavlna},
+%           \pkg{mdwmath}, \pkg{pinlabel}, \pkg{rlepsf},
+%           \pkg{tikz-imagelabels}, \pkg{xevlna}.
+%       \item Verified to work as-is: \pkg{tensind}.
+%   \end{itemize}
+% \needspace{2\baselineskip}
 % \item[v0.894:] \brand{MathJax} additions and improvements.
 %   \begin{itemize}
 %       \item Improved warning message for enabling \SVG\ graphics for
@@ -4179,7 +4198,7 @@ This boolean may be tested by the user for later use.
 %       \item \pkg{xfrac}: Improved \CSS.
 %       \item \pkg{textcomp} and \pkg{xunicode}: Fix conflicts with \cs{textcircled}.
 %       \item \pkg{ulem}: Improved compatibility with \pkg{CJKulem}, \env{lateximage}.
-%       \item MathJax and \pkg{siunitx}: Removed inoperable extension.
+%       \item \brand{MathJax} and \pkg{siunitx}: Removed inoperable extension.
 %       \item Added \pkg{bitpattern}, \pkg{pdfcomment},
 %           \pkg{pdfmarginpar}, \pkg{tram}, \pkg{unitsdef}, \pkg{xechangebar}.
 %       \item Added \pkg{musicography}, \pkg{octave}, \pkg{semantic-markup}.
@@ -4261,10 +4280,10 @@ This boolean may be tested by the user for later use.
 %           \margintag{\DVI\ \prog{latex}}
 %       \item Fix for \optn{-\/-shell-escape} with \prog{latexmk}.
 %           \margintag{\prog{latexmk}}
-%       \item Updated MathJax script to v2.7.4.
+%       \item Updated \brand{MathJax} script to v2.7.4.
 %           \margintag{math}
-%       \item Fix: Mathjax chapter number removed from non-numeric tagged equations.
-%       \item Added MathJax support for \pkg{nicefrac}, \pkg{units}.
+%       \item Fix: \brand{Mathjax} chapter number removed from non-numeric tagged equations.
+%       \item Added \brand{MathJax} support for \pkg{nicefrac}, \pkg{units}.
 %       \item Fix for \cs{[} and \cs{]} with \cs{displaymathnormal}.
 %       \item Fix for \cs{includegraphics} filename expansion.
 %           \margintag{images}
@@ -4329,7 +4348,7 @@ This boolean may be tested by the user for later use.
 % \needspace{2\baselineskip}
 % \item[v0.57:] \pkg{algorithm2e}, \pkg{float} styles, tabular packages, internal improvements.
 %   \begin{itemize}
-%       \item Added support for MathJax equations with \cs{footnote}, \cs{footnotemark}.
+%       \item Added support for \brand{MathJax} equations with \cs{footnote}, \cs{footnotemark}.
 %           \margintag{MathJax}
 %       \item Added \cs{StartDefiningMath} and \cs{StopDefiningMath} for
 %           \margintag{math macros}
@@ -4339,7 +4358,7 @@ This boolean may be tested by the user for later use.
 %           \margintag{dynamic math}
 %           delimit math expressions which depend on a variable condition
 %           such as a counter.  Such expressions will not be hashed for reuse,
-%           and will be converted to \SVG\ math images even when MathJax is enabled.
+%           and will be converted to \SVG\ math images even when \brand{MathJax} is enabled.
 %           See \cref{sec:mathdynamic}.
 %       \item Renamed \cs{EndDefiningTabulars} to \cs{StopDefiningTabulars}.
 %           \watchout[new name]
@@ -4506,7 +4525,7 @@ This boolean may be tested by the user for later use.
 %       \item Improved \cs{ensuremath} hashing expansion.
 %       \item Fix: \env{equation*} with \env{split}.
 %       \item \env{tabbing} now works inside a \env{lateximage}.  Use for math in \env{tabbing}.
-%       \item Fix: MathJax script was not executing in some conditions.
+%       \item Fix: \brand{MathJax} script was not executing in some conditions.
 %               \margintag{MathJax}
 %       \item Added \cs{CustomizeMathJax} to add custom functions.
 %               See \cref{sec:limitsmath}.
@@ -4540,8 +4559,8 @@ This boolean may be tested by the user for later use.
 %       \item Improved support for display math containing complicated math objects,
 %               such as \pkg{tikz-cd}.  See \cref{sec:displaymathother}.
 %       \item Fix: \cs{addcontentsline} inside \SVG\ math.
-%       \item Fix: SVG math containing an embedded \env{lateximage}.
-%       \item MathJax now handles \cs{ensuremath} in expressions.\margintag{MathJax}
+%       \item Fix: \SVG\ math containing an embedded \env{lateximage}.
+%       \item \brand{MathJax} now handles \cs{ensuremath} in expressions.\margintag{MathJax}
 %       \item Fix: Added \env{alignat} environment. \margintag{misc. fixes}
 %       \item Fix: \pkg{afterpackage} no longer required, which conflicted with \pkg{scrlfile}.
 %       \item Fix: \pkg{titling} \cs{thanks} mark.
@@ -4568,11 +4587,11 @@ This boolean may be tested by the user for later use.
 % ^^A            Display math and other forms of \SVG\ image such as \env{picture} and
 % ^^A            \tikz\ still use individual image files which are recreated each time
 % ^^A            \cmds{lwarpmk limages} is run.
-% ^^A        \item Fixes: SVG math and/or \cs{underline} in a sectioning file name.
+% ^^A        \item Fixes: \SVG\ math and/or \cs{underline} in a sectioning file name.
 % ^^A        \item Improved \SVG\ display math and tags.
 % ^^A        \item Improved \SVG\ math and \pkg{siunitx} \attribute{alt} tags.
 % ^^A        \item Improved \pkg{siunitx} units.
-% ^^A        \item Fix: \cs{ensuremath} with MathJax now creates a \env{lateximage}.
+% ^^A        \item Fix: \cs{ensuremath} with \brand{MathJax} now creates a \env{lateximage}.
 % ^^A        \item Fix: \cs{centering}, etc. in \SVG\ math, \env{lateximage}, \tikz.
 % ^^A        \item Fix: Made various macros robust,
 % ^^A            additionally fixing \pkg{authblk}.\margintag{misc. fixes}
@@ -4645,7 +4664,7 @@ This boolean may be tested by the user for later use.
 % ^^A        \item \cs{PrintStack} changed to \cs{LWRPrintStack}.\watchout[name change]
 % ^^A        \item Fix: Empty lines between \env{tabular} rows.\margintag{misc. fixes}
 % ^^A        \item Fix: Stack unnesting.
-% ^^A        \item Fix: SVG math and \env{lateximage}s in numerous situations.
+% ^^A        \item Fix: \SVG\ math and \env{lateximage}s in numerous situations.
 % ^^A        \item Fix: Spaces in \cs{usepackage}.
 % ^^A        \item Fix: Now allows \brand{MathJax} inside \env{verse}.
 % ^^A    \end{itemize}
@@ -4667,7 +4686,7 @@ This boolean may be tested by the user for later use.
 % ^^A        \item Fix: Empty lines between \env{tabular} rows.\margintag{misc. fixes}
 % ^^A        \item Fix: ``Improper \cs{prevdepth}'' with minipages, lists.
 % ^^A        \item Fix: Incorrect \SVG\ math and |lateximage|s with \pkg{subfig}.
-% ^^A        \item Fix: Lateximages from incorrect pages with Mathjax.
+% ^^A        \item Fix: Lateximages from incorrect pages with \brand{Mathjax}.
 % ^^A        \item Fix: Missing sidetoc if using \pkg{listings}.
 % ^^A        \item Fix: Added an \pkg{array} emulation package.
 % ^^A        \item Added
@@ -5340,7 +5359,7 @@ This boolean may be tested by the user for later use.
 % While generating \HTML\ output, \SVG\ files are used in place of \PDF.
 % Other formats such as \PNG\ and \JPG\ are used as-is.
 %
-% SVG images may be used for math,
+% \SVG\ images may be used for math,
 % and are also used for \env{picture}, \tikz, and similar environments.
 % The \SVG\ format has better browser and e-book support
 % than \MathML\ (as of this writing),
@@ -5491,8 +5510,8 @@ This boolean may be tested by the user for later use.
 %
 % \midrule
 %
-% Languages: & \spkg{babel}, \spkg{polyglossia}.
-%       \spkg{cjkpunct}, \spkg{xeCJK}.\\
+% Languages: & \spkg{babel}, \spkg{cjkpunct}, \ipkg{impnattypo}, \mpkg{luavlna},
+%       \spkg{polyglossia}, \spkg{xeCJK}, \mpkg{xevlna}. \\
 %
 % Chinese: & C\TeX, \spkg{ctex},
 %       \spkg{upzhkinsoku},
@@ -5620,7 +5639,7 @@ This boolean may be tested by the user for later use.
 %   \mpkg{theorem}, \mpkg{thmbox}, \mpkg{thmtools}. \\
 %
 % Additional math: & Math fonts via \SVG\ images,
-%   \spkg{accents}\ejax, \spkg{amscd}\sjax, \spkg{autobreak}\ejax, \ipkg{autonum},
+%   \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,
@@ -5628,15 +5647,16 @@ This boolean may be tested by the user for later use.
 %   \spkg{delarray}, \mpkg{DotArrow}\ejax, \spkg{dotlessi}\ejax, \spkg{dotlessj}\sjax,
 %   \spkg{esvect}\ejax, \spkg{extarrows}\ejax, \spkg{fixmath}\ejax,
 %   \spkg{fouridx}\ejax, \spkg{fourier}\ejax,
-%   \spkg{guass}, \spkg{hhtensor}\ejax, \spkg{icomma}\ijax, \spkg{jkmath},
+%   \spkg{guass}, \spkg{hhtensor}\ejax, \spkg{icomma}\ijax,
+%   \spkg{isomath}\ejax, \spkg{jkmath},
 %   \spkg{kpfonts}\ejax, \spkg{kpfonts-otf}\ejax,
 %   \spkg{leftidx}\ejax, \spkg{libertinust1math}\ejax, \spkg{mathalpha}\ejax,
 %   \spkg{mathastext}\ejax, \spkg{mathcomp}\ejax, \spkg{mathdesign}\ejax,
-%   \spkg{mathdots}\ejax,
-%   \spkg{mathfixs}\ejax,
+%   \spkg{mathdots}\ejax, \spkg{mathfixs}\ejax,
 %   \spkg{mathpazo}\ejax, \spkg{mathptmx}\ejax,
 %   \spkg{mathpunctspace}\ijax,
-%   \spkg{mathspec}\ejax, \mpkg{mathtools}\ejax,
+%   \spkg{mathspec}\ejax, \mpkg{mathtools}\ejax, \spkg{mattens}\ejax,
+%   \spkg{maybemath}\ijax, \spkg{mdwmath}\ejax,
 %   \mpkg{mismath}\ejax, \spkg{mleftright}\ejax,
 %   \spkg{multiobjective}\ejax, \mpkg{nccmath}\ejax,
 %   \spkg{nicematrix}\ejax, \spkg{noitcrul}\ejax,
@@ -5644,9 +5664,10 @@ This boolean may be tested by the user for later use.
 %   \spkg{pb-diagram},
 %   \spkg{pxfonts}\ejax,
 %   \ipkg{resizegather}\ijax, \spkg{rmathbr}\ejax, \spkg{scalerel}\ejax,
-%   \epkg{shuffle}\ejax, \spkg{stackrel}\ejax,
+%   \epkg{shuffle}\ejax, \spkg{skmath}\ejax, \spkg{stackrel}\ejax,
 %   \mpkg{statex2}\ejax, \mpkg{statistics}, \spkg{statmath}\ejax,
-%   \spkg{subsupscripts}\ejax, \spkg{textualicomma}\ijax,
+%   \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{ushort}\ejax, \mpkg{witharrows}\ejax,
@@ -5694,18 +5715,20 @@ This boolean may be tested by the user for later use.
 %   References to \PDF\ files are changed to \SVG, other image types
 %   are accepted as well.
 %   \cs{rotatebox} and \cs{scalebox} are supported as well as \HTML\ can handle.
-%   \epkg{rotating} is emulated but all objects are unrotated.
+%   \epkg{rotating} is emulated but all objects are unrotated in \HTML.
 %   \env{picture}, \mpkg{tikz}, and \mpkg{xy} are converted to an \SVG\ image.
 %
 %   \smallskip
 %
 %   \mpkg{asymptote}, \spkg{curves}, \spkg{datatool},
-%   \spkg{eepic}, \epkg{epsfig}, \spkg{epstopdf},
+%   \spkg{eepic}, \mpkg{epsf}, \epkg{epsfig}, \spkg{epstopdf},
 %   \epkg{figsize}, \ipkg{fitbox},
-%   \spkg{grffile}, \mpkg{luamplib}, \epkg{media9},
-%   \epkg{movie15}, \epkg{multimedia}, \mpkg{overpic}, \spkg{pict2e},
+%   \spkg{grffile}, \mpkg{lpic}, \mpkg{luamplib}, \epkg{media9},
+%   \epkg{movie15}, \epkg{multimedia}, \mpkg{overpic}, \spkg{pict2e}, \mpkg{pinlabel},
 %   \mpkg{psfrag}, \mpkg{psfragx}, \mpkg{pst-eps}, \mpkg{pstool}, \mpkg{pstricks},
-%   \spkg{rviewport}, \mpkg{svg}, \spkg{svg-extract}, \spkg{tikz-3dplot}. \\
+%   \mpkg{rlepsf},
+%   \spkg{rviewport}, \mpkg{svg}, \spkg{svg-extract}, \mpkg{tikz}, \spkg{tikz-3dplot},
+%   \mpkg{tikz-imagelabels}, \mpkg{xy} \\
 %
 % \midrule
 %
@@ -5828,6 +5851,7 @@ This boolean may be tested by the user for later use.
 %   \spkg{circuitikz}, \spkg{econometrics}\ejax, \spkg{elements},
 %   \mpkg{engtlc}\ejax, \spkg{fast-diagram}, \mpkg{ghsystem},
 %   \spkg{hepnicenames}, \spkg{heppennames}, \spkg{hepunits}\ejax,
+%   \mpkg{isotope}\ejax,
 %   \spkg{karnaughmap}, \mpkg{karnaugh-map}, \mpkg{keystroke},
 %   \mpkg{listings}, \spkg{listingsutf8}, \spkg{linop}, \mpkg{menukeys},
 %   \mpkg{mhchem}\sjax, \mpkg{minted}, \spkg{pgfgantt},
@@ -6509,7 +6533,7 @@ This boolean may be tested by the user for later use.
 %	create a new file called |tutorial.tex|.
 %	This may be done several ways:
 %	\begin{description}
-%	\item [Copy from the documentation PDF:] \
+%	\item [Copy from the documentation \PDF:] \
 %
 %	A listing is in \cref{fig:tutorial},
 %	which may be copied/pasted from the figure directly into your own editor,
@@ -7379,7 +7403,7 @@ This boolean may be tested by the user for later use.
 % \margintag{Computer Modern}%
 % \gindex{font>Computer Modern}\gindex{Computer Modern}%
 % \watchout[\prog{pdflatex}]%
-% \watchout[DVI \prog{latex}]%
+% \watchout[\DVI\ \prog{latex}]%
 % which may be a ``type 3'' bit-mapped font which may not
 % convert well to plain text.  A ``type 1'' vector font is required.
 %
@@ -7987,7 +8011,7 @@ This boolean may be tested by the user for later use.
 % \cs{AltTextClose} & PD & End an \HTML\ \attribute{alt} tag. \\
 % \midrule
 % \cs{CSSFilename} & PS & The \CSS\ for the following files. \\
-% \cs{MathJaxFilename} & PS & The MathJax script for the following files. \\
+% \cs{MathJaxFilename} & PS & The \brand{MathJax} script for the following files. \\
 % \midrule
 % \cs{HTMLLanguage} & PS & The \HTML\ \attribute{lang} tag. \\
 % \cs{HTMLTitle} & PS & The homepage's \element{title}, overriding \cs{title}. \\
@@ -8234,11 +8258,11 @@ This boolean may be tested by the user for later use.
 %
 % \ItemDescribeMacro{\MathJaxFilename}  \marg{filename}
 %   \DescribeDefault{\filenm{lwarp_mathjax.txt}} \quad
-%   Sets the MathJax script file to use for the following
+%   Sets the \brand{MathJax} script file to use for the following
 %   files.  May be changed before each each sectioning command which would
 %   cause a file split.
 %
-%   The MathJax script file is copied into the head of each \HTML\ file.
+%   The \brand{MathJax} script file is copied into the head of each \HTML\ file.
 %   This may be used to point to a local repository, add extensions, or change
 %   the script somewhere in the middle of the document.
 %   \cs{MathJaxFilename} may be used before each file break to set the script file for
@@ -9136,7 +9160,7 @@ This boolean may be tested by the user for later use.
 %           emulated in \brand{MathJax}.
 % \item Fitting features: \cs{tcboxfit} becomes \cs{tcbox} in \HTML.
 % \item Footnote numbering does not match the printed output.\watchout[footnotes]
-% \item MathJax emulation is provided for common macros.
+% \item \brand{MathJax} emulation is provided for common macros.
 % \end{itemize}
 %
 % If using \pkg{cleveref},
@@ -10695,14 +10719,6 @@ This boolean may be tested by the user for later use.
 % See \cref{sec:mhchem}.
 %
 %
-% \subsubsection{\pkg{xparse} package}
-%
-% \changes{v0.45}{2017/12/09}{Docs: \pkg{xparse} warnings.}
-% \DescribePackage{xparse}
-% \limitsxparse
-% \gindex{xparse=\pkg{xparse}>warnings}
-%
-%
 % \subsubsection{\pkg{kotex} package}
 %
 % \DescribePackage{kotex}
@@ -11375,7 +11391,7 @@ This boolean may be tested by the user for later use.
 %
 % Equation numbering is not automatic, but the equation numbers in \SVG\ math
 % will match the \LaTeX\ and \HTML\ output.
-% SVG math is recommended when using the \AmS\ environments, which may have
+% \SVG\ math is recommended when using the \AmS\ environments, which may have
 % multiple numbered equations per object.
 %
 % As of when last checked, \brand{LibreOffice} ignores the following:
@@ -11820,7 +11836,7 @@ This boolean may be tested by the user for later use.
 %   avoid corrupted \HTML\ output.
 % \item[(width,height) missing a comma:] \cs{makebox} and \cs{framebox} can accept
 %   a parenthesis-delimited width and height, which must be separated by a comma.
-% \item[``Load graphicx or graphics for improved SVG math baselines.'':] \SVG\ math
+% \item[``Load graphicx or graphics for improved \SVG\ math baselines.'':] \SVG\ math
 %   sizing and baselines are improved if either of these packages are used.
 % \item[``Load graphicx or graphics for improved XeTeX logo.'':] If these packages
 %   are loaded, the \XeLaTeX\ logo can use the reversed ``E''.
@@ -11976,7 +11992,7 @@ This boolean may be tested by the user for later use.
 %
 %           If using BibTeX, see \cref{sec:limitsbibtex}.\watchout[BibTeX]
 %
-%       \item[``\texttt{!~Undefined control sequence. \dots\ \cs{@begindocumenthook}''}:] ~
+%       \item[``\texttt{!~Undefined control sequence. \dots\ \cs{\_\_hook} begindocument''}:] ~
 %           \watchout[\pkg{polyglossia}] \\
 %           See \cref{sec:limitspolyglossia}
 %           if using \pkg{polyglossia}.
@@ -12104,7 +12120,7 @@ This boolean may be tested by the user for later use.
 %	\item Enter \cmds{lwarpmk limages} to refresh the \env{lateximage} images.
 %	\end{itemize}
 %
-% \item[SVG images:] \
+% \item[\SVG\ images:] \
 %
 % \limitssvgimages
 %
@@ -12746,6 +12762,7 @@ This boolean may be tested by the user for later use.
 % \changes{v0.88}{2020/07/07}{Prevented \pkg{shadethm}.}
 % \changes{v0.891}{2020/09/16}{Prevented \pkg{libgreek}.}
 % \changes{v0.893}{2020/11/15}{Allowed \pkg{picinpar}.}
+% \changes{v0.895}{2021/01/19}{Allowed \pkg{epsf}.}
 %
 %  ^^A *earlyloadnever *loadnever
 %    \begin{macrocode}
@@ -12766,7 +12783,6 @@ This boolean may be tested by the user for later use.
 \LWR@earlyloadnever{colortab}{colortbl}
 \LWR@earlyloadnever{csvtools}{datatool}
 \LWR@earlyloadnever{doublespace}{setspace}
-\LWR@earlyloadnever{epsf}{graphicx}
 \LWR@earlyloadnever{fancyheadings}{fancyhdr}
 \LWR@earlyloadnever{fncylab}{cleveref}
 \LWR@earlyloadnever{formula}{siunitx}
@@ -12835,6 +12851,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{algorithm2e}
 \LWR@loadafter{algorithmicx}
 \LWR@loadafter{alltt}
+\LWR@loadafter{amscdx}
 % \LWR@loadafter{amsmath}% may be preloaded
 % \LWR@loadafter{amsthm}% may be preloaded
 \LWR@loadafter{anonchap}
@@ -12943,6 +12960,7 @@ This boolean may be tested by the user for later use.
 \LWR@notmemoirloadafter{enumerate}
 \LWR@loadafter{enumitem}
 \LWR@notmemoirloadafter{epigraph}
+\LWR@loadafter{epsf}
 \LWR@loadafter{epsfig}
 \LWR@loadafter{epstopdf}
 \LWR@loadafter{epstopdf-base}
@@ -13036,11 +13054,14 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{idxlayout}
 \LWR@loadafter{ifoddpage}
 \LWR@loadafter{imakeidx}
+\LWR@loadafter{impnattypo}
 \LWR@notmemoirloadafter{index}
 % inputenc must be loaded before lwarp
 % inputenx must be loaded before lwarp
 % inputtrc may be loaded before lwarp
 \LWR@loadafter{intopdf}
+\LWR@loadafter{isomath}
+\LWR@loadafter{isotope}
 \LWR@loadafter{jurabib}
 \LWR@loadafter{karnaugh-map}
 \LWR@loadafter{keyfloat}
@@ -13060,6 +13081,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{listings}
 \LWR@loadafter{listliketab}
 \LWR@loadafter{longtable}
+\LWR@loadafter{lpic}
 \LWR@loadafter{lscape}
 \LWR@loadafter{ltablex}
 \LWR@loadafter{ltcaption}
@@ -13070,6 +13092,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{luacolor}
 \LWR@loadafter{luamplib}
 \LWR@loadafter{luatodonotes}
+\LWR@loadafter{luavlna}
 \LWR@loadafter{lyluatex}
 \LWR@loadafter{magaz}
 \LWR@notmemoirloadafter{makeidx}
@@ -13088,8 +13111,11 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{mathptmx}
 \LWR@loadafter{mathspec}
 \LWR@loadafter{mathtools}
+\LWR@loadafter{mattens}
+\LWR@loadafter{maybemath}
 \LWR@loadafter{mcaption}
 \LWR@loadafter{mdframed}
+\LWR@loadafter{mdwmath}
 \LWR@loadafter{media9}
 \LWR@loadafter{memhfixc}
 \LWR@loadafter{menukeys}
@@ -13177,6 +13203,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{physunits}
 \LWR@loadafter{picinpar}
 \LWR@loadafter{pifont}
+\LWR@loadafter{pinlabel}
 \LWR@loadafter{placeins}
 \LWR@loadafter{plarray}
 \LWR@loadafter{plarydshln}
@@ -13208,6 +13235,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{repeatindex}
 \LWR@loadafter{resizegather}
 \LWR@loadafter{returntogrid}
+\LWR@loadafter{rlepsf}
 \LWR@loadafter{rmathbr}
 \LWR@loadafter{rmpage}
 \LWR@loadafter{romanbar}
@@ -13242,6 +13270,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{simplebnf}
 \LWR@loadafter{SIunits}
 \LWR@loadafter{siunitx}
+\LWR@loadafter{skmath}
 \LWR@loadafter{slantsc}
 \LWR@loadafter{slashed}
 \LWR@loadafter{soul}
@@ -13277,6 +13306,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{tagpdf}
 \LWR@loadafter{tascmac}
 \LWR@loadafter{tcolorbox}
+\LWR@loadafter{tensor}
 \LWR@loadafter{termcal}
 \LWR@loadafter{textarea}
 % \LWR@loadafter{textcomp}% maybe before lwarp with font packages
@@ -13294,6 +13324,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{thumb}
 \LWR@loadafter{thumbs}
 \LWR@loadafter{tikz}
+\LWR@loadafter{tikz-imagelabels}
 \LWR@loadafter{titleps}
 \LWR@loadafter{titlesec}
 \LWR@loadafter{titletoc}
@@ -13351,6 +13382,7 @@ This boolean may be tested by the user for later use.
 \LWR@loadafter{xechangebar}
 \LWR@loadafter{xellipsis}
 % xetexko-vertical must be loaded before lwarp
+\LWR@loadafter{xevlna}
 \LWR@loadafter{xfakebold}
 \LWR@loadafter{xfrac}
 \LWR@loadafter{xltabular}
@@ -13452,7 +13484,7 @@ This boolean may be tested by the user for later use.
 %
 %
 % \section{Unicode input characters}
-% \changes{v0.18}{2016/05/17}{PDF Unicode input characters.}
+% \changes{v0.18}{2016/05/17}{PDF=\PDF\ Unicode input characters.}
 % \gindex{Unicode>input characters}
 %
 % \codeall
@@ -13528,7 +13560,7 @@ This boolean may be tested by the user for later use.
 %
 % \section{Upright quotes}
 %
-% In PDF\TeX, preserve upright quotes in verbatim text.
+% In pdf\TeX, preserve upright quotes in verbatim text.
 % \pkg{upquote} also loads \pkg{textcomp}.
 %
 % \changes{v0.63}{2018/11/25}{p\TeX: Load \pkg{upquote}.}
@@ -13544,6 +13576,33 @@ This boolean may be tested by the user for later use.
 %
 %
 %
+% \section{Avoid bad font combinations}
+%
+% For \XeLaTeX\ and \LuaLaTeX, certain font combinations cause problems
+% with \pkg{lwarp}.
+%
+% \pkg{libertinus-otf} has special handling for \cs{textquotedbl}.
+% Search for \cs{LWR@orig@textquotedbl}.
+%
+% \changes{v0.895}{2021/01/14}{Use \pkg{kpfonts-otf} if \LuaLaTeX, \XeLaTeX.}
+%
+%    \begin{macrocode}
+\ifxetexorluatex
+    \AtBeginDocument{
+        \@ifpackageloaded{kpfonts}{
+            \PackageError{lwarp}
+                {%
+                    When using XeLaTeX or LuaLaTeX,\MessageBreak
+                    use kpfonts-otf instead of kpfonts%
+                }
+                {%
+                    Replace: \protect\usepackage{kpfonts}\MessageBreak
+                    with: \protect\usepackage{kpfonts-otf}
+                }
+        }{}
+    }
+\fi
+%    \end{macrocode}
 %
 %
 % \section{Miscellaneous tools}
@@ -14961,7 +15020,7 @@ This boolean may be tested by the user for later use.
 % \changes{v0.20}{2017/01/12}{Page geometry set to 6in wide with large margins.}
 % \changes{v0.27}{2017/04/04}{Page geometry modified to reduce line overflow.}
 % \changes{v0.28}{2017/04/13}{Forced oneside to maintain large right margin.}
-% \changes{v0.52}{2018/03/31}{Fix: MathJax script line wraps.  Reduced right margin.}
+% \changes{v0.52}{2018/03/31}{Fix: \brand{MathJax} script line wraps.  Reduced right margin.}
 % \changes{v0.74}{2019/08/13}{Remembers user's geometry.}
 %
 % \codehtml
@@ -15464,6 +15523,7 @@ This boolean may be tested by the user for later use.
 % \changes{v0.88}{2020/07/07}{Prevented \pkg{shadethm}.}
 % \changes{v0.891}{2020/09/16}{Prevented \pkg{libgreek}.}
 % \changes{v0.893}{2020/11/15}{Allowed \pkg{picinpar}.}
+% \changes{v0.895}{2021/01/19}{Allowed \pkg{epsf}.}
 
 % The following should never be loaded:
 %
@@ -15481,7 +15541,6 @@ This boolean may be tested by the user for later use.
 \LWR@checkloadnever{#1}{colortab}{colortbl}
 \LWR@checkloadnever{#1}{csvtools}{datatool}
 \LWR@checkloadnever{#1}{doublespace}{setspace}
-\LWR@checkloadnever{#1}{epsf}{graphicx}
 \LWR@checkloadnever{#1}{fancyheadings}{fancyhdr}
 \LWR@checkloadnever{#1}{fncylab}{cleveref}
 \LWR@checkloadnever{#1}{formula}{siunitx}
@@ -15505,6 +15564,7 @@ This boolean may be tested by the user for later use.
 %
 % ^^A *loadbefore
 % The following should only be loaded before \pkg{lwarp}:
+% \changes{v0.895}{2021/01/14}{\pkg{kpfonts} load before \pkg{lwarp}.}
 %    \begin{macrocode}
 \LWR@checkloadbefore{#1}{ctex}
 \LWR@checkloadbefore{#1}{fontspec}
@@ -15513,6 +15573,7 @@ This boolean may be tested by the user for later use.
 \LWR@checkloadbefore{#1}{nfssext-cfr}
 \LWR@checkloadbefore{#1}{fontaxes}
 \LWR@checkloadbefore{#1}{kotex}
+\LWR@checkloadbefore{#1}{kpfonts}% textcomp option clash
 \LWR@checkloadbefore{#1}{luatexja}
 \LWR@checkloadbefore{#1}{luatexja-fontspec}
 \LWR@checkloadbefore{#1}{luatexko}
@@ -16479,6 +16540,7 @@ This boolean may be tested by the user for later use.
 \begin{warpHTML}
 %    \end{macrocode}
 %
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \AtBeginDocument{
 \ifbool{FormatWP}{
@@ -16496,11 +16558,11 @@ This boolean may be tested by the user for later use.
 \renewcommand*{\LWR@tagsubsubsectionend}{/h5}
 \renewcommand*{\LWR@tagparagraph}{h6}
 \renewcommand*{\LWR@tagparagraphend}{/h6}
-\renewcommand*{\LWR@tagsubparagraph}{span class="subparagraph"}
+\renewcommand*{\LWR@tagsubparagraph}{span class=\textquotedbl{}subparagraph\textquotedbl}
 \renewcommand*{\LWR@tagsubparagraphend}{/span}
 }% WPTitleHeading
 {% not WPTitleHeading, part and section starting at h1
-\renewcommand*{\LWR@tagtitle}{div class="title"}
+\renewcommand*{\LWR@tagtitle}{div class=\textquotedbl{}title\textquotedbl}
 \renewcommand*{\LWR@tagtitleend}{/div}
 \renewcommand*{\LWR@tagpart}{h1}
 \renewcommand*{\LWR@tagpartend}{/h1}
@@ -16519,7 +16581,7 @@ This boolean may be tested by the user for later use.
 {% chapter defined
 \ifbool{WPTitleHeading}{}
 {% not WPTitleHeading, part and chapter starting at h1
-\renewcommand*{\LWR@tagtitle}{div class="title"}
+\renewcommand*{\LWR@tagtitle}{div class=\textquotedbl{}title\textquotedbl}
 \renewcommand*{\LWR@tagtitleend}{/div}
 \renewcommand*{\LWR@tagpart}{h1}
 \renewcommand*{\LWR@tagpartend}{/h1}
@@ -16533,7 +16595,7 @@ This boolean may be tested by the user for later use.
 \renewcommand*{\LWR@tagsubsubsectionend}{/h5}
 \renewcommand*{\LWR@tagparagraph}{h6}
 \renewcommand*{\LWR@tagparagraphend}{/h6}
-\renewcommand*{\LWR@tagsubparagraph}{span class="subparagraph"}
+\renewcommand*{\LWR@tagsubparagraph}{span class=\textquotedbl{}subparagraph\textquotedbl}
 \renewcommand*{\LWR@tagsubparagraphend}{/span}
 }% not WPTitleHeading
 }% chapter defined
@@ -16592,9 +16654,22 @@ This boolean may be tested by the user for later use.
 %    \begin{macrocode}
 \let\LWR@origvdots\vdots
 %    \end{macrocode}
+%
+% \pkg{libertinus-otf} has too much kerning for \cs{textquotedbl},
+% causing an extra space.
+% \changes{v0.895}{2021/01/14}{Fixed \pkg{libertinus-otf} \cs{textquotedbl} kern.}
 %    \begin{macrocode}
-\let\LWR@orig@textquotedbl\textquotedbl
+\LetLtxMacro\LWR@orig@@textquotedbl\textquotedbl
+\LetLtxMacro\LWR@orig@textquotedbl\LWR@orig@@textquotedbl
 
+\AtEndPreamble{
+\@ifpackageloaded{libertinus-otf}{
+    \renewcommand{\LWR@orig@textquotedbl}{\LWR@orig@@textquotedbl\kern-.15em}
+    \LetLtxMacro\textquotedbl\LWR@orig@textquotedbl
+}{}
+}
+%    \end{macrocode}
+%    \begin{macrocode}
 \LetLtxMacro\LWR@origttfamily\ttfamily
 
 \LetLtxMacro\LWR@origem\em
@@ -16892,7 +16967,7 @@ This boolean may be tested by the user for later use.
     \PackageError{lwarp}%
         {Unknown LaTeX engine}%
         {%
-            Lwarp only knows about pdflatex, dvi latex,
+            Lwarp only knows about pdflatex, DVI latex,
             xelatex, lualatex, and upLateX.%
         }%
 }
@@ -17323,7 +17398,7 @@ This boolean may be tested by the user for later use.
 \begin{filecontents*}[overwrite]{lwarp.css}
 /*
   CSS stylesheet for the LaTeX Lwarp package
-  Copyright 2016-2020 Brian Dunn — BD Tech Concepts LLC
+  Copyright 2016-2021 Brian Dunn — BD Tech Concepts LLC
 */
 
 
@@ -19744,8 +19819,8 @@ page_compositor "."
 % \credits{Davide P. Cervone}
 
 % \DescribeFile{lwarp_mathjax.txt}
-% The default MathJax script used by \pkg{lwarp} when using \brand{MathJax}.
-% A recent version of MathJax is used, as served by the recommended repository.
+% The default \brand{MathJax} script used by \pkg{lwarp} when using \brand{MathJax}.
+% A recent version of \brand{MathJax} is used, as served by the recommended repository.
 % Adjustments are made to allow \LaTeX\ to control the equation tags
 % and provide for starred macros.
 %
@@ -19781,6 +19856,7 @@ page_compositor "."
 % \changes{v0.87}{2020/05/20}{File: \filenm{lwarp_mathjax.txt}: Now provides \cs{ifstar}, \cs{ifnextchar}.}
 % \changes{v0.891}{2020/09/07}{File: \filenm{lwarp_mathjax.txt}: Renamed \filenm{tagformat} extension.}
 % \changes{v0.892}{2020/09/26}{File: \filenm{lwarp_mathjax.txt}: Added \cs{left} \Slash \cs{right} delimiters.}
+% \changes{v0.895}{2021/01/13}{File: \filenm{lwarp_mathjax.txt}: Added \cs{ifblank}, \cs{ifstrequal} macros.}
 % ^^A *lwarp_mathjax.txt
 %
 % \codeconfig
@@ -19832,10 +19908,13 @@ MathJax = {
         }
       }
 
-      //  Create the command map for \ifstar, \ifnextchar, \seteqnumber
-      new CommandMap('ifstar-ifnextchar-setequnumber', {
+      //  Create the command map for:
+      //    \ifstar, \ifnextchar, \ifblank, \ifstrequal, \seteqnumber
+      new CommandMap('Lwarp-macros', {
         ifstar: 'IfstarFunction',
         ifnextchar: 'IfnextcharFunction',
+        ifblank: 'IfblankFunction',
+        ifstrequal: 'IfstrequalFunction',
         seteqnumber: 'SeteqnumberFunction'
       }, {
         //  This function implements an ifstar macro.
@@ -19859,6 +19938,25 @@ MathJax = {
           useArgument(parser, gotchar ? resultnextchar : resultnotnextchar);
         },
 
+        // This function implements an ifblank macro.
+        IfblankFunction(parser, name) {
+          const blankarg = parser.GetArgument(name);
+          const resultblank = parser.GetArgument(name);
+          const resultnotblank = parser.GetArgument(name);
+          const isblank = (blankarg.trim() == "");
+          useArgument(parser, isblank ? resultblank : resultnotblank);
+        },
+
+        // This function implements an ifstrequal macro.
+        IfstrequalFunction(parser, name) {
+          const strequalfirst = parser.GetArgument(name);
+          const strequalsecond = parser.GetArgument(name);
+          const resultequal = parser.GetArgument(name);
+          const resultnotequal = parser.GetArgument(name);
+          const isequal = (strequalfirst == strequalsecond);
+          useArgument(parser, isequal ? resultequal : resultnotequal);
+        },
+
         //  This function modifies the equation numbers.
         SeteqnumberFunction(parser, name) {
             //  Get the macro parameters
@@ -19874,9 +19972,9 @@ MathJax = {
 
       });
 
-      //  Create the ifstar-ifnextchar-setequnumber package
-      Configuration.create('ifstar-ifnextchar-setequnumber', {
-        handler: {macro: ['ifstar-ifnextchar-setequnumber']}
+      //  Create the Lwarp-macros package
+      Configuration.create('Lwarp-macros', {
+        handler: {macro: ['Lwarp-macros']}
       });
 
       MathJax.startup.defaultReady();
@@ -19943,7 +20041,7 @@ MathJax = {
   },    // startup
 
   tex: {
-    packages: {'[+]': ['tagformat', 'ifstar-ifnextchar-setequnumber', 'textmacros']},
+    packages: {'[+]': ['tagformat', 'Lwarp-macros', 'textmacros']},
     tags: "ams",
         tagformat: {
             number: function (n) {
@@ -20091,10 +20189,10 @@ MathJax = {
 \begin{filecontents*}[overwrite]{lwarpmk.lua}
 #!/usr/bin/env texlua
 
--- Copyright 2016-2020 Brian Dunn
+-- Copyright 2016-2021 Brian Dunn
 
 
-printversion = "v0.894"
+printversion = "v0.895"
 requiredconfversion = "2" -- also at *lwarpmk.conf
 
 function printhelp ()
@@ -21347,11 +21445,11 @@ end -- not --version
 
 
 % \DescribeBoolean{LWR@mathmacro} True if currently defining math macros.
-%   Used to disable \SVG\ math hashing and MathJax math contents while
+%   Used to disable \SVG\ math hashing and \brand{MathJax} math contents while
 %   defining a macro using inline math.
 %   Begin a macro, it is not guaranteed that the contents are static, and so
 %   the image must be unique.  The contents also almost certainly will not be
-%   parsed correctly by MathJax.
+%   parsed correctly by \brand{MathJax}.
 %    \begin{macrocode}
 \newbool{LWR@mathmacro}
 \boolfalse{LWR@mathmacro}
@@ -21397,7 +21495,7 @@ end -- not --version
 % value of a counter, then \cs{inlinemathother} must be used before the
 % inline math expression, and \cs{inlinemathnormal} must be used after.
 %
-% For MathJax, the inline math expression is usually printed for MathJax to
+% For \brand{MathJax}, the inline math expression is usually printed for \brand{MathJax} to
 % interpret.  When marked as dynamic math, the following inline math expression
 % will be displayed as an unhashed inline \SVG\ image instead.
 %
@@ -21473,7 +21571,7 @@ end -- not --version
 \newcommand*{\HTMLentity}[1]{%
 % \LWR@traceinfo{HTMLentity \detokenize{#1}}%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \LWR@origampersand#1;%
 \endgroup%
 % \LWR@traceinfo{HTMLentity done}%
@@ -21716,7 +21814,7 @@ end -- not --version
 %
 % Prints the filename for the given label
 %
-% \changes{v0.50}{2018/02/20}{Fix: SVG math in a section name.}
+% \changes{v0.50}{2018/02/20}{Fix: \SVG\ math in a section name.}
 %    \begin{macrocode}
 \newcommand*{\LWR@htmlrefsectionfilename}[1]{%
     \LWR@traceinfo{LWR@htmlrefsectionfilename: !\detokenize{#1}!}%
@@ -22181,10 +22279,11 @@ end -- not --version
 % \subsection{Mapping \LaTeX\ sections to \HTML\ sections}
 %
 % \changes{v0.73}{2019/06/21}{Added \cs{book} for \pkg{memoir}.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@tagtitle}{h1}
 \newcommand*{\LWR@tagtitleend}{/h1}
-\newcommand*{\LWR@tagbook}{div class="book"}
+\newcommand*{\LWR@tagbook}{div class=\textquotedbl{}book\textquotedbl}
 \newcommand*{\LWR@tagbookend}{/div}
 \newcommand*{\LWR@tagpart}{h2}
 \newcommand*{\LWR@tagpartend}{/h2}
@@ -22196,15 +22295,30 @@ end -- not --version
 \newcommand*{\LWR@tagsubsectionend}{/h5}
 \newcommand*{\LWR@tagsubsubsection}{h6}
 \newcommand*{\LWR@tagsubsubsectionend}{/h6}
-\newcommand*{\LWR@tagparagraph}{span class="paragraph"}
+\newcommand*{\LWR@tagparagraph}{span class=\textquotedbl{}paragraph\textquotedbl}
 \newcommand*{\LWR@tagparagraphend}{/span}
-\newcommand*{\LWR@tagsubparagraph}{span class="subparagraph"}
+\newcommand*{\LWR@tagsubparagraph}{span class=\textquotedbl{}subparagraph\textquotedbl}
 \newcommand*{\LWR@tagsubparagraphend}{/span}
 
 \newcommand*{\LWR@tagregularparagraph}{p}
 %    \end{macrocode}
 
 
+% \subsection{Hook while processing tags}
+%
+% This is used to disable special text processing while processing \HTML\ tags.
+% Special processing includes that done by
+% \pkg{babel-french}, \pkg{luavina}, \pkg{xevlna}.
+%
+% \begin{macro}{\LWR@hook@processingtags} Disable special text processing
+%       while generating tags.
+%       Replaces \cs{LWR@FBcancel} in most places.
+% \changes{v0.895}{2021/01/12}{Added.}
+%    \begin{macrocode}
+\newcommand*{\LWR@hook@processingtags}{}
+%    \end{macrocode}
+% \end{macro}
+
 
 % \subsection{Babel-French tag modifications}
 
@@ -22231,6 +22345,7 @@ end -- not --version
     {}%
     {%
         \LetLtxMacro\LWR@FBcancel\NoAutoSpacing%
+        \appto{\LWR@hook@processingtags}{\LWR@FBcancel}%
     }%
 
 \@ifundefined{frenchbsetup}%
@@ -22243,31 +22358,31 @@ end -- not --version
 %
     \renewrobustcmd*{\FBcolonspace}{%
         \begingroup%
-        \LWR@FBcancel%
+        \LWR@hook@processingtags%
         \LWR@origampersand{}nbsp;%
         \endgroup%
     }%
     \renewrobustcmd*{\FBthinspace}{%
         \begingroup%
-        \LWR@FBcancel%
+        \LWR@hook@processingtags%
         \LWR@origampersand\LWR@origpound{}x202f;% \,
         \endgroup%
     }%
     \renewrobustcmd*{\FBguillspace}{%
         \begingroup%
-        \LWR@FBcancel%
+        \LWR@hook@processingtags%
         \LWR@origampersand{}nbsp;% ~,  for \og xyz \fg{}
         \endgroup%
     }%
     \DeclareDocumentCommand{\FBmedkern}{}{%
         \begingroup%
-        \LWR@FBcancel%
+        \LWR@hook@processingtags%
         \LWR@origampersand\LWR@origpound{}x202f;% \,
         \endgroup%
     }%
     \DeclareDocumentCommand{\FBthickkern}{}{%
         \begingroup%
-        \LWR@FBcancel%
+        \LWR@hook@processingtags%
         \LWR@origampersand{}nbsp;% ~
         \endgroup%
     }%
@@ -22316,7 +22431,7 @@ end -- not --version
 \newcommand*{\LWR@htmltagc}[1]{%
 \LWR@traceinfo{LWR@htmltagc !\detokenize{#1}!}%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \ifmmode\else\protect\LWR@print@normalfont\protect\LWR@origttfamily\fi%
 \protect\LWR@origtextless%
 \LWR@isolate{#1}%
@@ -22496,7 +22611,7 @@ end -- not --version
 {%
 % \LWR@traceinfo{LWR@htmlopencomment}%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \ifmmode\else\protect\LWR@print@normalfont\protect\LWR@origttfamily\fi%
 \LWR@print@mbox{\LWR@origtextless{}!-\/-}%
 \endgroup%
@@ -22507,7 +22622,7 @@ end -- not --version
 {%
 % \LWR@traceinfo{LWR@htmlclosecomment}%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \ifmmode\else\protect\LWR@print@normalfont\protect\LWR@origttfamily\fi%
 \LWR@print@mbox{-\/-\LWR@origtextgreater}%
 \endgroup%
@@ -23461,7 +23576,7 @@ end -- not --version
 
 
 
-% \section{MathJax script}
+% \section{\brand{MathJax} script}
 
 % \codehtml
 %    \begin{macrocode}
@@ -23470,11 +23585,11 @@ end -- not --version
 
 % \begin{macro}{\LWR@mathjaxfilename}
 % \DescribeDefault{\filenm{lwarp_mathjax.txt}}
-% The MathJax script filename to use.
+% The \brand{MathJax} script filename to use.
 % This file is copied into the head of each \HTML\ page.
 % This may be changed mid-document using \cs{MathJaxFilename},
-% allowing the use of a custom MathJax script, such as for a local repository,
-% or different MathJax script files to be used for different sections of the document.
+% allowing the use of a custom \brand{MathJax} script, such as for a local repository,
+% or different \brand{MathJax} script files to be used for different sections of the document.
 %
 % \changes{v0.70}{2019/03/24}{Added.}
 %    \begin{macrocode}
@@ -23483,7 +23598,7 @@ end -- not --version
 % \end{macro}
 
 % \begin{macro}{\MathJaxFilename} \marg{filename} \qquad
-% Assigns the MathJax script file to be used by the following \HTML\ pages.
+% Assigns the \brand{MathJax} script file to be used by the following \HTML\ pages.
 %
 % \changes{v0.70}{2019/03/24}{Added.}
 %    \begin{macrocode}
@@ -24563,7 +24678,7 @@ end -- not --version
     \LWR@replacestrings{'}{&apos;}%
     \LWR@replacestrings{`}{&grave;}%
 %    \end{macrocode}
-% MathJax allows expressions to be defined with \cs{newcommand}.
+% \brand{MathJax} allows expressions to be defined with \cs{newcommand}.
 % These expressions would appear with |##| for each argument,
 % and each must be changed to a single |#|.
 % This must be done after all the above changes.
@@ -24587,7 +24702,7 @@ end -- not --version
 % and fully expand the strings:
 %    \begin{macrocode}
     \begingroup%
-    \LWR@FBcancel%
+    \LWR@hook@processingtags%
     \edef\LWR@strresult{\detokenize{#1}}%
     \LWR@subHTMLsanitize%
     \LWR@strresult%
@@ -24625,7 +24740,7 @@ end -- not --version
 % and fully expand the strings:
 %    \begin{macrocode}
     \begingroup%
-    \LWR@FBcancel%
+    \LWR@hook@processingtags%
 %    \end{macrocode}
 % The difference between this and \cs{LWR@HTMLsanitize} (without ``expand'')
 % is the following \cs{expandafter}:
@@ -24676,7 +24791,7 @@ end -- not --version
 %    \begin{macrocode}
 \newcommand*{\LWR@subcustomizedmathjax}[1]{%
     \begingroup%
-    \LWR@FBcancel%
+    \LWR@hook@processingtags%
     \edef\LWR@strresult{\detokenize{#1}}%
     \LWR@subHTMLsanitize%
     \xdef\LWR@customizedMathJax{%
@@ -24703,7 +24818,7 @@ end -- not --version
 \newcommand*{\CustomizeMathJax}[1]{%
     \ifbool{LWR@warnedcustomizemathjax}{}{%
         \StrLen{\detokenize{#1}}[\LWR@tempone]%
-        \ifnumgreater{\LWR@tempone}{200}{%
+        \ifnumgreater{\LWR@tempone}{350}{%
             \AtEndDocument{%
                 \PackageWarningNoLine{lwarp}{%
                     To ensure faster MathJax compilation, place each\MessageBreak
@@ -24736,6 +24851,7 @@ end -- not --version
 %    \end{macrocode}
 % \end{macro}
 
+
 % ^^A *mathjax customizations
 % Default customizations:
 % \margintag{defaults}
@@ -24832,7 +24948,7 @@ end -- not --version
 
 
 % \begin{macro}{\LWR@customizeMathJax}
-%   Prints MathJax commands to the \HTML\ output.
+%   Prints \brand{MathJax} commands to the \HTML\ output.
 %
 % \changes{v0.79}{2020/01/28}{MathJax: Hide definitions.}
 %    \begin{macrocode}
@@ -25106,7 +25222,7 @@ end -- not --version
 % Uses pipe-separated fields for |split_html.gawk|.
 % Uses monospaced font with ligatures disabled for everything except the title.
 %
-% \changes{v0.50}{2018/02/20}{Fix: SVG math in a section name.}
+% \changes{v0.50}{2018/02/20}{Fix: \SVG\ math in a section name.}
 %    \begin{macrocode}
 \LWR@traceinfo{LWR@newhtmlfile: about to print start file}%
 %    \end{macrocode}
@@ -25550,7 +25666,7 @@ end -- not --version
 %
 % \DescribeCounter{LWR@currentautosec} Records the page number when the section
 %   was created.  (If a math expression is included in the section name,
-%   and SVG math is used, the corresponding \env{lateximage} will cause the
+%   and \SVG\ math is used, the corresponding \env{lateximage} will cause the
 %   page number to change by the time the following autosec label is created,
 %   thus the initial page number is recorded here.)
 % \changes{v0.43}{2017/11/01}{\ctr{LWR@currentautosec}: Added.}
@@ -26257,6 +26373,10 @@ end -- not --version
 %    \end{macrocode}
 %
 % The language is user-adjustable:
+%
+% NOTE: \cs{LWR@orig@textquotedbl} is used here because \cs{textquotedbl} is
+% nullified by \cs{LWR@nullfonts} while starting the new file.
+%
 %    \begin{macrocode}
 \LWR@htmltag{%
     html lang=\LWR@orig@textquotedbl\LWR@currentHTMLLanguage\LWR@orig@textquotedbl%
@@ -26523,7 +26643,7 @@ end -- not --version
 \global\boolfalse{LWR@doingstartpars}
 %    \end{macrocode}
 % Document and page settings:
-% \changes{v0.45}{2017/12/08}{Fix: Lateximages on incorrect pages with Mathjax.}
+% \changes{v0.45}{2017/12/08}{Fix: Lateximages on incorrect pages with \brand{Mathjax}.}
 %    \begin{macrocode}
 \mainmatter
 \LWR@origpagenumbering{arabic}
@@ -27765,11 +27885,14 @@ end -- not --version
     \LWR@htmltag{/span}%
     \endgroup%
 }
-
+%    \end{macrocode}
+%
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
+%    \begin{macrocode}
 \xpretocmd{\verb}
     {%
         \begingroup%
-        \LWR@htmltag{span class="texttt"}%
+        \LWR@htmltag{span class=\textquotedbl{}texttt\textquotedbl}%
         \let\verb@egroup\LWR@verb@egroup@endspan%
     }
     {}
@@ -27836,7 +27959,7 @@ end -- not --version
 %    \end{macrocode}
 % Turn off \pkg{babel-french} extra space before punctuation:
 %    \begin{macrocode}
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 %    \end{macrocode}
 % Do not produce \HTML\ tags for \cs{hspace} inside a verse |par|.
 % Restore plain \LaTeX{} \cs{hspace} functionality:
@@ -28085,8 +28208,11 @@ end -- not --version
 % \begin{macro}{\LWR@printopenlist}
 % May be locally redefined by \env{enumerate} or \env{description}.
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-\newcommand*{\LWR@printopenlist}{ul style="\LWR@print@mbox{list-style-type:none}"}
+\newcommand*{\LWR@printopenlist}{%
+    ul style=\textquotedbl\LWR@print@mbox{list-style-type:none}\textquotedbl{}%
+}
 %    \end{macrocode}
 % \end{macro}
 
@@ -28323,10 +28449,13 @@ end -- not --version
 
 % \begin{environment}{itemize} \oarg{options}
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@itemizestart}{%
 \renewcommand*{\LWR@printcloselist}{\LWR@printcloseitemize}
-\renewcommand*{\LWR@printopenlist}{ul style="\LWR@print@mbox{list-style-type:none}"}
+\renewcommand*{\LWR@printopenlist}{%
+    ul style=\textquotedbl\LWR@print@mbox{list-style-type:none}\textquotedbl{}%
+}
 \let\item\LWR@itemizeitem%
 \LWR@nulllistfills%
 }
@@ -28341,10 +28470,13 @@ end -- not --version
 
 % \begin{environment}{enumerate} \oarg{options}
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@enumeratestart}{%
 \renewcommand*{\LWR@printcloselist}{\LWR@printcloseitemize}
-\renewcommand*{\LWR@printopenlist}{ul style="\LWR@print@mbox{list-style-type:none}"}
+\renewcommand*{\LWR@printopenlist}{%
+    ul style=\textquotedbl\LWR@print@mbox{list-style-type:none}\textquotedbl{}%
+}
 \let\item\LWR@itemizeitem%
 \LWR@nulllistfills%
 }
@@ -30078,6 +30210,7 @@ end -- not --version
         \booltrue{LWR@startedrow}%
 %    \end{macrocode}
 % Create the row tag, with a class if necessary.
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
         \booltrue{LWR@intabularmetadata}%
         \ifboolexpr{%
@@ -30085,19 +30218,19 @@ end -- not --version
             test{\ifnumcomp{\value{LWR@hdashedlines}}{>}{0}}%
         }%
         {%
-            \LWR@htmltag{tr class="hline" }%
+            \LWR@htmltag{tr class=\textquotedbl{}hline\textquotedbl }%
             \LWR@orignewline%
         }%
         {% not doing hline
             \ifbool{LWR@doingtbrule}%
             {%
                 \ifdefvoid{\LWR@ruleHTMLcolor}{%
-                    \LWR@htmltag{tr class="tbrule"}%
+                    \LWR@htmltag{tr class=\textquotedbl{}tbrule\textquotedbl}%
                 }{%
                     \LWR@htmltag{%
-                        tr class="tbrule" % space
-                        style="border-top: 1px solid % space
-                            \LWR@origpound\LWR@ruleHTMLcolor "%
+                        tr class=\textquotedbl{}tbrule\textquotedbl\ % space
+                        style=\textquotedbl{}border-top: 1px solid % space
+                            \LWR@origpound\LWR@ruleHTMLcolor \textquotedbl{}%
                     }%
                 }%
                 \LWR@orignewline%
@@ -30148,15 +30281,16 @@ end -- not --version
     \LWR@traceinfo{atbang: #2 !\LWR@atbangspec!}%
 %    \end{macrocode}
 % Only generate if is not empty;
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
     \ifdefempty{\LWR@atbangspec}%
     {}%
     {% not empty
         \LWR@htmltag{%
-            td class="td#1%
+            td class=\textquotedbl{}td#1%
             \LWR@subaddcmidruletrim{}{}%
             \LWR@printbartag{#2}%
-            "%
+            \textquotedbl{}%
             \LWR@tdstartstyles%
             \LWR@addcmidrulewidth%
             \LWR@addcdashline%
@@ -30248,13 +30382,14 @@ end -- not --version
                 \LWR@getexparray{LWR@tablecolspec}{\arabic{LWR@tableLaTeXcolindex}}%
             }%
 %    \end{macrocode}
-% print the start of a new table data cell:
+% Print the start of a new table data cell:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
             \LWR@traceinfo{LWR@tabledatasinglecolumntag: about to print td tag}%
             \LWR@htmltag{%
-                td class="td%
+                td class=\textquotedbl{}td%
 %    \end{macrocode}
-% append this column's spec:
+% Append this column's spec:
 %    \begin{macrocode}
                 \LWR@strresult%
 %    \end{macrocode}
@@ -30264,7 +30399,7 @@ end -- not --version
                 \LWR@addcmidruletrim%
                 \LWR@addleftmostbartag%
                 \LWR@printbartag{\arabic{LWR@tableLaTeXcolindex}}%
-                "%
+                \textquotedbl{}%
 %    \end{macrocode}
 % Add styles for rules, alignment:
 % \changes{v0.42}{2017/10/26}{If \progcode{FormatWP} add cell alignment.}
@@ -30512,11 +30647,12 @@ end -- not --version
 
 % \begin{macro}{\LWR@tdaddstyle}
 % Starts adding a table data cell style.
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@tdaddstyle}{%
     \ifbool{LWR@tdhavecellstyle}%
         {; }%
-        { style="}%
+        { style=\textquotedbl}%
     \booltrue{LWR@tdhavecellstyle}%
 }
 %    \end{macrocode}
@@ -30525,11 +30661,12 @@ end -- not --version
 % \begin{macro}{\LWR@tdendstyles}
 % Finishes possibly adding a table data cell style.
 % Prints the closing quote.
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@tdendstyles}{%
     \ifbool{LWR@tdhavecellstyle}%
         {%
-            "%
+            \textquotedbl%
             \boolfalse{LWR@tdhavecellstyle}%
         }{}%
 }
@@ -30887,11 +31024,14 @@ end -- not --version
 
 
 % \begin{macro}{\LWR@subaddtabularcellcolor} \marg{\HTML\ color}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@subaddtabularcellcolor}[1]{%
-    \LWR@htmltag{div class="cellcolor" style="%
+    \LWR@htmltag{div class=\textquotedbl{}cellcolor\textquotedbl\ % space
+        style=\textquotedbl{}%
         background:\LWR@origpound{}{}#1 %
-    " }%
+        \textquotedbl\ %
+    }% space
     \defaddtocounter{LWR@cellcolordepth}{1}%
 }
 %    \end{macrocode}
@@ -31249,20 +31389,22 @@ end -- not --version
     \LWR@maybenewtablerow%
 %    \end{macrocode}
 % Begin the opening table data tag:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
     \LWR@htmltag{%
-        td colspan="#4" %
+        td colspan=\textquotedbl#4\textquotedbl\ %
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
         \IfValueT{#2}{ % rows?
-            rowspan="#2" %
+            rowspan=\textquotedbl#2\textquotedbl\ %
         }%
 %    \end{macrocode}
 % 
 % \changes{v0.84}{2020/04/16}{Fix: Multicolumn style.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-        class="td%
+        class=\textquotedbl{}td%
 %    \end{macrocode}
 % Print the column type and vertical bars:
 %    \begin{macrocode}
@@ -31306,8 +31448,9 @@ end -- not --version
             { 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}
@@ -32139,7 +32282,7 @@ end -- not --version
 % \begin{macro}{\LWR@nullifyNoAutoSpacing}
 % For \pkg{babel-french}, turn off auto spacing at the start of the tabular,
 % then nullify the autospacing commands inside the tabular,
-% since they were not compatible with the tabular column parsing code,
+% since they were not compatible with the tabular parsing code for each cell,
 % which uses \pkg{xstring}.
 % \changes{v0.41}{2017/10/06}{\pkg{babel-french}: Fix: \cs{NoAutoSpacing} in a tabular.}
 % \changes{v0.78}{2019/10/29}{\pkg{babel-french}: Fix: Hyperlinks.}
@@ -32762,9 +32905,10 @@ end -- not --version
 
 
 % \begin{macro}{\LWR@label@subcreatetag} Creates the tag from \cs{LWR@sanitized}.
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@label@subcreatetag}{%
-    \LWR@htmltag{a \LWR@print@mbox{id="\LWR@sanitized"}}%
+    \LWR@htmltag{a \LWR@print@mbox{id=\textquotedbl\LWR@sanitized\textquotedbl}}%
     \LWR@htmltag{/a}%
 }
 %    \end{macrocode}
@@ -32912,10 +33056,11 @@ end -- not --version
 
 % \begin{macro}{\LWR@addlinktitle}
 % \changes{v0.74}{2019/08/25}{Added.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@addlinktitle}{%
     \ifdefvoid{\LWR@ThisAltText}{}{ % space
-        title="\LWR@ThisAltText" % space
+        title=\textquotedbl\LWR@ThisAltText\textquotedbl\ % space
         \gdef\LWR@ThisAltText{}%
     }%
 }
@@ -32939,8 +33084,9 @@ end -- not --version
     \LWR@traceinfo{LWR@startref A: !#1!}%
 %    \end{macrocode}
 % Create the filename part of the link:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-    \LWR@htmltag{a href="%
+    \LWR@htmltag{a href=\textquotedbl%
     \LWR@traceinfo{LWR@startref B}%
     \LWR@print@mbox{\LWR@htmlrefsectionfilename{#1}}%
     \LWR@traceinfo{LWR@startref C}%
@@ -32985,8 +33131,9 @@ end -- not --version
     \LWR@traceinfo{LWR@startref E}%
 %    \end{macrocode}
 % Closing quote:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-    "%
+    \textquotedbl%
 %    \end{macrocode}
 % Maybe add a title:
 %    \begin{macrocode}
@@ -33155,7 +33302,7 @@ end -- not --version
 % For \pkg{babel-french}:
 % \changes{v0.78}{2019/10/29}{\pkg{babel-french}: Fix: Hyperlinks.}
 %    \begin{macrocode}
-    \LWR@FBcancel%
+    \LWR@hook@processingtags%
 }
 %    \end{macrocode}
 % \end{macro}
@@ -33176,7 +33323,7 @@ end -- not --version
 % For \pkg{babel-french}:
 % \changes{v0.78}{2019/10/29}{\pkg{babel-french}: Fix: Hyperlinks.}
 %    \begin{macrocode}
-    \LWR@FBcancel%
+    \LWR@hook@processingtags%
 }
 %    \end{macrocode}
 % \end{macro}
@@ -33191,14 +33338,15 @@ end -- not --version
 % \changes{v0.18}{2016/04/14}{Improved \HTML\ output linebreaks.}
 % \changes{v0.45}{2017/12/29}{Improved URLs with underscores.}
 % \changes{v0.57}{2018/06/05}{Fix: Text catcodes.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@subhyperref}{m}{%
     \LWR@traceinfo{LWR@subhyperref !#1!}%
     \LWR@sanitize{#1}%
     \LWR@htmltag{%
-        a href="\LWR@sanitized" % space
+        a href=\textquotedbl\LWR@sanitized\textquotedbl\ % space
         \LWR@addlinktitle % space
-        target="\_{}blank" % space
+        target=\textquotedbl\_{}blank\textquotedbl\ % space
     }%
 }
 %    \end{macrocode}
@@ -33225,12 +33373,13 @@ end -- not --version
 % \changes{v0.45}{2017/12/29}{Improved URLs with underscores.}
 % \changes{v0.66}{2019/02/02}{Improved \HTML\ formatting.}
 % \changes{v0.78}{2019/11/05}{Remove extra space.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@subhyperrefclass}{m +m m}{%
     \LWR@htmltag{%
         a % space
-        href="\begingroup\@sanitize#1\endgroup" % space
-        class="#3" % space
+        href=\textquotedbl\begingroup\@sanitize#1\endgroup\textquotedbl\ % space
+        class=\textquotedbl#3\textquotedbl\ % space
         \LWR@addlinktitle % space
     }\LWR@orignewline%
     #2%
@@ -33330,23 +33479,24 @@ end -- not --version
 % \changes{v0.18}{2016/05/18}{Suppress extra space.}
 % \changes{v0.66}{2019/02/02}{Improved \HTML\ formatting.}
 % \changes{v0.74}{2019/08/20}{Add \cs{ThisAltText}.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@subinlineimage}[5]{%
     \ifblank{#1}%
     {%
         \LWR@htmltag{img \LWR@indentHTML
-            src="#3.#4" \LWR@indentHTML
-            alt="#3" \LWR@indentHTML
-            style="#5" \LWR@indentHTML
-            class="#2" \LWR@orignewline
+            src=\textquotedbl#3.#4\textquotedbl \LWR@indentHTML
+            alt=\textquotedbl#3\textquotedbl \LWR@indentHTML
+            style=\textquotedbl#5\textquotedbl \LWR@indentHTML
+            class=\textquotedbl#2\textquotedbl \LWR@orignewline
         }%
     }%
     {%
         \LWR@htmltag{img \LWR@indentHTML
-            src="#3.#4" \LWR@indentHTML
-            alt="#1" \LWR@indentHTML
-            style="#5" \LWR@indentHTML
-            class="#2" \LWR@orignewline
+            src=\textquotedbl#3.#4\textquotedbl \LWR@indentHTML
+            alt=\textquotedbl#1\textquotedbl \LWR@indentHTML
+            style=\textquotedbl#5\textquotedbl \LWR@indentHTML
+            class=\textquotedbl#2\textquotedbl \LWR@orignewline
         }%
     }%
 }
@@ -33449,10 +33599,13 @@ end -- not --version
 % \changes{v0.42}{2017/10/26}{If \progcode{FormatWP} add a text frame.}
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
 % \changes{v0.56}{2018/05/14}{Adds a \element{class} per \pkg{float} package style.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
     \LWR@htmltag{%
-        figure id="\LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}" % space
-        class="#1 \@nameuse{LWR@floatstyle@#1}"%
+        figure id=\textquotedbl%
+            \LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}%
+        \textquotedbl\ % space
+        class=\textquotedbl#1 \@nameuse{LWR@floatstyle@#1}\textquotedbl%
     }%
     \ifbool{FormatWP}{%
         \LWR@orignewline%
@@ -33599,18 +33752,23 @@ end -- not --version
 % \changes{v0.79}{2019/12/09}{Factored.}
 % \changes{v0.84}{2020/04/16}{\element{par} handling.}
 % \changes{v0.88}{2020/07/04}{Inline handling.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@forcenewautoidanchor}{%
     \addtocounter{LWR@thisautoid}{1}%
     \ifbool{LWR@doingapar}%
     {%
-        \LWR@htmltag{a id="\LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}" }%
-            \LWR@htmltag{/a }%
+        \LWR@htmltag{a id=\textquotedbl%
+            \LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}%
+            \textquotedbl\ }% space
+        \LWR@htmltag{/a }%
     }%
     {%
         \LWR@stoppars%
-        \LWR@htmltag{a id="\LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}" }%
-            \LWR@htmltag{/a }%
+        \LWR@htmltag{a id=\textquotedbl%
+            \LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}%
+        \textquotedbl\ }% space
+        \LWR@htmltag{/a }%
         \LWR@startpars%
     }%
 }
@@ -35365,7 +35523,7 @@ end -- not --version
     \LWR@restoreorigaccents%
     \LWR@restoreoriglists%
 %
-    \LWR@FBcancel%
+    \LWR@hook@processingtags%
 %    \end{macrocode}
 %
 % To enable \brand{MathJax}-specific nullification, used for \pkg{tcolorbox}:
@@ -35830,7 +35988,7 @@ end -- not --version
 %
 % A marker with alpha or opacity of 0\% is not registered by \prog{pdfcrop}, so
 % the marker is a small square block of 1\% alpha, which seems to work while still being
-% effectively invisible in the final SVG image.
+% effectively invisible in the final \SVG\ image.
 %
 % If \pkg{graphicx} is loaded, this marker is sized as a tiny 1\,sp square.
 % If \pkg{graphics} is loaded, this marker is used at its default size of around
@@ -35935,13 +36093,13 @@ end -- not --version
 % preferred.)
 %
 % \begin{description}
-% \item [SVG math:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [SVG math \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [SVG dynamic math:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [Mathjax:] Argument \#4 is the contents of the math expression
+% \item [\SVG\ math:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\SVG\ math \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\SVG\ dynamic math:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\brand{MathJax}:] Argument \#4 is the contents of the math expression
 %   without \cs{LWR@origensuredmath}.  This case is handled above.
-% \item [Mathjax \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [Mathjax dynamic math:]  Argument \#4 is the contents of the math expression
+% \item [\brand{MathJax} \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\brand{MathJax} dynamic math:]  Argument \#4 is the contents of the math expression
 %   without \cs{LWR@origensuredmath}, so \cs{LWR@origensuredmath} is added below.\
 % \item [\cs{ifmmode}:] Included ``just in case''.
 % \end{description}
@@ -36065,7 +36223,7 @@ end -- not --version
 \newcommand*{\LWR@subsingledollarsvg}[4]{%
 %    \end{macrocode}
 % Measure the depth, width, and height of the math image:
-% \changes{v0.51}{2018/03/04}{Fix: SVG math with enclosed \env{lateximage}.}
+% \changes{v0.51}{2018/03/04}{Fix: \SVG\ math with enclosed \env{lateximage}.}
 %    \begin{macrocode}
     \LWR@singledollarmeasure{#4}%
 %    \end{macrocode}
@@ -36217,17 +36375,17 @@ end -- not --version
 %                                               \marg{4: math expression}
 %
 % For inline math.
-% Uses MathJax, or for \SVG\ math the image is measured and ajusted to the baseline
+% Uses \brand{MathJax}, or for \SVG\ math the image is measured and ajusted to the baseline
 % of the \HTML\ output, and placed inside a \env{lateximage}.
 %
 % \begin{description}
-% \item [SVG math:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [SVG math \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [SVG dynamic math:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [Mathjax:] Argument \#4 is the contents of the math expression
+% \item [\SVG\ math:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\SVG\ math \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\SVG\ dynamic math:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\brand{MathJax}:] Argument \#4 is the contents of the math expression
 %   without \cs{LWR@origensuredmath}.  This case is handled above.
-% \item [Mathjax \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
-% \item [Mathjax dynamic math:]  Argument \#4 is the contents of the math expression
+% \item [\brand{MathJax} \cs{ensuremath}:] \cs{LWR@origensuredmath} is part of argument \#4.
+% \item [\brand{MathJax} dynamic math:]  Argument \#4 is the contents of the math expression
 %   without \cs{LWR@origensuredmath}, so \cs{LWR@origensuredmath} is added below.\
 % \end{description}
 %
@@ -36236,7 +36394,7 @@ end -- not --version
 % \changes{v0.19}{2016/05/25}{\brand{MathJax} support.}
 % \changes{v0.42}{2017/10/26}{If \progcode{FormatWP} print LaTeX expression.}
 % \changes{v0.47}{2018/01/24}{Added \SVG\ math image baseline adjust and em sizing.}
-% \changes{v0.50}{2018/02/23}{Fix: Use \env{lateximage} even if MathJax.}
+% \changes{v0.50}{2018/02/23}{Fix: Use \env{lateximage} even if \brand{MathJax}.}
 % \changes{v0.50}{2018/02/24}{Improved \SVG\ math \attribute{alt} tags.}
 %    \begin{macrocode}
 \newlength{\LWR@singledollarwidth}
@@ -36262,14 +36420,14 @@ end -- not --version
 %    \begin{macrocode}
         \LWR@applyxfakebold%
 %    \end{macrocode}
-% MathJax cannot parse the often complicated \TeX\ expressions which
+% \brand{MathJax} cannot parse the often complicated \TeX\ expressions which
 % appear in the various uses of \cs{ensuredmath}.
 % \cs{ensuremath} forces the \attribute{alt} tag to ``|(math image)|'', as
 % translated according to \cs{MathImageAltText}.
-% If this is the case, force the use of a \env{lateximage} even if MathJax.
+% If this is the case, force the use of a \env{lateximage} even if \brand{MathJax}.
 % Likewise for \pkg{siunitx} if |parse-numbers=false|.
 %
-% If MathJax, or if formatting math for a word processor, and not \cs{ensuredmath},
+% If \brand{MathJax}, or if formatting math for a word processor, and not \cs{ensuredmath},
 % and not a dynamic math expression, print the math expression:
 % \changes{v0.51}{2018/03/11}{Fix: \cs{ensuredmath} inside \SVG\ image.}
 % \changes{v0.57}{2018/05/23}{Fix: Dynamic inline math expressions.}
@@ -36306,7 +36464,7 @@ end -- not --version
             }%
         }% mathjax
 %    \end{macrocode}
-% For SVG, print the math inside a \env{lateximage},
+% For \SVG, print the math inside a \env{lateximage},
 % with an \element{alt} tag of the \LaTeX\ code,
 % and a \CSS\ style to control the baseline adjustment.
 %    \begin{macrocode}
@@ -36383,7 +36541,7 @@ end -- not --version
 
 }% mathjax
 %    \end{macrocode}
-% For SVG, print the math inside a \env{lateximage},
+% For \SVG, print the math inside a \env{lateximage},
 %   with an \element{alt} tag of the \LaTeX\ code:
 % \changes{v0.50}{2018/02/24}{Improved \SVG\ math \attribute{alt} tags.}
 % \changes{v0.50}{2018/03/02}{Improved \SVG\ math display.}
@@ -36479,14 +36637,14 @@ end -- not --version
 
 % \begin{macro}{\@ensuredmath} \marg{expression}
 %
-% If MathJax, a \env{lateximage} is used, since \cs{ensuremath} is
-% often used for complex \TeX\ expressions which MathJax may not render.
+% If \brand{MathJax}, a \env{lateximage} is used, since \cs{ensuremath} is
+% often used for complex \TeX\ expressions which \brand{MathJax} may not render.
 % If \SVG\ math, a hashed file is used with a simple \attribute{alt} tag, but
 % additional hashing provided by the contents.
 %
 % \changes{v0.51}{2018/02/24}{Hashes \cs{ensuremath}.}
 % \changes{v0.42}{2017/10/16}{Improved \cs{ensuremath}.}
-% \changes{v0.50}{2018/02/23}{Fix: Use \env{lateximage} even if MathJax.}
+% \changes{v0.50}{2018/02/23}{Fix: Use \env{lateximage} even if \brand{MathJax}.}
 % \changes{v0.50}{2018/02/24}{Improved \SVG\ math \attribute{alt} tags.}
 % \changes{v0.52}{2018/03/25}{Improved hashing expansion.}
 %    \begin{macrocode}
@@ -36854,7 +37012,7 @@ end -- not --version
         \LWR@hidelatexequation{#2}{#1}
     }
 %    \end{macrocode}
-% SVG output:
+% \SVG\ output:
 % Create the |lateximage| along with an \HTML\ \element{alt} tag
 % having an equation number, the \LaTeX{} equation environment
 % commands, and the contents of the environment's \cs{BODY}.
@@ -37064,7 +37222,7 @@ end -- not --version
 
 
 % \begin{macro}{\displaymathother} Use when display math environments have complicated
-% objects which will not work with MathJax or should not be
+% objects which will not work with \brand{MathJax} or should not be
 % included in \HTML\ \attribute{alt} tags. \margintag{complicated math objects}
 % Complicated contents are more likely to compile correctly.
 % \changes{v0.51}{2018/03/21}{Processing for complicated display math.}
@@ -37756,10 +37914,13 @@ end -- not --version
 % Create an \HTML\ span which will hold the comment which contains the \prog{pdftotext} translation
 % of the image's page, and also will hold the link to the |.svg| file:
 % \changes{v0.66}{2019/02/02}{Improved \HTML\ formatting.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
     \LWR@htmltag{span\LWR@indentHTML%
-        id="lateximage-\BaseJobname-\arabic{LWR@lateximagenumber}"\LWR@indentHTML
-        class="lateximagesource"\LWR@orignewline
+        id=\textquotedbl{}%
+            lateximage-\BaseJobname-\arabic{LWR@lateximagenumber}%
+            \textquotedbl\LWR@indentHTML
+        class=\textquotedbl{}lateximagesource\textquotedbl\LWR@orignewline
     }%
 %    \end{macrocode}
 % Write instructions to the |<ImagesDirectory>.txt| file:
@@ -37865,13 +38026,14 @@ end -- not --version
 %    \end{macrocode}
 %
 % Enable print-mode math functions:
-% \changes{v0.50}{2018/02/20}{Fix: SVG math in a section name.}
+% \changes{v0.50}{2018/02/20}{Fix: \SVG\ math in a section name.}
 %    \begin{macrocode}
     \LetLtxMacro$\LWR@origdollar%
     \catcode`\$=3% math shift
     \LetLtxMacro\(\LWR@origopenparen%
     \LetLtxMacro\)\LWR@origcloseparen%
 %    \end{macrocode}
+%
 % Only enable print-mode display math if are not already inside display math:
 % \changes{v0.51}{2018/03/21}{Processing for complicated display math.}
 %    \begin{macrocode}
@@ -37884,6 +38046,7 @@ end -- not --version
         \csletcs{endequation*}{LWR@origendequation*}%
     }% not in display math
 %    \end{macrocode}
+%
 % For \pkg{chemformula}:
 %    \begin{macrocode}
     \LetLtxMacro\LWR@newsingledollar$%
@@ -37896,20 +38059,20 @@ end -- not --version
 %    \end{macrocode}
 %
 %
-%
-%
-% When the environment closes:
+% When the \env{lateximage} environment closes:
 % \margintag{\cs{endlateximage}}
 %
 %    \begin{macrocode}
 {% start of \end{lateximage}
 \LWR@traceinfo{lateximage: starting end of lateximage}%
 %    \end{macrocode}
+%
 % Nested more than one deep?
 %    \begin{macrocode}
 \LWR@traceinfo{lateximage: internal depth was \arabic{LWR@lateximagedepth}}%
 \ifnumcomp{\value{LWR@lateximagedepth}}{>}{1}%
 %    \end{macrocode}
+%
 % If nesting inside an already existing lateximage, simply record one less level.
 % Uses a lower-level \TeX\ macro due to \AmS\ \cs{text} change of \cs{addtocounter}.
 %    \begin{macrocode}
@@ -37918,10 +38081,12 @@ end -- not --version
     \global\advance\c@LWR@lateximagedepth -1\relax%
 }%
 %    \end{macrocode}
+%
 % If this is the outer-most lateximage:
 %    \begin{macrocode}
 {% end of outer-most lateximage
 %    \end{macrocode}
+%
 % Finish the lateximage minipage and start a new \PDF\ page:
 % \changes{v0.69}{2019/03/14}{Fix for \prog{pdftotext} errors from font size change.}
 %    \begin{macrocode}
@@ -37929,12 +38094,14 @@ end -- not --version
     \endLWR@print@minipage%
     \LWR@maybe@orignewpage%
 %    \end{macrocode}
+%
 % Close the \HTML\ comment which encapsulated any traces of the lateximage picked up by \prog{pdftotext}:
 %    \begin{macrocode}
     \LWR@print@vspace*{.5\baselineskip}%
     \LWR@htmlclosecomment%
     \LWR@traceinfo{lateximage: The page after the image is \arabic{page}}%
 %    \end{macrocode}
+%
 % Create a link to the lateximage, allowing its natural height:
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
 % \changes{v0.50}{2018/02/22}{MD5 hash avoids duplicate \SVG\ math.}
@@ -37948,10 +38115,12 @@ end -- not --version
         \LWR@lateximage@oneimage{#2}{\LWR@ImagesName\theLWR@externalfilecnt}{#5}{#3}%
     }% no hash
 %    \end{macrocode}
+%
 % Be sure that are doing a paragraph:
 %    \begin{macrocode}
     \LWR@ensuredoingapar%
 %    \end{macrocode}
+%
 % Close the \HTML\ span which has the \prog{pdftotext} comment and also the link to the |.svg| image:
 %    \begin{macrocode}
     \LWR@htmltag{/span}%
@@ -37959,11 +38128,13 @@ end -- not --version
         \LWR@htmlcomment{End of lateximage}%
     }{}%
 %    \end{macrocode}
+%
 % Undo one lateximage level.
 % This is not inside an \AmS\ \cs{text}, so regular \cs{addtocounter} may be used here.
 %    \begin{macrocode}
     \addtocounter{LWR@lateximagedepth}{-1}%
 %    \end{macrocode}
+%
 % Clear the single-use \attribute{alt} text:
 % \changes{v0.74}{2019/08/20}{Add \cs{ThisAltText}.}
 %    \begin{macrocode}
@@ -38907,13 +39078,16 @@ end -- not --version
 % If |FormatWP|, add a text frame:
 % \changes{v0.42}{2017/10/26}{If \progcode{FormatWP} add a text frame.}
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \ifbool{FormatWP}{%
 
 \addtocounter{LWR@thisautoidWP}{1}%
 \LWR@htmltag{%
-    div id="\LWR@print@mbox{autoidWP-\arabic{LWR@thisautoidWP}}" %
-    class="wpminipage"%
+    div id=\textquotedbl%
+        \LWR@print@mbox{autoidWP-\arabic{LWR@thisautoidWP}}%
+    \textquotedbl\ % space
+    class=\textquotedbl{}wpminipage\textquotedbl%
 }%
 
 }{}%
@@ -38921,9 +39095,10 @@ end -- not --version
 %
 % Create the \element{div} tag with optional alignment style:
 % \changes{v0.47}{2018/01/26}{Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \LWR@traceinfo{minipage: creating div class}%
-\LWR@htmltag{div class="minipage" style="%
+\LWR@htmltag{div class=\textquotedbl{}minipage\textquotedbl\ style=\textquotedbl%
 \ifthenelse{\equal{#1}{t}}{\LWR@print@mbox{vertical-align:bottom} ; }{}%
 \ifthenelse{\equal{#1}{c}}{\LWR@print@mbox{vertical-align:middle} ; }{}%
 \ifthenelse{\equal{#1}{b}}{\LWR@print@mbox{vertical-align:top} ; }{}%
@@ -38950,7 +39125,8 @@ end -- not --version
 }%
 \LWR@traceinfo{minipage: about to print the height}%
 \ifblank{#2}{}{height:\LWR@printlength{\LWR@minipageheight} ; }%
-"}%
+\textquotedbl%
+}%
 %    \end{macrocode}
 %
 % Finish with an empty line to start the contents on a new line.
@@ -40511,11 +40687,12 @@ color:\LWR@origpound\LWR@tempcolor%
     }%
 %    \end{macrocode}
 % Print the span with the converted width.  Not rounded.
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
     {%
         \LWR@htmltagc{%
-            span style="width:\LWR@printlength{\LWR@tempwidth};  % extra space
-                display:inline-block"%
+            span style=\textquotedbl{}width:\LWR@printlength{\LWR@tempwidth};  % extra space
+                display:inline-block\textquotedbl%
         }%
 %    \end{macrocode}
 % If formatting for a word processor, approximate with a number of \cs{quad}s,
@@ -40698,11 +40875,12 @@ color:\LWR@origpound\LWR@tempcolor%
 % less than 1pt is quite common in \LaTeX\ code.
 % \changes{v0.57}{2018/06/02}{Fix: Colored rules.}
 % \changes{v0.66}{2019/02/02}{Improved \HTML\ formatting.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
     \LWR@findcurrenttextcolor%
     \LWR@htmltagc{%
     span\LWR@indentHTML%
-    style="%
+    style=\textquotedbl%
 %    \end{macrocode}
 % The \HTML\ background color is used to draw the filled rule according
 % to the \LaTeX\ foreground color set by \cs{textcolor}.
@@ -40737,8 +40915,9 @@ color:\LWR@origpound\LWR@tempcolor%
     }%
 %    \end{macrocode}
 % Display inline-block to place the span inline with the text:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-    display:inline-block;"\LWR@orignewline%
+    display:inline-block;\textquotedbl\LWR@orignewline%
     }%
 %    \end{macrocode}
 % If formatting for a word processor, approximate with a number of underscores,
@@ -41432,7 +41611,7 @@ color:\LWR@origpound\LWR@tempcolor%
     \typeout{Package lwarp:}
     \typeout{If the error}
     \typeout{\space\space``! Undefined control sequence.
-        \space ... \space \protect\@begindocumenthook''}
+        \space ... \space \protect\__hook begindocument''}
     \typeout{occurs here, use the polyglossia macro:}
     \typeout{\space\space\protect\setmainlanguage\protect{...\protect}}
     \typeout{---}
@@ -41486,13 +41665,15 @@ color:\LWR@origpound\LWR@tempcolor%
 % To be done \cs{AtBeginDocument}.
 %
 % \changes{v0.894}{2020/12/22}{Warn if using packages not supported by \brand{MathJax}.}
+% \changes{v0.895}{2021/01/08}{Improved \brand{MathJax} warning.}
 %    \begin{macrocode}
 \newcommand*{\LWR@nomathjaxwarn}[2]{%
     \@ifpackageloaded{lwarp-#1}{%
         \ifblank{#2}{%
             \PackageWarningNoLine{lwarp}
                 {%
-                    Lwarp does not provide MathJax support for #1%
+                    Lwarp does not provide MathJax support for #1.\MessageBreak
+                    Use SVG math by removing the Lwarp mathjax option%
                 }
         }{%
             \PackageWarningNoLine{lwarp}
@@ -41506,7 +41687,8 @@ color:\LWR@origpound\LWR@tempcolor%
 %    \end{macrocode}
 %
 % \begin{macro}{\LWR@forceSVGmessage} \marg{packagename}
-% \changes{v0.894}{2020/12/22}{Improved MathJax warnings.}
+% \changes{v0.894}{2020/12/22}{Improved \brand{MathJax} warnings.}
+% \changes{v0.895}{2021/01/08}{Improved \brand{MathJax} warning.}
 %    \begin{macrocode}
 \newcommand*{\LWR@forceSVGmessage}[1]{%
     SVG math output may be enabled for select math\MessageBreak
@@ -41517,23 +41699,34 @@ color:\LWR@origpound\LWR@tempcolor%
     afterward to resume using MathJax math.\MessageBreak
     Before display math, use \protect\displaymathother\MessageBreak
     to begin using SVG math, and use \protect\displaymathnormal\MessageBreak
-    after to resume using MathJax for the following math%
+    after to resume using MathJax for the following math.\MessageBreak
+    Or, use SVG math for all expressions by removing\MessageBreak
+    the mathjax option for the lwarp package%
 }
 %    \end{macrocode}
 % \end{macro}
 %
+%
 % ^^A *mathjax warnings
 %
 % If \brand{MathJax} is being used, issue a warning for certain packages.
-% \changes{v0.894}{2020/12/22}{Improved MathJax warnings.}
+% \changes{v0.894}{2020/12/22}{Improved \brand{MathJax} warnings.}
+% \changes{v0.895}{2021/02/06}{Added \brand{MathJax} warnings for
+%               \pkg{aligned-overset}, \pkg{autoaligne}, \pkg{boldtensors},
+%               \pkg{liberitinust1math}, \pkg{tensind}.}
+% \changes{v0.895}{2021/02/06}{Improved \brand{MathJax} warning  for \pkg{unicode-math}.}
 %    \begin{macrocode}
 \AtBeginDocument{
     \ifbool{mathjax}{
+        \LWR@nomathjaxwarn{aligned-overset}{}
+        \LWR@nomathjaxwarn{amscdx}
+            {\LWR@forceSVGmessage{amscdx}}
         \LWR@mathjaxwarn{arydshln}
             {In a math array, do not use the optional argument\MessageBreak
             for \protect\cdashline.\space\space
             Furthermore, \protect\cline\space is not\MessageBreak
             supported by MathJax}
+        \LWR@nomathjaxwarn{autoaligne}{}
         \LWR@mathjaxwarn{autonum}
             {MathJax does not support equation+.\MessageBreak
             You may use the warpprint and warpHTML\MessageBreak
@@ -41541,6 +41734,7 @@ color:\LWR@origpound\LWR@tempcolor%
             and the equation+ environments}
         \LWR@mathjaxwarn{bigdelim}
             {Delimiters appear only of the first line}
+        \LWR@nomathjaxwarn{boldtensors}{}
         \LWR@mathjaxwarn{booktabs}
             {\protect\cmidrule\space is not displayed}
         \LWR@mathjaxwarn{breqn}
@@ -41555,8 +41749,18 @@ color:\LWR@origpound\LWR@tempcolor%
             {\LWR@forceSVGmessage{gauss}}
         \LWR@mathjaxwarn{hhline}
             {A simple \protect\hline\space is used}
+        \LWR@mathjaxwarn{isomath}
+            {Some of the symbol font macros such as \protect\mathsfbfit\MessageBreak
+                do not use a sans font because MathJax does not yet\MessageBreak
+                have sans Greek.  Tensors may look like vectors%
+            }
         \LWR@nomathjaxwarn{jkmath}
             {\LWR@forceSVGmessage{jkmath}}
+        \LWR@mathjaxwarn{libertinust1math}
+            {Some of the symbol font macros such as \protect\mathsfbfit\MessageBreak
+                do not use a sans font because MathJax does not yet\MessageBreak
+                have sans Greek.  Tensors may look like vectors%
+            }
         \LWR@mathjaxwarn{mathtools}
             {See the Lwarp manual regarding the disallowspaces\MessageBreak
             and showonlyrefs options, the alignat environment,\MessageBreak
@@ -41581,13 +41785,15 @@ color:\LWR@origpound\LWR@tempcolor%
 % %             {The third-party extension is not used.\MessageBreak
 %             {The MathJax v3 extension is used.\MessageBreak
 %             See the Lwarp manual for details}
+        \LWR@nomathjaxwarn{tensind}{}
         \LWR@mathjaxwarn{unicode-math}
             {Do not use embedded Unicode characters.\MessageBreak
-            Not all characters are encoded correctly.\MessageBreak
-            \protect\left\space and \protect\right\space may not work.\MessageBreak
+            (Not all characters are encoded correctly.)\MessageBreak
             Some symbol fonts are not supported by MathJax,\MessageBreak
             and are only approximated.\MessageBreak
-            Latin characters may not be correct}
+            Greek macros such as \protect\alpha\space respond to the math-style\MessageBreak
+            option.  Latin symbols does not, per MathJax\MessageBreak
+            limitations, unless placed inside \protect\symbit\space or similar}
         \LWR@nomathjaxwarn{unitsdef}{}
         \LWR@mathjaxwarn{witharrows}
             {Arrows can only point to the next line.\MessageBreak
@@ -42214,7 +42420,18 @@ color:\LWR@origpound\LWR@tempcolor%
     \LWR@DeclareAcronym
 }
 %    \end{macrocode}
-
+%
+%
+% Replace dot fill with simple dots:
+% \changes{v0.895}{2021/01/20}{\pkg{acro}: Updated to v3.5.}
+%    \begin{macrocode}
+\ExplSyntaxOn
+\cs_new_protected:Npn \LWR@HTML@acro_dot_fill: {\dots\space}
+\LWR@formatted{acro_dot_fill:}
+\ExplSyntaxOff
+%    \end{macrocode}
+%
+%
 % Modified to activate the current font:
 % \changes{v0.76}{2019/10/07}{\pkg{acro}: Updated for v2.10.}
 %    \begin{macrocode}
@@ -42827,6 +43044,7 @@ color:\LWR@origpound\LWR@tempcolor%
 %
 % \changes{v0.42}{2017/10/27}{\pkg{algorithmicx}: If \progcode{FormatWP} add \cs{quad}s.}
 % \changes{v0.44}{2017/11/16}{\pkg{algorithmicx}: Improved comment symbol.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %
 %    \begin{macrocode}
 \AtBeginEnvironment{algorithmic}{%
@@ -42836,7 +43054,9 @@ color:\LWR@origpound\LWR@tempcolor%
 \renewcommand*{\ALG@doentity}{%
 \origALG@doentity%
 \LWR@htmltagc{%
-span style="width:\LWR@printlength{\ALG@thistlm}; display:inline-block;"%
+    span style=\textquotedbl{}%
+        width:\LWR@printlength{\ALG@thistlm}; display:inline-block;%
+    \textquotedbl%
 }%
 \ifbool{FormatWP}{%
 \setlength{\LWR@templengthone}{\the\ALG@thistlm}%
@@ -42926,6 +43146,53 @@ span style="width:\LWR@printlength{\ALG@thistlm}; display:inline-block;"%
 %
 %
 %
+% \iffalse
+%<*amscdx>
+% \fi
+%
+% \part{lwarp-amscdx.sty}
+%
+% \section{amscdx}
+%
+% \credits{Martin Vermeer}
+%
+% \DescribePackage{amscdx}
+% \pkg{amscdx} is used as-is for \SVG\ math.
+%
+% For \brand{MathJax}, a warning notes that the \env{CD} environment
+% \trouble[\brand{MathJax}]{amscdx=\pkg{amscdx}}
+% must be enclosed between \cs{displaymathother} and \cs{displaymathnormal}.
+%
+% \changes{v0.895}{2021/01/08}{\pkg{amscdx}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{amscdx}[2019/07/02]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\begin{warpMathJax}
+\CustomizeMathJax{%
+    \renewenvironment{CD}
+        {\text{(Use \unicode{x005C}displaymathother before the CD enviroment.) \quad}}
+        {\quad \text{(Use \unicode{x005C}displaymathnormal after the CD enviroment.)}}
+}
+
+\CustomizeMathJax{\newcommand{\CDfattrue}{}}
+\CustomizeMathJax{\newcommand{\CDfatfalse}{}}
+\CustomizeMathJax{\newcommand{\CDashtrue}{}}
+\CustomizeMathJax{\newcommand{\CDashfalse}{}}
+\CustomizeMathJax{\newcommand{\CDlor}[1]{}}
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</amscdx>
+% \fi
+%
+%
+%
 %
 % \iffalse
 %<*amsmath>
@@ -43213,9 +43480,20 @@ span style="width:\LWR@printlength{\ALG@thistlm}; display:inline-block;"%
 % For \brand{MathJax}:
 % \changes{v0.79}{2020/01/27}{\pkg{amsmath}: Added \brand{MathJax} emulation.}
 % \changes{v0.82}{2020/03/14}{\pkg{amsmath}: Fixed: \cs{intertext} for \brand{MathJax}.}
+% \changes{v0.895}{2021/02/11}{\pkg{amsmath}: Added \cs{Hat}, etc..}
 %    \begin{macrocode}
 \begin{warpMathJax}
 \CustomizeMathJax{\newcommand{\intertext}[1]{\text{#1}\notag \\}}
+\CustomizeMathJax{\let\Hat\hat}
+\CustomizeMathJax{\let\Check\check}
+\CustomizeMathJax{\let\Tilde\tilde}
+\CustomizeMathJax{\let\Acute\acute}
+\CustomizeMathJax{\let\Grave\grave}
+\CustomizeMathJax{\let\Dot\dot}
+\CustomizeMathJax{\let\Ddot\ddot}
+\CustomizeMathJax{\let\Breve\breve}
+\CustomizeMathJax{\let\Bar\bar}
+\CustomizeMathJax{\let\Vec\vec}
 \end{warpMathJax}
 %    \end{macrocode}
 %
@@ -44680,7 +44958,7 @@ span style="width:\LWR@printlength{\ALG@thistlm}; display:inline-block;"%
 \renewenvironment{bnf*}{\csuse{eqnarray*}}{\csuse{endeqnarray*}}
 %    \end{macrocode}
 %
-% ^^A % For HTML without SVG images, but also without equation numbering:
+% ^^A % For HTML without \SVG\ images, but also without equation numbering:
 % ^^A %
 % ^^A % A purely \HTML\ text output is generated, without math images.
 % ^^A %
@@ -46400,7 +46678,7 @@ span style="width:\LWR@printlength{\ALG@thistlm}; display:inline-block;"%
 % \section{cancel}
 %
 % \DescribePackage{cancel}
-% \pkg{cancel} is used as-is for SVG math, and emulated for \HTML\ text output.
+% \pkg{cancel} is used as-is for \SVG\ math, and emulated for \HTML\ text output.
 %
 % \changes{v0.44}{2017/11/16}{\pkg{cancel}: Added.}
 % \changes{v0.87}{2020/06/02}{\pkg{cancel}: Now uses \brand{MathJax} v3 extension.}
@@ -47123,13 +47401,18 @@ s%
 % \DescribePackage{changes}
 % \pkg{changes} is patched for use by \pkg{lwarp}.
 %
+% Use \optn{commandnameprefix=ifneeded} to avoid a conflict with the \cs{comment}
+% \trouble[\cs{comment}]{changes=\pkg{changes}}
+% command when using \pkg{lwarp}.
+%
 % \changes{v0.67}{2019/02/15}{\pkg{changes}: Added.}
 % \changes{v0.70}{2019/03/24}{\pkg{changes}: Updated to v3.1.2.}
+% \changes{v0.895}{2021/01/30}{\pkg{changes}: Updated to v4.0.1.}
 %
 % \codehtml
 %
 %    \begin{macrocode}
-\LWR@ProvidesPackagePass{changes}[2019/01/26]
+\LWR@ProvidesPackagePass{changes}[2021/02/14]
 %    \end{macrocode}
 %
 % \cs{BaseJobname} is added to the label in case \pkg{xr} or \pkg{xr-hyper} are used.
@@ -47137,7 +47420,7 @@ s%
 % \changes{v0.72}{2019/06/05}{\pkg{changes}: Fix references for \pkg{xr}, \pkg{xr-hyper}.}
 %    \begin{macrocode}
 \renewcommand{\ChangesListline}[4]{%
-    \IfSubStr{\Changes@loc@show}{#1}{%
+    \IfIsInList{#1}{\Changes@loc@show}{%
         \LWR@startpars%
         #2: #3 \qquad
         \nameref{\BaseJobname-autopage-#4}%
@@ -47145,112 +47428,255 @@ s%
     }{}%
 }
 
-\renewcommand{\Changes@summaryline}[4]{%
-    \IfSubStr{\Changes@loc@show}{#1}{%
-        \ifthenelse{\not\equal{\Changes@loc@style}{compactsummary} \or #2 > 0}%
-            {%
-                #3:~#2#4%
-            }{}%
-    }{}%
+\renewcommand{\listofchanges}[1][\@empty]{%
+\setkeys{Changes@loc}{#1}%
+\ifbool{Changes@optiondraft}%
+{%
+\IfIsInList{\Changes@loc@style}{list|summary|compactsummary}%
+{}%
+{%
+\PackageWarning{changes}{Wrong style for list of changes: '\Changes@loc@style', using 'list' instead.}%
+\def\Changes@loc@style{}%
+}%
+\IfIsEmpty{\Changes@loc@style}%
+{\def\Changes@loc@style{list}}%
+{}%
+\IfStrEq{\Changes@loc@show}{all}%
+{\def\Changes@loc@show{added|deleted|replaced|highlight|comment}}%
+{}%
+\IfIsInList{\Changes@loc@show}{added|deleted|replaced|highlight|comment}%
+{}%
+{%
+\PackageWarning{changes}{Wrong show-value for list of changes: '\Changes@loc@show', using 'all' instead.}%
+\def\Changes@loc@show{}%
+}%
+\IfIsEmpty{\Changes@loc@show}%
+{\def\Changes@loc@show{added|deleted|replaced|highlight|comment}}%
+{}%
+\IfIsEmpty{\Changes@loc@title}%
+{%
+\IfStrEq{\Changes@loc@style}{list}%
+{\def\Changes@heading{\listofchangesname}}{}%
+\IfStrEq{\Changes@loc@style}{summary}%
+{\def\Changes@heading{\summaryofchangesname}}{}%
+\IfStrEq{\Changes@loc@style}{compactsummary}%
+{\def\Changes@heading{\compactsummaryofchangesname}}{}%
+}%
+{\def\Changes@heading{\Changes@loc@title}}%
+\section*{\Changes@heading}
+\IfIsInList{\Changes@loc@style}{list}%
+{%
+\IfFileExists{\jobname.\Changes@locextension}%
+{%
+\newread\Changes@InFile%
+\openin\Changes@InFile=\jobname.\Changes@locextension%
+\loop\unless\ifeof\Changes@InFile%
+\read\Changes@InFile to \Changes@Line%
+\ifeof\Changes@InFile\else%
+\Changes@Line%
+\fi
+\repeat
+\closein\Changes@InFile%
+}{%
+\emph{\changesnoloc}%
+\PackageWarning{changes}{LaTeX rerun needed for list of changes}%
+}%
+}{}%
+\IfIsInList{\Changes@loc@style}{summary|compactsummary}%
+{%
+\IfFileExists{\jobname.\Changes@socextension}%
+{%
+\newread\Changes@InFile%
+\openin\Changes@InFile = \jobname.\Changes@socextension%
+\loop\unless\ifeof\Changes@InFile%
+\read\Changes@InFile to \Changes@Line%
+\ifeof\Changes@InFile\else%
+\expandafter\changes@chopline\Changes@Line\\%
+\textbf{%
+\IfIsColored%
+{\color{\Changes@Incolor}}%
+{}%
+\IfIsAnonymous{\Changes@Inid}%
+{%
+    \LWR@textcurrentcolor{%     lwarp
+        \changesauthorname: \changesanonymousname%
+    }%  lwarp
+}%
+{%
+    \LWR@textcurrentcolor{%     lwarp
+\changesauthorname: \Changes@Inid%
+    }%  lwarp
+\IfIsEmpty{\Changes@Inname}%
+{}%
+{ %
+    \LWR@textcurrentcolor{%     lwarp
+(\Changes@Inname)%
+    }%  lwarp
+}%
+}%
+}\\%
+\numdef{\Changes@InSum}{0}%
+\renewcommand*{\do}[1]{%
+\numdef{\Changes@InSum}{\Changes@InSum + \csuse{Changes@In########1}}%
+}%
+\expandafter\dopsvlist\expandafter{\Changes@loc@show}%
+\ifnumcomp{\Changes@InSum}{=}{0}%
+{%
+% \parbox{\Changes@summary@width}{% lwarp
+    \changesnochanges%
+% }%    lwarp
+% \\[1ex]%    lwarp
+    \par%   \lwarp
+}%
+{%
+\numdef{\Changes@InCount}{0}%
+\renewcommand*{\do}[1]{%
+\numdef{\Changes@InCount}{\Changes@InCount + \csuse{Changes@In########1}}%
+\ifboolexpr{%
+not test {\IfStrEq{\Changes@loc@style}{compactsummary}} or%
+test {\ifnumgreater{\csuse{Changes@In########1}}{0}}%
+}%
+{%
+% \parbox{\Changes@summary@width}{%  lwarp
+\csuse{changes########1name}~%
+% \let\cleaders\leaders\dotfill~%   lwarp
+\dotfill~%   \lwarp
+\csuse{Changes@In########1}%
+% }%    lwarp
+% \ifnumless{\Changes@InCount}{\Changes@InSum}%     lwarp
+{\\}%
+% {\\[1ex]}%    lwarp
+}%
+{}%
+}%
+\expandafter\dopsvlist\expandafter{\Changes@loc@show}%
+    \par%   lwarp
+}%
+\fi%
+\repeat
+\closein\Changes@InFile%
+}{%
+\emph{\changesnosoc}%
+\PackageWarning{changes}{LaTeX rerun needed for summary of changes}%
+}%
+}{}%
+}{}%
 }
 
-\xpatchcmd{\listofchanges}
-    {{\changesauthorname: \changesanonymousname}}
-    {{\LWR@textcurrentcolor{\changesauthorname: \changesanonymousname}}}
-    {}
-    {\LWR@patcherror{changes}{listofchanges A}}
-
-\xpatchcmd{\listofchanges}
-    {\changesauthorname: \Changes@InID}
-    {\LWR@textcurrentcolor{\changesauthorname: \Changes@InID}}
-    {}
-    {\LWR@patcherror{changes}{listofchanges B}}
-
-\xpatchcmd{\listofchanges}
-    {(\Changes@InName)}
-    {\LWR@textcurrentcolor{(\Changes@InName)}}
-    {}
-    {\LWR@patcherror{changes}{listofchanges C}}
-
-\xpatchcmd{\listofchanges}
-    {\parbox{\Changes@summary@width}}
-    {}
-    {}
-    {\LWR@patcherror{changes}{listofchanges D}}
 
-\xpatchcmd{\Changes@Markup@comment}
-    {%
-        \ifthenelse{\isAnonymous{#2}}%
-            {\textbf{[\arabic{Changes@commentCount#2}]:} }%
-            {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
-        #1%
-    }
-    {%
-        \LWR@textcurrentcolor{%         lwarp
-        \ifthenelse{\isAnonymous{#2}}%
-            {\textbf{[\arabic{Changes@commentCount#2}]:} }%
-            {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
-        #1%
-        }%                              lwarp
-    }
-    {}
-    {\LWR@patcherror{changes}{\Changes@Markup@comment A}}
-
-\xpatchcmd{\Changes@Markup@comment}
-    {%
-        \uwave{%
-            \ifthenelse{\isAnonymous{#2}}%
-                {\textbf{[\arabic{Changes@commentCount#2}]:} }%
-                {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
-            #1%
-        }%
-    }
-    {%
-        \LWR@textcurrentcolor{%         lwarp
-        \uwave{%
-            \ifthenelse{\isAnonymous{#2}}%
-                {\textbf{[\arabic{Changes@commentCount#2}]:} }%
-                {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
-            #1%
-        }%
-        }%                              lwarp
-    }
-    {}
-    {\LWR@patcherror{changes}{\Changes@Markup@comment B}}
-
-\xpatchcmd{\Changes@output}
-    {\Changes@Markup@author{\Changes@output@author{#2}{left}}}
-    {\LWR@textcurrentcolor{\Changes@Markup@author{\Changes@output@author{#2}{left}}}}
-    {}
-    {\LWR@patcherror{changes}{Changes@output A}}
-
-\xpatchcmd{\Changes@output}
-    {%
-        \ifthenelse{\equal{#1}{added}}{\Changes@Markup@added{#3}}{}%
-        \ifthenelse{\equal{#1}{deleted}}{\Changes@Markup@deleted{#4}}{}%
-        \ifthenelse{\equal{#1}{replaced}}{%
-            {\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}%
-        }{}%
-        \ifthenelse{\equal{#1}{highlight}}{\Changes@Markup@highlight{#3}}{}%
-    }
-    {%
-        \LWR@textcurrentcolor{%
-        \ifthenelse{\equal{#1}{added}}{\Changes@Markup@added{#3}}{}%
-        \ifthenelse{\equal{#1}{deleted}}{\Changes@Markup@deleted{#4}}{}%
-        \ifthenelse{\equal{#1}{replaced}}{%
-            {\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}%
-        }{}%
-        \ifthenelse{\equal{#1}{highlight}}{\Changes@Markup@highlight{#3}}{}%
-        }%
-    }
-    {}
-    {\LWR@patcherror{changes}{Changes@output B}}
+\renewcommand{\Changes@Markup@comment}[3]{%
+\IfStrEq{\Changes@optioncommentmarkup}{todo}%
+{%
+\IfIsColored%
+{\colorlet{Changes@todocolor}{authorcolor}}%
+{\colorlet{Changes@todocolor}{black}}%
+\todo[color=Changes@todocolor!10, bordercolor=Changes@todocolor, linecolor=Changes@todocolor!70, nolist]{\textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{authorcommentcount}]} #1}%
+}{}%
+\IfStrEq{\Changes@optioncommentmarkup}{margin}%
+{%
+\marginpar{%
+\IfIsColored%
+{\leavevmode\color{authorcolor}}%
+{}%
+    \LWR@textcurrentcolor{%     lwarp
+\textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1%
+    }%  lwarp
+}%
+}{}%
+\IfStrEq{\Changes@optioncommentmarkup}{footnote}%
+{%
+\footnote{%
+    \LWR@textcurrentcolor{%     lwarp
+\textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1%
+    }%  lwarp
+}%
+}{}%
+\IfStrEq{\Changes@optioncommentmarkup}{uwave}%
+{%
+{%
+\IfIsColored%
+{\color{authorcolor}}%
+{}%
+\allowbreak%
+\uwave{%
+\textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1%
+}%
+}%
+}{}%
+}
 
-\xpatchcmd{\Changes@output}
-    {\Changes@Markup@author{\Changes@output@author{#2}{right}}}
-    {\LWR@textcurrentcolor{\Changes@Markup@author{\Changes@output@author{#2}{right}}}}
-    {}
-    {\LWR@patcherror{changes}{Changes@output C}}
+\renewrobustcmd{\Changes@output}[7]{%
+\ifbool{Changes@optiondraft}%
+{%
+\Changes@check@author{#2}%
+\Changes@set@color{#2}%
+{%
+\IfIsInList{#1}{added|deleted|replaced|highlight}%
+{%
+\IfIsEmpty{#5}%
+{%
+\IfIsAuthorEmptyAtPosition{#2}{left}%
+{}%
+{{%
+\IfIsColored%
+{\color{authorcolor}}%
+{}%
+    \LWR@textcurrentcolor{%     lwarp
+\Changes@Markup@author{\Changes@output@author{#2}{left}}%
+    }%  lwarp
+}}%
+}{}%
+{%
+\IfStrEq{#1}{highlight}%
+{}{%
+\IfIsColored%
+{\color{authorcolor}}%
+{}%
+}%
+    \LWR@textcurrentcolor{%     lwarp
+\IfStrEq{#1}{added}{\Changes@Markup@added{#3}}{}%
+\IfStrEq{#1}{deleted}{\Changes@Markup@deleted{#4}}{}%
+\IfStrEq{#1}{replaced}{{\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}}{}%
+\IfStrEq{#1}{highlight}{\Changes@Markup@highlight{#3}}{}%
+    }%  lwarp
+}%
+\IfIsEmpty{#5}%
+{%
+\IfIsAuthorEmptyAtPosition{#2}{right}%
+{}%
+{{%
+\IfIsColored%
+{\color{authorcolor}}%
+{}%
+    \LWR@textcurrentcolor{%     lwarp
+\Changes@Markup@author{\Changes@output@author{#2}{right}}%
+    }%  lwarp
+}}%
+}{}%
+\stepcounter{Changes@#1Count#2}%
+}{}%
+\IfIsEmpty{#5}%
+{}%
+{%
+\stepcounter{Changes@commentCount#2}%
+\Changes@set@commentcount{#2}%
+\Changes@Markup@comment%
+{#5}%
+{#2}%
+{\Changes@output@author{#2}{left}\Changes@output@author{#2}{right}}%
+}%
+}%
+\IfIsEmpty{#2}%
+{\def\Changes@locid{}}%
+{\def\Changes@locid{~(#2)}}%
+\addtocontents{\Changes@locextension}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}%
+}%
+{%
+\IfIsEmpty{#3}%
+{\@bsphack\@esphack}%
+{#3}%
+}%
+}
 %    \end{macrocode}
 %
 % \iffalse
@@ -47481,7 +47907,7 @@ s%
 %    \end{macrocode}
 %
 % \begin{noindmacro}{\ch}
-% Enclose in an inline \SVG\ image or MathJax.
+% Enclose in an inline \SVG\ image or \brand{MathJax}.
 % The \attribute{alt} tag is is the contents of the \cs{ch} expression.
 % The filename is hashed, and also has additional hashing information based on
 % the local options.
@@ -47864,7 +48290,7 @@ s%
 \LWR@ProvidesPackagePass{chemmacros}[2017/08/28]
 %    \end{macrocode}
 %
-% SVG file hashing assumes that the relevent options are constant for the entire document.
+% \SVG\ file hashing assumes that the relevent options are constant for the entire document.
 %
 % \subsection{Changes to the user's document}
 %
@@ -51808,6 +52234,45 @@ name = \chemmacros_translate:n {scheme-name}
 %
 %
 %
+% \iffalse
+%<*epsf>
+% \fi
+%
+% \part{lwarp-epsf.sty}
+%
+% \section{epsf}
+%
+% \credits{Tom Rokicki}
+%
+% \DescribePackage{epsf}
+% \pkg{epsf} is patched for use by \pkg{lwarp}.
+%
+% \changes{v0.895}{2019/01/19}{\pkg{epsf}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{epsf}% not date given
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\xpretocmd{\epsfsetgraph}
+    {\begin{lateximage}}
+    {}
+    {\LWR@patcherror{lwarp-epsf}{epsfsetgraph-begin}}
+
+\xapptocmd{\epsfsetgraph}
+    {\end{lateximage}}
+    {}
+    {\LWR@patcherror{lwarp-epsf}{epsfsetgraph-end}}
+%    \end{macrocode}
+%
+% \iffalse
+%</epsf>
+% \fi
+%
+%
+%
 %
 % \iffalse
 %<*epsfig>
@@ -51824,11 +52289,12 @@ name = \chemmacros_translate:n {scheme-name}
 % \watchout
 %
 % \changes{v0.61}{2018/10/01}{\pkg{epsfig}: Added.}
+% \changes{v0.895}{2021/01/17}{\pkg{epsfig}: Supports \env{lateximage}.}
 %
 % \codehtml
 %
 %    \begin{macrocode}
-\LWR@ProvidesPackageDrop{epsfig}[2017/06/25]
+\LWR@ProvidesPackagePass{epsfig}[2017/06/25]
 %    \end{macrocode}
 %
 % A few additional keys to capture the filename:
@@ -51850,9 +52316,11 @@ name = \chemmacros_translate:n {scheme-name}
 %
 % The captured filename is used as the argument to \cs{includegraphics}:
 %    \begin{macrocode}
-\newcommand{\epsfig}[1]{\includegraphics[#1]{\LWR@epsfig@filename}}
+\newcommand{\LWR@HTML@epsfig}[1]{\includegraphics[#1]{\LWR@epsfig@filename}}
+\LWR@formatted{epsfig}
 
-\newcommand{\psfig}[1]{\includegraphics[#1]{\LWR@epsfig@filename}}
+\newcommand{\LWR@HTML@psfig}[1]{\includegraphics[#1]{\LWR@epsfig@filename}}
+\LWR@formatted{psfig}
 %    \end{macrocode}
 %
 % \iffalse
@@ -52911,19 +53379,20 @@ name = \chemmacros_translate:n {scheme-name}
 % \changes{v0.20}{2017/01/11}{\pkg{fancyhdr}: Added.}
 % \changes{v0.33}{2017/06/18}{\pkg{fancyhdr}: Fix: Optional args for \cs{lhead}, etc.}
 % \changes{v0.66}{2019/02/02}{\pkg{fancyhdr}: Updated to v3.10.}
+% \changes{v0.895}{2020/01/05}{\pkg{fancyhdr}: Updated to v4.0.}
 %
 % \codehtml
 %
 % Discard all options for \pkg{lwarp-fancyhdr}:
 %    \begin{macrocode}
-\LWR@ProvidesPackageDrop{fancyhdr}[2019/01/31]
+\LWR@ProvidesPackageDrop{fancyhdr}[2021/01/04]
 %    \end{macrocode}
 
 %    \begin{macrocode}
 \newcommand*{\fancyhead}[2][]{}
 \newcommand*{\fancyfoot}[2][]{}
 \newcommand*{\fancyhf}[2][]{}
-\newcommand*{\fancypagestyle}[2]{}
+
 \newcommand*{\lhead}[2][]{}
 \newcommand*{\chead}[2][]{}
 \newcommand*{\rhead}[2][]{}
@@ -52932,16 +53401,30 @@ name = \chemmacros_translate:n {scheme-name}
 \newcommand*{\rfoot}[2][]{}
 \newcommand*{\headrulewidth}{}
 \newcommand*{\footrulewidth}{}
+\providecommand{\headruleskip}{0pt}
+\providecommand{\footruleskip}{0pt}
+\newcommand{\plainheadrulewidth}{0pt}
+\newcommand{\plainfootrulewidth}{0pt}
+\def\fancyplain#1#2{#1}
 \newcommand*{\headrule}{}
 \newcommand*{\footrule}{}
 \newlength{\headwidth}
+\newcommand*{\fancycenter}[1][1em]{}
 \newcommand*{\fancyheadoffset}[2][]{}
 \newcommand*{\fancyfootoffset}[2][]{}
 \newcommand*{\fancyhfoffset}[2][]{}
+\newcommand{\fancyheadinit}[1]{}
+\newcommand{\fancyfootinit}[1]{}
+\newcommand{\fancyhfinit}[1]{}
 \newcommand*{\iffloatpage}[2]{#2}
 \newcommand*{\ifftopfloat}[2]{#2}
 \newcommand*{\iffbotfloat}[2]{#2}
 \newcommand*{\iffootnote}[2]{#2}
+
+\newcommand{\fancypagestyle}[1]{%
+  \@ifnextchar[{\f@nch@pagestyle{#1}}{\f@nch@pagestyle{#1}[]}%
+}
+\long\def\f@nch@pagestyle#1[#2]#3{}
 %    \end{macrocode}
 
 % \iffalse
@@ -53189,6 +53672,7 @@ name = \chemmacros_translate:n {scheme-name}
 % start and end of the environment, depending on the choice of |frame|.
 % Original code is from the \pkg{fancyvrb} package.
 % \changes{v0.73}{2019/06/26}{\pkg{fancyvrb}: Fix: Nested \element{div}/\element{pre}.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@fvstartnone}{%
 \LWR@traceinfo{fvstartnone}%
@@ -53199,8 +53683,8 @@ name = \chemmacros_translate:n {scheme-name}
     \ifx\FV@LabelBegin\relax\else
         \FancyVerbRuleColor{\LWR@FVfindbordercolor}
         \LWR@htmltagc{%
-            div class="fancyvrblabel" % extra space
-                style="color: \LWR@origpound\LWR@tempcolor"%
+            div class=\textquotedbl{}fancyvrblabel\textquotedbl\ % space
+                style=\textquotedbl{}color: \LWR@origpound\LWR@tempcolor\textquotedbl%
         }
         \LWR@print@textrm{\FV@LabelBegin}% \textrm preserves emdash
         \LWR@htmltagc{/div}\LWR@orignewline%
@@ -53219,8 +53703,8 @@ name = \chemmacros_translate:n {scheme-name}
     \ifx\FV@LabelEnd\relax\else
         \FancyVerbRuleColor{\LWR@FVfindbordercolor}
         \LWR@htmltagc{%
-            div class="fancyvrblabel" % extra space
-                style="color: \LWR@origpound\LWR@tempcolor"%
+            div class=\textquotedbl{}fancyvrblabel\textquotedbl\ % space
+                style=\textquotedbl{}color: \LWR@origpound\LWR@tempcolor\textquotedbl%
         }
         \LWR@print@textrm{\FV@LabelEnd}
         \LWR@htmltagc{/div}\LWR@orignewline%
@@ -57009,19 +57493,21 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
 % For the \HTML\ reference, add the graphicspath, filename, extension,
 % alt tag, style, and class.
 % \changes{v0.79}{2019/12/09}{\pkg{graphics}: Factored from \cs{LWR@includegraphicsb}.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand*{\LWR@ig@htmltag}{%
     img\LWR@indentHTML%
-    src="%
+    src=\textquotedbl%
 %    \end{macrocode}
 % \changes{v0.62}{2018/10/27}{\pkg{graphics}: Fix: Filename expansion.}
 %    \begin{macrocode}
     \detokenize\expandafter{\LWR@parsedfilename}%
 %    \end{macrocode}
 %    \begin{macrocode}
-    "\LWR@indentHTML%
+    \textquotedbl\LWR@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}
     \ifthenelse{
         \NOT\equal{\LWR@igwidthstyle}{} \OR
@@ -57032,7 +57518,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
         \NOT\equal{\LWR@igyscale}{1}
     }%
     {%
-        style="\LWR@indentHTML
+        style=\textquotedbl\LWR@indentHTML
         \ifthenelse{\NOT\equal{\LWR@igwidthstyle}{}}%
             {\LWR@igwidthstyle;\LWR@indentHTML}{}%
         \ifthenelse{\NOT\equal{\LWR@igheightstyle}{}}%
@@ -57064,14 +57550,15 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
         \ifthenelse{\NOT\equal{\LWR@opacity}{1}}%
             {opacity:\LWR@opacity;\LWR@indentHTML}{}%
         %
-        "\LWR@indentHTML%
+        \textquotedbl\LWR@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.}
 %    \begin{macrocode}
-    class="\LWR@igclass"\LWR@indentHTML%
-    alt="\AltTextOpen\LWR@igalt\AltTextClose" \LWR@orignewline%
+    class=\textquotedbl\LWR@igclass\textquotedbl\LWR@indentHTML%
+    alt=\textquotedbl\AltTextOpen\LWR@igalt\AltTextClose\textquotedbl\ \LWR@orignewline%
 }% end of image tags
 %    \end{macrocode}
 % \end{noindmacro}
@@ -57093,7 +57580,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
 % \changes{v0.18}{2016/05/17}{\pkg{graphics}: Fix: \cs{linewidth}, \cs{textwidth}, \cs{textheight}
 %   inside a minipage.}
 % \changes{v0.18}{2016/05/17}{\pkg{graphics}: em, ex, \%, px dimensions preserved.}
-% \changes{v0.18}{2016/05/17}{\pkg{graphics}: Add: svgz file extension.}
+% \changes{v0.18}{2016/05/17}{\pkg{graphics}: Add: \SVG\ file extension.}
 % \changes{v0.20}{2016/08/20}{\pkg{graphics}: Fix: \cs{linewidth} in a floatrow.}
 % \changes{v0.20}{2017/01/12}{\pkg{graphics}: Fix: Expands filename.}
 % \changes{v0.28}{2017/04/12}{\pkg{graphics}: Adapts to \pkg{graphics} syntax.}
@@ -57319,10 +57806,11 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
 %    \end{macrocode}
 % Select |inline-block| so that \HTML\ will transform this span:
 % \changes{v0.66}{2019/02/02}{Improved \HTML\ formatting.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \LWR@htmltagc{%
     span\LWR@indentHTML
-    style="\LWR@indentHTML
+    style=\textquotedbl\LWR@indentHTML
     display: inline-block;\LWR@indentHTML
 %    \end{macrocode}
 % If an origin was given, translate and print the origin information:
@@ -57335,7 +57823,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
 %    \begin{macrocode}
     \LWR@rotstyle{-ms-}{#2}\LWR@indentHTML
     \LWR@rotstyle{-webkit-}{#2}\LWR@indentHTML
-    \LWR@rotstyle{}{#2}"\LWR@orignewline%
+    \LWR@rotstyle{}{#2}\textquotedbl\LWR@orignewline%
 }\LWR@orignewline%
 %    \end{macrocode}
 % Print the text to be rotated:
@@ -57371,10 +57859,11 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
 %    \end{macrocode}
 % Select |inline-block| so that \HTML\ will transform this span:
 % \changes{v0.66}{2019/02/02}{Improved \HTML\ formatting.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \LWR@htmltagc{%
     span\LWR@indentHTML
-    style="\LWR@indentHTML
+    style=\textquotedbl\LWR@indentHTML
     display: inline-block;\LWR@indentHTML
 %    \end{macrocode}
 % Print the scaling information:
@@ -57382,7 +57871,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
     \LWR@scalestyle{-ms-}{#1}{\IfNoValueTF{#2}{#1}{#2}}\LWR@indentHTML
     \LWR@scalestyle{-webkit-}{#1}{\IfNoValueTF{#2}{#1}{#2}}\LWR@indentHTML
     \LWR@scalestyle{}{#1}{\IfNoValueTF{#2}{#1}{#2}}
-    "\LWR@orignewline
+    \textquotedbl\LWR@orignewline
 }\LWR@orignewline%
 %    \end{macrocode}
 % Print the text to be scaled:
@@ -57642,6 +58131,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
 %
 % \changes{v0.44}{2017/11/15}{\pkg{hang}: Added.}
 % \changes{v0.47}{2018/01/26}{\pkg{hang}: Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %
 % \codehtml
 %
@@ -57676,7 +58166,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
     \renewcommand*{\LWR@printcloselist}{\LWR@printcloseitemize}%
     \renewcommand*{\LWR@printopenlist}{%
         \LWR@findhangingleftmargin%
-        ul style="%
+        ul style=\textquotedbl%
             \LWR@print@mbox{list-style-type:none;} % extra space
             \LWR@print@mbox{%
                 margin-left:\LWR@printlength{\LWR@templengthone}%
@@ -57684,7 +58174,7 @@ solid {\FancyVerbRuleColor{\LWR@origpound\LWR@tempcolor}} ; % space
             \LWR@print@mbox{%
                 text-indent:-\LWR@printlength{\hangingindent}%
             }%
-        "%
+        \textquotedbl%
     }%
     \let\item\LWR@itemizeitem%
     \list{}{}%
@@ -58416,12 +58906,17 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 % \changes{v0.43}{2017/10/31}{\pkg{hyperref}: Made robust.}
 % \changes{v0.45}{2017/12/29}{\pkg{hyperref}: Fix: Underscore in \URL.}
 % \changes{v0.52}{2018/03/26}{\pkg{hyperref}: Fix: \progcode{\#}, \progcode{\%}, \progcode{\&}, \progcode{\~}, \progcode{\_} in \URL.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@hyperimageb}{m +m}{%
     \LWR@ensuredoingapar%
     \def\LWR@templink{#1}%
     \@onelevel@sanitize\LWR@templink%
-    \LWR@htmltag{img src="\LWR@templink" alt="#2" class="hyperimage"}%
+    \LWR@htmltag{%
+        img src=\textquotedbl\LWR@templink\textquotedbl\ %
+        alt=\textquotedbl#2\textquotedbl\ %
+        class=\textquotedbl{}hyperimage\textquotedbl%
+    }%
     \LWR@ensuredoingapar%
     \endgroup%
 }
@@ -58465,6 +58960,7 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 % \changes{v0.45}{2018/01/02}{\pkg{hyperref}: Fix: Underscore in \URL.}
 % \changes{v0.52}{2018/03/26}{\pkg{hyperref}: Fix: \progcode{\#}, \progcode{\%}, \progcode{\&}, \progcode{\~}, \progcode{\_} in \URL.}
 % \changes{v0.57}{2018/06/05}{\pkg{subcaption}: Fix: \cs{subref}.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %
 % Creates an \HTML\ link to |URL#category.name| with the given text.
 %
@@ -58480,10 +58976,10 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 
 \newcommand*{\LWR@hyperrefbb}[3]{%
     \LWR@htmltag{%
-        a href="%
+        a href=\textquotedbl%
             \detokenize\expandafter{#1}\LWR@hashmark%
             \detokenize\expandafter{#2}.\detokenize\expandafter{#3}%
-        "%
+        \textquotedbl%
         \LWR@addlinktitle%
     }%
     \endgroup%
@@ -59273,6 +59769,32 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 %
 %
 %
+%
+% \iffalse
+%<*impnattypo>
+% \fi
+%
+% \part{lwarp-impnattypo.sty}
+%
+% \section{impnattypo}
+%
+% \DescribePackage{impnattypo}
+% \pkg{impnattypo} is ignored.
+%
+% \changes{v0.895}{2021/01/13}{\pkg{impnattypo}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackageDrop{impnattypo}[2019/03/04]
+%    \end{macrocode}
+%
+% \iffalse
+%</impnattypo>
+% \fi
+%
+%
+%
 % \iffalse
 %<*index>
 % \fi
@@ -59455,6 +59977,149 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 %
 %
 % \iffalse
+%<*isomath>
+% \fi
+%
+% \part{lwarp-isomath.sty}
+%
+% \section{isomath}
+%
+% \credits{Günter Milde}
+%
+% \DescribePackage{isomath}
+% \pkg{isomath} is used as-is for \SVG\ math, and
+% emulated for \brand{MathJax}.
+%
+% \brand{MathJax} does not provide a sans math font, so sans is typeset as roman.
+% \trouble[\brand{MathJax} sans]{isomath=\pkg{isomath}}
+%
+% \changes{v0.895}{2021/02/08}{\pkg{isomath}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{isomath}[2012/09/04]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\begin{warpMathJax}
+\CustomizeMathJax{\let\mathbfit\boldsymbol}
+\CustomizeMathJax{\let\mathsfbfit\mathbfit}% not sans
+\CustomizeMathJax{\let\mathsfit\mathit}% not sans
+\CustomizeMathJax{\let\vectorsym\mathbfit}
+\CustomizeMathJax{\let\matrixsym\mathbfit}
+\CustomizeMathJax{\let\tensorsym\mathsfbfit}
+\CustomizeMathJax{\let\mathboldsans\mathsfbfit}
+\CustomizeMathJax{\let\mathbold\mathbfit}
+\CustomizeMathJax{\let\mathsans\mathrm}% not sans
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</isomath>
+% \fi
+%
+%
+%
+%
+% \iffalse
+%<*isotope>
+% \fi
+%
+% \part{lwarp-isotope.sty}
+%
+% \section{isotope}
+%
+% \credits{Heiko Bauke}
+%
+% \DescribePackage{isotope}
+% \pkg{isotope} is patched for use by \pkg{lwarp} with \SVG\ math,
+% and emulated for \brand{MathJax}.
+%
+% \changes{v0.895}{2021/01/10}{\pkg{isotope}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{isotope}[2011/08/26]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\newcommand{\LWR@HTML@isotope@two}[2][]{%
+    \renewcommand{\isotope@atomicnumber}{#1}%
+    \edef\LWR@isotope@alttag{%
+        \textbackslash(
+        \textbackslash{}isotope
+        [\isotope@nucleonnumber]%
+        [\isotope@atomicnumber]%
+        \{#2\}
+        \textbackslash)%
+    }%
+  \ifbool{mathjax}%
+    {\LWR@isotope@alttag}%
+    {% SVG
+        \m@th%
+        \LWR@subsingledollar*%
+        {% alt tag
+            \LWR@isotope@alttag%
+        }%
+        {isotope}% add'l hashing
+        {% contents
+            \settowidth\@tempdimb{%
+                \ensuremath{\scriptstyle\isotope@nucleonnumber}%
+            }%
+            \settowidth\@tempdimc{%
+                \ensuremath{\scriptstyle\isotope@atomicnumber}%
+            }%
+            \ifdim\@tempdimb<\@tempdimc\@tempdimb=\@tempdimc\fi%
+            \ensuremath{
+                {}%
+                ^{\makebox[\@tempdimb][r]{%
+                    \ensuremath{%
+                    \scriptstyle\isotope@nucleonnumber%
+                    }% ensuremath
+                }}%
+                _{\makebox[\@tempdimb][r]{%
+                    \ensuremath{%
+                        \scriptstyle\isotope@atomicnumber%
+                    }% ensuremath
+                }}%
+                \isotopestyle{#2}%
+            }% ensuremath
+        }% contents
+    }% SVG
+  \endgroup%
+}%
+\LWR@formatted{isotope@two}
+
+\begin{warpMathJax}
+\CustomizeMathJax{%
+    \newcommand{\LWRisotopetwo}[2][]{%
+        {%
+            \vphantom{\mathrm{#2}}%
+            {}^{\LWRisotopenucleonnumber}_{#1}%
+            \mathrm{#2}%
+        }%
+    }%
+}
+
+\CustomizeMathJax{%
+    \newcommand{\isotope}[1][]{%
+        \def\LWRisotopenucleonnumber{#1}%
+        \LWRisotopetwo%
+    }%
+}
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</isotope>
+% \fi
+%
+%
+%
+%
+% \iffalse
 %<*jurabib>
 % \fi
 %
@@ -59664,9 +60329,12 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 %     \ifnum0=\@karnaughmap@local@matrixtemplate@%  original
       % print error if no template could be found
       \PackageError{lwarp-karnaugh-map}{%
-        Can not find a template fitting your specification (\@karnaughmap@var@mapsizex@\space x \@karnaughmap@var@mapsizey@\space x \@karnaughmap@var@mapsizez@)%
+        Can not find a template fitting your specification
+        (\@karnaughmap@var@mapsizex@\space x \@karnaughmap@var@mapsizey@\space x
+        \@karnaughmap@var@mapsizez@)%
       }{%
-        Existing templates have the following dimensions: 2x2x1, 2x4x1, 4x2x1, 4x4x1, 4x4x2, and 4x4x4.
+        Existing templates have the following dimensions:
+        2x2x1, 2x4x1, 4x2x1, 4x4x1, 4x4x2, and 4x4x4.
       }%
 %     \fi   original
     }{\relax}%    lwarp
@@ -60775,10 +61443,11 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 % \brand{MathJax} cannot yet honor options for adjusting Latin characters.
 %
 % The dedicated macros for upright and italic Greek letters do work correctly.
-% Some of the symbol font macros such as \cs{mathsfbf} work for Latin but not
-% for Greek letters.
 %
-% \SVG\ math should appear the same as the printed output.
+% Some of the symbol font macros such as \cs{mathsfbf} do not use a sans font
+% because \brand{MathJax} does not yet have sans Greek.
+%
+% \SVG\ math honors all font choices, and should appear the same as the printed output.
 %
 % \changes{v0.891}{2020/09/18}{\pkg{libertinust1math}: Added.}
 %
@@ -60816,17 +61485,35 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 \LWR@mathjax@addgreek@l@up{up}{}
 
 \CustomizeMathJax{\let\uppartial\partial}% not upright
+%    \end{macrocode}
+%
+% \changes{v0.895}{2021/01/04}{\pkg{libertinust1math}: \brand{MathJax}: Fixed for Greek, ignoring sans.}
+%    \begin{macrocode}
+\CustomizeMathJax{\let\mathsfbf\mathbf}% not sans
+% \CustomizeMathJax{\newcommand{\mathsfbf}[1]{%
+%     \mmlToken{mi}[mathvariant="bold-sans-serif"]{#1}% not greek
+% }}% not sans
+
+% \CustomizeMathJax{\newcommand{\mathbfit}[1]{\boldsymbol{#1}}}
+\CustomizeMathJax{\let\mathbfit\boldsymbol}
+%    \end{macrocode}
+%
+% \changes{v0.895}{2021/01/04}{\pkg{libertinust1math}: \brand{MathJax}: Fixed for Greek, ignoring sans.}
+%    \begin{macrocode}
+% \CustomizeMathJax{\newcommand{\mathsfbfit}[1]{\boldsymbol{#1}}}% not sans
+\CustomizeMathJax{\let\mathsfbfit\mathbfit}% not sans
+% \CustomizeMathJax{\newcommand{\mathsfbfit}[1]{%
+%     \mmlToken{mi}[mathvariant="sans-serif-bold-italic"]{#1}% not greek
+% }}%
+%    \end{macrocode}
+%
+% \changes{v0.895}{2021/01/04}{\pkg{libertinust1math}: \brand{MathJax}: Fixed for Greek, ignoring sans.}
+%    \begin{macrocode}
+\CustomizeMathJax{\let\mathsfit\mathit}% not sans
+% \CustomizeMathJax{\newcommand{\mathsfit}[1]{%
+%     \mmlToken{mi}[mathvariant="sans-serif-italic"]{#1}% not greek
+% }}
 
-\CustomizeMathJax{\newcommand{\mathsfbf}[1]{%
-    \mmlToken{mi}[mathvariant="bold-sans-serif"]{#1}% not greek
-}}% not sans
-\CustomizeMathJax{\newcommand{\mathsfbfit}[1]{%
-    \mmlToken{mi}[mathvariant="sans-serif-bold-italic"]{#1}% not greek
-}}%
-\CustomizeMathJax{\newcommand{\mathbfit}[1]{\boldsymbol{#1}}}
-\CustomizeMathJax{\newcommand{\mathsfit}[1]{%
-    \mmlToken{mi}[mathvariant="sans-serif-italic"]{#1}% not greek
-}}
 \CustomizeMathJax{\let\vectorsym\mathbfit}
 \CustomizeMathJax{\let\matrixsym\mathbfit}
 \CustomizeMathJax{\let\tensorsym\mathsfbfit}
@@ -61456,8 +62143,11 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 \else%
 %    \end{macrocode}
 % Inline, so open a \element{span}:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-    \ifbool{LWR@verbtags}{\LWR@htmltag{span class="inlineprogramlisting"}}{}%
+    \ifbool{LWR@verbtags}{\LWR@htmltag{%
+        span class=\textquotedbl{}inlineprogramlisting\textquotedbl%
+    }}{}%
 \fi%
 \LWR@traceinfo{lst@Init done}%
 }
@@ -61918,6 +62608,42 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 %
 %
 %
+% \iffalse
+%<*lpic>
+% \fi
+%
+% \part{lwarp-lpic.sty}
+%
+% \section{lpic}
+%
+% \credits{R. Matveyev}
+%
+% \DescribePackage{lpic}
+% \pkg{lpic} is patched for use by \pkg{lwarp}.
+%
+% \changes{v0.895}{2021/01/19}{\pkg{lpic}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{lpic}[2010/12/23]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\BeforeBeginEnvironment{lpic}{%
+    \begin{lateximage}[-lpic-~\PackageDiagramAltText]%
+}
+
+\AfterEndEnvironment{lpic}{\end{lateximage}}
+%    \end{macrocode}
+%
+% \iffalse
+%</lpic>
+% \fi
+%
+%
+%
+%
 %
 %
 % \iffalse
@@ -62507,6 +63233,41 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 %
 %
 %
+% \iffalse
+%<*luavlna>
+% \fi
+%
+% \part{lwarp-luavlna.sty}
+%
+% \section{luavlna}
+%
+% \credits{Michal Hoftich, Miro Hrončok}
+%
+% \DescribePackage{luavlna}
+% \pkg{luavlna} is patched for use by \pkg{lwarp}.
+%
+% The package is disabled for \HTML\ output, due to incompatibilities with
+% \pkg{lwarp}'s handling of math \SVG\ images.
+%
+% \changes{v0.895}{2020/01/13}{\pkg{luavlna}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{luavlna}[2019/10/30]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\preventsingleoff
+\LetLtxMacro\preventsingleon\preventsingleoff
+%    \end{macrocode}
+%
+% \iffalse
+%</luavlna>
+% \fi
+%
+%
+%
 %
 % \iffalse
 %<*lyluatex>
@@ -64041,6 +64802,169 @@ do not attempt to patch lwarp's version of `hyperref'.)\MessageBreak}
 %
 %
 %
+%
+% \iffalse
+%<*mattens>
+% \fi
+%
+% \part{lwarp-mattens.sty}
+%
+% \section{mattens}
+%
+% \credits{Danie Els}
+%
+% \DescribePackage{mattens}
+% \pkg{mattens} is used as-is for \SVG\ math,
+% and is emulated for \brand{MathJax}.
+%
+% \changes{v0.895}{2021/02/11}{\pkg{mattens}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{mattens}[2010/03/26]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\begin{warpMathJax}
+\CustomizeMathJax{\newcommand{\LWRmattensnull}{}}
+
+\CustomizeMathJax{\newcommand{\LWRmattensnostar}[2][]{%
+    {#1{\LWRmattensundercmd{\LWRmattensovercmd{\LWRmattenscross{\boldsymbol{#2}}}}}}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRmattensstar}[2][]{%
+    {#1{\LWRmattensundercmd{\LWRmattensovercmd{\LWRmattenscross{#2}}}}}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRmattens}{
+    \ifstar\LWRmattensstar\LWRmattensnostar%
+}}
+
+\CustomizeMathJax{\newcommand{\aS}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\overrightarrow%
+    \let\LWRmattensundercmd\LWRmattensnull%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\Sa}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\underrightarrow%
+    \let\LWRmattensundercmd\LWRmattensnull%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\bS}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\overline%
+    \let\LWRmattensundercmd\LWRmattensnull%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\Sb}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\underline%
+    \let\LWRmattensundercmd\LWRmattensnull%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\aSa}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\overrightarrow%
+    \let\LWRmattensundercmd\underrightarrow%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\aSb}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\overrightarrow%
+    \let\LWRmattensundercmd\underline%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\bSa}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\overline%
+    \let\LWRmattensundercmd\underrightarrow%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\bSb}{%
+    \let\LWRmattenscross\LWRmattensnull%
+    \let\LWRmattensovercmd\overline%
+    \let\LWRmattensundercmd\underline%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\aCSa}{%
+    \let\LWRmattenscross\tilde%
+    \let\LWRmattensovercmd\overrightarrow%
+    \let\LWRmattensundercmd\underrightarrow%
+    \LWRmattens%
+}}
+
+\CustomizeMathJax{\newcommand{\bCSb}{%
+    \let\LWRmattenscross\tilde%
+    \let\LWRmattensovercmd\overline%
+    \let\LWRmattensundercmd\underline%
+    \LWRmattens%
+}}
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</mattens>
+% \fi
+%
+%
+%
+% \iffalse
+%<*maybemath>
+% \fi
+%
+% \part{lwarp-maybemath.sty}
+%
+% \section{maybemath}
+%
+% \credits{Andy Buckley}
+%
+% \DescribePackage{maybemath}
+% \pkg{maybemath} is used as-is for \SVG\ math,
+% and is emulated for \brand{MathJax}.
+%
+% \brand{MathJax} is not able to detect the surrounding text font,
+% \trouble[no effect]{maybemath=\pkg{maybemath}}
+% so all \pkg{maybemath} macros are ignored.
+%
+% \changes{v0.0.895}{2021/01/08}{\pkg{maybemath}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{maybemath}[2005/2/22]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\begin{warpMathJax}
+\CustomizeMathJax{\newcommand{\mayberm}[1]{{#1}}}
+\CustomizeMathJax{\let\maybebm\mayberm}
+\CustomizeMathJax{\let\maybeit\mayberm}
+\CustomizeMathJax{\let\maybeitrm\mayberm}
+\CustomizeMathJax{\let\maybeitsubscript\mayberm}
+\CustomizeMathJax{\let\maybesf\mayberm}
+\CustomizeMathJax{\let\maybebmsf\mayberm}
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</maybemath>
+% \fi
+%
+%
+%
+%
+%
 % \iffalse
 %<*mcaption>
 % \fi
@@ -64224,12 +65148,13 @@ endinnercode={\LWR@stoppars},
 % A \env{BlockClass} environment is not used because this \element{div} is
 % created by the \pkg{mdframed} \optn{startcode} and \optn{endcode} settings,
 % which do not properly nest the \element{div} inside the \env{mdframed} environment.
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-\LWR@htmltagc{div class="%
+\LWR@htmltagc{div class=\textquotedbl%
 mdframed%
 \ifdefstring{\LWR@mdthisenv}{mdframed}{}{ \LWR@mdthisenv}%
-" \LWR@orignewline
-style=" \LWR@orignewline
+\textquotedbl \LWR@orignewline
+style=\textquotedbl\LWR@orignewline
 %    \end{macrocode}
 % Convert and print the background color:
 %    \begin{macrocode}
@@ -64257,7 +65182,7 @@ border-radius: \LWR@mdfprintlength{roundcorner} ; \LWR@orignewline
 \LWR@orignewline
 %    \end{macrocode}
 %    \begin{macrocode}
-"}
+\textquotedbl}
 % \LWR@htmldivclass{\LWR@mdthisenv}
 %    \end{macrocode}
 % \env{mdframed} environment may not work with the \HTML\ versions of the following,
@@ -64676,6 +65601,44 @@ background:
 % \addtocontents{toc}{\protect\setcounter{tocdepth}{0}}
 %
 %
+% \iffalse
+%<*mdwmath>
+% \fi
+%
+% \part{lwarp-mdwmath.sty}
+%
+% \section{mdwmath}
+%
+% \credits{Mark Wooding}
+%
+% \DescribePackage{mdwmath}
+% \pkg{mdwmath} is used as-is for \SVG\ math, and
+% is emulated for \brand{MathJax}.
+%
+% \changes{v0.895}{2021/01/11}{\pkg{mdwmath}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{mdwmath}[1996/04/11]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\begin{warpMathJax}
+\CustomizeMathJax{\let\LWRmdwmathsqrt\sqrt}
+\CustomizeMathJax{\renewcommand{\sqrt}{\ifstar\LWRmdwmathsqrt\LWRmdwmathsqrt}}
+\CustomizeMathJax{\newcommand{\bitand}{\mathbin\&}}
+\CustomizeMathJax{\def\bitor{\mathbin\mid}}
+\CustomizeMathJax{\def\dblor{\mathbin{\mid\mid}}}
+\CustomizeMathJax{\def\dbland{\mathbin{\mathrel\bitand\mathrel\bitand}}}
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</mdwmath>
+% \fi
+%
+%
 %
 % \iffalse
 %<*media9>
@@ -66269,8 +67232,7 @@ background:
 %
 % \limitsmultirow
 %
-% In a \env{lateximage}, \cs{LWR@restoreorigformatting}
-% restores the original print-mode versions.
+% In a \env{lateximage}, the print versions are restored.
 %
 % See \cref{sec:printmultirow} for the print-mode versions.
 %
@@ -66282,7 +67244,7 @@ background:
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\LWR@ProvidesPackagePass{multirow}[2018/08/03]
+\LWR@ProvidesPackagePass{multirow}[2021/01/29]
 %    \end{macrocode}
 %
 %
@@ -66297,6 +67259,12 @@ background:
 %
 % \subsection{Multirow}
 %
+% \begin{noindmacro}{\LWR@multirow@par} \cs{par} inside a \cs{multirow}.
+%    \begin{macrocode}
+\newcommand*{\LWR@multirow@par}{\LWR@htmltag{br /}\LWR@origpar}%
+%    \end{macrocode}
+% \end{noindmacro}
+%
 % \DescribeMacro{\multirow}
 %   \oarg{vpos} \marg{numrows} \oarg{bigstruts} \marg{width} \oarg{fixup} \marg{text}
 % \changes{v0.19}{2015/05/28}{\pkg{multirow}: Added optional args.}
@@ -66321,12 +67289,13 @@ background:
 \LWR@tabularleftedge%
 %    \end{macrocode}
 % Print the start of a new table data cell:
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
-\LWR@htmltag{td rowspan="#2" %
+\LWR@htmltag{td rowspan=\textquotedbl#2\textquotedbl\ %
 %    \end{macrocode}
 % A class adds the column spec and the rule:
 %    \begin{macrocode}
-class="td%
+class=\textquotedbl{}td%
 %    \end{macrocode}
 % Append this column's spec:
 % \changes{v0.60}{2018/09/17}{\env{tabular}: Improved memory management: Not using \pkg{xstring}.}
@@ -66340,7 +67309,7 @@ class="td%
 \LWR@addcmidruletrim%
 \LWR@addleftmostbartag%
 \LWR@printbartag{\arabic{LWR@tableLaTeXcolindex}}%
-"%
+\textquotedbl%
 %    \end{macrocode}
 % \changes{v0.42}{2017/10/26}{\pkg{multirow}: If \progcode{FormatWP} add cell alignment.}
 %    \begin{macrocode}
@@ -66377,9 +67346,22 @@ class="td%
 %    \begin{macrocode}
 \LWR@getexparray{LWR@colbeforespec}{\arabic{LWR@tableLaTeXcolindex}}%
 %    \end{macrocode}
-% While printing the text, redefine |\\| to generate a new line
+%
+% While printing the text, redefine |\\| to generate a new line.
+% If a nested \env{tabular} occurs, |\\| is redefined to
+% \cs{LWR@tabularendofline} at the start of the \env{tabular}, then
+% \cs{LWR@endofline} before again printing any
+% \cs{multirow} contents inside the nested \env{tabular}.
+%
+% \cs{par} is redefined to insert an \HTML\ break, and if \env{tabular}
+% is nested, it is redefined at the start of \env{tabular}.
+% \changes{v0.895}{2021/01/31}{Allow \cs{par}.}
 %    \begin{macrocode}
-\begingroup\LetLtxMacro{\\}{\LWR@endofline}#6\endgroup%
+\begingroup%
+    \LetLtxMacro{\\}{\LWR@endofline}%
+    \let\par\LWR@multirow@par%
+    #6%
+\endgroup%
 \LWR@stoppars%
 \boolfalse{LWR@intabularmetadata}%
 \renewcommand{\LWR@multirowborder}{}%
@@ -67795,7 +68777,7 @@ do not attempt to patch lwarp's version of `nameref'.)\MessageBreak
 \LWR@formatted{@UnitsUglyFrac}
 %    \end{macrocode}
 %
-% For Mathjax:
+% For \brand{Mathjax}:
 % \changes{v0.891}{2020/09/08}{\pkg{nicefrac}: Added \cs{mathinner}, improved fraction.}
 %    \begin{macrocode}
 \begin{warpMathJax}
@@ -67877,8 +68859,8 @@ do not attempt to patch lwarp's version of `nameref'.)\MessageBreak
 % \trouble[\brand{MathJax}]{nicematrix=\pkg{nicematrix}}
 % \cs{Cdots}, etc. do not span multiple cells.
 % \env{AutoNiceMatrix}, etc. are not supported for \brand{MathJax}.
-% SVG math output preserves all nicematrix features.
-% To force SVG output for one or more consecutive
+% \SVG\ math output preserves all nicematrix features.
+% To force \SVG\ output for one or more consecutive
 % math expressions, for inline math use
 % \cs{inlinemathother} and \cs{inlinemathnormal}, or
 % for display math use \cs{displaymathother} and \cs{displaymathnormal}.
@@ -68640,11 +69622,15 @@ do not attempt to patch lwarp's version of `nameref'.)\MessageBreak
 % Mimics a float by incrementing the float counter and generating
 % an \HTML\ anchor.  These are used for list-of-theorem cross-references.
 % \changes{v0.47}{2018/01/26}{\pkg{ntheorem}: Fix: Line wrap at \HTML\ hyphen.}
+% \changes{v0.895}{2021/01/14}{Improved \HTML\ quotes.}
 %    \begin{macrocode}
 \newcommand{\LWR@inctheorem}{%
 \addtocounter{LWR@thisautoid}{1}%
 \LWR@stoppars%
-\LWR@htmltag{a id="\LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}"}\LWR@htmltag{/a}%
+\LWR@htmltag{%
+    a id=\textquotedbl\LWR@print@mbox{autoid-\arabic{LWR@thisautoid}}\textquotedbl%
+}%
+\LWR@htmltag{/a}%
 \LWR@startpars%
 }
 %    \end{macrocode}
@@ -70927,6 +71913,47 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %
 %
 %
+%
+%
+% \iffalse
+%<*pinlabel>
+% \fi
+%
+% \part{lwarp-pinlabel.sty}
+%
+% \section{pinlabel}
+%
+% \credits{Colin Rourke}
+%
+% \DescribePackage{pinlabel}
+% \pkg{pinlabel} is patched for use by \pkg{lwarp}.
+%
+% \changes{v0.895}{2021/01/19}{\pkg{pinlabel}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{pinlabel}% no date given
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\xpretocmd{\psfig}
+    {\begin{lateximage}[-pinlabel-~\PackageDiagramAltText]}
+    {}
+    {\LWR@patcherror{pinlabel}{psfigA}}
+
+\xapptocmd{\psfig}
+    {\end{lateximage}}
+    {}
+    {\LWR@patcherror{pinlabel}{psfigB}}
+%    \end{macrocode}
+%
+% \iffalse
+%</pinlabel>
+% \fi
+%
+%
+%
 % \iffalse
 %<*placeins>
 % \fi
@@ -72377,6 +73404,49 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %
 %
 %
+% \iffalse
+%<*rlepsf>
+% \fi
+%
+% \part{lwarp-rlepsf.sty}
+%
+% \section{rlepsf}
+%
+% \credits{Michael Greene, Colin Rourke}
+%
+% \DescribePackage{rlepsf}
+% \pkg{rlepsf} is patched for use by \pkg{lwarp}.
+%
+% The file \filenm{rlepsf.tex} must be copied to \filenm{rlepsf.sty} for
+% \trouble[Rename the style file!]{rlepsf=\pkg{rlepsf}}
+% \pkg{lwarp} to detect and patch it.
+%
+% \changes{v0.895}{2019/01/19}{\pkg{rlepsf}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{rlepsf}% No date given.
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\xpretocmd{\relabelbox}
+    {\begin{lateximage}}
+    {}
+    {\LWR@patcherror{rlepsf}{relabelbox}}
+
+\xapptocmd{\endrelabelbox}
+    {\end{lateximage}}
+    {}
+    {\LWR@patcherror{rlepsf}{endrelabelbox}}
+%    \end{macrocode}
+%
+% \iffalse
+%</rlepsf>
+% \fi
+%
+%
+%
 %
 % \iffalse
 %<*rmathbr>
@@ -72524,27 +73594,41 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %
 % All rotations are ignored in \HTML\ output.
 %
-% \changes{v0.69}{2019/03/09}{\pkg{rotfloat}: Requires \pkg{graphicx}.}
+% \changes{v0.69}{2019/03/09}{\pkg{rotating}: Requires \pkg{graphicx}.}
+% \changes{v0.895}{2021/01/19}{\pkg{rotating}: Supports \env{lateximage}.}
 %
 % \codehtml
 %    \begin{macrocode}
-\LWR@ProvidesPackageDrop{rotating}[2016/08/11]
+\LWR@ProvidesPackagePass{rotating}[2016/08/11]
 \RequirePackage{graphicx}
 %    \end{macrocode}
 
 %    \begin{macrocode}
-\LetLtxMacro\sidewaystable\table
-\let\endsidewaystable\endtable
+\LetLtxMacro\LWR@HTML@sidewaystable\table
+\let\endLWR@HTML@sidewaystable\endtable
+\LWR@formattedenv{sidewaystable}
+
+\LetLtxMacro\LWR@HTML@sidewaysfigure\figure
+\let\endLWR@HTML@sidewaysfigure\endfigure
+\LWR@formattedenv{sidewaysfigure}
+
+\newenvironment*{LWR@HTML@sideways}{}{}
+\LWR@formattedenv{sideways}
 
-\LetLtxMacro\sidewaysfigure\figure
-\let\endsidewaysfigure\endfigure
+\newenvironment*{LWR@HTML@turn}[1]{}{}
+\LWR@formattedenv{turn}
 
-\newenvironment*{sideways}{}{}
-\newenvironment*{turn}[1]{}{}
-\newenvironment*{rotate}[1]{}{}
-\NewDocumentCommand{\turnbox}{m +m}{#2}
-\let\rotcaption\caption
-\let\@makerotcaption\@makecaption
+\newenvironment*{LWR@HTML@rotate}[1]{}{}
+\LWR@formattedenv{rotate}
+
+\NewDocumentCommand{\LWR@HTML@turnbox}{m +m}{#2}
+\LWR@formatted{turnbox}
+
+\let\LWR@HTML@rotcaption\caption
+\LWR@formatted{rotcaption}
+
+\let\LWR@HTML@@makerotcaption\@makecaption
+\LWR@formatted{@makerotcaption}
 %    \end{macrocode}
 
 
@@ -74683,12 +75767,18 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 \CustomizeMathJax{\newcommand{\molepercubicmetrenp}{\mole\usk\rpcubic\metre}}
 \CustomizeMathJax{\newcommand{\radianpersquaresecond}{\radian\per\second\squared}}
 \CustomizeMathJax{\newcommand{\radianpersquaresecondnp}{\radian\usk\second\rpsquared}}
-\CustomizeMathJax{\newcommand{\kilogramsquaremetrepersecond}{\kilogram\usk\squaremetre\per\second}}
-\CustomizeMathJax{\newcommand{\kilogramsquaremetrepersecondnp}{\kilogram\usk\squaremetre\usk\reciprocal\second}}
+\CustomizeMathJax{\newcommand{\kilogramsquaremetrepersecond}{%
+    \kilogram\usk\squaremetre\per\second%
+}}
+\CustomizeMathJax{\newcommand{\kilogramsquaremetrepersecondnp}{%
+    \kilogram\usk\squaremetre\usk\reciprocal\second%
+}}
 \CustomizeMathJax{\newcommand{\radianpersecond}{\radian\per\second}}
 \CustomizeMathJax{\newcommand{\radianpersecondnp}{\radian\usk\reciprocal\second}}
 \CustomizeMathJax{\newcommand{\squaremetrepercubicmetre}{\squaremetre\per\cubic\metre}}
-\CustomizeMathJax{\newcommand{\squaremetrepercubicmetrenp}{\squaremetre\usk\rpcubic\metre}}
+\CustomizeMathJax{\newcommand{\squaremetrepercubicmetrenp}{%
+    \squaremetre\usk\rpcubic\metre%
+}}
 \CustomizeMathJax{\newcommand{\katalpercubicmetre}{\katal\per\cubic\metre}}
 \CustomizeMathJax{\newcommand{\katalpercubicmetrenp}{\katal\usk\rpcubic\metre}}
 \CustomizeMathJax{\newcommand{\coulombpermol}{\coulomb\per\mole}}
@@ -74697,8 +75787,12 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 \CustomizeMathJax{\newcommand{\amperepersquaremetrenp}{\ampere\usk\rpsquare\metre}}
 \CustomizeMathJax{\newcommand{\kilogrampercubicmetre}{\kilogram\per\cubic\metre}}
 \CustomizeMathJax{\newcommand{\kilogrampercubicmetrenp}{\kilogram\usk\rpcubic\metre}}
-\CustomizeMathJax{\newcommand{\squaremetrepernewtonsecond}{\squaremetre\per\newton\usk\second}}
-\CustomizeMathJax{\newcommand{\squaremetrepernewtonsecondnp}{\squaremetre\usk\reciprocal\newton\usk\reciprocal\second}}
+\CustomizeMathJax{\newcommand{\squaremetrepernewtonsecond}{%
+    \squaremetre\per\newton\usk\second%
+}}
+\CustomizeMathJax{\newcommand{\squaremetrepernewtonsecondnp}{%
+    \squaremetre\usk\reciprocal\newton\usk\reciprocal\second%
+}}
 \CustomizeMathJax{\newcommand{\pascalsecond}{\pascal\usk\second}}
 \CustomizeMathJax{\newcommand{\coulombpercubicmetre}{\coulomb\per\cubic\metre}}
 \CustomizeMathJax{\newcommand{\coulombpercubicmetrenp}{\coulomb\usk\rpcubic\metre}}
@@ -74726,11 +75820,21 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 \CustomizeMathJax{\newcommand{\coulombperkilogram}{\coulomb\per\kilogram}}
 \CustomizeMathJax{\newcommand{\coulombperkilogramnp}{\coulomb\usk\reciprocal\kilogram}}
 \CustomizeMathJax{\newcommand{\squaremetrepersecond}{\squaremetre\per\second}}
-\CustomizeMathJax{\newcommand{\squaremetrepersecondnp}{\squaremetre\usk\reciprocal\second}}
-\CustomizeMathJax{\newcommand{\squaremetrepersquaresecond}{\squaremetre\per\second\squared}}
-\CustomizeMathJax{\newcommand{\squaremetrepersquaresecondnp}{\squaremetre\usk\second\rpsquared}}
-\CustomizeMathJax{\newcommand{\kilogrammetrepersecond}{\kilogram\usk\metre\per\second}}
-\CustomizeMathJax{\newcommand{\kilogrammetrepersecondnp}{\kilogram\usk\metre\usk\reciprocal\second}}
+\CustomizeMathJax{\newcommand{\squaremetrepersecondnp}{%
+    \squaremetre\usk\reciprocal\second%
+}}
+\CustomizeMathJax{\newcommand{\squaremetrepersquaresecond}{%
+    \squaremetre\per\second\squared%
+}}
+\CustomizeMathJax{\newcommand{\squaremetrepersquaresecondnp}{%
+    \squaremetre\usk\second\rpsquared%
+}}
+\CustomizeMathJax{\newcommand{\kilogrammetrepersecond}{%
+    \kilogram\usk\metre\per\second%
+}}
+\CustomizeMathJax{\newcommand{\kilogrammetrepersecondnp}{%
+    \kilogram\usk\metre\usk\reciprocal\second%
+}}
 \CustomizeMathJax{\newcommand{\candelapersquaremetre}{\candela\per\squaremetre}}
 \CustomizeMathJax{\newcommand{\candelapersquaremetrenp}{\candela\usk\rpsquare\metre}}
 \CustomizeMathJax{\newcommand{\amperepermetre}{\ampere\per\metre}}
@@ -74741,54 +75845,93 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 \CustomizeMathJax{\newcommand{\henrypermetrenp}{\henry\usk\reciprocal\metre}}
 \CustomizeMathJax{\newcommand{\kilogrampersecond}{\kilogram\per\second}}
 \CustomizeMathJax{\newcommand{\kilogrampersecondnp}{\kilogram\usk\reciprocal\second}}
-\CustomizeMathJax{\newcommand{\kilogrampersquaremetresecond}{\kilogram\per\squaremetre\usk\second}}
-\CustomizeMathJax{\newcommand{\kilogrampersquaremetresecondnp}{\kilogram\usk\rpsquare\metre\usk\reciprocal\second}}
+\CustomizeMathJax{\newcommand{\kilogrampersquaremetresecond}{%
+    \kilogram\per\squaremetre\usk\second%
+}}
+\CustomizeMathJax{\newcommand{\kilogrampersquaremetresecondnp}{%
+    \kilogram\usk\rpsquare\metre\usk\reciprocal\second%
+}}
 \CustomizeMathJax{\newcommand{\kilogrampersquaremetre}{\kilogram\per\squaremetre}}
 \CustomizeMathJax{\newcommand{\kilogrampersquaremetrenp}{\kilogram\usk\rpsquare\metre}}
 \CustomizeMathJax{\newcommand{\kilogrampermetre}{\kilogram\per\metre}}
 \CustomizeMathJax{\newcommand{\kilogrampermetrenp}{\kilogram\usk\reciprocal\metre}}
 \CustomizeMathJax{\newcommand{\joulepermolekelvin}{\joule\per\mole\usk\kelvin}}
-\CustomizeMathJax{\newcommand{\joulepermolekelvinnp}{\joule\usk\reciprocal\mole\usk\reciprocal\kelvin}}
+\CustomizeMathJax{\newcommand{\joulepermolekelvinnp}{%
+    \joule\usk\reciprocal\mole\usk\reciprocal\kelvin%
+}}
 \CustomizeMathJax{\newcommand{\kilogramperkilomole}{\kilogram\per\kilo\mole}}
-\CustomizeMathJax{\newcommand{\kilogramperkilomolenp}{\kilogram\usk\kilo\reciprocal\mole}}
+\CustomizeMathJax{\newcommand{\kilogramperkilomolenp}{%
+    \kilogram\usk\kilo\reciprocal\mole%
+}}
 \CustomizeMathJax{\newcommand{\kilogramsquaremetre}{\kilogram\usk\squaremetre}}
 \CustomizeMathJax{\newcommand{\kilogramsquaremetrenp}{\kilogramsquaremetre}}
-\CustomizeMathJax{\newcommand{\kilogrammetrepersquaresecond}{\kilogram\usk\metre\per\second\squared}}
-\CustomizeMathJax{\newcommand{\kilogrammetrepersquaresecondnp}{\kilogram\usk\metre\usk\second\rpsquared}}
+\CustomizeMathJax{\newcommand{\kilogrammetrepersquaresecond}{%
+    \kilogram\usk\metre\per\second\squared%
+}}
+\CustomizeMathJax{\newcommand{\kilogrammetrepersquaresecondnp}{%
+    \kilogram\usk\metre\usk\second\rpsquared%
+}}
 \CustomizeMathJax{\newcommand{\newtonpersquaremetre}{\newton\per\squaremetre}}
 \CustomizeMathJax{\newcommand{\newtonpersquaremetrenp}{\newton\usk\rpsquare\metre}}
 \CustomizeMathJax{\newcommand{\persquaremetresecond}{1\per\squaremetre\usk\second}}
-\CustomizeMathJax{\newcommand{\persquaremetresecondnp}{\rpsquare\metre\usk\reciprocal\second}}
+\CustomizeMathJax{\newcommand{\persquaremetresecondnp}{%
+    \rpsquare\metre\usk\reciprocal\second%
+}}
 \CustomizeMathJax{\newcommand{\wattperkilogram}{\watt\per\kilogram}}
 \CustomizeMathJax{\newcommand{\wattperkilogramnp}{\watt\usk\reciprocal\kilogram}}
 \CustomizeMathJax{\newcommand{\wattpercubicmetre}{\watt\per\cubic\metre}}
 \CustomizeMathJax{\newcommand{\wattpercubicmetrenp}{\watt\usk\rpcubic\metre}}
-\CustomizeMathJax{\newcommand{\wattpersquaremetresteradian}{\watt\per\squaremetre\usk\steradian}}
-\CustomizeMathJax{\newcommand{\wattpersquaremetresteradiannp}{\watt\usk\rpsquare\metre\usk\rp\steradian}}
+\CustomizeMathJax{\newcommand{\wattpersquaremetresteradian}{%
+    \watt\per\squaremetre\usk\steradian%
+}}
+\CustomizeMathJax{\newcommand{\wattpersquaremetresteradiannp}{%
+    \watt\usk\rpsquare\metre\usk\rp\steradian%
+}}
 \CustomizeMathJax{\newcommand{\jouleperkilogramkelvin}{\joule\per\kilogram\usk\kelvin}}
-\CustomizeMathJax{\newcommand{\jouleperkilogramkelvinnp}{\joule\usk\reciprocal\kilogram\usk\reciprocal\kelvin}}
+\CustomizeMathJax{\newcommand{\jouleperkilogramkelvinnp}{%
+    \joule\usk\reciprocal\kilogram\usk\reciprocal\kelvin%
+}}
 \CustomizeMathJax{\newcommand{\squaremetreperkilogram}{\squaremetre\per\kilogram}}
-\CustomizeMathJax{\newcommand{\rpsquaremetreperkilogram}{\squaremetre\usk\reciprocal\kilogram}}
+\CustomizeMathJax{\newcommand{\rpsquaremetreperkilogram}{%
+    \squaremetre\usk\reciprocal\kilogram%
+}}
 \CustomizeMathJax{\newcommand{\cubicmetreperkilogram}{\cubic\metre\per\kilogram}}
-\CustomizeMathJax{\newcommand{\rpcubicmetreperkilogram}{\cubic\metre\usk\reciprocal\kilogram}}
+\CustomizeMathJax{\newcommand{\rpcubicmetreperkilogram}{%
+    \cubic\metre\usk\reciprocal\kilogram%
+}}
 \CustomizeMathJax{\newcommand{\newtonpermetre}{\newton\per\metre}}
 \CustomizeMathJax{\newcommand{\newtonpermetrenp}{\newton\usk\reciprocal\metre}}
 \CustomizeMathJax{\newcommand{\Celsius}{\unicode{x2103}}}
 \CustomizeMathJax{\newcommand{\wattpermetrekelvin}{\watt\per\metre\usk\kelvin}}
-\CustomizeMathJax{\newcommand{\wattpermetrekelvinnp}{\watt\usk\reciprocal\metre\usk\reciprocal\kelvin}}
-\CustomizeMathJax{\newcommand{\newtonmetre}{\newton\usk\metre} \CustomizeMathJax{\newcommand{\newtonmetrenp}{\newtonmetre}}}
-\CustomizeMathJax{\newcommand{\squaremetrepercubicsecond}{\squaremetre\per\cubic\second}}
-\CustomizeMathJax{\newcommand{\squaremetrepercubicsecondnp}{\squaremetre\usk\rpcubic\second}}
+\CustomizeMathJax{\newcommand{\wattpermetrekelvinnp}{%
+    \watt\usk\reciprocal\metre\usk\reciprocal\kelvin%
+}}
+\CustomizeMathJax{\newcommand{\newtonmetre}{\newton\usk\metre}
+\CustomizeMathJax{\newcommand{\newtonmetrenp}{\newtonmetre}}}
+\CustomizeMathJax{\newcommand{\squaremetrepercubicsecond}{%
+    \squaremetre\per\cubic\second%
+}}
+\CustomizeMathJax{\newcommand{\squaremetrepercubicsecondnp}{%
+    \squaremetre\usk\rpcubic\second%
+}}
 \CustomizeMathJax{\newcommand{\metrepersecond}{\metre\per\second}}
 \CustomizeMathJax{\newcommand{\metrepersecondnp}{\metre\usk\reciprocal\second}}
 \CustomizeMathJax{\newcommand{\joulepercubicmetre}{\joule\per\cubicmetre}}
 \CustomizeMathJax{\newcommand{\joulepercubicmetrenp}{\joule\usk\rpcubic\metre}}
-\CustomizeMathJax{\newcommand{\kilogrampercubicmetrecoulomb}{\kilogram\per\cubic\metre\usk\coulomb}}
-\CustomizeMathJax{\newcommand{\kilogrampercubicmetrecoulombnp}{\kilogram\usk\rpcubic\metre\usk\reciprocal\coulomb}}
+\CustomizeMathJax{\newcommand{\kilogrampercubicmetrecoulomb}{%
+    \kilogram\per\cubic\metre\usk\coulomb%
+}}
+\CustomizeMathJax{\newcommand{\kilogrampercubicmetrecoulombnp}{%
+    \kilogram\usk\rpcubic\metre\usk\reciprocal\coulomb%
+}}
 \CustomizeMathJax{\newcommand{\cubicmetrepersecond}{\cubicmetre\per\second}}
 \CustomizeMathJax{\newcommand{\rpcubicmetrepersecond}{\cubicmetre\usk\reciprocal\second}}
-\CustomizeMathJax{\newcommand{\kilogrampersecondcubicmetre}{\kilogram\per\second\usk\cubicmetre}}
-\CustomizeMathJax{\newcommand{\kilogrampersecondcubicmetrenp}{\kilogram\usk\reciprocal\second\usk\rpcubic\metre}}
+\CustomizeMathJax{\newcommand{\kilogrampersecondcubicmetre}{%
+    \kilogram\per\second\usk\cubicmetre%
+}}
+\CustomizeMathJax{\newcommand{\kilogrampersecondcubicmetrenp}{%
+    \kilogram\usk\reciprocal\second\usk\rpcubic\metre%
+}}
 \end{warpMathJax}
 %    \end{macrocode}
 %
@@ -74810,7 +75953,8 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 % \credits{Joseph Wright}
 %
 % \DescribePackage{siunitx}
-% \pkg{siunitx} is patched for use by \pkg{lwarp}.
+% \pkg{siunitx} is patched for use by \pkg{lwarp},
+% and is emulated for \brand{MathJax}.
 %
 % \limitssiunitx
 %
@@ -74842,7 +75986,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 % \cs{@ensuredmath} is not supported inside an \cs{hbox}, so it must
 % temporarily be restored to its original.
 % Similar for \cs{mbox}.
-% SVG math is created explicitly when necessary, using \cs{LWR@subsingledollar}.
+% \SVG\ math is created explicitly when necessary, using \cs{LWR@subsingledollar}.
 %
 % \changes{v0.42}{2017/10/16}{\pkg{siunitx}: Improved \cs{ensuremath}.}
 % \changes{v0.48}{2018/02/13}{\pkg{siunitx}: Improved \SVG\ math.}
@@ -75078,6 +76222,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 \cs_new_protected:Npn \__siunitx_textsuperscript:n #1 {\textsuperscript{#1}}
 %    \end{macrocode}
 %
+% \begin{noindmacro}{\num} \oarg{options} \marg{value}
 %    \begin{macrocode}
 \RenewDocumentCommand \num { o m } {
   \leavevmode
@@ -75090,7 +76235,11 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
     \__siunitx_number_output:n {#2}
   \group_end:% lwarp
 }
-
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\numrange} \oarg{options} \marg{value1} \marg{value2}
+%    \begin{macrocode}
 \RenewDocumentCommand \numrange { o m m } {
   \leavevmode
   \group_begin:% lwarp
@@ -75102,7 +76251,11 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
     \__siunitx_range_numbers:nn {#2} {#3}
   \group_end:% lwarp
 }
-
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\ang} \marg{options} \marg{angle}
+%    \begin{macrocode}
 \RenewDocumentCommand \ang { o > { \SplitArgument { 2 } { ; } } m } {
   \group_begin:% lwarp
     \LetLtxMacro\@ensuredmath\LWR@origensuredmath% lwarp
@@ -75112,7 +76265,11 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
     \__siunitx_angle_output:nnn #2
   \group_end:% lwarp
 }
-
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\si} \marg{options} \marg{unit}
+%    \begin{macrocode}
 \RenewDocumentCommand \si { o m } {
   \leavevmode
   \group_begin:% lwarp
@@ -75127,8 +76284,11 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
       }
   \group_end:% lwarp
 }
-
-
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\SIrange} \oarg{options} \marg{value1} \marg{value2} \marg{unit}
+%    \begin{macrocode}
 \RenewDocumentCommand{\SIrange}{o m m m}
 {%
   \leavevmode
@@ -75144,10 +76304,14 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
       }
   \group_end:% lwarp
 }
-
+%    \end{macrocode}
+% \end{noindmacro}
+%
+%    \begin{macrocode}
 \ExplSyntaxOff
 %    \end{macrocode}
 
+
 % For \brand{MathJax}.
 % (The following runs much faster as separate \cs{CusomizeMathJax} calls instead
 % of one single call.)
@@ -75160,24 +76324,243 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\tothe}[1]{^{#1}}}
 \CustomizeMathJax{\newcommand{\raiseto}[2]{{#2}^{#1}}}
+%    \end{macrocode}
+%
+% Used as an end marker when parsing values:
+% \changes{v0.895}{2021/01/13}{\pkg{siunitx}: Fix: \brand{MathJax} for \cs{ang}.}
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRsiunitxEND}{}}
+%    \end{macrocode}
+%
+% \begin{noindmacro}{\ang} \oarg{options} \marg{value}
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRsiunitxang#1;#2;#3;#4\LWRsiunitxEND{%
+    \ifblank{#1}{}{\num{#1}\degree}%
+    \ifblank{#2}{}{\num{#2}^{\unicode{x2032}}}% \prime
+    \ifblank{#3}{}{\num{#3}^{\unicode{x2033}}}% \dblprime
+}}
+\CustomizeMathJax{\newcommand{\ang}[2][]{\LWRsiunitxang#2;;;\LWRsiunitxEND}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% Processes scientific notation.
+% Special handling for a mantissa which is either empty or only a minus sign.
+% \changes{v0.895}{2021/01/14}{\pkg{siunitx}, \brand{MathJax}: Scientific notation.}
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRsiunitxnumscientific}[2]{%
+    \ifblank{#1}%
+        {}%
+        {%
+            \ifstrequal{#1}{-}%
+                {-}%
+                {\LWRsiunitxprintdecimal{#1}\times}%
+        }%
+    10^{\LWRsiunitxprintdecimal{#2}}
+}}
+%    \end{macrocode}
+%
+% \cs{num} handles optional powers (|e|, |E|, |d|, |D|),
+% multiples (|x|), plus and minus, and period or comma decimal output.
+%
+% To split the string, \cs{def} is used with parameter delimiters.
+% When each of the following macro is used, extra delimiters are padded to the end
+% of the arguments of each macro when used, and
+% the final argument of each collects any extra unused delimiters.
+%
+% \changes{v0.895}{2021/01/14}{\pkg{siunitx}, \brand{MathJax}:
+%       \cs{num} sci notation, multiples, +-, decimals, comma.}
+%    \begin{macrocode}
+\ExplSyntaxOn
+\AtBeginDocument{
+\ifdefstring{\l__siunitx_output_decimal_tl}{{,}}
+    {% Use decimal comma
+        \CustomizeMathJax{\def\LWRsiunitxprintdecimalsub#1.#2.#3\LWRsiunitxEND{%
+            \mathrm{#1}%
+            \ifblank{#2}
+                {}%
+                {,\mathrm{#2}}
+        }}
+
+        \CustomizeMathJax{\newcommand{\LWRsiunitxprintdecimal}[1]{%
+            \LWRsiunitxprintdecimalsub#1...\LWRsiunitxEND%
+        }}
+    }
+    {% Use decimal point
+        \CustomizeMathJax{\def\LWRsiunitxprintdecimalsub#1,#2,#3\LWRsiunitxEND{%
+            \mathrm{#1}%
+            \ifblank{#2}
+                {}%
+                {.\mathrm{#2}}
+        }}
+
+        \CustomizeMathJax{\newcommand{\LWRsiunitxprintdecimal}[1]{%
+            \LWRsiunitxprintdecimalsub#1,,,\LWRsiunitxEND%
+        }}
+    }
+}
+\ExplSyntaxOff
+%    \end{macrocode}
+%
+% \begin{noindmacro}{\num} \oarg{options} \marg{value}
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRsiunitxnumplus#1+#2+#3\LWRsiunitxEND{%
+    \ifblank{#2}
+        {\LWRsiunitxprintdecimal{#1}}% no plus
+        {%
+            \ifblank{#1}%
+                {\LWRsiunitxprintdecimal{#2}}% leading plus, ignore
+                {% a+b
+                    \LWRsiunitxprintdecimal{#1}%
+                    \unicode{x02B}% plus sign
+                    \LWRsiunitxprintdecimal{#2}%
+                }%
+        }%
+}}
 
-\CustomizeMathJax{\newcommand{\ang}[2][]{(\mathrm{#2})\degree}}
-\CustomizeMathJax{\newcommand{\num}[2][]{\mathrm{#2}}}
+\CustomizeMathJax{\def\LWRsiunitxnumminus#1-#2-#3\LWRsiunitxEND{%
+    \ifblank{#2}
+        {\LWRsiunitxnumplus#1+++\LWRsiunitxEND}%
+        {%
+            \LWRsiunitxprintdecimal{#1}%
+            \unicode{x02212}% mathematical minus sign
+            \LWRsiunitxprintdecimal{#2}%
+        }%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnumpm#1+-#2+-#3\LWRsiunitxEND{%
+    \ifblank{#2}%
+        {\LWRsiunitxnumminus#1---\LWRsiunitxEND}%
+        {%
+            \LWRsiunitxprintdecimal{#1}%
+            \unicode{x0B1}% \pm
+            \LWRsiunitxprintdecimal{#2}%
+        }%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnumx#1x#2x#3x#4\LWRsiunitxEND{%
+    \ifblank{#2}%
+        {\LWRsiunitxnumpm#1+-+-\LWRsiunitxEND}%
+        {%
+            \ifblank{#3}%
+                {%
+                    \LWRsiunitxprintdecimal{#1}%
+                    \times%
+                    \LWRsiunitxprintdecimal{#2}%
+                }%
+                {%
+                    \LWRsiunitxprintdecimal{#1}%
+                    \times%
+                    \LWRsiunitxprintdecimal{#2}%
+                    \times%
+                    \LWRsiunitxprintdecimal{#3}%
+                }%
+        }%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnumD#1D#2D#3\LWRsiunitxEND{%
+    \ifblank{#2}%
+        {\LWRsiunitxnumx#1xxxxx\LWRsiunitxEND}%
+        {\mathrm{\LWRsiunitxnumscientific{#1}{#2}}}%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnumd#1d#2d#3\LWRsiunitxEND{%
+    \ifblank{#2}%
+        {\LWRsiunitxnumD#1DDD\LWRsiunitxEND}%
+        {\mathrm{\LWRsiunitxnumscientific{#1}{#2}}}%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnumE#1E#2E#3\LWRsiunitxEND{%
+    \ifblank{#2}%
+        {\LWRsiunitxnumd#1ddd\LWRsiunitxEND}%
+        {\mathrm{\LWRsiunitxnumscientific{#1}{#2}}}%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnume#1e#2e#3\LWRsiunitxEND{%
+    \ifblank{#2}%
+        {\LWRsiunitxnumE#1EEE\LWRsiunitxEND}%
+        {\mathrm{\LWRsiunitxnumscientific{#1}{#2}}}%
+}}
+
+\CustomizeMathJax{\def\LWRsiunitxnumcomma#1,#2,#3\LWRsiunitxEND{%
+    \ifblank{#2}
+        {\LWRsiunitxnume#1eee\LWRsiunitxEND}
+        {\LWRsiunitxnume#1.#2eee\LWRsiunitxEND}
+}}
+
+\CustomizeMathJax{\newcommand{\num}[2][]{\LWRsiunitxnumcomma#2,,,\LWRsiunitxEND}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\si} \oarg{options} \marg{unit}
+%    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\si}[2][]{\mathrm{#2}}}
+%    \end{macrocode}
+% \end{noindmacro}
 %
-% \SI[opt]{num}[preunit]{unit}
-\CustomizeMathJax{\newcommand{\LWRSI}[2][]{\mathrm{#1\LWRSInumber\,#2}}}
-\CustomizeMathJax{\newcommand{\SI}[2][]{\def\LWRSInumber{#2}\LWRSI}}
+% \begin{noindmacro}{\SI} \oarg{options} \marg{value} \oarg{prefix} \marg{unit}
+%
+% \cs{SI} has a second optional arg, which is parsed using \cs{ifnextchar}.
+% \changes{v0.895}{2021/01/14}{\pkg{siunitx}: \brand{MathJax}: \cs{SI} prefix parsing.}
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRsiunitxSIopt#1[#2]#3{%
+    {#2}\num{#1}{#3}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRsiunitxSI}[2]{%
+    \num{#1}\,{#2}%
+}}
 %    \end{macrocode}
 %
-% \changes{v0.89}{2020/08/02}{\pkg{siunitx}: Unicode for endash.}
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\SI}[2][]{%
+    \ifnextchar[%
+        {\LWRsiunitxSIopt{#2}}%
+        {\LWRsiunitxSI{#2}}%
+}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\numlist} \oarg{options} \marg{list}
+%
+% \cs{numlist} should only be used in text mode.
+% If used in \brand{MathJax}, it is merely printed as input.
 %    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\numlist}[2][]{\mathrm{#2}}}
-\CustomizeMathJax{\newcommand{\numrange}[3][]{\mathrm{#2\,\unicode{x2013}\,#3}}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\numrange} \oarg{options} \marg{value1} \marg{value2}
+%
+% \cs{numrange} should only be used in text mode.
+% If used in \brand{MathJax} math, an en-dash is used instead of the \optn{range-phase}.
+% \changes{v0.89}{2020/08/02}{\pkg{siunitx}: Unicode for endash.}
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\numrange}[3][]{\num{#2}\,\unicode{x2013}\,\num{#3}}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\SIlist} \oarg{options} \marg{list}
+%
+% \cs{SIlist} and \cs{SIrange} should only be used in text mode.
+% If used in \brand{MathJax}, a simple emulation is provided.
+%    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\SIlist}[3][]{\mathrm{#2\,#3}}}
-\CustomizeMathJax{\newcommand{\SIrange}[4][]{\mathrm{#2\,#4\,\unicode{x2013}\,#3\,#4}}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\SIrange} \oarg{options} \marg{value1} \marg{value2} \marg{unit}
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\SIrange}[4][]{\num{#2}\,#4\,\unicode{x2013}\,\num{#3}\,#4}}
+%    \end{macrocode}
+% \end{noindmacro}
+%
+% \begin{noindmacro}{\tablenum} \oarg{options} \marg{value}
+%    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\tablenum}[2][]{\mathrm{#2}}}
+%    \end{macrocode}
+% \end{noindmacro}
 %
+%    \begin{macrocode}
 \CustomizeMathJax{\newcommand{\ampere}{\mathrm{A}}}
 \CustomizeMathJax{\newcommand{\candela}{\mathrm{cd}}}
 \CustomizeMathJax{\newcommand{\kelvin}{\mathrm{K}}}
@@ -75403,6 +76786,382 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %
 %
 % \iffalse
+%<*skmath>
+% \fi
+%
+% \part{lwarp-skmath.sty}
+%
+% \section{skmath}
+%
+% \credits{Simon Sigurdhsson}
+%
+% \DescribePackage{skmath}
+% \pkg{skmath} is used as-is for \SVG\ math,
+% and is emulated for \brand{MathJax}.
+%
+% \changes{v0.895}{2021/01/13}{\pkg{skmath}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{skmath}[2019/10/15]
+%    \end{macrocode}
+%
+% Only defined if package option requested:
+%    \begin{macrocode}
+\begin{warpMathJax}
+\ExplSyntaxOn
+\bool_if:NT\g__skmath_define_common_sets_bool{
+\CustomizeMathJax{\newcommand{\N}{\mathbb{N}}}
+\CustomizeMathJax{\newcommand{\Z}{\mathbb{Z}}}
+\CustomizeMathJax{\newcommand{\Q}{\mathbb{Q}}}
+\CustomizeMathJax{\newcommand{\R}{\mathbb{R}}}
+\CustomizeMathJax{\newcommand{\C}{\mathbb{C}}}
+}
+%    \end{macrocode}
+%
+% \pkg{skmath} is using \pkg{l3keys}, which does not seem to have
+% an equivalent to \cs{@ifpackagewith}.
+% To detect package options, comparisons with the following are made to see if
+% various macros have been defined as follows:
+%    \begin{macrocode}
+\cs_gset_nopar:Npn\LWR__skmath_imaginary_unit:n#1{{#1}}
+\cs_gset_nopar:Npn\LWR__skmath_natural_log_e:{{e}}
+\cs_gset_nopar:Npn\LWR__skmath_integral_d:{{d}}
+\cs_gset_nopar:Npn\LWR__skmath_total_derivative_d:{{d}}
+%    \end{macrocode}
+%
+% If \optn{notation=iso}, use upright, else italic:
+%    \begin{macrocode}
+\cs_if_eq:NNTF \__skmath_imaginary_unit:n \LWR__skmath_imaginary_unit:n
+    {
+        \CustomizeMathJax{\newcommand{ii}{\mathit{i}}}
+        \CustomizeMathJax{\newcommand{jj}{\mathit{j}}}
+    }
+    {
+        \CustomizeMathJax{\newcommand{ii}{\mathrm{i}}}
+        \CustomizeMathJax{\newcommand{jj}{\mathrm{j}}}
+    }
+%    \end{macrocode}
+%
+% If \optn{notation=iso}, use upright, else italic:
+%    \begin{macrocode}
+\cs_if_eq:NNTF \__skmath_natural_log_e: \LWR__skmath_natural_log_e:
+    { \CustomizeMathJax{\newcommand{\ee}{\mathit{e}}} }
+    { \CustomizeMathJax{\newcommand{\ee}{\mathrm{e}}} }
+%    \end{macrocode}
+%
+% \pkg{skmath} uses \cs{DeclarePairedDelimiter} from \pkg{mathtools}
+% for \cs{abs} and \cs{norm},
+% and \pkg{lwarp} uses this to automatically define \brand{MathJax} definitions for
+% each.
+%
+% If \optn{notation=english}, use slanted, else upright:
+%    \begin{macrocode}
+\cs_if_eq:NNTF \__skmath_integral_d: \LWR__skmath_integral_d:
+    { \CustomizeMathJax{\newcommand{\d}{\mathit{d}}} }
+    { \CustomizeMathJax{\newcommand{\d}{\mathrm{d}}} }
+%    \end{macrocode}
+%
+% Used to parse comma and caret arguments for \cs{pd} and \cs{td}:
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRskmathEND{}}
+%    \end{macrocode}
+%
+% Parse the arguments with up to four commas.
+% Argument 6 contains any leftover commas.
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRskmathpdstarsub#1#2,#3,#4,#5,#6\LWRskmathEND{
+    #1_{#2#3#4#5}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRskmathpdstar}[2]{%
+    \LWRskmathpdstarsub{#1}#2,,,,\LWRskmathEND%
+}}
+%    \end{macrocode}
+%
+% Parse the arguments with up to two carets.
+% Argument 3 contains any leftover carets.
+% \cs{LWRskmathpdplus} is used to only place a plus sign
+% starting after the first term.
+% \cs{LWRskmathpdone} is used to only place a |1| digit if
+% a second or later term does not have a power.
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRskmathpdnumerator#1^#2^#3\LWRskmathEND{%
+    \ifblank{#1}{}{
+        \ifblank{#2}{\LWRskmathpdplus\LWRskmathpdone}{\LWRskmathpdplus#2}
+    }
+}}
+%    \end{macrocode}
+%
+% Parse the arguments with up to two carets.
+% Argument 3 contains any leftover carets.
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRskmathpddenominator#1^#2^#3\LWRskmathEND{%
+    \ifblank{#1}{}{%
+        \ifblank{#2}%
+            {\partial{#1}}%
+            {\partial{#1}^{#2}}%
+    }%
+}}
+%    \end{macrocode}
+%
+% Factored from \cs{LWRskmathpdnostarsub}, following:
+%
+% The phrase |^{}| appears to be required while
+% parsing the carets.
+% \cs{LWRskmathpdplus} is used to only place a plus sign
+% starting after the first term.
+% \cs{LWRskmathpdone} is used to only place a |1| digit if
+% a second or later term does not have a power.
+%
+% This may not be recursion-safe.
+% (Is there really such as a thing as nested differentials?)
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathdonumerator}[5]{%
+    \partial^{%
+        \def\LWRskmathpdplus{}%
+        \LWRskmathpdnumerator#2^{}^{}\LWRskmathEND%
+        \def\LWRskmathpdplus{+}%
+        \def\LWRskmathpdone{1}%
+        \LWRskmathpdnumerator#3^{}^{}\LWRskmathEND%
+        \LWRskmathpdnumerator#4^{}^{}\LWRskmathEND%
+        \LWRskmathpdnumerator#5^{}^{}\LWRskmathEND%
+    }%
+    {#1}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRskmathdodenominator}[4]{%
+    \LWRskmathpddenominator#1^{}^{}^{}\LWRskmathEND%
+    \ifblank{#2}{}{\,}%
+    \LWRskmathpddenominator#2^{}^{}^{}\LWRskmathEND%
+    \ifblank{#3}{}{\,}%
+    \LWRskmathpddenominator#3^{}^{}^{}\LWRskmathEND%
+    \ifblank{#4}{}{\,}%
+    \LWRskmathpddenominator#4^{}^{}^{}\LWRskmathEND%
+}}
+%    \end{macrocode}
+%
+% Parse the arguments with up to four commas.
+% Argument 6 contains any leftover commas.
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRskmathpdnostarsub#1#2,#3,#4,#5,#6\LWRskmathEND{
+    \ifblank{#3}{\def\LWRskmathpdone{}}{\def\LWRskmathpdone{1}}
+    \frac%
+        {\LWRskmathdonumerator{#1}{#2}{#3}{#4}{#5}}%
+        {\LWRskmathdodenominator{#2}{#3}{#4}{#5}}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRskmathpdnostar}[2]{%
+    \LWRskmathpdnostarsub{#1}#2,,,,,,\LWRskmathEND%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\pd}{\ifstar\LWRskmathpdstar\LWRskmathpdnostar}}
+%    \end{macrocode}
+%
+% If \optn{notation=english} or \optn{legacy}, use slanted, else upright:
+%    \begin{macrocode}
+\cs_if_eq:NNTF \__skmath_total_derivative_d: \LWR__skmath_total_derivative_d:
+    { \CustomizeMathJax{\newcommand{\LWRskmathtd}{\mathit{d}}} }
+    { \CustomizeMathJax{\newcommand{\LWRskmathtd}{\mathrm{d}}} }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\def\LWRskmathtdsub#1#2^#3\LWRskmathEND{%
+    \frac
+        {\LWRskmathtd^{#3}{#1}}
+        {\LWRskmathtd{#2}^{#3}}
+}}
+
+\CustomizeMathJax{\newcommand{\td}[2]{%
+    \LWRskmathtdsub{#1}#2^{}\LWRskmathEND%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\E}[1]{%
+    \operatorname{E}\left[#1\right]%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\let\given\mid}
+
+\CustomizeMathJax{\newcommand{\P}[1]{%
+    \operatorname{P}%
+    \left(#1\right)%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\var}[1]{%
+  \operatorname{Var}\left(#1\right)%
+}}
+
+\CustomizeMathJax{\newcommand{\cov}[2]{%
+  \operatorname{Cov}\left(#1,#2\right)%
+}}
+%    \end{macrocode}
+%
+% Common code for \cs{sin} etc:
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathtrigtwo}[2][]{%
+    \ifblank{#1}{}{^{#1}}%
+    \ifblank{#2}{}{\left(#2\right)}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRskmathtrig}[1]{%
+    \operatorname{#1}%
+    \LWRskmathtrigtwo%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\renewcommand{\sin}{\LWRskmathtrig{sin}}}
+\CustomizeMathJax{\renewcommand{\arcsin}{\LWRskmathtrig{arcsin}}}
+
+\CustomizeMathJax{\renewcommand{\cos}{\LWRskmathtrig{cos}}}
+\CustomizeMathJax{\renewcommand{\arccos}{\LWRskmathtrig{arccos}}}
+
+\CustomizeMathJax{\renewcommand{\tan}{\LWRskmathtrig{tan}}}
+\CustomizeMathJax{\renewcommand{\arctan}{\LWRskmathtrig{arctan}}}
+
+\CustomizeMathJax{\renewcommand{\cot}{\LWRskmathtrig{cot}}}
+
+\CustomizeMathJax{\renewcommand{\sinh}{\LWRskmathtrig{sinh}}}
+\CustomizeMathJax{\renewcommand{\cosh}{\LWRskmathtrig{cosh}}}
+\CustomizeMathJax{\renewcommand{\tanh}{\LWRskmathtrig{tanh}}}
+%    \end{macrocode}
+%
+% Common code for \cs{ln} and \cs{log}:
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathlogtwo}[2][]{%
+    \ifblank{#1}{}{_{#1}}%
+    \ifblank{#2}{}{\left(#2\right)}%
+}}
+
+\CustomizeMathJax{\newcommand{\LWRskmathlog}[1]{%
+    \operatorname{#1}%
+    \LWRskmathlogtwo%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\renewcommand{\ln}{\LWRskmathlog{ln}}}
+\CustomizeMathJax{\renewcommand{\log}{\LWRskmathlog{log}}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathexpparens}[1]{%
+    \operatorname{exp}%
+    \ifblank{#1}{}{\left(#1\right)}%
+}}
+%    \end{macrocode}
+%
+% See the \pkg{skmath} source for the original of the following:
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathexpnostar}[1]{%
+    \mathchoice
+        {\ee^{#1}}
+        {\LWRskmathexpparens{#1}}
+        {\LWRskmathexpparens{#1}}
+        {\LWRskmathexpparens{#1}}
+}}
+
+\CustomizeMathJax{\renewcommand{\exp}{\ifstar\LWRskmathexpparens\LWRskmathexpnostar}}
+%    \end{macrocode}
+%
+% Common code for \cs{min} etc:
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathminstar}[2][]{%
+    \operatorname{\LWRskmathminname}%
+    \ifblank{#1}{}{%
+        _{\mathchoice{\mathclap{#1}}{#1}{#1}{#1}}
+    }%
+    \ifblank{#2}{}{#2}%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathminnostar}[2][]{%
+    \ifblank{#1}%
+        {\operatorname{\LWRskmathminname}}%
+        {%
+            \underset%
+                {\mathchoice{\mathclap{#1}}{#1}{#1}{#1}}%
+                {\operatorname{\LWRskmathminname}}%
+        }%
+    \ifblank{#2}{}{\left\{#2\right\}}%
+}}
+%    \end{macrocode}
+%
+% \cs{LWRskmathminname} seems to be recursion-safe since it is used immediately.
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRskmathmin}[1]{%
+    \def\LWRskmathminname{#1}%
+    \ifstar\LWRskmathminstar\LWRskmathminnostar%
+}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\renewcommand{\min}{\LWRskmathmin{min}}}
+\CustomizeMathJax{\renewcommand{\argmin}{\arg\LWRskmathmin{min}}}
+
+\CustomizeMathJax{\renewcommand{\max}{\LWRskmathmin{max}}}
+\CustomizeMathJax{\renewcommand{\argmax}{\arg\LWRskmathmin{max}}}
+\CustomizeMathJax{\renewcommand{\sup}{\LWRskmathmin{sup}}}
+\CustomizeMathJax{\renewcommand{\inf}{\LWRskmathmin{inf}}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{\let\bar\overline}
+
+\CustomizeMathJax{\let\vec\boldsymbol}
+%    \end{macrocode}
+%
+% Remember the original definitions:
+%    \begin{macrocode}
+\CustomizeMathJax{\let\LWRskmathRe\Re}
+\CustomizeMathJax{\let\LWRskmathIm\Im}
+%    \end{macrocode}
+%
+% Redefine depending on \optn{notation=iso}:
+%    \begin{macrocode}
+\bool_if:NTF\g__skmath_iso_complex_parts_bool{
+    \CustomizeMathJax{\renewcommand{\Re}[1]{%
+        \LWRskmathRe%
+        \ifblank{#1}{}{\left(#1\right)}%
+    }}
+    \CustomizeMathJax{\renewcommand{\Im}[1]{%
+        \LWRskmathIm%
+        \ifblank{#1}{}{\left(#1\right)}%
+    }}
+}{
+    \CustomizeMathJax{\renewcommand{\Re}[1]{%
+        \operatorname{Re}%
+        \ifblank{#1}{}{#1}%
+    }}
+    \CustomizeMathJax{\renewcommand{\Im}[1]{%
+        \operatorname{Im}%
+        \ifblank{#1}{}{#1}%
+    }}
+}
+
+\ExplSyntaxOff
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</skmath>
+% \fi
+%
+%
+%
+%
+%
+% \iffalse
 %<*slantsc>
 % \fi
 %
@@ -78507,6 +80266,110 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %
 %
 % \iffalse
+%<*tensor>
+% \fi
+%
+% \part{lwarp-tensor.sty}
+%
+% \section{tensor}
+%
+% \credits{Philip G. Ratcliffe}
+%
+% \DescribePackage{tensor}
+% \pkg{tensor} is used as-is for \SVG\ math, and
+% is emulated for \brand{MathJax}.
+%
+% Compressed spacing and left justification are not possible with \brand{MathJax}.
+% \trouble[spacing]{tensor=\pkg{tensor}}
+%
+% \changes{v0.895}{2021/01/23}{\pkg{tensor}: Added \brand{MathJax}.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{tensor}[2004/12/20]
+%    \end{macrocode}
+%
+% For \brand{MathJax}.
+% Special handling is required to parse the superscript and subscript arguments.
+%
+% When a superscript or subscript is seen, it is processed and then the
+% remainder is processesed recursively.
+%    \begin{macrocode}
+\begin{warpMathJax}
+\CustomizeMathJax{\def\LWRtensorindicesthreesub#1#2{{_{#2}}\LWRtensorindicesthree}}
+\CustomizeMathJax{\def\LWRtensorindicesthreesup#1#2{{^{#2}}\LWRtensorindicesthree}}
+%    \end{macrocode}
+%
+% If not a superscript nor a subscript, processing stops.
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRtensorindicesthreenotsup}{}}
+%    \end{macrocode}
+%
+% Check ahead for a superscript or a subscript.
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRtensorindicesthreenotsub}{
+    \ifnextchar ^ \LWRtensorindicesthreesup \LWRtensorindicesthreenotsup
+}}
+
+\CustomizeMathJax{\newcommand{\LWRtensorindicesthree}{
+    \ifnextchar _ \LWRtensorindicesthreesub \LWRtensorindicesthreenotsub
+}}
+%    \end{macrocode}
+%
+% Ignore star.
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRtensorindicestwo}{
+    \ifstar\LWRtensorindicesthree\LWRtensorindicesthree
+}}
+%    \end{macrocode}
+%
+% Remove the outer brace of the argument.
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\indices}[1]{\LWRtensorindicestwo#1}}
+%    \end{macrocode}
+%
+% Attempting to use \cs{vphantom} here does not work:
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\LWRtensortwo}[3][]{{}\indices{#1}{#2}\indices{#3}}}
+%    \end{macrocode}
+%
+% Ignore star.
+%    \begin{macrocode}
+\CustomizeMathJax{\newcommand{\tensor}{\ifstar\LWRtensortwo\LWRtensortwo}}
+%    \end{macrocode}
+%
+% In text mode, \cs{nuclide} is converted to an \SVG\ image.
+%    \begin{macrocode}
+\CustomizeMathJax{%
+    \newcommand{\LWRnuclidetwo}[2][]{%
+        {%
+            \vphantom{\mathrm{#2}}%
+            {}^{\LWRtensornucleonnumber}_{#1}%
+            \mathrm{#2}%
+        }%
+    }%
+}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\CustomizeMathJax{%
+    \newcommand{\nuclide}[1][]{%
+        \def\LWRtensornucleonnumber{#1}%
+        \LWRnuclidetwo%
+    }%
+}
+\end{warpMathJax}
+%    \end{macrocode}
+%
+% \iffalse
+%</tensor>
+% \fi
+%
+%
+%
+%
+% \iffalse
 %<*termcal>
 % \fi
 %
@@ -79767,6 +81630,42 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %
 %
 %
+% \iffalse
+%<*tikz-imagelabels>
+% \fi
+%
+% \part{lwarp-tikz-imagelabels.sty}
+%
+% \section{tikz-imagelabels}
+%
+% \credits{Tobias Plüss}
+%
+% \DescribePackage{tikz-imagelabels}
+% \pkg{tikz-imagelabels} is patched for use by \pkg{lwarp}.
+%
+% \changes{v0.895}{2021/01/19}{\pkg{tikz-imagelabels}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{tikz-imagelabels}[2019/06/27]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\BeforeBeginEnvironment{annotationimage}{%
+    \begin{lateximage}[-tikz-imagelabels-~\PackageDiagramAltText]%
+}
+
+\AfterEndEnvironment{annotationimage}{\end{lateximage}}
+%    \end{macrocode}
+%
+% \iffalse
+%</tikz-imagelabels>
+% \fi
+%
+%
+%
+%
 %
 %
 % \iffalse
@@ -82333,7 +84232,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 % and thus not display correctly in \brand{MathJax}.
 %
 % Symbol font commands are emulated, but not all combinations are
-% supported by MathJax, especially with the dedicated Greek macros.
+% supported by \brand{MathJax}, especially with the dedicated Greek macros.
 % Symbol macros such as \cs{symbfsf} may not be sans or bold.
 % For Greek, use the Unicode equivalent, if necessary.
 %
@@ -82661,7 +84560,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 \LWR@formatted{unitfrac}
 %    \end{macrocode}
 %
-% For Mathjax:
+% For \brand{Mathjax}:
 % \changes{v0.891}{2020/09/08}{\pkg{units}: Added \cs{mathinner}, improved fraction.}
 %    \begin{macrocode}
 \begin{warpMathJax}
@@ -84008,7 +85907,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %    \begin{macrocode}
 \DeclareDocumentCommand{\LWR@textcurrentcolor}{m}{%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \LWR@findcurrenttextcolor%
 \InlineClass[color:\LWR@origpound\LWR@tempcolor]{textcolor}{%
     \renewcommand*{\LWR@currenttextcolor}{\LWR@origpound\LWR@tempcolor}%
@@ -84030,7 +85929,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@colorstyle}{m m}{%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 %    \end{macrocode}
 % Use the \pkg{xcolor} package to convert to an \HTML\ color space:
 %    \begin{macrocode}
@@ -84055,7 +85954,7 @@ remember to convert PDF images to SVG using 'lwarpmk pdftosvg *-fig.pdf',
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@backgroundcolor}{O{named} m m}{%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \InlineClass[background:\LWR@colorstyle{#1}{#2}]{backgroundcolor}{%
 #3%
 }%
@@ -84122,7 +86021,7 @@ padding:\LWR@printlength{\fboxsep}%
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@HTML@textcolor}{o m m}{%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \IfValueTF{#1}{%
     \color[#1]{#2}%
 }{%
@@ -84166,7 +86065,7 @@ padding:\LWR@printlength{\fboxsep}%
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@HTML@colorbox}{O{named} m +m}{%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \InlineClass[%
 background:\LWR@colorstyle{#1}{#2} ; %
 padding:\LWR@printlength{\fboxsep}%
@@ -84189,7 +86088,7 @@ padding:\LWR@printlength{\fboxsep}%
 %    \begin{macrocode}
 \NewDocumentCommand{\LWR@HTML@colorboxBlock}{O{named} m +m}{%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 %    \end{macrocode}
 % \changes{v0.62}{2018/11/11}{\pkg{xcolor}: Fix: Horiz white space.}
 %    \begin{macrocode}
@@ -84231,7 +86130,7 @@ padding:\LWR@printlength{\fboxsep}%
 \NewDocumentCommand{\LWR@HTML@fcolorbox}{O{named} m O{#1} m +m}{%
 \LWR@traceinfo{HTML fcolorbox #2 #4}%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \LWR@forceminwidth{\fboxrule}%
 \ifthenelse{\equal{#4}{none}}%
     {% no background color
@@ -84267,7 +86166,7 @@ padding:\LWR@printlength{\fboxsep}%
 \NewDocumentCommand{\LWR@HTML@fcolorboxBlock}{O{named} m O{#1} m +m}{%
 \LWR@traceinfo{HTML fcolorboxBlock #2 #4}%
 \begingroup%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \LWR@forceminwidth{\fboxrule}%
 %    \end{macrocode}
 % \changes{v0.62}{2018/11/11}{\pkg{xcolor}: Fix: Horiz white space.}
@@ -84345,7 +86244,7 @@ width:\LWR@printlength{\LWR@tempwidth}%
 %    \begin{macrocode}
 \NewDocumentEnvironment{LWR@HTML@fcolorminipage}{O{named} m O{#1} m O{c} o o m}
 {%
-\LWR@FBcancel%
+\LWR@hook@processingtags%
 \setlength{\LWR@tempwidth}{#8}%
 \IfValueT{#6}{\setlength{\LWR@tempheight}{#6}}%
 \LWR@forceminwidth{\fboxrule}%
@@ -84625,6 +86524,42 @@ height:\LWR@printlength{\LWR@tempheight}%
 %
 %
 % \iffalse
+%<*xevlna>
+% \fi
+%
+% \part{lwarp-xevlna.sty}
+%
+% \section{xevlna}
+%
+% \credits{Zdeněk Wagner}
+%
+% \DescribePackage{xevlna}
+% \pkg{xevlna} is patched for use by \pkg{lwarp}.
+%
+% Non-breakable spaces are inserted into \HTML.
+%
+% \changes{v0.895}{2021/01/13}{\pkg{xevlna}: Added.}
+%
+% \codehtml
+%
+%    \begin{macrocode}
+\LWR@ProvidesPackagePass{xevlna}[2016/09/05]
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\def\ProcessCSpreposition{\ifx\next\xevlnaXeTeXspace\HTMLentity{nbsp}\fi}
+
+\appto{\LWR@hook@processingtags}{\xevlnaDisable}%
+%    \end{macrocode}
+%
+% \iffalse
+%</xevlna>
+% \fi
+%
+%
+%
+%
+% \iffalse
 %<*xfakebold>
 % \fi
 %
-- 
cgit v1.2.3

