diff options
author | Karl Berry <karl@freefriends.org> | 2017-02-21 23:44:01 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-02-21 23:44:01 +0000 |
commit | 91c9b5dc1e480401f79c7ea64bd98754e1eab170 (patch) | |
tree | 0490daeb741da832d4791aef4d848c3adf39621b /Master/texmf-dist/source | |
parent | 28867ba53359e0e24d60b4189f4625553a5e76a0 (diff) |
lwarp (10feb17)
git-svn-id: svn://tug.org/texlive/trunk@43292 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r-- | Master/texmf-dist/source/latex/lwarp/lwarp.dtx | 21225 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/lwarp/lwarp.ins | 92 |
2 files changed, 21317 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/lwarp/lwarp.dtx b/Master/texmf-dist/source/latex/lwarp/lwarp.dtx new file mode 100644 index 00000000000..dce07329532 --- /dev/null +++ b/Master/texmf-dist/source/latex/lwarp/lwarp.dtx @@ -0,0 +1,21225 @@ +% +% \iffalse meta-comment +% +% Copyright 2016 Brian Dunn +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% \fi +% +% \iffalse +%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<package>\ProvidesPackage{lwarp} +%<package> [2017/02/09 v0.20 Allows LaTeX to directly produce HTML5 output.] +% +%<*driver> +\documentclass{ltxdoc} + +\usepackage{lmodern} +% \usepackage{libertine} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{textcomp} % provides \degree, \textquotesingle, \textmu + +\usepackage{newunicodechar} +\newunicodechar{ff}{ff} +\newunicodechar{fi}{fi} +\newunicodechar{fl}{fl} +\newunicodechar{ffi}{ffi} +\newunicodechar{ffl}{ffl} +% \newunicodechar{°}{\degree} +\newunicodechar{ρ}{\ensuremath{\rho}} +\newunicodechar{⨯}{\texttimes} +\newunicodechar{⁄}{\textfractionsolidus} +% \newunicodechar{®}{\textregistered} +% \newunicodechar{©}{\textcopyright} +\newunicodechar{—}{---} +\newunicodechar{–}{--} +% \newunicodechar{”}{''} +% \newunicodechar{“}{``} +% \newunicodechar{§}{\S} +% \newunicodechar{¶}{\P} +% \newunicodechar{†}{\dag} +\newunicodechar{‡}{\ddag} +\newunicodechar{Á}{\'{A}} +\newunicodechar{è}{\`{e}} +\newunicodechar{ø}{\o{}} +\newunicodechar{Æ}{\AE{}} +\newunicodechar{â}{\^{a}} +\newunicodechar{ô}{\^{o}} +\newunicodechar{Ô}{\^{O}} +\newunicodechar{ê}{\^{e}} + +\usepackage{microtype} + +\usepackage[all,defaultlines=2]{nowidow} +\usepackage{needspace} + + +\usepackage[log-declarations=false]{xparse} + +\usepackage[svgnames]{xcolor} +\definecolor{myurlcolor}{rgb}{0,0,.7} +\definecolor{mylinkcolor}{rgb}{.7,0,0} +\definecolor{codecolor}{rgb}{0,.4,.2} +\definecolor{overviewcolor}{rgb}{0,.2,.4} + + +\usepackage{graphicx} +\graphicspath{{images/}} + +\usepackage{enumitem} + +\usepackage{array} +\usepackage{longtable} +\usepackage{booktabs} + +\usepackage[normalem]{ulem} + +\usepackage{fancyvrb} + +\usepackage{capt-of} + +\usepackage{comment} +\excludecomment{testing} + + + +% \usepackage{morefloats} +% \usepackage{marginfix} + +\usepackage{tocloft} +\renewcommand{\cftpartfont}{\Large\bfseries} +\setlength{\cftsecnumwidth}{2.5em} +\setlength{\cftsubsecnumwidth}{3em} +\setlength{\cftsubsubsecindent}{2.8em} +\setlength{\cftsubsubsecnumwidth}{4em} + + +\usepackage{titleps} + +\newpagestyle{pageheadfoot}{ + \headrule + \sethead{\pkg{lwarp}}{}{\thepage} +% \renewcommand{\makefootrule}{\rule[2.5ex]{\linewidth}{.4pt}} + \setfoot{}{}{} +} + +\pagestyle{pageheadfoot} + + + + +\usepackage{dtxdescribe} + +\newcommand{\ItemDescribeMacro}[1]{\item[\cmd{#1}:]\DescribeMacro{#1}} +\newcommand{\ItemDescribeEnv}[1]{\item[\env{#1}:]\DescribeEnv{#1}} +\newcommand{\ItemDescribeCounter}[1]{\item[\texttt{#1}:]\DescribeCounter{#1}} +\newcommand{\ItemDescribeBoolean}[1]{\item[\texttt{#1}:]\DescribeBoolean{#1}} + + +\usepackage[lwarpmk]{lwarp-newproject} +\usepackage{lwarp} + + + +\usepackage[pdftex,bookmarks=true,hidelinks,% +colorlinks,linkcolor=mylinkcolor,urlcolor=myurlcolor,% +pageanchor=true,hyperindex=true, +]{hyperref} + +\hypersetup{% +pdfinfo={% +Title={LaTeX lwarp package},% +Author={Brian Dunn},% +Subject={LaTeX to HTML conversion},% +Keywords={LaTeX, HTML, conversion}% +}} + + +\usepackage{cleveref} + + +\renewcommand{\partname}{Package} +\renewcommand*{\thepart}{\arabic{part}} + + +\newcommand{\lmacro}[1]{\textbackslash#1} +\newcommand{\cmds}[1]{\texttt{#1}} +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\pkg}[1]{\textsf{#1}} +\newcommand{\acro}[1]{\textsc{\lowercase{#1}}} + + + + + + + +\newcommand{\codehtml}{\leavevmode\marginpar{\footnotesize\raggedleft\textcolor{codecolor}{\textbf{for HTML output:~}}}\vspace{-5.25ex}} +\newcommand{\codeprint}{\leavevmode\marginpar{\footnotesize\raggedleft\textcolor{codecolor}{\textbf{for PRINT output:~}}}\vspace{-5.25ex}} +\newcommand{\codeall}{\leavevmode\marginpar{\footnotesize\raggedleft\textcolor{codecolor}{\textbf{for HTML \& PRINT:~}}}\vspace{-5.25ex}} + +\newcommand{\tikz}{Ti\textit{k}z} +\newcommand{\htmlfive}{\acro{HTML}\oldstylenums{5}} +\newcommand{\cssthree}{\acro{CSS}\oldstylenums{3}} + +\newcommand{\goesto}{$\Rightarrow$} + +\newcommand{\userentry}[1]{% +\par +\smallskip +\hspace*{2em}{\footnotesize Enter~$\Rightarrow$}\quad\texttt{#1} +\smallskip +} + +\newenvironment{docsidebar}[1][] +{\hfill\minipage{.9\linewidth}\raggedright#1\smallskip\hrule\medskip} +{\smallskip\hrule\endminipage\hspace*{\fill}\bigskip} + +% \makeatletter +% \newcommand{\watchout}[1][]{% +% \@bsphack% +% \marginpar{\raggedleft\textcolor{blue!70!black}{#1} \quad \includegraphics[height=3ex]{symbol_warning.pdf}} +% \@esphack% +% } +% \makeatother + +\newcommand{\pdflatexonly}{ +\textcolor{red}{Only pre-loaded if \texttt{pdflatex} is being used.} +\marginpar{\raggedleft\textcolor{blue!70!black}{\texttt{pdflatex} only:}} +} + +% \newcommand{\margintag}[1]{% +% \marginpar{\raggedleft\textcolor{blue!70!black}{#1}}% +% } + + +% The following text is used in multiple places in the documentation: + +\newcommand{\documentationnotes}{ +The following sections document the actual implementation of the \pkg{lwarp} package. + +The small numbers at the left end of a line refer to line numbers +\margintag{line numbers} +in the \texttt{lwarp.sty} file. + +Blue-colored tags in the left margin +\margintag{subjects} +aid in quickly identifying the subject of each paragraph. + +Black-colored tags in the left marign are used to +\margintag{objects} +identify programming objects such as files, packages, +environments, booleans, and counters. +Items without a tag are command macros. +Each of these also appears in the index as +\margintag{index entries} +individual entries, and are also listed together under ``files'', ``packages'', ``environments'', +``booleans'', and ``counters''. + +Special warnings are marked with a warning icon. +\watchout[warnings] + +\codehtml\vspace*{5.25ex}\ignorespaces +\codeprint\vspace*{5.25ex}\ignorespaces +\codeall\vspace*{5.25ex}\ignorespaces +Green-colored tags in the left margin show which sections of source +code apply to the generation of \acro{HTML}, print, or both forms of output. +} + +\newcommand{\limitstext}{\cs{textbf}, etc.\ are supported, +but \cs{bfseries}, etc.\ are not yet supported.} + +\newcommand{\limitsverse}{% +\DescribeMacro{\attrib} +The documentation for the \pkg{verse} and \pkg{memoir} packages suggest +defining an \cs{attrib} command, which may already exist in current documents, +but it will only work for print output. +\pkg{lwarp} provides \cs{attribution}, which +works for both print and \acro{HTML} output. To combine the two so that +\cs{attrib} is used for print and \cs{attribution} is used for \acro{HTML}: + +\begin{docsidebar} +\ttfamily +\cs{begin}\{warpHTML\} + +\cs{let}\cs{attrib}\cs{attribution} + +\cs{end}\{warpHTML\} +\end{docsidebar} + +\DescribeLength{vleftskip} +\DescribeLength{vleftmargini} +These lengths are used by \pkg{verse} and \pkg{memoir} to control the left margin, +and they may already be set by the user for print output. New lengths + \DescribeLength{HTMLvleftskip}\DescribeLength{HTMLleftmargini} +\cs{HTMLvleftskip} and \cs{HTMLleftmargini} are provided to control the +margins in \acro{HTML} output. These new lengths may be set by the user +before any \env{verse} environment, and persist until they are manually changed again. +One reason to change \cs{HTMLleftmargini} is if there is a wide +\cs{flagverse} in use, such as the word ``Chorus'', in which case the value of +\cs{HTMLleftmargini} should be set to a wide enough length to contain ``Chorus''. +The default is wide enough for a stanza number. + +Horizontal spacing relies on \texttt{pdftotext}'s ability to discern the +\texttt{-layout} of the +text in the \acro{HTML}-tagged \acro{PDF} output. For some settings of +\cs{HTMLleftmargini} or \cs{HTMLleftskip} the horizontal alignment may not work out +exactly, in which case a label may be shifted by one space. +} + + +\newcommand{\limitslateximagefontsize}{% +The size of the math and text used +\margintag{SVG image font size} +in the \acro{SVG} image may be adjusted +\index{font>size --- lateximage}% +\index{font>size --- math, SVG}% +\index{math>font size --- SVG}% +\index{lateximages>font size}% +by setting \cs{LateximageFontSizeName} to a font size name --- \emph{without the backslash}, for ex: \\ +\hspace*{.5in}\texttt{\cs{renewcommand}\{\cs{LateximageFontSizeName}\}\{\textcolor{red}{large}\}} +} + + +\newcommand{\limitsmath}{% +Math may be rendered as \acro{SVG} graphics or using the \textsc{MathJax} JavaScript display engine. +\index{JavaScript>MathJax} + +For \acro{SVG} math, +\margintag{SVG math option} +math is rendered as usual by \LaTeX{} into the initial \acro{PDF} file using the +\index{math>SVG summary}% +\index{SVG>math summary}% +current font\footnote{See \cref{sec:xfrac} regarding fonts and fractions.}, +then is captured from the \acro{PDF} and converted to \acro{SVG} graphics +via a number of utility programs. +The \acro{SVG} format is a scalable-vector web format, so math may be typeset by \LaTeX{} +with its fine control and precision, then displayed or printed at any size, +depending on (sometimes broken) browser support. +An \acro{HTML} \texttt{ALT} tag carries the \LaTeX{} code which generated the +math, allowing copy/paste of the \LaTeX{} math expression into other documents. + +\limitslateximagefontsize + +As currently implemented, +\margintag{SVG files} +each instance of math creates a new \acro{SVG} file. In text with +many references to math variables, this can result in a large number of files with +duplicate content. In the future, some method of content-based naming and checksumming +may be used to remove the need for duplicate files. + +Another approach would be +\margintag{SVG inline} +to in-line the \acro{SVG} files directly into the \acro{HTML}. +This avoids having a large number of files and potentially speeds loading the images, +but dis-allows the possibility of sharing one file among many instances without +user intervention. + +Others have used \acro{PNG} files, +\margintag{PNG files} +sometimes pre-scaled for print resolution but displayed +on-screen at a scaled down size. This allows high-quality print output at the expense +of larger files, but \acro{SVG} files are also larger as well. + +Conversion to Math\acro{ML} might be a better approach, +\margintag{MathML} +among other things +allowing a more compact representation of math than \acro{SVG} drawings. +Problems with Math\acro{ML} include limited browser support and some +issues with the fine control of the appearance of the result. + +The popular MathJax alternative (\url{mathjax.org}) may be used to display math. +\margintag{MathJax math option} +\DescribeProgram{MathJax} +\index{math>MathJax summary} +\index{MathJax>summary} + +When MathJax is enabled, math is rendered twice: +\begin{enumerate} +\item As regular \LaTeX\ \acro{PDF} output placed inside an \acro{HTML} comment, allowing +equation numbering and cross referencing to be almost entirely under the control of \LaTeX, and +\item As detokenized printed \LaTeX{} commands placed directly into the \acro{HTML} output +for interpretation by the MathJax display scripts. An additional script is used to +pre-set the equation number format and value according to the current \LaTeX\ values, +and the MathJax cross-referencing system is ignored in favor of the \LaTeX\ internal system, +seamlessly integrating with the rest of the \LaTeX\ code. +\end{enumerate} + +Limitations when using MathJax include: +\margintag{MathJax limitations} +\DescribeProgram{MathJax} +\begin{itemize} +\item In document classes which have chapters, + \margintag{chapter numbers}% + \index{MathJax>tagged equations}% + \index{tagged equations>Mathjax}% + \cs{tag}ged equations have the chapter number prepended in \acro{HTML} output, unlike \LaTeX. + \cs{tag*} equations (correctly) do not. + This may be improved with future versions of the MathJax support script. + + \href{https://groups.google.com/forum/\#!topic/mathjax-users/jUtewUcE2bY} + {\texttt{https://groups.google.com/forum/\#!topic/\\ + \hspace*{2em}mathjax-users/jUtewUcE2bY}} + +\item MathJax itself does not support subequations. + \margintag{subequations} +\index{MathJax>subequations}% +\index{subequations>MathJax}% + This may be improved by parsing the \LaTeX{} + math expression to manually insert tags, but this has not yet been done. +\item Footnotes inside equations are not yet supported while using MathJax. + \margintag{footnotes in math} +\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 MathJax is used in the rest of the document. +\item Usage of \pkg{siunitx} inside a math equation + \margintag{siunitx} + is supported via a third-party MathJax extension. + While inside a math expression, do not use \cs{SI} or \cs{si} inside \cs{text}, + where it will be rendered as normal text. + \watchout[siunitx inside an equation] + + \href{https://github.com/mathjax/MathJax-third-party-extensions/tree/master/siunitx} + {\texttt{https://github.com/mathjax/MathJax-third-party-extensions/\\ + \hspace*{2em}tree/master/siunitx}} + +\item MathJax does not automatically support custom \LaTeX{} macros, + \margintag{\LaTeX{} macros} + but they may be set up by the user. +\end{itemize} +} + +\newcommand{\limitsgraphics}{% +\cs{graphicspath} only works for a single directory; +\margintag{\cs{graphicspath}} +all graphics must be in this directory. + +For \cs{includegraphics}, avoid \texttt{px} and \% units for width and height, or +\margintag{units} +enclose them inside \env{warpHTML} environments. +For font-proportional image sizes, use \texttt{ex} or \texttt{em}. +For fixed-sized images, use +\texttt{cm}, \texttt{mm}, \texttt{in}, \texttt{pt}, or \texttt{pc}. +Using the keys \cmds{width=.5\lmacro{linewidth}}, +or similar for \cmds{\lmacro{textwidth}} or \cmds{\lmacro{textheight}} +to give fixed-sized images proportional to a 6 by 9 inch text area. + +\cs{includegraphics} accepts \texttt{width} and \texttt{height}, +\margintag{options} +\texttt{origin}, \texttt{rotate} and \texttt{scale}, +plus a new \texttt{class} key. + +With \acro{HTML} output, \cs{includegraphics} accepts an optional +\margintag{\acro{HTML} class} +\texttt{class=xyz} keyval combination, and if this is given then +the \acro{HTML} output will include that class for the image. +The class is ignored for print output. + +For \cs{includegraphics} the user should provide both \texttt{.pdf} and \texttt{.svg} +images, but always refer to +\watchout[image file types] +\texttt{.pdf} images in the document source. +All \cs{includegraphics} references to \texttt{.pdf} will automatically +be changed to \texttt{.svg} for \acro{HTML} output, and will be left as \texttt{.pdf} for print output. +Images may also be \texttt{.jpg} and \texttt{.png}, and will be used as-is for either output. + +\cs{rotatebox} accepts the optional \texttt{origin} key. +\margintag{\cs{rotatebox}} + +\cs{rotatebox}, \cs{scalebox}, and \cs{reflectbox} depend on modern browser +support. +\watchout[browser support] +The \cssthree{} standard declares that when an object is transformed +the whitespace which they occupied is preserved, +unlike \LaTeX{}, so expect some +ugly results for scaling and rotating. +} + +\newcommand{\limitsxcolor}{% +Color definitions, models, and mixing are fully supported +\margintag{support} +without any changes required. + +Colored tables are ignored. Use \acro{CSS} to style tables. +\margintag{tables} + +\cs{textcolor}, \cs{colorbox}, and \cs{fcolorbox} are supported. +\margintag{colored text and boxes} + +\cs{color} and \cs{pagecolor} are ignored. +Use \acro{CSS} or \cs{textcolor} where possible. +\margintag{\cs{color} and \cs{pagecolor}} +} + +\newcommand{\limitstabular}{% +\begin{itemize} +\item Vertical rules are not yet supported. + \margintag{column types} + +\item \texttt{*} in a column specification is not used (so far). + Repeat the column type the correct number of times. + +\item Multirow and multicolumn cannot be used at the same time. + \watchout[\cs{multirow} \& \cs{multicolumn}] + (No rectangular holes wider than one column or taller than one row.) + +\item For multirow, insert \cs{mrowcell} into any empty multi-row cells. + This will be a null function for the print output, and is a placeholder for + \watchout[\cs{multirow}] + parsing the table for \acro{HTML} output. + +\item If a multirow reaches to the bottom of a table, + and \cs{bottomrule} does not go over to that edge, + \margintag{\cs{multirow} with rules} + try adding a line of empty cells below the \cs{bottomrule}. + This may be a browser bug. + \changes{v0.19}{2016/05/28}{Docs: \env{multirow} browser bug workaround.} + +\item If a \cs{midrule} is desired after the last row, + \margintag{rule at last row} + an additional row of blank cells must be used. + +\item Multiple paragraphs in one cell of a p, b, m column + must have \cs{newline} between paragraphs. + \watchout[paragraphs] + +\item \cs{cmidrule} does not support width or trim options + due to \acro{CSS} limitations. + \margintag{\cs{cmidrule} width, trim} + +\item For \pkg{longtable}, place headings and footings which + \margintag{\env{longtable} headings} + do not apply to \acro{HTML} inside \cs{warpprintonly\{\}}. + +\item For \cs{toprule} and \cs{bottomrule}, + when combined with a \env{warpprint} or \env{warpHTML} environment, + \watchout[\cs{warpprintonly}] + if a ``misplaced \cs{noalign}'' error occurs, + change \\ + \hspace*{.375in}\cmds{This \& That \cs{endhead}} \\ + to \\ + \hspace*{.375in}\cmds{\cs{warpprintonly}\{This \& That \cs{endhead}\}} \\ + and likewise with the other \cs{end} headings. + Keep the \cs{endfirsthead} row unchanged, as it is still relevent to \acro{HTML} output. + +\item For S columns (from the \pkg{siunitx} package), + \watchout[S columns] + while producing print output, + anything non-numeric must be placed + inside \{ \} braces, including commands such as \cs{multirow}. + While producing \acro{HTML} output, though, anything placed inside + braces is not seen by \pkg{lwarp}'s tabular handling algorithm. + To resolve this problem, make a copy of the row, with one version + for print output, containing the extra braces, and another version + for \acro{HTML} output, without the extra braces, such as: \\ + \hspace*{.375in} \cs{warpprintonly}\{\texttt{1 \& 2 \& \textcolor{red}{\{}\cs{multirow}\{2\}\{2cm\}\{Text\}\textcolor{red}{\}} \& 3 \textbackslash\textbackslash\}} \\ + \hspace*{.375in} \cs{warpHTMLonly}\{\texttt{1 \& 2 \& \cs{multirow}\{2\}\{2cm\}\{Text\} \& 3 \textbackslash\textbackslash\}} + +\end{itemize} +} + +\newcommand{\limitsminipage}{% +Minipages and parboxes will be placed side-by-side in \acro{HTML} +unless you place a \cs{newline} between them. +\margintag{placement} + +A line of text with an inline minipage +\margintag{inline} +or parbox will have the minipage or parbox placed onto its own line, +because a paragraph is a block element and cannot be made \texttt{inline-block}. + +There is limited support for minipages inside an \acro{HTML} |span|. +\margintag{in a span} +An \acro{HTML} |div| cannot appear inside a |span|. +While in a |span|, minipages and parboxes are ignored. +Use \cs{newline} or \cs{par} for an \acro{HTML} break. + +When using \cs{linewidth}, \cs{textwidth}, and \cs{textheight}, +\margintag{size} +widths and heights are scaled proportionally to a 6\texttimes{}9 inch text area. + +A new macro \cs{minipagefullwidth} requests +\margintag{full-width minipages} +that the next minipage be generated +without an \acro{HTML} \texttt{width} tag, allowing it to be the full width of +the display rather than the fixed width given. + +Nested minipages adopt their parent's text alignment in \acro{HTML}, +whereas in regular \LaTeX{} \acro{PDF} output they do not. +\watchout[text alignment] +Use a \env{flushleft} or similar environment in the child minipage +to force a text alignment. +} + +\newcommand{\limitsmdframed}{% +Most basic functionality is supported, including +\margintag{support} +frame background colors and single-border colors and thickness, +title and subtitle background colors and borders and thickness, +border radius, and shadow. +CSS classes are created for \pkg{mdframed} environments and frame titles. + +Only load \pkg{mdframed} in a \env{warpprint} environment. +\pkg{lwarp} pre-loads \pkg{mdframed} in HTML with \texttt{framemethod=none}. +\watchout[loading] + +For title font, use\\ + \hspace*{.25in}\texttt{frametitlefont=\cs{textbf},}\\ +\margintag{font}% +instead of\\ + \hspace*{.25in}\texttt{frametitlefont=\cs{bfseries},}\\ +where \cs{textbf} must appear just before the comma and will receive the +following text as its argument (since the text happens to be between braces +in the \pkg{mdframed} source). +Since \pkg{lwarp} does not support \cs{bfseries} and friends, +only one font selection may be made at a time. + +\texttt{theoremtitlefont} is not supported, since the following text is not +\margintag{theoremtitlefont} +in braces in the \pkg{mdframed} source. + +Footnotes are currently placed at the bottom of the \acro{HTML} page. +\margintag{footnotes} + +\texttt{userdefinedwidth} and \texttt{align} are currently ignored. +\margintag{ignored options} +} + +\newcommand{\limitscaption}{% +To ensure proper float numbering, set caption positions +such as: + +\hspace*{2em} \texttt{\cs{captionsetup}[table]\{position=top\}} \\ +\hspace*{2em} \texttt{\cs{captionsetup}[figure]\{position=bottom\}} + +Similarly for \texttt{subtable}, \texttt{subfigure}, +and \texttt{longtable}. +} + +\newcommand{\limitscombiningfloats}{% +If using \cs{newfloat}, \pkg{trivfloat}, and/or +\pkg{algorithmicx} together, see \cref{sec:combiningfloats}. +\watchout[package conflicts] +} + +\newcommand{\limitssubfig}{% +At present, subfigures before the enclosing figure/table's \cs{caption} +\margintag{LOF/LOT} +would appear in the List of Figures/Tables before the enclosing figure/table, +therefore \pkg{lwarp} does not place subfigures in the LOF/LOT. + +In the document source, use \cs{hfill} and \cs{hspace*} +\margintag{horizontal spacing} +between subfigures to spread them +apart horizontally. The use of other forms of whitespace may +cause paragraph tags to be generated, resulting in subfigures +appearing on the following lines instead of all on a single line. +} + +\newcommand{\limitsfloatrow}{% +The emulation of \pkg{floatrow} does not support \cs{FBwidth} or \cs{FBheight}. +These values are pre-set to \texttt{.3\cs{linewidth}} and \texttt{2in}. +\watchout[\cs{FBwidth}, \cs{FBheight}] +Possible solutions include: +\begin{itemize} +\item Use fixed lengths. \pkg{lwarp} will scale the \acro{HTML} lengths appropriately. +\item Use \env{warpprint} and \env{warpHTML} environments to select appropriate + values for each case. +\item Inside a \env{warpHTML} environment, manually change + \cs{FBwidth} or \cs{FBheight} before the \cs{ffigbox} or \cs{ttabbox}. + Use \cs{FBwidth} or \cs{FBheight} normally afterwards; it will be used as + expected in print output, and will use your custom-selected value in \acro{HTML} + output. This custom value will be used repeatedly, + until it is manually changed to a new value. +\end{itemize} +} + +\newcommand{\limitssiunitx}{% +Do not use \cmds{per-mode=fraction}, which cannot be seen by the final \cmds{pdftotext} conversion. +\watchout[per-mode] +} + +\newcommand{\limitstikz}{% +For recent versions of \tikz{} (v3.0.0 --- 2013/12/20 and later), include in the document +\watchout[preamble] +preamble: \\ +\hspace*{.25in} \texttt{\cs{usetikzlibrary\{babel\}} \% v3.0.0 and up} + +For older versions of \tikz{} without the \tikz{} \texttt{babel} library, +\pkg{lwarp} automatically handles the catcode change for the \$ math shift. +} + + +\newcommand{\limitsbabelone}{% +If using \pkg{babel} with French, use \\ +\hspace*{.25in}\cs{frenchbsetup\{StandardLists=true\}} \\ +\watchout[French]% +to preserve the special \acro{HTML} and \pkg{enumitem} list handling. +} + +\newcommand{\limitsbabeltwo}{% +Also, when French is used, the caption separator is +\margintag{\cs{CaptionSeparator}} +changed to a dash. The following may be used to restore it to a colon: \\ +\hspace*{.25in}% +\texttt{\cs{renewcommand}*\{\cs{CaptionSeparator}\}\{:\textasciitilde\}} +} + +\newcommand{\limitsnewclude}{% +\pkg{newclude} modifies \cs{label} in a non-adaptive way, so +\pkg{newclude} must be loaded before \pkg{lwarp} is loaded. +\watchout[loading] + +\begin{docsidebar}[Ex:] +\cs{documentclass\{article\}} \\ +\ldots <font setup> \\ +\cs{usepackage\{newclude\}} \\ +\cs{usepackage[warpHTML]\{lwarp\}} \\ +\ldots +\end{docsidebar} +} + +\newcommand{\limitsnewtxmath}{% +\pkg{newtxmath} must be loaded after \pkg{lwarp}. +\watchout[loading] +} + +\newcommand{\limitsenumitem}{% +\pkg{enumitem} is pre-loaded during \acro{HTML} output. +\margintag{enumitem} +Many of the spacing options are rendered irrelevant by \cmds{pdftotext} and +\acro{HTML}. Numbering, labels, and \cs{newlist} function correctly. +} + +\newcommand{\osportabilityusage}{% +\pkg{lwarp} tries to detect which operating system is being used. + +If \textsc{MS-Windows} is not correctly detected, +\DescribeProgram{MS-Windows} \DescribeProgram{Windows} +use the command \cs{warpOSwindows} in the document +\DescribeMacro{\warpOSwindows} +preamble after \pkg{lwarp} is loaded. This modifies the +creation of the \\ \hspace*{2em}\texttt{lateximages.sh} or \texttt{lateximages.cmd} \\ +batch file, which is an operating-system-specific shell script used to take +individual pages of the \LaTeX{} \acro{PDF} output and +convert and store them in individual \acro{SVG} files. +} + + +\setlength{\marginparsep}{1em} +\setlength{\marginparpush}{.7ex} +\setlength{\parindent}{0em} +\setlength{\parskip}{2ex} +\setlength{\IndexMin}{40ex} + + +\setcounter{IndexColumns}{2} + +\DisableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{lwarp.dtx} +\end{document} +%</driver> + +% \fi + + +% \iffalse +%<*package> +% \fi +% +% \CheckSum{8260} +% +% \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 +% Lower-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 +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} + +% +% \changes{v0.10}{2016/03/08}{\ 2016/03/08 Initial version} +% \changes{v0.11}{2016/03/11}{\ 2016/03/11} +% \changes{v0.11}{2016/03/10}{Test Suite: limages and index in README.txt} +% \changes{v0.11}{2016/03/11}{Test Suite: MS-Windows in README.txt} +% \changes{v0.12}{2016/03/14}{\ 2016/03/14} +% \changes{v0.12}{2016/03/14}{Global: Uses \textbackslash{}p@(type) in float captions.} +% \changes{v0.12}{2016/03/14}{Test Suite: Sub-figures} +% \changes{v0.13}{2016/03/24}{\ 2016/03/24} +% \changes{v0.13}{2016/03/23}{Test Suite: Ordinals, Subcaption} +% \changes{v0.13}{2016/03/24}{Removed package: subfig} +% \changes{v0.14}{2016/03/31}{\ 2016/03/31} +% \changes{v0.14}{2016/03/29}{Test Suite: Assigned cleveref name for Test Float.} +% \changes{v0.14}{2016/03/31}{Test Suite: Floatrow} +% \changes{v0.15}{2016/04/06}{\ 2016/04/06} +% \changes{v0.15}{2016/03/31}{Files: lwarp\_formal.css added.} +% \changes{v0.15}{2016/03/31}{Test Suite: test\_suite\_formal.css file added.} +% \changes{v0.16}{2016/04/11}{\ 2016/04/11} +% \changes{v0.16}{2016/04/07}{Test Suite: Supports XeLaTeX, LuaLaTeX.} +% \changes{v0.16}{2016/04/08}{Test Suite: Lwarp no longer selects fonts.} +% \changes{v0.16}{2016/04/08}{Removed package: suffix} +% \changes{v0.17}{2016/04/14}{\ 2016/04/14} +% \changes{v0.17}{2016/04/14}{Test Suite: Mdframed} +% \changes{v0.17}{2016/04/14}{Test Suite: Fix: Print-version front-matter page numbers.} +% \changes{v0.18}{2016/05/19}{\ 2016/05/19} +% \changes{v0.18}{2016/04/23}{Files: lwarp.css and lwarp\_formal.css: Improved responsive design.} +% \changes{v0.18}{2016/04/23}{File: lwarp.css: Improved TOC outline display.} +% \changes{v0.18}{2016/05/13}{Test Suite: Verse package} +% \changes{v0.19}{2016/06/08}{\ 2016/06/08} +% \changes{v0.19}{2016/05/25}{File: \texttt{lwarp\_mathjax.txt} added.} +% \changes{v0.19}{2016/06/01}{File: lwarp.css: \texttt{tnoteitemheader} added} +% \changes{v0.20}{2017/02/09}{\ 2017/02/09} +% \changes{v0.20}{2016/06/27}{Test Suite: HTML meta descriptions.} +% \changes{v0.20}{2016/09/19}{File: lwarp.css: Minor fixes for validation.} +% \changes{v0.20}{2016/12/08}{Docs: Improved index.} +% \changes{v0.20}{2016/12/17}{File: lwarpmk used to compile print, HTML, indexes, and lateximages.} +% \changes{v0.20}{2016/12/17}{Removed reliance on make, grep, gawk.} +% \changes{v0.20}{2016/12/17}{Parallel versions of aux files for print/HTML.} +% \changes{v0.20}{2017/01/03}{Moved sidebar and example code to test suite.} +% \changes{v0.20}{2017/01/25}{\pkg{caption} and \pkg{subcaption} supported.} + + + + +% \GetFileInfo{lwarp.sty} +% +% \DoNotIndex{\newcommand,\renewcommand,\addtocounter,\begin,\end,\begingroup,\endgroup} +% \DoNotIndex{\global,\ifbool,\ifthenelse,\isequivalentto,\let} +% \DoNotIndex{\booltrue,\boolfalse} +% \expandafter\DoNotIndex\expandafter{\detokenize{\(,\),\,,\\,\#,\$,\%,\^,\_,\~,\ ,\&,\{,\}}} +% +% +% \thispagestyle{empty} +% +% \begin{center} +% \vfill +% \includegraphics[width=.3\linewidth]{lwarp_logo.pdf} +% \vfill +% {\Huge The \textbf{lwarp} package} +% +% \fileversion{} --- \filedate +% +% \bigskip +% +% {\Large \textup{\LaTeX{} to HTML5}} +% +% \bigskip +% +% {\small\copyright{} 2016} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com} +% +% \bigskip +% +% +% ^^A % \title{The \pkg{lwarp} package\thanks{This document +% ^^A % corresponds to \pkg{lwarp}~\fileversion, +% ^^A % dated \filedate.}} +% ^^A % \author{{\small\copyright{} 2016} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}} +% ^^A % \published{} +% ^^A % \subtitle{\textup{\LaTeX{} to HTML5}} +% ^^A % +% ^^A % \maketitle +% +% \vfill +% +% \begin{abstract} +% \noindent +% The \pkg{lwarp} package causes \LaTeX\ to directly produce \htmlfive\ output, +% using external utility programs only for the final conversion of text and images. +% Math may be represented by \acro{SVG} files or MathJax. +% +% Documents may be produced by \LaTeX, \LuaLaTeX, or \XeLaTeX. +% A TexLua script removes the need for system utilities such as |make| and |gawk|, +% and also supports |xindy| and |latexmk|. Configuration is automatic at the +% first manual compile. +% +% Print and \acro{HTML} versions of each document may coexist, each with its own +% set of auxiliary files. Support files are self-generated on request. +% +% A modular package-loading system uses the \pkg{lwarp} version of a package for +% \acro{HTML} when available. +% Several dozen \LaTeX\ packages are supported with these high-level source +% compatibility replacements. +% +% A tutorial is provided to quickly introduce the user to the major components +% of the package. +% +% +% \vfill +% +% \begin{center} +% \textcolor{blue}{To update existing projects, see \cref{sec:updates}, +% \nameref{sec:updates}.} +% +% \vfill +% +% \begin{minipage}{\linewidth} +% \raggedright +% \textcolor{red!30!black}{\bfseries +% Note that this is still a ``beta'' version of \pkg{lwarp}, +% and some things may change in response to user feedback and +% further project development. +% } +% \end{minipage} +% +% \end{center} +% \end{abstract} +% +% \vspace*{\fill} +% \vspace*{\fill} +% \vspace*{\fill} +% +% \end{center} +% +% \clearpage +% +% +% \tableofcontents +% +% \clearpage +% \listoffigures +% \listoftables +% +% +% \thispagestyle{pageheadfoot} +% +% \clearpage +% +% \part{lwarp.sty} +% +% \section{Updates} +% \label{sec:updates} +% +% For a detailed list of changes, see the Change History on page \pageref{sec:changehistory}. +% +% \begin{description} +% \item[v0.20:] \ +% \begin{itemize} +% \item The |makefile| and related infrastructure +% has been replaced by the |lwarpmk| utility. +% This provides increased portability, reduced dependencies, +% and much simpler installation and setup. +% \item The |lwarp-newproject| package is now used to locally create +% support files. +% \item The print and \acro{HTML} versions of a document may co-exist with their +% own sets of auxiliary files. +% \item Package handling is now controlled by a modular system which +% looks for and loads an |lwarp-<package>| version if available. +% \item High-level source compatibility is provided for all supported +% packages, almost totally eliminating the need +% for |warpprint| and |warpHTML| environments. +% \item A large number of additional packages are supported. +% \item A new tutorial is included in the documentation, and +% many obsolete sections have been removed. +% \item \cs{NewHTMLdescription} sets the \acro{HTML} meta description tag for each file. +% See \cref{sec:htmldescription}. +% \item \cs{HTMLFileName} may now be empty, allowing filenames without a prefix. +% Lwarp no longer automatically appends a |-| character. +% \watchout +% For existing projects, add a |-| to the end of \cs{HTMLFileName}. +% \item \cs{HomeHTMLFileName} and \cs{HTMLFileName} no longer use +% escaped underscore\watchout\ +% characters. Underscores may be used in filenames as-is. +% \item \pkg{lwarp} now tries to auto-detect the operating system, +% and \cs{warpOSwindows} is only needed if the auto-detection +% fails to detect Windows. +% \item Tabular column types |@|, |>|, and |<| are now supported. +% \item |BlockClass| and \cs{InlineClass} add an optional style. +% \item The |sidebar| and |example| environments have been moved to the +% test suite, and are no longer included in \pkg{lwarp}. +% \end{itemize} +% \item[v0.19:] \ +% \begin{itemize} +% \item \textsc{MathJax} now may be used to display math via the |mathjax| option. +% See \cref{sec:loading,sec:limitsmath}. +% To use MathJax with a pre-existing project, +% \watchout +% copy or link the file |lwarp_mathjax.txt| to the project's directory. +% \item \cs{rule} added, supporting width, height, raise, \cs{textcolor}. +% \item \cs{LateximageFontSizeName} provides user-adjustable font size for math +% and \env{lateximage}s. +% \item \cs{minipagefullwidth} requests that the next minipage be +% full-width in \acro{HTML}, but still the assigned width in print. +% \item \env{minipage} improved side-by-side rendering. +% \item CSS class |tablenotes| is provided for table note items. +% \item \cs{warpprintonly} replaces \cs{rowprintedonly}, +% and \cs{warpHTMLonly} is added. These behave like the \env{warpprint} +% \watchout +% and \env{warpHTML} environments, and are generally useful, so they replace +% the previously table-specific syntax. +% \item \pkg{cleveref} is loaded \cs{AtEndPreamble} for improved reliability. +% See \cref{sec:cleveref}. +% \item \cs{xfracHTMLfontsize} controls \pkg{xfrac} font size in \acro{HTML}. +% \item \tikz\ improved catcode handling. +% \end{itemize} +% \item[v0.18:] \ +% \begin{itemize} +% \item The \pkg{verse} package and the verse-related commands from +% the \pkg{memoir} package are now supported. +% \item Responsive web design has been improved for the sideTOC. +% \item \cs{includegraphics} now maintains relative sized for em, ex, and \%. +% \end{itemize} +% \item[v0.17:] \ +% \begin{itemize} +% \item \pkg{mdframed} package is supported. +% \end{itemize} +% \item[v0.16:] \ +% \begin{itemize} +% \item Font and input encoding are now controlled by the user, and +% \pkg{lwarp} is loaded after fonts have been selected. +% \item Support for \XeLaTeX{} and \LuaLaTeX. See \cref{sec:fonts}. +% \end{itemize} +% \end{description} +% +% \clearpage +% +% \section{Introduction} +% \changes{v0.19}{2016/05/25}{Introduction: MathJax support mentioned.} +% +% The \pkg{lwarp} project aims to allow a rich \LaTeX{} document to be converted to a reasonable \acro{HTML} +% interpretation. No attempt has been made to force \LaTeX{} to provide for every +% \acro{HTML}-related possibility, and \acro{HTML} cannot exactly render every possible \LaTeX{} concept. +% Where compromise is necessary, it is desirable to allow the print output to remain +% typographically rich, and compromise only in the \acro{HTML} conversion. +% +% Several ``modern'' features of \htmlfive, \cssthree, and \acro{SVG} +% are employed to allow a fairly feature-rich document +% without relying on the use of Javascript. +% Limited testing on older browsers show that these new features +% degrade gracefully, although the \acro{SVG} format +% for math may not be available on small cell phones. +% +% |pdflatex|, |xelatex|, or |lualatex| is used, allowing \pkg{lwarp} to process the usual image formats. +% While generating \acro{HTML} output, \acro{SVG} files are used in placed of \acro{PDF}. +% Other formats such as \acro{JPG} are used as-is. +% +% \acro{SVG} images may be used for math, +% and are also used for \env{picture}, and \tikz{} environments, +% as this format has +% better browser and e-book support than Math\acro{ML} (as of this writing), +% while still allowing for the high-quality display and printing of images (again, subject to potentially +% bug-ridden\footnote{Firefox has had an on-again/off-again bug for quite some time regareding +% printing \acro{SVG}s at high resolution.} browser +% support).\footnote{Aside --- The author, being a programmer, believes in the movement towards +% ``logical punctuation''. (Look it up.) +% +% Aside to the aside --- The author also believes that space should be on +% either side of an em-dash, employing the symbol as a separator rather than something looking +% like a chemical \textbf{bond---as} shown here, but is willing to abide by +% Chicago style when necessary.} +% Further, \acro{SVG} images allow math to be presented with +% the same precise formatting as in the print version. +% Math is accompanied by ALT tags holding the \LaTeX{} source for the expression, allowing it to be +% copy/pasted into other documents.\footnote{There seems to be some debate as to whether +% Math\acro{ML} is actually an improvement over \LaTeX{} for sharing math. The author has no +% particular opinion on the matter, except to say that in this case \LaTeX{} is much easier to implement!} +% Custom \LaTeX{} macros may be used as-is in math expressions, since the math is evaluated +% entirely inside \LaTeX. +% +% The \textsc{MathJax} JavaScript display engine may be selected +% for math display instead of using \acro{SVG} images. +% Subject to browser support and Internet access, +% MathJax allows an \acro{HTML} page to display +% math without relying on a large number of external image files, +% one per math expression. \pkg{lwarp} maintains \LaTeX\ control for cross-referencing +% and equation numbering\,/\,formatting. +% +% \hfill\rule[.7ex]{.3\linewidth}{.4pt}\hspace*{\fill} +% +% The \pkg{lwarp} package allows \LaTeX{} to directly generate \htmlfive{} tags from a \LaTeX{} +% source document, with only minor intervention on the user's part. +% A |texlua| program called |lwarpmk| is used to process either the print or \acro{HTML} +% version of the document. A few external utility programs are used to finish +% the conversion from a \LaTeX{}-generated \acro{PDF} file which happens to have \htmlfive{} tags, +% to a number of \htmlfive{} plain-text files and accompanying images. +% +% A special |lwarp-newproject| package is used to set up the auxiliary files necessary for +% the \acro{HTML} conversion. Included is a parallel version of the user's source document, +% |<sourcename>-html.tex|, which selects \acro{HTML} output and then inputs the user's own source. +% This process allows both the printed and \acro{HTML} versions to co-exist side-by-side, +% each with their own auxiliary files. +% +% When requesting packages during \acro{HTML} conversion, +% |lwarp| first looks to see if it has its own modified version +% to use instead of the usual \LaTeX\ version. These |lwarp-packagename.sty| files contain +% code used to emulate or replace functions for \acro{HTML} output. +% +% Enough functionality is provided to convert a typical article containing technical content. +% Not every package has been tested, but many of the most useful ones are known to work, +% either as-is or through emulation with replacement code. (See \cref{tab:supported} on +% page \pageref{tab:supported}.) +% +% +% \subsection{Supported packages and features} +% \changes{v0.15}{2016/04/05}{Docs: Moved the supported functions table to the introduction.} +% +% \Cref{tab:supported} lists the various \LaTeX{} packages and macros which may be used. +% \emph{Supported} means that the package or macro may be used as-is, +% perhaps with minor limitations. +% \emph{Emulated} means that the original package or macro is not used, but similar +% functionality is provided in a way which is intended to be compatible with the +% user's \LaTeX{} code. +% \emph{Ignored} means that the package is not used, but nullified user-level macros +% and related counters, lengths, etc.\ are provided for source-level compatibility. +% +% Any package listed in \cref{tab:supported} probably works with little or no change to the +% user's source code. +% Special environments are provided to mark blocks of code which are for +% print only, \acro{HTML} only, or both, should it be necessary. +% +% \clearpage +% +% \renewcommand{\arraystretch}{1.5} +% +% \begin{longtable}{>{\raggedright}m{.3\linewidth}m{.6\linewidth}} +% \caption{\protect\LaTeX--HTML generation --- +% \protect\pkg{lwarp} package --- +% Supported functions\label{tab:supported}} \endfirsthead +% \warpprintonly{\multicolumn{2}{c}{\pkg{lwarp} Supported Functions --- continued} \\ +% Package or Macro & Status \\ \toprule \endhead} +% \toprule +% Package or Macro & Status \\ +% \midrule +% Engines: & pdf\LaTeX, \XeLaTeX, \LuaLaTeX \\ +% \midrule +% Classes: & \pkg{book}, \pkg{report}, or \pkg{article}. \pkg{memoir} is planned. \\ +% \midrule +% Sectioning: & Supported, with hyperlinks. +% Honors \cmds{tocdepth} and \cmds{secnumdepth}. +% Adds \cmds{filedepth} for splitting the \acro{HTML} output. +% Files may be numbered sequentially or named according to section name. +% Common short words and punctuation is removed from the filenames. \\ +% \pkg{titlesec} & Ignored. \\ +% Table of Contents, Figures, Tables: & Supported, with hyperlinks. \\ +% \cs{maketitle}, \env{titlepage}, \pkg{titling}: & Supported, with optional +% \pkg{titling}-based commands for published and subtitle. \\ +% \pkg{titletoc} & Ignored. \\ +% \pkg{tocloft} & Ignored, with support for \cs{newlistof} and \cs{ctfchapterprecis}.\\ +% \pkg{abstract}: & Supported \\ +% \midrule +% Cross-references: & Emulated, with hyperlinks. \\ +% \pkg{cleverref}: & Supported, including ranges and lists, with hyperlinks. \\ +% \pkg{nameref}: & Emulated \\ +% \pkg{hyperref}: & Emulated. +% \acro{HTML} hyperlinks are generated for \acro{TOC}, \acro{LOF}, \acro{LOT}, +% \cs{nameref}, \cs{ref}, +% the \pkg{cleveref} commands, and index entries.\\ +% \pkg{bookmark}: & Emulated. \\ +% \midrule +% Footnotes: & Supported, emulated as pagenotes per \acro{HTML} page. \\ +% \pkg{pagenote}: & Supported. \\ +% Indexing: & \cmds{texindy} is used, with hyperlinks. \\ +% Bibliography: & Supported, without hyperlinks so far. \\ +% \midrule +% \pkg{babel}: & Supported. \\ +% \midrule +% Math: & Supported. Converted to \acro{SVG} images with \acro{HTML} \cmds{ALT} tags containing the +% \LaTeX{} source for the math expression. +% MathJax supported as an alternative. +% \AmS{} environments are supported. +% User-defined macros are available during converson, +% due to native \LaTeX{} processing.\\ +% \midrule +% Floats: & Supported, appear where declared. +% \pkg{float} is emulated, \pkg{newfloat} is supported, +% \pkg{caption} and \pkg{subcaption} are supported, +% \pkg{capt-of} is supported, +% \pkg{placeins} is ignored, +% \pkg{trivfloat} is supported, \pkg{floatrow} is emulated, +% \pkg{keyfloat} is supported, \pkg{wrapfig} is emulated. \\ +% \midrule +% \env{tabular}: & Emulated. +% \cs{multirow} and \cs{multicolumn} are available, but cannot +% be used at the same time. +% Nested tables are not supported. \\ +% \pkg{multirow}: & Emulated. \\ +% \pkg{longtable}: & Emulated. Converted to a tabular. Captions supported. +% Extra headings and \cs{kill} lines must be enclosed in +% \cs{warpprintonly\{\}} \\ +% \cmidrule{2-2} +% \pkg{booktabs}: & Emulated. \cs{toprule} and \cs{bottomrule} +% form black rules, \cs{midrule} forms silver rules, as demonstrated on +% this table. +% \cs{cmidrule}, demonstrated at this line, does not use width or trim options. \\ +% \cmidrule{2-2} +% \pkg{threeparttable}: & Emulated \\ +% \midrule +% \pkg{geometry}: & Ignored. \\ +% \pkg{titleps}: & Used by \pkg{lwarp}, but emulated for the user. \\ +% \pkg{fancyhdr}: & Ignored. \\ +% \pkg{extramarks}: & Ignored. \\ +% \pkg{afterpage}, \pkg{draftwatermark}, \pkg{eso-pic}, +% \pkg{everypage}, \pkg{wallpaper}: & Ignored. \\ +% \midrule +% \pkg{graphics}, \pkg{graphicx}: & Emulated. +% \cs{includegraphics} supports \cmds{width}, \cmds{height}, +% \cmds{origin}, \cmds{angle}, and \cmds{scale} tags, and adds \cmds{class}. +% References to \acro{PDF} files are changed to \acro{SVG}, other image types +% are accepted as well. +% \cs{rotatebox} and \cs{scalebox} are supported as well as \acro{HTML} can handle. \\ +% \pkg{rotating}: & Emulated. All objects are displayed unrotated. \\ +% \midrule +% Lists: & Supported \\ +% \pkg{enumitem}: & Supported, although spacing is still controlled by \acro{CSS}. \\ +% \midrule +% Environments: & Standard \LaTeX{} environments are supported. \\ +% \pkg{theorem}: & Supported, with added \acro{CSS} tags. \\ +% \pkg{epigraph}: & Emulated \\ +% \pkg{csquotes}: & Supported \\ +% \pkg{verse} and \pkg{memoir}'s verse-related macros & Supported \\ +% \pkg{picture} and \pkg{tikz}: & Converted to an \acro{SVG} image. \\ +% \env{minipage}: & Supported with some \acro{HTML}5-imposed limitations. +% Nested minipages are supported. +% Footnotes appear at the bottom of the \acro{HTML} page. \\ +% \pkg{fancyvrb}: & Supported except for verbatim footnotes. \\ +% \pkg{alltt}, \pkg{listings}: & Supported \\ +% \pkg{algorithmicx}: & Supported \\ +% \pkg{mdframed}: & Supported \\ +% \pkg{multicol}: & Emulated, with \acro{CSS}3. +% Converted to up to three columns with an optional heading, +% per browser support. Single-column if unsupported.\\ +% \midrule +% \pkg{siunitx}: & Supported except for \cmds{per-mode=fraction}. \\ +% \pkg{xfrac}: & Supported \\ +% \midrule +% Direct formatting: & \cs{emph}, \cs{textsuperscript}, +% \cs{textbf}, etc are supported. +% \cs{bfseries}, etc.\ are not yet supported. \\ +% Ordinals: & \pkg{nth}, \pkg{fmtcount}, and \pkg{engord} are supported. \\ +% Text ligatures: & Ligatures for symbols are supported. +% Ligatures for f, q, t are intentionally turned off +% because many simpler browsers do not display them correctly. +% Modern full-featured browsers re-create these ligatures on-the-fly.\\ +% Horizontal space: & +% \acro{HTML} output for thin-unbreakable, unbreakable, +% \cs{enskip}, \cs{quad}, \cs{qquad}, \cs{hspace}. \\ +% Rules: & \cs{rule} with width, height, raise, text color. \\ +% \pkg{placeins}, \pkg{setspace}, \pkg{needspace}: & Ignored. \\ +% \pkg{textpos}: & Emulated. \\ +% \pkg{nowidow}: & Ignored. \\ +% \pkg{microtype}, \pkg{letterspace}: & Ignored. +% \pkg{microtype} is used to disable ligatures. \\ +% \acro{HTML} reserved characters: & \cs{\&}, \cs{textless}, and +% \cs{textgreater} are converted to \acro{HTML} entities. \\ +% \midrule +% \pkg{xcolor}: & \textcolor{DarkGreen}{Supported}. +% Full package color names, any color models, +% and \textcolor{Goldenrod}{mixing} is +% converted to hex web colors via \cs{convertcolorspec}. +% Patched commands are +% \textcolor{Maroon}{\cs{textcolor}}, +% \colorbox{LightSteelBlue}{\cs{colorbox}}, +% and \fcolorbox{red}{NavajoWhite}{\cs{fcolorbox}}. +% \cs{pagecolor} is not supported. \\ +% \midrule +% \pkg{CJKutf8}: & Supported \\ +% \midrule +% Where: & \\ +% \textbf{Supported:} & The existing \LaTeX{} package is used. \\ +% \textbf{Emulated:} & The \LaTeX{} package is not used, but some/all of its +% functions are emulated. Null functions, lengths, and counters are provided +% for source compatibility. \\ +% \textbf{Ignored:} & The \LaTeX{} package is not used, but null functions +% are provided for source compatibility. \\ +% \bottomrule +% \end{longtable} +% +% +% \clearpage +% +% \section{Alternatives} +% +% Summarized below are several other ways to convert a \LaTeX{} or other document to \acro{HTML}. +% Where an existing \LaTeX{} document is to be converted to \acro{HTML}, \pkg{lwarp} may be +% a good choice. For new projects with a large number of documents, it may be worth +% investigating the alternatives before decided which path to take. +% +% \subsection{TeX4ht} +% +% \url{http://tug.org/tex4ht/}\DescribeProgram{TeX4ht} +% +% This system uses native \LaTeX{} processing to produce a DVI file containing special commands, +% and then uses additional post-processing for the \acro{HTML} conversion by way of numerous configuration +% files. +% In some cases, \pkg{lwarp} provides a better \acro{HTML} conversion, and it +% supports a different set of packages. +% TeX4ht produces several other forms of output beyond \acro{HTML}. +% +% \subsection{Translators} +% +% These systems use external programs to translate a subset of \LaTeX{} syntax into \acro{HTML}: +% \begin{description} +% \item [H\textsuperscript{E}v\textsuperscript{E}a:] \url{http://hevea.inria.fr/} +% \DescribeProgram{Hevea} +% \item [T\textsubscript{T}H:] \url{http://hutchinson.belmont.ma.us/tth/} +% \DescribeProgram{TtH} +% \item [GELLMU:] \url{http://www.albany.edu/~hammond/gellmu/} +% \DescribeProgram{GELLMU} +% \item [LaTeXML:] \url{http://dlmf.nist.gov/LaTeXML/} +% \DescribeProgram{LaTeXML} +% \item [Plastex:] \url{https://github.com/tiarno/plastex} +% \DescribeProgram{Plastex} +% \item [LaTeX2html:] \url{http://www.latex2html.org/} \\ +% and \url{http://ctan.org/pkg/latex2html}. +% \DescribeProgram{LaTeX2html} +% \end{description} +% +% \subsection{AsciiDoc} +% +% AsciiDoc is one of the most capable markup languages, providing enough features to produce +% the typical technical-writing document with cross-references, +% and it writes \LaTeX{} and \acro{HTML}. +% \begin{description} +% \item [Asciidoctor:] \url{http://asciidoctor.org/} (More active.)\DescribeProgram{AsciiDoc} +% \item [AsciiDoc:] \url{http://asciidoc.org/} (The original version.)\DescribeProgram{AsciiDoctor} +% \end{description} +% +% The Asciidoctor-LaTeX project is adding additional \LaTeX{}-related features. +% \begin{description} +% \item [Asciidoctor-LateX:] ~ \\ +% \url{http://www.noteshare.io/book/asciidoctor-latex-manual} \\ +% \url{https://github.com/asciidoctor/asciidoctor-latex} +% \DescribeProgram{Asciidoctor-LaTeX} +% \end{description} +% +% \subsection{Pandoc} +% \DescribeProgram{Pandoc} +% +% A markup system which also reads and writes \LaTeX{} and \acro{HTML}. +% \begin{description} +% \item [Pandoc:] \url{http://pandoc.org/} +% \end{description} +% +% (Watch for improvements in cross-references to figures and tables.) +% +% \subsection{Word Processors} +% +% It should be noted that the popular word processors +% \DescribeProgram{Word}\DescribeProgram{LibreOffice}\DescribeProgram{OpenOffice} +% have advanced through the years in their abilities +% to represent math with a \LaTeX-ish input syntax, unicode math fonts, +% and high-quality output, and also generate HTML with varying success. +% See recent developments in Microsoft\,\textregistered{} Word\,\textregistered{} +% and LibreOffice\,\texttrademark{} Writer. +% +% \subsection{Commercial Systems} +% +% Likewise, several professional systems exist whose +% \DescribeProgram{Adobe} \DescribeProgram{FrameMaker} +% \DescribeProgram{InDesign} \DescribeProgram{Flare} \DescribeProgram{Madcap} +% abilities have been advancing in the areas of typesetting, cross-referencing, and HTML generation. +% See Adobe\,\textregistered{} FrameMaker\,\textregistered{}, +% Adobe\,\textregistered{} InDesign\,\textregistered{}, +% and Madcap Flare\,\texttrademark{}. +% +% \subsection{Comparisons} +% \index{markup languages} +% +% AsciiDoc, Pandoc, and various other markup languages typically have a syntax which tries to be +% natural and human-readable, but the use of advanced features tends to require +% many combinations of special characters, resulting in a complicated mess of syntax. +% By contrast, \LaTeX{} spells things out in readable words but takes longer to type, although +% integrated editors exist which can provide faster entry and a graphic user interface. +% For those functions which are covered by the typical markup language +% it is arguable that \LaTeX{} is comparably easy to learn, while \LaTeX{} provides many more advanced +% features where needed, along with a large number of pre-existing packages which provide solutions +% to numerous common tasks. +% +% Text-based document-markup systems share some of the advantages of \LaTeX{} vs.\ a typical word +% processor. Documents formats are stable. The documents themselves are portable, +% work well with revision control, +% do not crash or become corrupted, and are easily generated under program control. +% Formatting commands are visible, +% cross-referencing is automatic, and editing is responsive. +% Search/replace with regular expressions provides a powerful tool for +% the manipulation of both document contents and structure. +% Markup systems and some commercial systems allow printed output +% through a \LaTeX{} back end, yielding high-quality results especially when the \LaTeX{} +% template is adjusted, but they lose the ability to use \LaTeX{} macros and +% other \LaTeX{} source-document features. +% +% The effort required to customize the output of each markup system varies. +% For print output, \LaTeX{} configuration +% files are usually used. For HTML output, a \acro{CSS} file will be available, but additional +% configuration may require editing some form of control file with a different syntax, such as XML. +% In the case of \pkg{lwarp}, CSS is used, and much HTML output is adjusted +% through the usual \LaTeX{} optional macro parameters, +% but further customization may require patching \LaTeX{} code. +% +% The popular word processors and professional document systems each has a large +% base of after-market support including pre-designed styles and templates, and often include +% content-management systems for topic reuse. +% +% +% +% +% \clearpage +% +% \section{Installation} +% +% \Cref{tab:utility} shows the tools which are used for +% the \LaTeX\ to \acro{HTML} conversion. +% In most cases, these will be available via the +% standard package-installation tools. +% +% \index{utility>programs} +% \index{programs>utility} +% +% \vfill +% +% \begin{minipage}{\linewidth} +% \captionof{table}{Required software programs\label{tab:utility}} +% \hrule +% \begin{description} +% +% \item[Provided by your \LaTeX\ distribution:] \ +% +% From \TeX{}Live: \url{http://tug.org/texlive/}. +% +% \begin{description} +% +% \item[\LaTeX:] |pdflatex|, |xelatex|, or |lualatex|. +% \DescribeProgram[requirement]{pdfLaTeX} +% \DescribeProgram[requirement]{XeLaTeX} +% \DescribeProgram[requirement]{LuaLaTeX} +% +% \item[The \pkg{lwarp} package:] This package. +% +% \item[The \pkg{lwarp-newproject} package:] Accompanies \pkg{lwarp}, and used +% to create configuration files. +% +% \item[The |lwarpmk| utility:] Provided along with this package. This +% should be an operating-system executable in the same way that +% |pdflatex| or |latexmk| is. It is possible to have the +% \pkg{lwarp-newproject} package generate a local copy of |lwarpmk| +% called |lwarpmk.lua|. +% See \cref{sec:genlatexmk}. +% +% \item[luatex:] Used by the |lwarpmk| program to simplify and automate document generation. +% +% \item [xindy:] The \pkg{xindy} package is used by \pkg{lwarp} to create +% indexes. On a MiK\TeX\ system this may have to be acquired separately, +% but it is part of the regular installer as of mid 2015. +% +% \item[latexmk:] Optionally used by |lwarpmk| to compile \LaTeX\ code. +% On a MiK\TeX\ system, Perl may need to be installed first. +% +% \item[pdfcrop:] Used to pull images out of the \LaTeX{} \acro{PDF}. +% \DescribeProgram[requirement]{pdfcrop} +% +% \end{description} +% +% \item[Extra packages provided with your operating sytem:] \ +% +% From Poppler: \url{poppler.freedesktop.org}. +% +% \begin{description} +% +% \item[pdftotext:] Used to convert \acro{PDF} to text. +% \DescribeProgram[requirement]{pdftotext}\index{Poppler} +% +% \item[pdfseparate:] Used to pull images out of the \LaTeX{} \acro{PDF}. +% \DescribeProgram[requirement]{pdfseparate} +% +% \item[pdftocairo:] Used to convert images to \acro{SVG}. +% \DescribeProgram[requirement]{pdftocairo} +% +% \end{description} +% +% \item[Automatically downloaded from the internet as required:] \ +% \begin{description} +% +% \item[MathJax:] Optionally used to display math. +% Automatically loaded from the MathJax website when needed. \\ +% From: \url{mathjax.org} +% \DescribeProgram[requirement]{MathJax} +% +% \end{description} +% \end{description} +% +% \hrule +% \end{minipage} +% +% \subsection{Installing the \protect\pkg{lwarp} package} +% +% There are several ways to install \pkg{lwarp}. These are listed here +% with the preferred methods listed first: +% +% \begin{description} +% \raggedright +% +% \item [Pre-installed:] Try entering into a command line: +% \userentry{lwarpmk} \\ +% If the |lwarpmk| help message appears, then \pkg{lwarp} is already installed. +% +% \item [\TeX\ Live:]If using a \TeX\ Live distribution, +% try installing via |tlmgr|: +% \userentry{tlmgr install lwarp} +% +% \item [MiK\TeX:] If using MiK\TeX, try using the package installer. +% +% \item [Operating-system package:] The operating-system package manager may +% already have |lwarp|, perhaps as part of a set of \TeX-related packages. +% +% \item [CTAN TDS archive:] \pkg{lwarp} may be downloaded from the Comprehensive \TeX\ Archive: +% \begin{enumerate} +% \item See \url{http://ctan.org/pkg/lwarp} for the \pkg{lwarp} package. +% \item Download the TDS archive: |lwarp.tds.zip| +% \item Find the \TeX\ |local| directory: +% \begin{description} +% \item[\TeX\ Live:] \ +% +% \userentry{kpsewhich -var-value TEXMFLOCAL} +% \item[MiKTeX:] \ +% +% In the ``Settings'' window, ``Roots'' tab, look for a local TDS root. +% \end{description} +% This should be something like: \\ +% \hspace*{2em}|/usr/local/texlive/texmf-local/| +% \item Unpack the archive in the TDS local directory. +% \item Renew the cache: +% \userentry{mktexlsr} \quad —\,or\,— +% \userentry{texhash} +% \end{enumerate} +% +% \item[CTAN \texttt{.dtx} and \texttt{.ins} files:] Another form of \TeX\ package +% is the |.dtx| and |.ins| source files. These files are used to create +% the documentation and |.sty| files. +% +% \begin{enumerate} +% \item See \url{http://ctan.org/pkg/lwarp} for the \pkg{lwarp} package. +% \item Download the zip archive |lwarp.zip| into your own |lwarp| directory. +% \item Unpack |lwarp.zip|. +% \item Locate the contents |lwarp.dtx| and |lwarp.ins| +% \item Create the documentation: \userentry{pdflatex lwarp.dtx} (several times) +% \item Create the |.sty| files: \userentry{pdflatex lwarp.ins} +% \item Copy the |.sty| files somewhere such as the \TeX\ Live local tree +% found in the previous CTAN TDS section, under the subdirectory: \\ +% \hspace*{2em}|<texlocal>/tex/latex/local/lwarp| +% \item Copy the documentation |lwarp.pdf| to a |source| directory in the local tree, +% such as: \\ +% \hspace*{2em}|<texlocal>/doc/local/lwarp| +% \item Renew the cache: +% \userentry{mktexlsr} \quad —\,or\,— +% \userentry{texhash} +% \item See \cref{sec:locallwarpmk} to generate your local copy of |lwarpmk|. +% \item Once the local version of |lwarpmk.lua| is installed, it may be made +% available system-wide as per \cref{sec:installlwarpmk}. +% \end{enumerate} +% \item[Project-local CTAN \texttt{.dtx} and \texttt{.ins} files:] The +% |.dtx| and |.ins| files may be downloaded to a project +% directory, then compiled right there, alongside the +% document source files. The resultant |*.sty| and |lwarpmk.lua| files +% may be used as-is, so long as they are in the same directory +% as the document source. This approach is especially useful if +% you would like to temporarily test\margintag{Just testing!}\ +% \pkg{lwarp} before deciding whether to permanently install it. +% \end{description} +% +% \subsection{Installing the \protect\texttt{lwarpmk} utility} +% \label{sec:installlwarpmk} +% +% {\small +% (Note: It is possible to use a local copy of |lwarpmk| instead of +% installing it system-wide. +% See \cref{sec:locallwarpmk}.) +% } +% +% After the \pkg{lwarp} package is installed, +% you may need to setup the |lwarpmk| utility: +% \begin{enumerate} +% \item At a command line, try executing |lwarpmk|. If the help message +% appears, then |lwarpmk| is already set up. +% \item Locate the file |lwarpmk.lua|, which should be in the |scripts| directory +% of the TDS tree. On a \TeX\ Live system you may use \userentry{kpsewhich lwarpmk.lua} +% \item Create |lwarpmk|: +% \begin{description} +% \item [The easy way:] Copy |lwarpmk.lua| to wherever |pdflatex| is located. +% For Unix, rename |lwarpmk.lua| to |lwarpmk| and make it executable. +% \item [Unix:] Create a symbolic link and make it executable: +% \begin{enumerate} +% \item Locate the \TeX\ Live binaries: +% \userentry{kpsewhich -var-value TEXMFROOT} \\ +% This will be something like: \\ +% \hspace*{2em}|/usr/local/texlive/<year>| \\ +% The binaries are then located in the |bin/<arch>| directory +% under the root: \\ +% \hspace*{2em}|/usr/local/texlive/<year>/bin/<architecture>/| \\ +% In this directory you will find programs +% such as |pdflatex| and |makeindex|. +% \item In the binaries directory, +% create a new symbolic link from the binaries directory to |lwarpmk.lua|: +% \userentry{ln -s <pathtolwarpmk.lua> lwarpmk} +% \item Make the link executable: +% \userentry{chmod 0755 lwarpmk} +% \end{enumerate} +% \item [Windows \TeX\ Live:] Create a new |lwarpmk.exe| file: +% \begin{enumerate} +% \item Locate the \TeX\ Live binaries as shown above for Unix. +% \item In the binaries directory, make a \emph{copy} of |runscript.exe| +% and call it |lwarpmk.exe| +% \end{enumerate} +% \item [Windows MiK\TeX:] Copy |lwarpmk.lua| to a folder in the executable |PATH|: +% \begin{enumerate} +% \item Locate the binaries. These will be in a directory such as: \\ +% \hspace*{2em}|C:\Program Files\MiKTeX 2.9\miktex\bin| \\ +% In this directory you will find programs +% such as |pdflatex| and |makeindex|. +% \item Copy |lwarpmk.lua| to this directory. +% \end{enumerate} +% \end{description} +% \end{enumerate} +% +% \subsubsection{Using a local copy of \protect\pkg{lwarpmk}} +% \label{sec:locallwarpmk} +% It is also possible to use a local version of |lwarpmk|: +% \begin{enumerate} +% \item When compiling the tutorial in \cref{sec:tutorial}, +% use the |lwarpmk| option for the \pkg{lwarp-newproject} package: \\ +% \hspace*{2em}|\usepackage[lwarpmk]{lwarp-newproject}| +% \item When the tutorial is compiled with |pdflatex|, the file |lwarpmk.lua| +% will be generated along with the other configuration files. +% \item |lwarpmk.lua| may be used for this project: +% \begin{description} +% \item[Unix:] \ +% \begin{enumerate} +% \item Make |lwarpmk.lua| executable: \userentry{chmod 0755 lwarpmk.lua} +% \item Compile documents with \\ +% \hspace*{2em} |./lwarpmk.lua html| \\ +% \hspace*{2em} |./lwarpmk.lua print| \quad etc. +% \item It may be useful to rename or link to a version without the |.lua| suffix. +% \end{enumerate} +% \item[Windows:] \ +% +% Compile documents with \\ +% \hspace*{2em} |lwarpmk html| \\ +% \hspace*{2em} |lwarpmk print| \quad etc. +% \end{description} +% \end{enumerate} +% +% +% \subsection{Installing additional utilities} +% +% The \TeX\ utilities |latexmk| and |pdfcrop| may require +% the installation of additional \TeX-relatex operating-system packages. +% +% The tools from the \textsc{Poppler} project should be provided by your +% operating system's package-installation tools. +% +% To test for the existence of the additional utilities, try: +% \userentry{luatex --version} +% \userentry{xindy --version} +% \userentry{latexmk --version} +% \userentry{pdfcrop --version} +% \userentry{pdftotext -v} +% \userentry{pdfseparate --version} +% \userentry{pdftocairo -v} +% +% +% +% +% \clearpage +% +% \section{Tutorial} +% \label{sec:tutorial} +% +% This section shows an example of how to create an \pkg{lwarp} document. +% +% +% \subsection{Starting a new project} +% +% \begin{enumerate} +% +% \item Create a new project directory called |tutorial|. +% +% \item Inside the |tutorial| directory, +% create a new file called |tutorial.tex|, as seen in \cref{fig:tutorial}. +% This may be copied/pasted from this documentation directly into your own editor. +% +% \item Compile the project: \userentry{pdflatex tutorial.tex} +% \quad (several times) +% +% (|xelatex| or |lualatex| may be used as well.) +% +% \end{enumerate} +% +% +% A number of new files are created when |tutorial.tex| is compiled, as +% shown in \cref{fig:newprojectfiles}. These files are created by +% the |lwarp-newproject| package. +% +% (Two of the new files are configuration files for the helper program |lwarpmk|. +% Whenever a print version of the document is created while the |lwarp-newproject| +% package is used, the configuration files for |lwarpmk| are updated to +% record the operating system, \LaTeX\ program (|pdflatex|, |xelatex|, or |lualatex|), +% the filenames of the source code and \acro{HTML} output, and whether +% the additional helper program |latexmk| will be used to compile the document.) +% +% +% +% \clearpage +% +% \begingroup +% \captionof{figure}{tutorial.tex listing} +% \label{fig:tutorial} +% +% \begin{center} +% \footnotesize +% \textcolor{red}{Note: There are two pages!} +% \end{center} +% +% \begin{verbatim} +% \documentclass{book} +% +% \usepackage{iftex} +% +% % --- LOAD FONT SELECTION AND ENCODING BEFORE LOADING LWARP --- +% \ifPDFTeX +% \usepackage{lmodern} % pdflatex +% \usepackage[T1]{fontenc} +% \usepackage[utf8]{inputenc} +% \else +% \usepackage{fontspec} % XeLaTeX or LuaLaTeX +% \fi +% +% % --- HTML FILENAME AND LATEXMK SETTINGS --- +% % \newcommand{\HomeHTMLFilename}{index} % Filename of the homepage. +% % \newcommand{\HTMLFileName}{node-} % Filename prefix of other pages. +% % \newcommand{\UseLatexmk}{true}% Uncomment to use latexmk +% +% % --- LWARP IS LOADED NEXT --- +% \usepackage{lwarp-newproject} % Possibly with the [lwarpmk] option. +% \usepackage{lwarp} +% % \boolfalse{FileSectionNames} % If false, numbers the files. +% +% % --- OTHER PACKAGES ARE LOADED AFTER LWARP --- +% \usepackage{makeidx} \makeindex +% \usepackage{xcolor} +% +% \usepackage{hyperref,cleveref} % LOAD THESE LAST! +% +% % --- LATEX AND HTML CUSTOMIZATION --- +% \title{The Lwarp Tutorial} +% \author{Some Author} +% \setcounter{tocdepth}{2} % Include subsections in the TOC. +% \setcounter{secnumdepth}{2} % Number down to subsections. +% \setcounter{FileDepth}{1} % Split HTML files at sections +% \booltrue{CombineHigherDepths} % Combine parts/chapters/sections +% \setcounter{SideTOCDepth}{1} % Include subsections in the sideTOC +% \SetFirstPageTop{Name and \fbox{HOMEPAGE LOGO}} +% \SetPageTop{\fbox{LOGO}} +% \SetPageBottom{Contact Information and Copyright} +% \NewCSS{lwarp_sagebrush.css} +% +% \begin{document} +% \maketitle % (or a titlepage environment) +% % --- An abstract may be placed here. --- +% \tableofcontents \listoffigures % --- MUST BE BEFORE THE FIRST SECTION. +% +% \chapter{First chapter} +% \section{A section} +% This is some text which is indexed.\index{Some text.} +% +% \subsection{A subsection} +% See \cref{fig:withtext}. +% \begin{figure}\begin{center} +% \fbox{\textcolor{blue!50!green}{Text in a figure.}} +% \caption{A figure with text\label{fig:withtext}} +% \end{center}\end{figure} +% +% \section{Some math} +% Inline math: $r = r_0 + vt - \frac{1}{2}at^2$ +% \begin{equation} +% a^2 + b^2 = c^2 +% \end{equation} +% +% \printindex +% \end{document} +% \end{verbatim} +% \endgroup +% +% +% \begin{table} +% \caption{Files created in a new project\label{fig:newprojectfiles}} +% \begin{description} +% +% \item [|tutorial.pdf|:] The \acro{PDF} output from \LaTeX. +% +% \item [|tutorial\_html.tex|:] A small |.tex| file used to create +% a parallel \acro{HTML} version of the document, which co-exists with usual +% the \acro{PDF} version, and which will have its +% own auxiliary files. In this way, both \acro{PDF} and \acro{HTML} +% documents may co-exist side-by-side. +% +% \item [Auxiliary files:] The usual \LaTeX\ files |tutorial.aux|, |tutorial.log|. +% When an \acro{HTML} version of the document is created, |_html| versions +% of the auxiliary files will also be generated. +% +% \item [|lwarpmk.conf|:] A configuration file for |lwarpmk|, +% which is used to automate the compilation of \acro{PDF} or \acro{HTML} +% versions of the document. +% +% \item [|tutorial.lwarpmkconf|:] Another configuration file used by |lwarpmk|, +% which is only useful if you wish to have several projects +% residing in the same directory. +% +% \item [|.css files|:] |lwarp.css|, |lwarp_formal.css|, |lwarp_sagebrush.css| +% These files are standard for \pkg{lwarp}, and are not meant to be modified +% by the user. +% +% \item [|sample\_project.css|:] An example of a user-customized \acro{CSS} file, +% which may be used for project-specific changes to the \pkg{lwarp} defaults. +% +% \item [|lwarp\_html.xdy|:] Used by \pkg{lwarp} while creating an index. +% This file should not need to be modified by the user. +% +% \item [|lwarp\_mathjax.txt|:] Inserted into the \acro{HTML} files when +% |MathJax| is used to display math. +% This file should not need to be modified by the user. +% +% \item [|comment.cut|:] A temporary file used by \pkg{lwarp} to +% conditionally process blocks of text. This file may be ignored. +% \end{description} +% +% \hrule \medskip +% \label{sec:genlatexmk} +% When the |lwarpmk| option is given to the \pkg{lwarp-newproject} package: +% \begin{description} +% \item [|lwarpmk.lua|:] A local copy of the |lwarpmk| utility. +% +% On Unix-related operating systems this file must be made executable: \\ +% \hspace*{2em} |chmod u+x lwarpmk.lua| +% +% This may be useful to have to archive with a project for future use. +% \end{description} +% \end{table} +% +% +% +% \clearpage +% +% \subsection{Compiling the print version with \texttt{lwarpmk}} +% +% The |lwarpmk| utility program is used to compile either the printed or +% the \acro{HTML} version of the document. +% +% |lwarpmk print| is used to recompile a printed version of the document. +% +% \begin{enumerate} +% +% \item Re-compile the print version: \userentry{lwarpmk print} +% +% |lwarpmk| prints an introduction then checks to see if the document +% must be recompiled. If it seems that the files are up-to-date, then +% |lwarpmk| informs you of that fact and then exits. +% +% \item Make a small change in the original document, +% such as adding a space character. +% +% \item Recompile again. \userentry{lwarpmk print} +% +% The document is recompiled when a change is seen in the source. +% Several compilations may be necessary to resolve cross-references. +% +% \item Force a recompile to occur. +% +% \userentry{lwarpmk again} +% \userentry{lwarpmk print} +% +% |lwarpmk again| updates the date code for the file, +% triggering a recompile the next time the document is made.\footnote{ +% Although, when using the utility |latexmk| (introduced later), the changed date is +% ignored and an actual change in contents must occur to cause a recompile.} +% +% \item Process the index. +% \userentry{lwarpmk printindex} +% +% \item Recompile again to include the index. +% \userentry{lwarpmk print} +% +% \end{enumerate} +% +% Note that the \acro{HTML} customization commands are ignored while making the +% print version. +% +% +% \clearpage +% +% \subsection{Compiling the HTML version with \texttt{lwarpmk}} +% +% |lwarpmk html| is used to recompile an \acro{HTML} version of the document. +% +% \begin{enumerate} +% \item Compile the \acro{HTML} version: +% \userentry{lwarpmk html} +% +% \begin{enumerate} +% \item |lwarpmk| uses \LaTeX\ to process |tutorial_html.tex| +% to create \\ +% |tutorial_html.pdf|. +% \item |pdftotext| is then used to convert into the file |tutorial_html.html|. +% This file is a plain-text file containing \acro{HTML} tags and +% content for the entire document. +% \item |lwarpmk| manually splits |tutorial_html.html| into +% individual \acro{HTML} files according to the \acro{HTML} settings. +% For this tutorial, the result is |tutorial.html| (the home page), +% along with |First-chapter.html|\footnote{ +% \texttt{First-chapter.html} +% also contains the first section, even though the second +% section is its own \acro{HTML} page. This behavior is +% controlled by the boolean \texttt{CombineHigherDepths}.}, +% |Some-math.html|, and the document's +% index in |_Index.html|.\footnote{\texttt{index.html} is commonly +% used as a homepage, so the document index is in \texttt{\_Index.html}.} +% \end{enumerate} +% +% \item View the homepage in a web browser. +% +% \qquad Open the file |tutorial.html| in a web browser. +% +% Note that math is still displayed as its plain-text \LaTeX\ source +% \margintag{math} +% until the +% images of the math expressions have not yet been generated. Math may be +% displayed as \acro{SVG} images or by a MathJax script, as seen in +% \cref{sec:tutorialsvgmath,sec:tutorialmathjax}. +% +% \item Force a recompile: +% \userentry{lwarpmk again} +% \userentry{lwarpmk html} +% \userentry{lwarpmk print} +% +% \item Process the \acro{HTML} index and recompile: +% \userentry{lwarpmk htmlindex} +% \userentry{lwarpmk html} +% +% |_Index.html|, is updated for the new \LaTeX\ index. +% +% \item Reload the web page to see the added index. +% \end{enumerate} +% +% +% +% \clearpage +% +% \subsection{Generating the SVG images} +% \label{sec:tutorialsvgmath} +% +% By default \pkg{lwarp} represents math as \acro{SVG} images with +% \margintag{math as \acro{SVG} images} +% the \LaTeX\ source included in |alt| tags. In this way, +% the math displays as it was drawn by \LaTeX, and the \LaTeX\ source +% may be copied and pasted into some other document. +% +% \pkg{lwarp} uses the same mechanism for |picture| and \tikz\ environments. +% \margintag{\env{picture} and \tikz} +% +% \begin{enumerate} +% \item Create the \acro{SVG} images: +% \userentry{lwarpmk limages} +% \userentry{lwarpmk html} +% +% \item Move to the tutorial's math page and reload. +% +% \item The math images are displayed using the same font and formatting +% as the printed version. +% +% \item Copy/paste a math expression into a text editor to see the \LaTeX\ source. +% \end{enumerate} +% +% When a math expression, |picture|, or \tikz\ environment is added or +% \watchout[Adding/removing] +% removed, the \acro{SVG} images must be re-created with |lwarpmk limages| +% to maintain the proper image file sequence numbers. +% +% Expressing math as \acro{SVG} images has the advantage of representing +% the math exactly as \LaTeX\ would, but has the disadvantage of requiring +% an individual file for each math expression. +% \watchout[Lots of files!] +% There is no attempt at +% reusing the same file each time the same expression occurs, so each +% time \$x\$ is used, for example, yet another file is created. +% For a document with a large amount of math, +% see \cref{sec:tutorialmathjax} to use MathJax instead. +% +% \clearpage +% +% \subsection{Using MathJax for math} +% \label{sec:tutorialmathjax} +% +% Math may also be represented using the MathJax Javascript project. +% \margintag{math with MathJax} +% +% \begin{enumerate} +% \item In the tutorial's source code, change \\ +% \hspace*{2em} |\usepackage{lwarp}| \\ +% \hspace*{3em} to \\ +% \hspace*{2em} |\usepackage[mathjax]{lwarp}| +% +% \item Recompile \userentry{lwarpmk html} +% +% \item Reload the math page. +% \end{enumerate} +% +% MathJax requires web access unless a local copy of MathJax is available, +% \watchout[MathJax requirements] +% and it also requires that Javascript is enabled for the web page. +% The math is rendered by MathJax. Right-click on math to see several +% options for rendering, and for copying the \LaTeX\ source. +% +% While using MathJax has many advantages, it may not be able to represent +% complex expressions or spacing adjustments as well as \LaTeX. +% +% +% +% \clearpage +% \subsection{Changing the CSS style} +% +% \DescribeMacro{\NewCSS} +% \cs{NewCSS} may be used to choose which |.css| file is used to display +% each section of the web page. Use \cs{NewCSS} before |\begin{document}| +% to assign the style of the home page. +% If different parts of the website should have different styles, +% call \cs{NewCSS} again before each section heading which creates a new file. +% +% The styles provided by \pkg{lwarp} include: +% \begin{description} +% \item[|lwarp.css|:] A default style if \cs{NewCSS} is not used. This +% style is comparable to a plain \LaTeX\ document. +% To set this style, you may use |\NewCSS{lwarp.css}|, or no \cs{NewCSS} call at all. +% \item[|lwarp\_formal.css|:] A formal style with a serif fonts and a traditional +% look. +% \item[|lwarp\_sagebrush.css|:] A style with muted colors, gradient backgrounds, +% additional borders, and rounded corners. +% \end{description} +% +% To see each style in use, change the \cs{NewCSS} entry in the tutorial +% |lwarpmk html|, and then reload the webpage. +% +% A customized style may also be created. +% \margintag{Custom \acro{CSS}} +% For each new project a file +% called |sample_project.css| is generated. This may be renamed to +% |<project>.css| then used by assigning |\NewCSS{<project>.css|. +% +% Note that |sample_project.css| is overwritten whenever \pkg{lwarp-newproject} +% is loaded in print mode. +% It is therefore important to rename the file \watchout[Rename it!] +% to something like |<project>.css| before +% using it, so that your own changes are not overwritten. +% +% |<project>.css| has an entry which loads |lwarp.css|, and this +% entry may be changed to load |lwarp_formal.css| or |lwarp_sagebrush.css| if +% desired. Additional changes to the \acro{CSS} may be made by making entries +% later in the |<project>.css| file. +% +% \clearpage +% +% \subsection{Customizing the HTML output} +% \label{sec:htmlsettings} +% \index{settings>HTML conversion} +% \index{HTML>conversion settings} +% +% Several settings may be used to customize the \acro{HTML} output. +% Watch for the correct placement of each!\watchout[Placement!] +% +% Note that if changes are made, +% \watchout[Changes!] +% it is best to first use |lwarpmk clearall| to +% clear all the \acro{HTML}, \acro{PDF}, and auxiliary files. +% Also, if \cs{HomeHTMLFilename}, \cs{HTMLFileName}, or \cs{UseLatexmk} are +% changed, it is necessary to reenable the |lwarp-newproject| package and +% then recompile the print version in order to recreate the configuration +% files for |lwarpmk|. +% +% \begin{description} +% +% \item[Placed in the preamble just before \pkg{lwarp} is loaded:] \ +% +% \begin{description} +% +% \ItemDescribeMacro{\HomeHTMLFilename} Filename of the homepage, without +% the ``|.html|'' suffix. +% Defaults to the \cs{BaseJobname}. A common setting is: \\ +% \hspace*{2em}|\newcommand{HomeHTMLFilename}{index}| \\ +% causing the +% homepage to be the file |index.html|. Underscores are allowed in filenames. +% +% \ItemDescribeMacro{\HTMLFileName} A filename prefix for the rest of the \acro{HTML} web pages. +% Useful for numbered web pages with a common prefix. May be empty. +% +% \ItemDescribeMacro{\UseLatexmk} A macro which controls whether +% \pkg{lwarp} uses |latexmk| to +% compile the document. This setting is written to |lwarpmk|'s configuration +% files. Defaults to false. Set to true with: \\ +% \hspace*{2em}|\newcommand*{\UseLatexmk}{true}| +% +% \end{description} +% +% \item[Placed in the preamble before \texttt{\cs{begin}\{document\}}:] \ +% +% \begin{description} +% +% \ItemDescribeCounter{tocdepth} Sectioning depth of the table of contents. +% See \cref{sec:stackdepths} for a list of \LaTeX{} stack depths. +% +% \ItemDescribeCounter{SideTOCDepth} Sectioning depth of the side\acro{TOC}. +% Defaults to 1, causing the sidetoc to show sections but not subsections. +% +% Each subpage of the website has its own small table of contents +% \margintag{sideTOC} +% on the side (the ``side\acro{TOC}''). Its depth is set by |SideTOCDepth|. +% This side\acro{TOC} is only shown if the web page is wide enough. +% When using a narrow web browser window, +% ``responsive web design'' is used to show the side\acro{TOC} at the top of the +% page and a link back to ``Home'' at the bottom. +% +% \label{sec:filedepth} +% It is recommended to set: \\ +% \hspace*{.25in} |SideTOCDepth|\,=\,|FileDepth|, or \\ +% \hspace*{.25in} |SideTOCDepth|\,=\,|FileDepth|+1 +% +% If |SideTOCDepth|\,<\,|FileDepth|, web pages will be inaccessible via the +% side\acro{TOC}. \watchout +% \index{files>inaccessible} +% \index{pages>inacessible} +% \index{missing sections} +% \index{section>missing} +% +% \ItemDescribeCounter{FileDepth} Sectioning depth of file splits. +% Defaults to -5, causing the entire \acro{HTML} website to be one single file. +% \begin{itemize} +% \item To place the entire file into one \acro{HTML} page, use: \\ +% \hspace*{.25in}|\setcounter{FileDepth}{-5}}| +% \item To split the \acro{HTML} file at \cs{section} depth, use: \\ +% \hspace*{.25in}|\setcounter{FileDepth}{1}}| +% \item To ensure that the \acro{HTML} pages/files are accessible: +% \watchout\\ +% Place a \cs{tableofcontents} somewhere before the first section +% break (therefore in the ``home page''), and set |tocdepth|\,>=\,|FileDepth|. +% \index{files>inaccessible} +% \index{pages>inacessible} +% \index{missing sections} +% \index{section>missing} +% \end{itemize} +% +% \ItemDescribeBoolean{CombineHigherDepths} Combine a higher section with +% its first lower subsections, down to the |FileDepth|. +% Defaults to true. Set to false to simulate the concept of a chapter +% opening on its own page, for example. +% +% The file splits are controlled by the counter |FileDepth| and +% the boolean |CombineHigherDepths|. +% Setting |FileDepth| to 0 splits the file +% at chapters, 1 at sections, etc. |CombineHigherDepths| controls whether +% to combine pages at levels higher than the chosen |FileDepth|, such as +% in this tutorial where the page which opens the chapter also contains the +% first section. +% Be careful to set |tocdepth| and |SideTOCDepth| to allow +% \watchout[Inaccesible pages!] +% access to each page of the website. Set |tocdepth| and |SideTOCDepth| to be +% greater than or equal to |FileDepth|. +% +% When making changes to the file structure, +% \watchout[Lost in an old page!] +% it is possible to end up +% with the web browser pointing to an old file which is no longer in use. +% When this occurs, changes to the web site will not appear in the browser, +% even if reloading the page, because that page is no longer in use. +% It is best to return to the home page, clean the files (|lwarpmk cleanall|), +% change |FileDepth| and/or |CombineHigherDepths|, then finally recompile and +% renavigate to the desired page using the new file structure. +% +% \ItemDescribeBoolean{FileSectionNames} If true, web page filenames are +% derived from a sanitized version of the section names. If false, web pages +% are numbered. Either way, the \cs{HTMLFileName} is prefixed. +% +% Example HTML filenames: +% \changes{v0.20}{2016/09/11}{Docs: Examples for generating HTML file names.} +% \label{sec:filenameexamples} +% \margintag{HTML filenames} +% \index{HTML>filename generation} +% \begin{description} +% \item[Numbered HTML nodes:] \ +% +% Example: Homepage |index.html|, and |node-1|, |node-2|. +% (See \cs{SetHTMLFileNumber} to number grouped by chapter, for example.) +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \newcommand{\HomeHTMLFileName}{index} +% \newcommand{\HTMLFileName}{node-} +% \usepackage{lwarp} +% \boolfalse{FileSectionNames} +% \end{Verbatim} +% +% \item[Named HTML sections, no prefix:] \ +% +% Example: |index.html|, and |About.html|, |Products.html| +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \newcommand{\HomeHTMLFileName}{index} +% \newcommand{\HTMLFileName}{} +% \usepackage{lwarp} +% \booltrue{FileSectionNames} +% \end{Verbatim} +% +% \item[Named HTML sections, with prefix:] \ +% +% Example: Homepage |mywebsite.html|, and additional pages such +% as |mywebsite-About.html|, etc. +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \newcommand{\HomeHTMLFileName}{mywebsite} +% \newcommand{\HTMLFileName}{mywebsite-} +% \usepackage{lwarp} +% \booltrue{FileSectionNames} +% \end{Verbatim} +% \end{description} +% +% \ItemDescribeMacro{\abstractname} The name of the abstract. This may also be over-written +% by the \pkg{babel} package. Defaults to ``Abstract''. +% +% \ItemDescribeMacro{\MetaLanguage} The \acro{HTML} language meta header. +% Defaults to {en-US}. +% +% \ItemDescribeMacro{\SetFirstPageTop} \marg{contents} \quad +% A user-definable custom action applied +% to the top of the home page. Useful for logos, etc. +% Defaults empty. +% Ignored in print output. +% +% \ItemDescribeMacro{\SetPageTop} \marg{contents} \quad +% A user-definable custom action applied to +% the top of pages other than the home page. Useful for logos, etc. +% Defaults empty. +% |\LinkHome| may be used to place a link back to the homepage. +% Ignored in print output. +% +% \ItemDescribeMacro{\SetPageBottom} \marg{contents} \quad +% A user-definable custom action applied to the +% bottom of each web page. +% Useful for authors, copyright notices, contact information, etc. +% Defaults empty. +% |\LinkHome| may be used to place a link back to the homepage. +% Ignored in print output. +% +% \end{description} +% +% \item[Placed in the home page before the first section break:] \ +% +% \begin{description} +% \ItemDescribeMacro{\tableofcontents} +% Used to place a table of contents on the home page. +% This command must be used before the first file split, so that a way is +% available to navigate to other files from the homepage. +% +% Links to each chapter/section are provided, as selected by |tocdepth|. +% \end{description} +% +% +% \item[Placed before any sectioning command which causes a file break:] \ +% +% \begin{description} +% \ItemDescribeMacro{\NewCSS} \marg{filename.css} \quad +% Sets the \acro{CSS} file to use for the following +% files. May be changed before each each sectioning command which would +% cause a file split. +% +% The \acro{CSS} styles of the web pages are set by the \cs{NewCSS} command. +% If \cs{NewCSS} is not used, a default plain style is used to mimic printed +% \LaTeX\ output. |lwarp_sagebrush.css| is a semi-fancy colored style as shown +% in this tutorial. Change it to |lwarp_formal.css| for a more formal look, +% or comment out the \cs{NewCSS} command to see the default. +% \cs{NewCSS} may be used before each file break to set the \acro{CSS} for +% individual pagess of the website. +% +% \ItemDescribeMacro{\NewHTMLdescription} \marg{description} \quad +% Sets the \acro{HTML} description tag for +% the following files. May be changed before each each sectioning command which would +% cause a file split. +% \end{description} +% +% \needspace{2\baselineskip} +% \item[Placed in the document wherever necessary:] \ +% +% \begin{description} +% \ItemDescribeEnv{warpprint} An environment which is only used +% while generating print output. Place here anything which does not +% apply to \acro{HTML} and which may cause problems with \pkg{lwarp}. +% If \pkg{lwarp} knows about and emulates or supports +% a package then its related macros, lengths, counters, etc. probably won't have +% to be placed inside a \env{warpprint} environment, but unknown packages +% may cause problems which may be isolated from \pkg{lwarp} using this environment. +% +% \ItemDescribeEnv{warpHTML} An environment which is only used +% while generating \acro{HTML} output. This is useful for website logos and +% other items which have no purpose in printed output. +% +% \ItemDescribeMacro{\warpprintonly} \marg{contents} \quad +% A macro version of the \env{warpprint} environment. +% +% \ItemDescribeMacro{\warpHTMLonly} \marg{contents} \quad +% A macro version of the \env{warpHTML} environment. +% \end{description} +% +% \end{description} +% +% +% \clearpage +% +% \subsection{Using \texttt{latexmk}} +% +% |latexmk| is a \LaTeX\ utility used to monitor changes in source files +% and recompile as needed. +% +% \begin{enumerate} +% \item In the tutorial's source code, at ``HTML FILENAME AND LATEXMK SETTINGS'', +% insert the line: \\ +% \hspace*{2em}|\newcommand{\UseLatexmk}{true}| +% +% \item Directly recompile the printed version of the document. +% \userentry{pdflatex tutorial.tex} \watchout[NOT \texttt{lwarpmk}!] \\ +% \hspace*{2em}(Or |xelatex| or |lualatex|) +% +% \begin{sloppy} +% \pkg{lwarp} updates its own configuration files (|lwarpmk.conf| and \newline +% |tutorial.lwarpmkconf|) whenever the printed version of the document +% is compiled. These configuration files remember that |lwarpmk| should +% use |latexmk| to compile the document. +% \end{sloppy} +% +% \item Recompile the document. +% \userentry{lwarpmk print} \quad and/or +% \userentry{lwarpmk html} +% \end{enumerate} +% +% Changes are detected by comparing checksums +% rather than modification times, so |lwarpmk again| will not trigger a +% recompile, but |latexmk| has a much better awareness of changes than +% the |lwarpmk| utility does and it is likely to correctly know when to +% recompile. A recompile may be forced by making a small change to the source. +% +% +% \clearpage +% +% \subsection{Using XeLaTeX or LuaLaTeX} +% +% \XeLaTeX\ or \LuaLaTeX\ may be used instead of \LaTeX. +% +% \begin{enumerate} +% +% \item Remove the auxiliary files for the project: +% \userentry{lwarpmk cleanall} +% +% \item Be sure that \\ +% \hspace*{2em} |\usepackage{lwarp-newproject}| \\ +% is still enabled in |tutorial.tex|. +% +% \item Use |xelatex| or |lualatex| to recompile the printed version. +% \userentry{xelatex tutorial.tex} \quad -or- +% \userentry{lualatex tutorial.tex} +% +% When the recompile occurs and \pkg{lwarp-newproject} is loaded, +% the configuration files for |lwarpmk| are modified to remember +% which \TeX\ engine was used. \XeLaTeX\ or \LuaLaTeX\ will be used for +% future runs of |lwarpmk|. +% +% \item To recompile the document: +% \userentry{lwarpmk print} \quad -and- +% \userentry{lwarpmk html} +% +% \item Also rememeber to update the indexes and recompile again. +% \end{enumerate} +% +% +% \clearpage +% +% \subsection{Cleaning auxiliary files} +% +% To remove the auxiliary files |.aux|, |.toc|, |.lof|, |.lot|, |.idx|, |.ind|, and +% |.log|: +% \userentry{lwarpmk clean} +% +% +% \subsection{Cleaning auxiliary and output files} +% +% To remove the auxiliary files, and also remove the |.pdf| and |.html| files: +% \userentry{lwarpmk cleanall} +% +% +% \subsection{Processing multiple projects in the same directory} +% +% It is possible to have several projects in the same directory. +% |lwarpmk| has an optional parameter which is the document to compile. +% +% To create each project: +% \userentry{pdflatex project\_a} +% \userentry{pdflatex project\_b} +% +% Each project is given its own configuration file: \\ +% \hspace*{2em}|project_a.lwarpmkconf|, |project_b.lwarpmkconf| +% +% To compile each project with |lwarkmk|: +% \userentry{lwarpmk print project\_a} +% \userentry{lwarpmk html project\_b} +% +% +% \subsection{Using the \texttt{make} utility} +% +% |lwarpmk| has an action which may be useful for integration with the +% common |make| utility:\\ +% \hspace*{2em}|lwarpmk pdftohtml [project]| +% +% |make| may be used to compile the code to \acro{PDF} with \acro{HTML} +% tags (|project_html.pdf|), then |lwarpmk| may be used to +% convert each target to \acro{HTML} files. +% +% +% \clearpage +% +% \section{Additional details} +% +% \label{sec:usage} +% +% +% +% \subsection{Font and UTF-8 support} +% \label{sec:fonts} +% \index{font>selection} +% \index{Unicode>selection} +% \index{UTF-8>selection} +% \changes{v0.16}{2016/04/08}{Docs: Font and UTF-8 support.} +% \changes{v0.16}{2016/04/08}{Lwarp no longer selects fonts.} +% +% \pkg{lwarp} uses |pdftotext| to convert \acro{PDF} output into UTF-8-encoded +% text. This process requires that UTF-8 information be embedded in the \acro{PDF} +% file, which usually prevents the use of bit-mapped fonts. +% \index{font>bitmapped} +% +% While using |pdflatex|, if no font-related package is specified, the default +% \margintag{vector fonts} +% bit-mapped Computer Modern font is used, +% \margintag{Computer Modern}% +% \index{font>Computer Modern}\index{Computer Modern}% +% \watchout% +% so simply add \\ +% \hspace*{.25in}|usepackage{lmodern}| \\ +% to the preamble to enable the related vector font instead, or use\\ +% \hspace*{.25in}|\usepackage{dejavu}| +% +% \index{Deja Vu}% +% \index{font>Deja Vu}% +% \index{Unicode>enhanced coverage}% +% \index{UTF-8>enhanced coverage}% +% or other other font packages, which may provide an increased coverage of Unicode mappings. +% Avoid bit-mapped fonts. +% +% \XeLaTeX{} and \LuaLaTeX{} users must use the \pkg{fontspec} package. +% \watchout +% Do NOT use \pkg{fontenc}! +% +% Place \pkg{fontspec} or \pkg{fontenc} and other font and UTF-8 related commands +% after the |\documentclass| command and before |\usepackage{lwarp}|: +% +% \begin{enumerate} +% \item |documentclass{article/book/report}| goes here, followed by any of: +% \item Font and UTF-8 related commands: +% \begin{itemize} +% \item For \XeLaTeX{} or \LuaLaTeX: +% \begin{itemize} +% \item \pkg{fontspec} and font choices +% \DescribePackage{fontspec} +% +% \medskip +% \pkg{lwarp} sets the following to turn off \TeX{} ligatures during +% \margintag{ligatures} +% the generation of \acro{HTML} tags, and turn off common ligatures +% in regular text, since older browsers may not display them correctly +% and newer browsers can automatically re-create them. +% \index{ligatures}\index{font>ligatures} +% \vspace{-1ex} +% \begin{Verbatim}[gobble=2,obeytabs,tabsize=4,frame=lines] +% \defaultfontfeatures[\rmfamily]{Ligatures={NoCommon,TeX}} +% \defaultfontfeatures[\sffamily]{Ligatures={NoCommon,TeX}} +% \defaultfontfeatures[\ttfamily]{Ligatures=NoCommon} +% \end{Verbatim} +% \end{itemize} +% \item For |pdflatex|: +% \begin{itemize} +% \item \pkg{lmodern} or other font-related packages +% \DescribePackage{lmodern} +% \index{font>packages} +% \item \pkg{fontenc} +% \DescribePackage{fontenc} +% \item \pkg{inputenc} +% \DescribePackage{inputenc} +% \item \pkg{newunicodechar} +% \DescribePackage{newunicodechar} +% \item |\input glyphtounicode.tex| +% \DescribeFile{glyphtounicode} +% \item |\input glyphtounicode-cmr.tex% from the pdfx package| +% \item |\pdfgentounicode=1| +% \item \pkg{cmap} +% \DescribePackage{cmap} +% \item \pkg{textcomp} +% \DescribePackage{textcomp} +% \item \pkg{microtype} is automatically used by \pkg{lwarp} +% \DescribePackage{microtype} +% to turn off f,q,t,T,Q ligatures for the same +% \margintag{ligatures} +% browser-related reasons shown above. Also, the monospaced font is used +% during \acro{HTML} tag generation to turn off \TeX{} ligatures. +% \index{ligatures}\index{font>ligatures} +% \end{itemize} +% \end{itemize} +% \item |\usepackage{lwarp}| (\cref{sec:loading}) goes after any of the above, followed by: +% \item \ldots{} the rest of the preamble and the main document. +% \end{enumerate} +% +% \subsection{\protect\pkg{lwarp} package loading and options} +% \label{sec:loading} +% \index{settings>lwarp package options} +% +% \pkg{lwarp} supports |book|, |report|, and |article| classes. +% +% Load the \pkg{lwarp} package immediately after the font and UTF-8 setup commands. +% \changes{v0.16}{2016/04/08}{Docs: Moved location of \cs{usepackage\{lwarp\}}.} +% \changes{v0.19}{2016/05/25}{Docs: Math options.} +% \DescribePackage{lwarp} +% \index{lwarp>loading}\index{lwarp>options} +% +% \DescribeOption[lwarp]{warpprint} +% \DescribeOption[lwarp]{warpHTML} +% Select the |warpprint| option to generate print output (default), +% or the |warpHTML| option to generate \htmlfive{} output. +% The default is print output, so the print version may be +% compiled with the usual |pdflatex|, etc. +% When \pkg{lwarp-newproject} is loaded in print mode, it creates +% |<project>_html.tex|, which sets the |warpHTML| option before calling +% the user's source code |<project>.tex|. In this way, |<project>.tex| +% can |\usepackage{lwarp}| without any options to create a printed version, +% while |<project>_html.tex| will create an HTML version. +% +% \DescribeOption[lwarp]{mathsvg} +% \DescribeOption[lwarp]{mathjax} +% For math display, select |mathsvg| (default), or |mathjax|. +% For more information about the math options, see \cref{sec:limitsmath}. +% +% +% \subsection{Selecting the operating system} +% \label{sec:OSportabilityusage} +% \changes{v0.11}{2016/03/11}{Added section: Selecting the operating system.} +% +% \osportabilityusage +% +% +% \subsection{Selecting actions for print or HTML output} +% \label{sec:selectingoutput} +% \index{settings>selecting output} +% \changes{v0.15}{2016/04/05}{Docs: Clarify print/HTML output.} +% +% The following environments and macros are used to select actions which only apply +% to either traditional \LaTeX{} print-formatted PDF generation, +% or to \acro{HTML} generation. +% +% For most of built-in \LaTeX\ and many additional packages +% there is user-level source code support or emulation, +% so no special handling will be required. +% For those cases which \pkg{lwarp} does not handle by itself, the +% following environments and macros may be used to isolate sections +% of code for print-only or \acro{HTML}-only. +% +% These environments are also useful for creating a special version of +% the titlepage for print and another for \acro{HTML}. + +% \DescribeEnv{warpHTML} +% Anything which is to be done only for \htmlfive{} output +% is surrounded by a |warpHTML| environment: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \begin{warpHTML} +% ... something to be done only during HTML generation +% \end{warpHTML} +% \end{Verbatim} +% +% \DescribeEnv{warpprint} +% Anything which is to be done only for print output +% is surrounded by a |warpprint| environment: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \begin{warpprint} +% ... something to be done only during traditional PDF generation +% \end{warpprint} +% \end{Verbatim} +% +% \DescribeEnv{warpall} +% Anything which is to be done for any output +% may be surrounded by a |warpall| environment. Doing so is optional. +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \begin{warpall} +% ... something to be done during print PDF or HTML output +% \end{warpall} +% \end{Verbatim} +% +% +% Macros are also provided for print-only or \acro{HTML}-only code: +% +% \DescribeMacro{\warpprintonly} \marg{actions} +% +% Performs the given actions only when print output is being generated. +% +% \DescribeMacro{\warpHTMLonly} \marg{actions} +% +% Performs the given actions only when \acro{HTML} output is being generated. +% +% +% +% \subsection{Commands to be placed into the \env{warpprint} environment} +% \label{sec:printcommands} +% +% \changes{v0.14}{2016/03/26}{Docs: Commands into a warpprint environment.} +% +% Certain print-related commands should always be placed +% inside a \env{warpprint} environment, or may need other special handling. +% These are unrelated to \acro{HTML} output, but are hard to isolate automatically. +% For example: +% +% \begin{itemize} +% \item Paragraph formatting: \cs{parindent} \cs{parskip} +% \item Variable spaces such as \cs{vspace}. \cs{hfill} is turned into a \cs{quad}. +% Fixed spaces such as \cs{quad} are emulated correctly. +% \item Manual page positions such as the \pkg{textpos} package, which is +% emulated but only in a limited way. +% \end{itemize} +% +% Some packages require additional setup commands. Where these packages are emulated +% for \acro{HTML}, setup commands may work for the emulated \acro{HTML} output as well as for print +% output. See the details for each package in this document for more information. +% +% Also see \cref{sec:troubleshooting}: \nameref{sec:troubleshooting}. +% +% +% \subsection{Commands for a successful HTML conversion} +% \label{sec:successfulcommands} +% \index{HTML>commands for a successful conversion} +% +% \changes{v0.14}{2016/03/26}{Docs: Commands for a successful HTML conversion.} +% +% Some commonly-used \LaTeX{} expressions should be modified to allow +% for a smooth conversion to both \acro{HTML} and print-formatted outputs: +% +% \begin{description} +% \item [\cs{bfseries}, etc:] Use \cs{textbf} instead. +% \item [\cs{centering}, \cs{raggedright}, \cs{raggedleft}:] ~ +% +% Use the environments \env{center}, \env{flushright}, \env{flushleft} instead. +% +% \item [Superscripts and other non-math uses of math mode:] ~ +% +% Use \cs{textsuperscript\{x\}} instead of |$^{x}$| +% +% \item [Empty \cs{item} followed by a new line of text or a nested list:] \ +% +% Use a trailing backslash: |\item[label] \| +% \index{item, list, empty}\index{list item, empty} +% +% \item [\cs{fbox} around a minipage:] ~ +% +% \cs{fbox} can only be used around inline items during +% \acro{HTML} output. +% +% For an \cs{fbox} around a minipage, you may: +% \index{fbox>around a minipage} +% \index{minipage>in an \cs{fbox}} +% \begin{itemize} +% \item Place the \cs{fbox} command and +% its closing brace inside \env{warpprint} environments. +% \item Use \cs{mdframed} instead. +% ^^A \item Use the \env{example} or \env{sidebar} environments. +% \item Use a custom environment to create a sidebar, +% containing a \env{BlockClass} environment +% with custom \acro{CSS} formatting, +% and |\warpprintonly{\hrule}| command: +% \begin{Verbatim}[gobble=2,frame=lines] +% \begin{BlockClass}{frameminipage}% ignored in print output +% % use CSS to format div class ``framedminipage'' +% \warpprintonly{\hrule} % only appears in print output +% Contents +% \warpprintonly{\hrule} % only appears in print output +% \end{BlockClass} +% \end{Verbatim} +% \end{itemize} +% \end{description} +% +% Also see \cref{sec:troubleshooting}: \nameref{sec:troubleshooting}. +% +% +% +% +% \subsection{Title page} +% \label{sec:settitle} +% \index{settings>title page} +% +% In the preamble, place an additional block of code to set the following: +% \vspace{-2em} +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \title{Document Title} % One line only +% \subtitle{Optional Document Subtitle \\ with optional multiple lines} +% \author{Author One\affiliation{Affiliation One} \and +% Author Two\affiliation{Affiliation Two} } +% \date{Optional date} +% \published{Optional Journal Name \\ Optional multiple lines} +% \end{Verbatim} +% +% The title is used in the meta tags in the \acro{HTML} files, and the rest are used +% in |\maketitle|. +% +% +% \DescribeMacro{\maketitle} +% Use |\maketitle| just after the |\begin{document}|, as this will establish +% the title of the homepage. Optionally, use a |titlepage| environment instead. +% +% \DescribeEnv{titlepage} +% The \env{titlepage} environment may be used to hold a custom title page. +% The titlepage will be set in a div class |titlepage|, and \cs{printtitle}, etc.\ may be used +% inside this environment. +% +% \DescribeEnv{titlingpage} +% Another form of custom title page, where \cs{maketitle} is allowed, and +% additional information may be included as well. +% +% \DescribeMacro{\title} \marg{title} + +% Avoid newlines in the |\title|; these will interfere with the +% file break and \acro{CSS} detection. +% \watchout +% Use the |\subtitle| command instead. +% In \acro{HTML}, the title will appear in a heading ``h1''. +% +% \DescribeMacro{\author} \marg{author} +% +% In |\author|, use |\protect| before formatting commands such as |\textsc|. +% \watchout +% In \acro{HTML}, the author will appear in a div class |author|. +% \cs{affiliation} is a new addition to \pkg{lwarp}. +% +% \DescribeMacro{\date} \marg{date} +% +% |\date| works as expected. +% In \acro{HTML}, this will appear in a div class ``titledate''. +% +% \DescribeMacro{\subtitle} \marg{subtitle} +% +% A new command which sets a subtitle. Newlines are allowed. +% The default is empty. +% In \acro{HTML}, this will appear in a div class ``subtitle''. +% +% \DescribeMacro{\published} \marg{published} +% +% A new command which sets a publisher. +% The default is empty. +% In \acro{HTML}, this will appear in a div class ``published''. +% +% +% \DescribeMacro{\thanks} \marg{text} +% +% \cs{thanks} are allowed in the titlepage fields, and will be rendered +% as \acro{HTML} notes at the bottom of the title page. +% +% +% \subsection{HTML page meta descriptions} +% +% \label{sec:htmldescription} +% \index{HTML>meta tag>description} +% \index{description>HTML meta tag} +% \index{meta tag, HTML>description} +% \DescribeMacro{\NewHTMLdescription} \marg{A description of the web page.} +% \quad The default is no description. +% +% Each page of \acro{HTML} output should have its own \acro{HTML} meta description, +% which usually shows up in web search results, +% \margintag{limitations} +% is limited to around +% 150 characters in length, and should not include the \acro{ASCII} double quote character ("). +% +% Use \cs{NewHTMLdescription} +% \margintag{placement} +% just before |\begin{document}| to set the description of the home page, +% and also just before each sectioning command such as \cs{chapter} or \cs{section} +% where a new file will be generated, depending on |FileDepth|. For example, if |FileDepth| is 1, +% use \cs{NewHTMLdescription} just before each \cs{section} command, and that description will be +% placed inside the \acro{HTML} page for that \cs{section}. The same descrition will be used for +% all following \acro{HTML} files as well, until reset by a new \cs{NewHTMLdescription}. It is best +% to use a unique description for each \acro{HTML} file. +% +% To disable the generation of \acro{HTML} description meta tags, +% \margintag{disabling} +% use:\\ +% \hspace*{1em} |\NewCSSdescription{}| +% +% +% \subsection{CSS} +% +% \label{sec:projectcss} +% \DescribeFile{lwarp.css}\DescribeFile{project.css}\DescribeFile{sample_project.css}\label{sec:lwarpcss}It is best +% to make a local project-specific \acro{CSS} file such as |project.css|, containing only +% things which are different from |lwarp.css|. +% |project.css| should refer to |lwarp.css| as follows: +% \index{CSS>project-specific changes}\index{CSS>lwarp.css} +% \index{settings>\acro{CSS} project-specific} +% \vspace{-2ex} +% \VerbatimInput[frame=lines]{sample_project.css} +% +% An example file called |sample_project.css| is provided, and may be renamed |project.css|. +% +% \label{sec:setcss} +% +% \DescribeMacro{\NewCSS} +% For each section at which \acro{HTML} files are split, +% |\NewCSS| may be used before the sectioning command to select a \acro{CSS} file for that and all +% following sections. This may be changed numerous times throughout the file, resulting in +% different \acro{HTML} pages having different \acro{CSS} files assigned. +% \index{CSS>file selection} +% \index{CSS>per HTML page} +% \index{settings>CSS selection} +% +% +% +% \subsection{Special cases and limitations} +% \label{sec:limitations} +% +% \subsubsection{Text formatting} +% +% \limitstext +% +% +% \subsubsection{Verse and Memoir packages} +% +% \limitsverse +% +% +% \subsubsection{Math} +% \label{sec:limitsmath} +% +% \limitsmath +% +% For an example of using custom \LaTeX\ macros with MathJax, +% \margintag{custom MathJax macros} +% see page \pageref{ex:mathjaxmacros}. +% +% +% \subsubsection{Graphics} +% +% \limitsgraphics +% +% +% \subsubsection{Xcolor} +% +% \limitsxcolor +% +% +% \subsubsection{\tikz} +% +% \limitstikz +% +% See \cref{sec:tikz}. +% +% +% \subsubsection{Tabular} +% +% \limitstabular +% +% +% \subsubsection{Minipages} +% +% \limitsminipage +% +% \subsubsection{Mdframed} +% +% \limitsmdframed +% +% \subsubsection{\pkg{float}, \pkg{trivfloat}, and/or \pkg{algorithmicx} together} +% +% \limitscombiningfloats +% +% +% \subsubsection{\pkg{caption} and \pkg{subcaption} packages} +% +% \limitscaption +% +% +% \subsubsection{\pkg{subfig} package} +% +% \limitssubfig +% +% +% \subsubsection{\pkg{floatrow} package} +% +% \limitsfloatrow +% +% +% \subsubsection{\pkg{siunitx} package} +% \DescribePackage{siunitx} +% +% \limitssiunitx +% +% +% \subsubsection{\pkg{newclude} package} +% \DescribePackage{newclude} +% \changes{v0.14}{2016/03/29}{Docs: Newclude limitations.} +% +% \limitsnewclude +% +% +% \subsubsection{\pkg{newtxmath} package} +% \DescribePackage{newtxmath} +% +% \limitsnewtxmath +% +% +% \subsubsection{\pkg{babel} package} +% \DescribePackage{babel} +% +% \limitsbabelone +% +% \limitsbabeltwo +% +% +% \subsubsection{\pkg{enumitem} package} +% \DescribePackage{enumitem} +% +% \limitsenumitem +% +% +% +% +% \section{Expanding the code base} +% \pagestyle{pageheadfoot} +% +% Purely text-based packages probably will work as-is when generating +% \acro{HTML}. +% +% Look to existing code for ideas on how to expand into new code. +% +% An environment may be converted to a |lateximage| then displayed +% with an image of the resulting \LaTeX{} output. +% See \cref{sec:picture} for an example of the |picture| environment. +% +% To create a custom \acro{HTML} block or inline \acro{CSS} class, +% see \cref{sec:highlevelclasses}. +% +% \subsection{Creating an lwarp version of a package} +% +% When creating \acro{HTML}, +% \pkg{lwarp} redefines the \cs{usepackage} and \cs{RequirePackage} +% macros such that it first looks to see if a |lwarp-<packagename>.sty| +% version exists. If so, the \pkg{lwarp} version is used instead. +% This modular system allows the users to create their own +% versions of packages for \pkg{lwarp} to use for \acro{HTML}, simply by creating +% a new package with a |lwarp-| prefix. If placed in the local +% directory along with the source code, it will be seen by that project +% alone. If placed alongside the other |lwarp-| packages where \TeX\ +% can see it, then the user's new package will be seen by any documents +% using \pkg{lwarp}. +% +% An |lwarp-<packagename>.sty| package is only used during \acro{HTML} +% generation. Its purpose is to pretend to be the original package, +% while modify anything necessary to create a successful \acro{HTML} conversion. +% For many packages it is sufficient to simply provide nullified macros, +% lengths, counters, etc. for anything which the original package does, +% while passing the raw text on to be typeset. See the pre-existing +% |lwarp-| packages for examples. +% +% Note that anything the user might expect of the original package +% must be replaced or emulated by the new |lwarp-| package, including +% package options, user-adjustable counters, lengths, and booleans, and +% conditional behaviors. +% +% Each |lwarp-| package should first call either \cs{LWR@ProvidesPackageDrop} +% or \cs{LWR@ProvidesPackagePass}. If dropped, the original print-version +% package is ignored, and only the |lwarp-| version is used. +% Use this where the original print version is useless for \acro{HTML}. +% If passed, the original package is loaded first, with the supplied options, then +% the |lwarp-| version continues loading as well. Use this when \acro{HTML} +% output only requires some modifications of the original package. +% For a case where the original package is usable as-is, there is no +% need to create a |lwarp-| version. +% +% +% +% +% +% \section{Troubleshooting} +% \label{sec:troubleshooting} +% \index{FAQ}\index{Frequently Asked Questions}\index{bugs} +% \index{troubleshooting}\index{problems}\index{error messages} +% \index{debugging} +% +% \subsection{Using the \protect\texttt{lwarp.sty} package} +% +% Also see: \\ +% \Cref{sec:successfulcommands}: \nameref{sec:successfulcommands} \\ +% \Cref{sec:printcommands}: \nameref{sec:printcommands} \\ +% \Cref{sec:limitations}: \nameref{sec:limitations} +% +% \changes{v0.14}{2016/03/26}{Docs: Troubleshooting cross-references.} +% \changes{v0.16}{2016/04/08}{Docs: Text not converting.} +% +% \begin{description} +% +% \item [Text is not converting:] ~ +% \begin{itemize} +% \item Font-related UTF-8 information must be embedded in the \acro{PDF} file. +% See \cref{sec:fonts} regarding vector fonts. +% \end{itemize} +% +% \item [Undefined HTML settings:] \ +% \item See the warning regarding the placement of the \acro{HTML} settings +% at \cref{sec:htmlsettings}. +% +% \item [Obscure error messages:] ~ +% \begin{itemize} +% \item Be sure that a print version of the document compiles and +% that your document's \LaTeX{} code is correct, before attempting +% to generate an \acro{HTML} version. +% \end{itemize} +% +% \item [Missing sections:] ~ +% \begin{itemize} +% \item See \cref{sec:filedepth} regarding the +% |FileDepth| and |SideTOCDepth| counters, +% and the use of \cs{tableofcontents} in the home page. +% \end{itemize} +% +% \item [Missing HTML files:] \ +% \item See the warning regarding changes to the \acro{HTML} settings +% at \cref{sec:htmlsettings}. +% +% \item [Missing / incorrect cross-references:] ~ +% \index{cross-references>missing or incorrect} +% \begin{itemize} +% \item Use |lwarpmk again| followed +% by |lwarpmk html| or |lwarpmk print| to compile the document one more time. +% \end{itemize} +% +% \item [Em-dashes or En-dashes in listing captions and titles:] \ +% +% Use \XeLaTeX\ or \LuaLaTeX. +% +% \item [Floats out of sequence:] ~ +% \begin{description} +% \item [Mixed ``Here'' and floating:] Floats [H]ere and regular floats may +% become out of order. \cs{clearpage} if necessary. +% \item [Caption setup:] With \cs{captionsetup} set the positions for +% the captions |above| or |below| to match their use in the source code. +% \end{description} +% +% \item [Print document contains HTML tags:] ~ +% \begin{itemize} +% \item Be sure that the document +% selects |\usepackage[warpprint]{lwarp}| instead of |[warpHTML]|. +% \end{itemize} + +% \item [HTML document contains a single unformatted print +% document:] ~ +% \begin{itemize} +% \item Be sure that the document +% selects |\usepackage[warpHTML]{lwarp}| instead of |[warpprint]|. +% \end{itemize} +% +% \item [Images are appearing in strange places:] ~ +% \index{images>in strange places} +% \begin{itemize} +% \item |lwarpmk limages| to refresh the |lateximage| images. +% \end{itemize} +% +% \item [``Leaders not followed by proper glue'':] This can be caused by +% a missing |l@<floattype>| or |l@<sectiontype>| definition. +% See \pkg{lwarp}'s definitions for examples. +% +% \item [Plain-looking document:] ~ +% \begin{itemize} +% \item The document's \acro{CSS} stylesheet may not be available, or may be +% linked incorrectly. Verify any \cs{NewCSS} statements point to +% a valid \acro{CSS} file. +% \end{itemize} +% +% \item [Broken fragments of HTML:] ~ +% \begin{itemize} +% \item Check the \acro{PDF} file used to create \acro{HTML} +% to see if the tags overflowed the margin. +% (This is why such large page size and margins are used.) +% \end{itemize} +% +% \item [Changes do not seem to be taking effect:] ~ +% \begin{itemize} +% \item Be sure to |lwarpmk clean|, recompile, then start by reloading the home page. +% You may have been looking at an older version of the document. +% If you changed a section name, you may have been looking at +% the file for the old name. +% \item See the warning regarding changes to the \acro{HTML} settings +% at \cref{sec:htmlsettings}. +% \item Verify that the proper \acro{CSS} is actually being used. +% \item The browser may compensate for some subtle changes, such as +% automatically generating ligatures, reflowing text, etc. +% \end{itemize} +% +% \item [Un-matched conditional compiles:] ~ +% \begin{itemize} +% \item Verify the proper |begin|/|end| of |warpprint|, |warpHTML|, and |warpall| environments. +% \end{itemize} +% +% \end{description} +% +% +% \subsubsection{Debug tracing output} +% +% \DescribeMacro{\tracinglwarp} +% When \cs{tracinglwarp} is used, \pkg{lwarp} will add extra +% tracing messages to the |.log| file. The last several messages +% may help track down errors. +% +% Place \cs{tracinglwarp} just after |\usepackage{lwarp}| to +% activate tracing. +% +% +% +% +% \subsection{Compiling the \protect\texttt{lwarp.dtx} file} +% +% \begin{description} +% \item [Illogical error messages caused by an out-of-sync |lwarp.sty| file:] ~ +% \begin{enumerate} +% \item Delete the |lwarp.sty| file. +% \item |pdflatex lwarp.ins| to generate a new |lwarp.sty| file. +% \item |pdflatex lwarp.dtx| to recompile the |lwarp.pdf| documentation. +% \end{enumerate} +% +% \item [Un-nested environments:]~ +% +% Be sure to properly nest: +% \begin{itemize} +% \item |\begin{macrocode}| and |\end{macrocode}| +% \item |\begin{macro}| and |\end{macro}| +% \item |\begin{environment}| and |\end{environment}| +% \end{itemize} +% \end{description} +% +% +% +% +% \StopEventually{\PrintChanges\PrintIndex} +% +% +% +% +% \section{Implementation} +% +% +% This package is perhaps best described as a large collection of smaller +% individual technical challenges, +% in many cases solved through a number of \sout{crude hacks} clever tricks. +% Reference sources are +% given for many of the solutions, and a quick internet search will provide +% additional possibilities. +% +% Judgement calls were made, and are often commented. Improvements are possible. +% The author is open to ideas and suggestions. +% +% Packages were patched for re-use where they provided significant functionality. +% Examples include \pkg{xcolor} with its color models and conversion to \acro{HTML} +% color output, and \pkg{siunitx} which provides many number and unit-formatting +% options, almost all of which are available in pure-text form, and thus +% easily used by \cmds{pdftotext}. +% +% Packages were emulated where their primary purpose was visual formatting which is not +% relevent to \acro{HTML} output. For example, packages related to sectioning +% are already patched by numerous other packages, creating a difficult number of +% combinations to try to support, and yet in \acro{HTML} output all of the +% formatting is thrown away, so these packages are merely emulated. +% +% Packages with graphical output are allowed as-is, but must be nested inside a +% \env{lateximage} environment to preserve the graphics. +% +% There is still room to improve the factoring of the code, and doing so will become +% important if support for other output formats is added. Rather than wait until the +% code is pristine, the author felt it best to publish early and accept input before +% pushing on towards a perhaps less-than-ideal solution. +% +% +% Testing has primarily been done with the Iceweasel/Firefox browser. +% +% +% \section{Stack depths} +% \label{sec:stackdepths} +% \index{HTML>headings} +% \index{section>depths}\index{stack depths} +% +% Stacks are created to track depth inside the \LaTeX{} document structure. +% This depth is translated to \acro{HTML} headings as shown +% in \cref{tab:depthsheadings}. +% ``Depth'' here is not +% depth in the traditional computer-science stack-usage sense, but rather a +% representation of the nesting depth inside the \LaTeX{} document structure. +% +% When starting a new section, the program first must close out any existing +% sections and lists of a deeper level to keep the \acro{HTML} tags nested correctly. +% +% \begin{table} +% \caption{Section depths and HTML headings\label{tab:depthsheadings}} +% \begin{tabular}{lcl} +% \toprule +% Section & \parbox[c]{.35in}{\LaTeX{} depth} & \acro{HTML} headings \\ +% \midrule +% title of the entire website & & h1 \\ +% none & -5 & new for this package \\ +% book & -2 & \textbf{not yet used} \\ +% part & -1 & h2 \\ +% chapter & 0 & h3 \\ +% section & 1 & h4 \\ +% subsection & 2 & h5 \\ +% subsubsection & 3 & h6 \\ +% paragraph & 4 & span class = "paragraph" \\ +% subparagraph & 5 & span class = "subparagraph" \\ +% listitem & 7 & new for this package, used for list items \\ +% \bottomrule +% \end{tabular} +% \end{table} +% +% Support for the \pkg{memoir} package will require the addition of a \cmds{book} +% level, which will push the \acro{HTML} headings down a step, and also cause \cmds{subsubsection} +% to become a \cmds{div} due to a limit of six \acro{HTML} headings. +% +% It is possible to use \htmlfive{} \cmds{section} and \cmds{H1} for all levels, +% but this may not be well-recognized by older browsers. +% +% \clearpage +% +% +% +% \section{Source Code} +% This is where the documented source code for \pkg{lwarp} begins, +% continuing through the following sections all the way to the +% change log and index at the end of this document. +% +% \index{numbers>left margin}\index{line numbers} +% \index{margin>numbers}\index{margin>tags} +% \documentationnotes +% \index{warning icon}\index{danger icon}\index{icon>warning} +% \index{for>HTML output}\index{for>PRINT output}\index{for>HTML \& PRINT} +% \changes{v0.15}{2016/04/05}{Docs: Added warning icons for items needing +% special attention.} +% +% \vfill +% +% \begin{center} +% \pkg{lwarp} source code begins on the following page. +% \end{center} +% +% +% +% \clearpage +% +% +% +% \section{Detecting the \TeX\ Engine — pdflatex, lualatex, xelatex} +% +% \begin{macrocode} +\RequirePackage{iftex} + +\ifLuaTeX +\RequirePackage{luatex85}% until the geometry package is updated +\fi +% \end{macrocode} +% +% +% +% \section{Unicode Input Characters} +% \changes{v0.18}{2016/05/17}{PDF Unicode input characters.} +% \index{Unicode>input characters} +% +% \codeall +% +% If using |pdflatex|, convert a minimal set of Unicode characters. +% Additional characters may be defined by the user, as needed. +% +% If using and of |pdflatex|, |xelatex|, or |lualatex|, \cs{texttimes} is +% declared for a common multiply symbol. +% \begin{macrocode} + +\RequirePackage{newunicodechar} + +\newunicodechar{⨯}{\texttimes} + +\ifPDFTeX +\newunicodechar{ff}{ff} +\newunicodechar{fi}{fi} +\newunicodechar{fl}{fl} +\newunicodechar{ffi}{ffi} +\newunicodechar{ffl}{ffl} +\newunicodechar{—}{---} +\newunicodechar{–}{--} +% \end{macrocode} +% In verbatim text in PDFTex, preserve upright quotes. +% \begin{macrocode} +\RequirePackage{upquote} +\else +\fi +% \end{macrocode} +% +% +% +% \section{Handling package options} +% \label{sec:handlingpackageoptions} +% +% +% \DescribePackage{etoolbox} +% Provides |\ifbool| and other functions. +% +% \begin{macrocode} +\RequirePackage{etoolbox}[2011/01/03] +% requires v2.6 for \BeforeBeginEnvironment, etc. +% \end{macrocode} + + +% \DescribePackage{ifplatform} +% Provides \cs{ifwindows} to try to automatically detect +% Windows OS. +% +% \begin{macrocode} +\RequirePackage{ifplatform}% sense op-system platform +% \end{macrocode} +% +% +% \DescribePackage{comment} +% Provides conditional code blocks. +% +% \begin{macrocode} +\RequirePackage{comment} +\excludecomment{testing} +% \end{macrocode} + + + +% \DescribePackage{kvoptions} +% Allows key/value package options. +% \begin{macrocode} +\RequirePackage{kvoptions} +\SetupKeyvalOptions{family=LWR,prefix=LWR@} +% \end{macrocode} + + +% \DescribeBoolean{warpingprint} +% \DescribeBoolean{warpingHTML} +% \DescribeBoolean{mathjax} +% Set to true/false depending on the package option selections for +% print/\acro{HTML} output and mathsvg/mathjax: +% \begin{macrocode} +\newbool{warpingprint} +\newbool{warpingHTML} +\newbool{mathjax} +% \end{macrocode} + + +% \begin{macro}{\warpprintonly} \marg{contents} +% +% Only process the contents if producing printed output. +% \changes{v0.19}{2016/06/06}{Replaces \cs{rowprintedonly}.} +% \begin{macrocode} +\newcommand{\warpprintonly}[1]{\ifbool{warpingprint}{#1}{}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\warpHTMLonly} \marg{contents} +% +% Only process the contents if producing \acro{HTML} output. +% \changes{v0.19}{2016/06/06}{Added.} +% \begin{macrocode} +\newcommand{\warpHTMLonly}[1]{\ifbool{warpingHTML}{#1}{}} +% \end{macrocode} +% \end{macro} + + + + +% \begin{environment}{warpall} +% Anything in the |warpall| environment will be generated for print or \acro{HTML} outputs. +% \begin{macrocode} +\includecomment{warpall} +% \end{macrocode} +% \end{environment} + + + + +% \begin{environment}{warpprint} +% Anything in the |warpprint| environment will be generated for print output only. +% +% \DescribeOption[lwarp]{warpprint} +% If the |warpprint| option is given, boolean |warpingprint| is true and boolean |warpingHTML| is false, +% and may be used for |\ifbool| tests. +% +% \begin{macrocode} +\DeclareVoidOption{warpprint}{% +\PackageInfo{lwarp}{Using option 'warpprint'} +\includecomment{warpprint}% +\excludecomment{warpHTML}% +\booltrue{warpingprint}% +\boolfalse{warpingHTML}% +} +% \end{macrocode} +% \end{environment} + +% \begin{environment}{warpHTML} +% Anything in the |warpHTML| environment will be generated for \acro{HTML} output only. +% +% \DescribeOption[lwarp]{warpHTML} +% If the |warpHTML| option is given, boolean |warpingHTML| is true and boolean |warpingprint| is false, +% and may be used for |\ifbool| tests. +% +% \begin{macrocode} +\DeclareVoidOption{warpHTML}{% +\PackageInfo{lwarp}{Using option 'warpHTML'} +\excludecomment{warpprint}% +\includecomment{warpHTML}% +\booltrue{warpingHTML}% +\boolfalse{warpingprint}% +} +% \end{macrocode} +% \end{environment} +% +% +% + + +% +% \changes{v0.19}{2016/05/25}{Options: mathsvg and mathjax} +% \DescribeOption[lwarp]{mathsvg} +% Option |mathsvg| selects \acro{SVG} math display: +% \index{math>mathsvg option} +% \index{SVG>mathsvg option} +% If the |mathsvg| option is given, boolean |mathjax| is false, and may be used for |\ifbool| tests. +% \begin{macrocode} +\DeclareVoidOption{mathsvg}{% +\PackageInfo{lwarp}{Using option 'mathsvg'} +\boolfalse{mathjax}% +} +% \end{macrocode} +% +% \DescribeOption[lwarp]{mathjax} +% Option |mathjax| selects MathJax math display: +% \index{math>mathjax option} +% \index{MathJax>mathjax option} +% If the |mathjax| option is given, boolean |mathjax| is true, may be used for |\ifbool| tests. +% \begin{macrocode} +\DeclareVoidOption{mathjax}{% +\PackageInfo{lwarp}{Using option 'mathjax'} +\booltrue{mathjax}% +} +% \end{macrocode} + +% \DescribeOption[lwarp]{BaseJobname} +% Option |BaseJobname| sets the \cs{BaseJobname} for this document. +% +% This is the \cs{jobname} of the printed version, even if currently +% compiling the \acro{HTML} version. +% I.e. this is the \cs{jobname} without |_html| appended. +% This is used to set \cs{HomeHTMLFileName} if the user did not provide one. +% \begin{macrocode} +\DeclareStringOption[\jobname]{BaseJobname} +% \end{macrocode} + + + +% The default is print output, +% and \acro{SVG} math if the user chose \acro{HTML} output. +% \begin{macrocode} +\includecomment{warpprint}% +\excludecomment{warpHTML}% +\booltrue{warpingprint}% +\boolfalse{warpingHTML}% +\boolfalse{mathjax}% + + +% \ExecuteOptions{warpprint,mathsvg} + +\ProcessKeyvalOptions*\relax +% \end{macrocode} + + +% Assign the \cs{BaseJobname} if the user hasn't provided one: +% \begin{macrocode} +\providecommand*{\BaseJobname}{\LWR@BaseJobname} +% \end{macrocode} + + + +% \begin{macro}{\@nameedef} \marg{name} \marg{defn} +% +% Expands |<defn>| before assigning to |<name>| +% \begin{macrocode} +\def\@nameedef#1{\expandafter\edef\csname #1\endcsname} +% \end{macrocode} +% \end{macro} + + + +% \section{Required packages} +% \label{sec:requiredpackages} +% \index{packages>required} +% \changes{v0.16}{2016/04/08}{Lwarp no longer selects fonts.} + +% These packages are automatically loaded by \pkg{lwarp} when generating +% \acro{HTML} output. Some of them are also automatically loaded when +% generating print output, but some are not. +% +% In the document preamble, create a \env{warpprint} environment, and place +% inside it any of the following packages which are required and which +% are labeled as ``Print: OK to Load in a \env{warpprint} environment''. +% Those packages which are labeled as ``Print: Pre-Loaded'' +% need not be placed into the document preamble. + + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + + +% \changes{v0.16}{2016/04/07}{Added XeLaTeX, LuaLaTeX support.} +% See: \url{http://tex.stackexchange.com/a/47579}. + +% Detects \XeTeX{} and \LuaLaTeX: +% \index{XeLaTeX>detection}\index{LuaLaTeX>detection} +% \begin{macrocode} +\RequirePackage{iftex} +\newif\ifxetexorluatex +\ifXeTeX + \xetexorluatextrue +\else + \ifLuaTeX + \xetexorluatextrue + \else + \xetexorluatexfalse + \fi +\fi +% \end{macrocode} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% ^^A +% ^^A +% ^^A % For \XeTeX{} or \LuaLaTeX, use \pkg{fontspec}. +% ^^A % \marginpar{\textcolor{blue}{\XeTeX{} or \LuaLaTeX{} only:}} +% ^^A % +% ^^A % See:\\ +% ^^A % \href +% ^^A % {http://tex.stackexchange.com/questions/2984/frequently-loaded-packages-differences-between-pdflatex-and-xelatex} +% ^^A % {http://tex.stackexchange.com/questions/2984/\\ +% ^^A % \hspace*{.25in}frequently-loaded-packages-differences-between-pdflatex-and-xelatex} +% ^^A % +% ^^A % \index{font>during conversion} +% ^^A % For \XeLaTeX{} and \LuaLaTeX, uses DejaVu Serif for enhanced Cyrillic and Greek coverage. +% ^^A % \index{Unicode>XeLaTeX \& LuaLaTeX} +% \begin{macrocode} +\ifxetexorluatex +% ^^A \usepackage[no-math]{fontspec} +% \end{macrocode} +% ^^A \defaultfontfeatures{Ligatures=Common} +% ^^A \setmainfont{DejaVu Serif} +% ^^A \setsansfont{DejaVu Sans} +% ^^A \setmonofont{DejaVu Sans Mono} +% The monospaced font is used for \acro{HTML} tags, +% so turn off its TeX ligatures and common ligatures: +% \begin{macrocode} +\defaultfontfeatures[\rmfamily]{Ligatures={NoCommon,TeX}} +\defaultfontfeatures[\sffamily]{Ligatures={NoCommon,TeX}} +\defaultfontfeatures[\ttfamily]{Ligatures=NoCommon} +\else +% \end{macrocode} +% ^^A % For |pdflatex|, use \pkg{fontenc} and \pkg{lmodern}: +% ^^A % \marginpar{\textcolor{blue}{|pdflatex| only:}} +% ^^A % \index{Unicode>pdfLaTeX} +% ^^A % \index{pdfLaTeX>Unicode support} +% ^^A % \begin{macrocode} +% ^^A \RequirePDFTeX % error if not pdflatex +% ^^A +% ^^A \input glyphtounicode.tex +% ^^A \input glyphtounicode-cmr.tex% from the pdfx package +% ^^A \pdfgentounicode=1 +% ^^A +% ^^A \usepackage{cmap}% help map Russian to unicode +% ^^A \defaulthyphenchar=127% +% ^^A % \end{macrocode} +% ^^A +% ^^A % \DescribePackage{lmodern} +% ^^A % +% ^^A % \pdflatexonly +% ^^A % +% ^^A % |pdftotext| works better with a vector font. +% ^^A % This font choice does not control the HTML file, but it does appear in the +% ^^A % images generated from math expressions. +% ^^A % \begin{macrocode} +% ^^A \RequirePackage{lmodern} +% ^^A % \end{macrocode} +% ^^A +% ^^A +% ^^A % \DescribePackage{fontenc} +% ^^A % +% ^^A % \pdflatexonly +% ^^A % +% ^^A % \begin{macrocode} +% ^^A \RequirePackage[T1]{fontenc} +% ^^A % \end{macrocode} +% ^^A +% ^^A +% ^^A % \DescribePackage{inputenc} +% ^^A % +% ^^A % \pdflatexonly +% ^^A % +% ^^A % \begin{macrocode} +% ^^A \RequirePackage[utf8]{inputenc} +% ^^A % \end{macrocode} +% ^^A + + +% \DescribePackage{microtype} +% \changes{v0.18}{2016/05/18}{Microtype disabled during HTML generation} +% +% \pdflatexonly +% +% Older browsers don't +% \index{ligatures} +% display ligatures. +% \margintag{ligatures} +% Turn off letter ligatures, keeping +% \LaTeX{} dash and quote ligatures, which may fail on older browers +% but at least won't corrupt written words. +% \begin{macrocode} +\RequirePackage {microtype} + +\microtypesetup{ + protrusion=false, + expansion=false, + tracking=false, + kerning=false, + spacing=false} + +\DisableLigatures[f,q,t,T,Q]{encoding = *,family = *} +% \end{macrocode} +% ^^A +% ^^A +% ^^A % \DescribePackage{newunicodechar} +% ^^A % +% ^^A % +% ^^A % \pdflatexonly +% ^^A % +% ^^A % Note that the font used by the source code listing may not correctly display the +% ^^A % \watchout +% ^^A % actual Unicode character contained in the \cs{newunicode\{\}} expression. +% ^^A % The listing printout may not display ligatures or the dashes correctly. +% ^^A % \begin{macrocode} +% ^^A \RequirePackage{newunicodechar} +% ^^A \newunicodechar{Í}{\IeC {\'I}} +% ^^A \newunicodechar{ff}{ff}% ligatures +% ^^A \newunicodechar{fi}{fi} +% ^^A \newunicodechar{fl}{fl} +% ^^A \newunicodechar{ffi}{ffi} +% ^^A \newunicodechar{ffl}{ffl} +% ^^A %% \newunicodechar{°}{\degree} +% ^^A \newunicodechar{ρ}{\ensuremath{\rho}} +% ^^A \newunicodechar{⨯}{\texttimes} +% ^^A %% \newunicodechar{®}{\textregistered} +% ^^A %% \newunicodechar{©}{\textcopyright} +% ^^A \newunicodechar{—}{---}% emdash +% ^^A \newunicodechar{–}{--}% endash +% ^^A %% \newunicodechar{”}{''}% closing quote +% ^^A %% \newunicodechar{“}{``}% opening quote +% ^^A %% \newunicodechar{§}{\S} +% ^^A %% \newunicodechar{¶}{\P} +% ^^A %% \newunicodechar{†}{\dag} +% ^^A %% \newunicodechar{‡}{\ddag} +% ^^A % \end{macrocode} +% ^^A +% ^^A +% ^^A % \DescribePackage{textcomp} +% ^^A % +% ^^A % +% ^^A % \pdflatexonly +% ^^A % +% ^^A % Provides \cs{degree}, \cs{textquotesingle}, \cs{textmu}. +% ^^A % \begin{macrocode} +% ^^A \RequirePackage{textcomp} +% ^^A % \end{macrocode} +% ^^A +% \begin{macrocode} +\fi +% \end{macrocode} +% ^^A % \marginpar{\textcolor{blue}{End of \XeLaTeX, \LuaLaTeX, |pdflatex| choices.}} +% ^^A +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \DescribePackage{geometry} +% Tactics to avoid unwanted page breaks and margin overflow: +% \begin{itemize} +% \item Uses a very long and wide page to minimize page breaks and margin overflow. +% \item Will also use a scriptsize font. +% \item Also uses extra space at the margin to avoid \acro{HTML} tag overflow off the page. +% \item Will also force a new page before environments. +% \end{itemize} +% +% \changes{v0.20}{2017/01/12}{Page geometry set to 6in wide with large margins.} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\RequirePackage[paperheight=190in,paperwidth=20in,% +left=7in,right=7in,% +top=1in,bottom=1in,% +]{geometry} +\end{warpHTML} +% \end{macrocode} + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \DescribePackage{xparse} +% +% \LaTeX{}3 command argument parsing +% ^^A \RequirePackage[log-declarations=false]{xparse} +% \begin{macrocode} +\RequirePackage{xparse} +% \end{macrocode} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \DescribePackage{expl3} +% +% \LaTeX{}3 programming +% \begin{macrocode} +\RequirePackage{expl3} +% \end{macrocode} + +% ^^A % \DescribePackage{l3regex} +% ^^A % +% ^^A % \LaTeX{}3 regular expression handling +% ^^A % \begin{macrocode} +% ^^A \RequirePackage{l3regex} +% ^^A % \end{macrocode} + + + +% ^^A % \begin{macro}{\EmulatesPackage} \marg{pkg name} \oarg{yyyy/mm/dd and comments} +% ^^A % +% ^^A % Similar to \cs{ProvidesPackage}. Used where the \pkg{lwarp} package emulates +% ^^A % other packages. +% ^^A % For example, \pkg{trivfloat} wants to load \pkg{float}, which is emulated by \pkg{lwarp}. +% ^^A % Since |\EmulatesPackage{float}| is declared by \pkg{lwarp}, +% ^^A % \pkg{trivfloat} will not load \pkg{float} on its own. +% ^^A % Doing so would have over-written the \pkg{lwarp} emulation. +% ^^A % +% ^^A % Do not use \cs{EmulatesPackage} for packages which are patched by other +% ^^A % \watchout +% ^^A % packages. The emulated code cannot be patched correctly. +% ^^A % +% ^^A % \begin{macrocode} +% ^^A \NewDocumentCommand{\EmulatesPackage}{m O{}}{% +% ^^A \expandafter\xdef\csname ver@#1.sty\endcsname{#2 --- +% ^^A Emulated by package \@currname.} +% ^^A } +% ^^A \@onlypreamble\EmulatesPackage +% ^^A % \end{macrocode} +% ^^A % \end{macro} +% ^^A + + +% \DescribePackage{gettitlestring} +% +% Used to emulate \cs{nameref}. +% \begin{macrocode} +\RequirePackage{gettitlestring} +% \end{macrocode} + + +% \DescribePackage{everyhook} +% +% \pkg{everyhook} is used to patch paragraph handling. +% \begin{macrocode} +\RequirePackage{everyhook} +\end{warpHTML} +% \end{macrocode} + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \DescribePackage{fancyvrb} +% +% Used for Verbatim, verse. +% \begin{macrocode} +\RequirePackage{fancyvrb} +% \end{macrocode} + + + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \DescribePackage{xifthen} +% \begin{macrocode} +\RequirePackage{xifthen} +% \end{macrocode} + + +% \DescribePackage{xstring} +% \begin{macrocode} +\RequirePackage{xstring} +% \end{macrocode} + + +% \DescribePackage{makeidx} +% \begin{macrocode} +\RequirePackage{makeidx} +\makeindex +% \end{macrocode} + + +% \DescribePackage{calc} +% \begin{macrocode} +\RequirePackage{calc} +% \end{macrocode} + + +% \DescribePackage{newfloat} +% \begin{macrocode} +\RequirePackage{newfloat} +% \end{macrocode} + +% \DescribePackage{caption} +% \begin{macrocode} +\RequirePackage{caption} +% \end{macrocode} + +% \DescribePackage{subcaption} +% \begin{macrocode} +\RequirePackage{subcaption} +% \end{macrocode} + + +% \DescribePackage{enumitem} +% +% \pkg{enumitem} is patched to support |\newlist| with \acro{HTML}. +% \begin{macrocode} +\RequirePackage{enumitem} +\setlist[itemize]{leftmargin=0em} +\setlist[enumerate]{leftmargin=0em} +\setlist[description]{leftmargin=0em} +% \end{macrocode} + + +% \DescribePackage{pagenote} +% +% Used to convert footnotes into pagenotes. +% \begin{macrocode} +\RequirePackage[continuous]{pagenote} +\makepagenote +\let\LWR@origmakepagenote\makepagenote +\let\LWR@origprintnotes\printnotes +\let\LWR@origpagenote\pagenote +\end{warpHTML} +% \end{macrocode} + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \DescribePackage{titling} +% +% Used for |\maketitle| and the title page. See \cref{sec:titles}. +% \begin{macrocode} +\RequirePackage{titling} +% \end{macrocode} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \DescribePackage{zref} +% +% Used for cross-references. +% \begin{macrocode} +\RequirePackage{zref} +% \end{macrocode} + + +% \DescribePackage{amsmath} +% \changes{v0.16}{2016/04/09}{Fix: amsmath options clash} +% +% Equation numbers are placed to the left for \acro{HTML}. +% +% \pkg{newtxmath} automatically loads \pkg{amsmath}, +% so the options |leqno| and |fleqn| are passed beforehand to be +% picked up both here and by \pkg{newtxmath} if it is used. +% \changes{v0.16}{2016/04/11}{Fix: newtxmath compatibility.} +% +% \begin{macrocode} +\PassOptionsToPackage{leqno,fleqn}{amsmath} +\RequirePackage{amsmath} +% \end{macrocode} + + +% \DescribePackage{environ} +% +% Used to encapsulate math environments for re-use in \acro{HTML} ALT text. +% +% \begin{macrocode} +\RequirePackage{environ} +% \end{macrocode} + + + + + + + +% \DescribePackage{titleps} +% \changes{v0.19}{2016/05/27}{titleps: null \cs{pagestyle} and \cs{thispagestyle} for HTML.} +% +% Used to place an \acro{HTML} comment into the footer of a page below the footnotes. +% This comment is used for |lateximage| environments, including math. +% +% The |nopatches| option prevents titleps from trying to patch sectioning commands. +% +% \cs{pagestyle} and \cs{thispagestyle} are nullified for \acro{HTML} output. +% +% \begin{macrocode} +\RequirePackage[nopatches]{titleps} +% \end{macrocode} +% +% \begin{macro}{\pagestyle} \marg{style} +% \begin{macrocode} +\let\LWR@origpagestyle\pagestyle +\renewcommand*{\pagestyle}[1]{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thispagestyle} \marg{style} +% \begin{macrocode} +\let\LWR@origthispagestyle\thispagestyle +\renewcommand*{\thispagestyle}[1]{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pagenumbering} \marg{commands} +% \begin{macrocode} +\let\LWR@origpagenumbering\pagenumbering +\renewcommand*{\pagenumbering}[1]{} +% \end{macrocode} +% \end{macro} +% + + +% \DescribePackage{xfrac} +% +% Patched for \acro{HTML} use. +% See \cref{sec:xfrac}. + +% \begin{macrocode} +\RequirePackage{xfrac} +% \end{macrocode} + +% +% Used to convert lengths for image width/height options. +% +% \begin{macrocode} +\RequirePackage{printlen} +% \end{macrocode} + + + + + + + + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Loading Packages} +% +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% Remember the original \cs{RequirePackage}: +% \begin{macrocode} +\let\LWR@origRequirePackage\RequirePackage +% \end{macrocode} + +% \begin{macro}{\LWR@requirepackagenames} Stores the list of required package names. +% \begin{macrocode} +\newcommand*{\LWR@requirepackagenames}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@findword} \oarg{1: separator} \marg{2: list} +% \marg{3: index} \oarg{4: destination} +% +% Note that argument 4 is passed directly to \cs{StrBetween}. +% \begin{macrocode} +\newcommand*\LWR@findword[3][,]{% + \StrBetween[#3,\numexpr#3+1]{#1#2#1}{#1}{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@lookforpackagename} \marg{index} +% If this is a package name, re-direct it to the \pkg{lwarp} version +% by renaming it |lwarp-| followed by the original name. +% \begin{macrocode} +\newcommand*{\LWR@lookforpackagename}[1]{ +% \end{macrocode} +% Find the n'th package name from the list: +% \begin{macrocode} +\LWR@findword{\LWR@requirepackagenames}{#1}[\LWR@strresult] +% \end{macrocode} +% See if the package name was found: +% \begin{macrocode} +\IfStrEq{\LWR@strresult}{} +{}% no filename +{% yes filename +% \end{macrocode} +% If found, and if an \pkg{lwarp}-equivalent name exists, use |lwarp-|* instead. +% \begin{macrocode} +\IfFileExists{lwarp-\LWR@strresult.sty} +{% latex_html_ file found + \StrSubstitute + {\LWR@requirepackagenames} + {\LWR@strresult} + {lwarp-\LWR@strresult}[\LWR@requirepackagenames] +} +{}% no latex_html_* file +}% yes filename +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\RequirePackage} \oarg{1: options} \marg{2: package names} \oarg{3: version} +% +% For each of many package names in a comma-separated list, +% if an \pkg{lwarp} version of a package exists, +% select it instead of the \LaTeX\ version. +% +% \begin{macrocode} +\RenewDocumentCommand{\RequirePackage}{o m o}{% +% \end{macrocode} +% Redirect up to nine names: +% \begin{macrocode} +\renewcommand*{\LWR@requirepackagenames}{#2} +\LWR@lookforpackagename{1} +\LWR@lookforpackagename{2} +\LWR@lookforpackagename{3} +\LWR@lookforpackagename{4} +\LWR@lookforpackagename{5} +\LWR@lookforpackagename{6} +\LWR@lookforpackagename{7} +\LWR@lookforpackagename{8} +\LWR@lookforpackagename{9} +% \end{macrocode} +% \cs{RequirePackage} depending on the options and version: +% \begin{macrocode} +\IfValueTF{#1} +{% options given + \IfValueTF{#3}% version given? + {\LWR@origRequirePackage[#1]{\LWR@requirepackagenames}[#3]} + {\LWR@origRequirePackage[#1]{\LWR@requirepackagenames}} +} +{% no options given + \IfValueTF{#3}% version given? + {\LWR@origRequirePackage{\LWR@requirepackagenames}[#3]} + {\LWR@origRequirePackage{\LWR@requirepackagenames}} +} +} +\let\usepackage\RequirePackage +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\LWR@ProvidesPackagePass} \marg{pkgname} \oarg{version} +% +% Provides a new package which passes its options to the original. +% \begin{macrocode} +\NewDocumentCommand{\LWR@ProvidesPackagePass}{m o}{ +\PackageInfo{lwarp}{Using the lwarp version of package `#1', including options,}% +\IfValueTF{#2} +{\ProvidesPackage{lwarp-#1}[#2]} +{\ProvidesPackage{lwarp-#1}} +\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{#1}} +\ProcessOptions\relax + +\IfValueTF{#2} +{\LWR@origRequirePackage{#1}[#2]} +{\LWR@origRequirePackage{#1}} +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\LWR@ProvidesPackageDrop} \marg{pkgname} \oarg{version} +% +% Provides a new package which drops/discards its options. +% \begin{macrocode} +\NewDocumentCommand{\LWR@ProvidesPackageDrop}{m o}{ +\PackageInfo{lwarp}{Using the lwarp version of package `#1', discarding options,}% +\IfValueTF{#2} +{\ProvidesPackage{lwarp-#1}[#2]} +{\ProvidesPackage{lwarp-#1}} +\DeclareOption*{} +\ProcessOptions\relax +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{Copying a file} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@copyfile} \marg{source filename} \marg{destination filename} +% +% Used to copy the |.toc| file to |.sidetoc| to re-print the \acro{TOC} in +% the side\acro{TOC} navigation pane. +% \begin{macrocode} +\newcommand*{\LWR@copyfile}[2]{% +\newwrite\copyfile % open the file to write to +\immediate\openout\copyfile=#2 +\newread\file % open the file to read from +\openin\file=#1 +\begingroup\endlinechar=-1 +\makeatletter +\loop\unless\ifeof\file + \read\file to\fileline % Read one line and store it into \fileline +% \fileline\par % print the content into the pdf +% print the content: + \immediate\write\copyfile{\unexpanded\expandafter{\fileline}}% +\repeat +\closeout\copyfile +\endgroup +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \section{Debugging messages} + +% \DescribeBoolean{LWR@tracinglwarp} True if tracing is turned on. +% \begin{macrocode} +\newbool{LWR@tracinglwarp} +% \end{macrocode} +% +% \begin{macro}{\tracinglwarp} Turns on the debug tracing messages. +% \changes{v0.20}{2017/02/07}{Added.} +% \begin{macrocode} +\newcommand{\tracinglwarp}{\booltrue{LWR@tracinglwarp}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@traceinfo} \marg{text} \quad If tracing is turned on, writes +% the text to the |.log| file. +% \begin{macrocode} +\newcommand{\LWR@traceinfo}[1]{% +\ifbool{LWR@tracinglwarp}% +{\PackageInfo{lwarp}{#1 : }}% +{}% +} +% \end{macrocode} +% \end{macro} + + + +% \section{Remembering original formatting macros} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% Remember original definitions of formatting commands. +% Will be changed to \acro{HTML} commands for most uses. +% Will be temporarily restored to original meaning inside any lateximage environment. +% Also nullify unused commands. +% \begin{macrocode} +\let\LWR@origtextit\textit +\let\LWR@origtextbf\textbf +\let\LWR@origtexttt\texttt +\let\LWR@origtextsc\textsc +\let\LWR@origtextsf\textsf +\let\LWR@origtextrm\textrm +\let\LWR@origbfseries\bfseries +\let\LWR@origrmfamily\rmfamily +\let\LWR@origttfamily\ttfamily +\let\LWR@orignormalfont\normalfont + +\let\LWR@origraggedright\raggedright +\let\LWR@origonecolumn\onecolumn + +\let\LWR@origtextsuperscript\textsuperscript +\let\LWR@origtextsubscript\textsubscript + +\let\LWR@origscriptsize\scriptsize + +\let\LWR@orignewpage\newpage + +\let\LWR@origminipage\minipage +\let\LWR@origendminipage\endminipage + +\let\LWR@orignewline\newline + +\let\LWR@origitem\item + +\let\LWR@origpar\par + + +\let\LWR@origfootnote\footnote +\let\LWR@orig@mpfootnotetext\@mpfootnotetext + +\let\LWR@origclearpage\clearpage +\let\clearpage\relax +\let\cleardoublepage\relax +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{Operating-System portability} +% \label{sec:OSportability} +% \changes{v0.11}{2016/03/11}{Added section: Operating-System portability.} +% +% \osportabilityusage +% +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} +% +% +% \subsection{Common portability code} +% +% \DescribeBoolean{usingOSwindows}Set if \cs{warpOSwindows}. +% \begin{macrocode} +\newbool{usingOSwindows} +\boolfalse{usingOSwindows} +% \end{macrocode} + +% +% \subsection{Unix, Linux, and Mac\,OS} + +% \begin{macro}{\OSPathSymbol} +% Symbol used to separate directories in a path. +% \begin{macrocode} +\newcommand*{\OSPathSymbol}{/} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\OSmkdir} +% The make-directory command. +% \begin{macrocode} +\newcommand*{\OSmkdir}{mkdir } % trailing space is required +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\OSrm} +% The remove-file command. +% \begin{macrocode} +\newcommand*{\OSrm}{rm } +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\OSmv} +% The move-file command. +% \begin{macrocode} +\newcommand*{\OSmv}{mv } +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\OSShellPath} +% Path to the command-line shell. +% \begin{macrocode} +\newcommand*{\OSShellPath}{/bin/sh} +% \end{macrocode} +% \end{macro} + + +% \subsection{MS-Windows} + +% For MS-Windows: +% +% \begin{macro}{\warpOSwindows} +% Set defaults for the MS-Windows operating system. +% \pkg{lwarp} attempts to auto-detect the operatings system, +% so \cs{warpOSwindows} may not be necessary. +% +% \changes{v0.20}{2016/12/19}{Auto-detects operating system.} +% +% \begin{macrocode} +\newcommand*{\warpOSwindows} +{ +\booltrue{usingOSwindows} +\renewcommand*{\OSPathSymbol}{\@backslashchar} +\renewcommand*{\OSmkdir}{MD } +\renewcommand*{\OSrm}{DEL } +\renewcommand*{\OSmv}{MOVE } +} +% \end{macrocode} +% Test for windows during compile. The user may also specify +% \cs{warpOSwindows} later in case this test fails. +% \begin{macrocode} +\ifwindows +\warpOSwindows +\fi +% \end{macrocode} +% \end{macro} + + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + + + +% \section{Stacks} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + + +% Stacks are used to remember how to close sections and list items. +% Before a new section is started, previously nested sections and items must +% be closed out (un-nested) in proper order. +% Note that starting a new section may close several levels of previously +% \watchout +% nested items at the same time. +% For example, starting a new |\section| would close any currently open +% subsection, subsubsection, and paragraph. +% General environments are not nested on the stack since they have their own close +% mechanism. List environments are nested, and items inside those environments +% are nested one level deeper still. +% List environments may be nested inside other list environments, and list items +% are nested inside list environments as well. Thus, the stack may have items +% which are not necessarily in order, since a description may contain an enumerate, +% for example. +% Depths to be recorded in |\LWR@closedepthone|, etc. + +% \subsection{Assigning depths} + +% initial depths for empty stack entries: +% \begin{macrocode} +\newcommand*{\LWR@depthnone}{-5} +% \end{macrocode} +% all sectioning depths are deeper than |LWR@depthfinished|: +% \begin{macrocode} +\newcommand*{\LWR@depthfinished}{-4} +\newcommand*{\LWR@depthpart}{-1} +\newcommand*{\LWR@depthchapter}{0} +\newcommand*{\LWR@depthsection}{1} +\newcommand*{\LWR@depthsubsection}{2} +\newcommand*{\LWR@depthsubsubsection}{3} +\newcommand*{\LWR@depthparagraph}{4} +\newcommand*{\LWR@depthsubparagraph}{5} +% \end{macrocode} +% used by |\itemize|, |\enumerate|, |\description|: +% \begin{macrocode} +\newcommand*{\LWR@depthlist}{6} +% \end{macrocode} +% used by |\item|: +% \begin{macrocode} +\newcommand*{\LWR@depthlistitem}{7} +% \end{macrocode} + +% \subsection{Closing actions} + +% A stack to record the action to take to close each nesting level: +% Add more levels of stack if necessary for a very deeply nested document, +% adding to |\pushclose| and |\popclose| as well. +% \begin{macrocode} +\newcommand*{\LWR@closeone}{}% top of the stack +\newcommand*{\LWR@closetwo}{} +\newcommand*{\LWR@closethree}{} +\newcommand*{\LWR@closefour}{} +\newcommand*{\LWR@closefive}{} +\newcommand*{\LWR@closesix}{} +\newcommand*{\LWR@closeseven}{} +\newcommand*{\LWR@closeeight}{} +\newcommand*{\LWR@closenine}{} +\newcommand*{\LWR@closeten}{} +\newcommand*{\LWR@closeeleven}{} +\newcommand*{\LWR@closetwelve}{} +% \end{macrocode} + +% \subsection{Closing depths} + +% A stack to record the depth of each level: +% +% Note that nested LaTeX structures may push depths which are non-sequential. +% \watchout + +% \begin{docsidebar}[Ex:] +% \begin{Verbatim}[gobble=2,obeytabs,tabsize=4] +% \begin{itemize} +% \item{A} +% \begin{description} +% \item{B} +% \end{description} +% \end{itemize} +% \end{Verbatim} +% \end{docsidebar} + +% \begin{macrocode} +\newcommand*{\LWR@closedepthone}{\LWR@depthnone}% top of the stack +\newcommand*{\LWR@closedepthtwo}{\LWR@depthnone} +\newcommand*{\LWR@closedepththree}{\LWR@depthnone} +\newcommand*{\LWR@closedepthfour}{\LWR@depthnone} +\newcommand*{\LWR@closedepthfive}{\LWR@depthnone} +\newcommand*{\LWR@closedepthsix}{\LWR@depthnone} +\newcommand*{\LWR@closedepthseven}{\LWR@depthnone} +\newcommand*{\LWR@closedeptheight}{\LWR@depthnone} +\newcommand*{\LWR@closedepthnine}{\LWR@depthnone} +\newcommand*{\LWR@closedepthten}{\LWR@depthnone} +\newcommand*{\LWR@closedeptheleven}{\LWR@depthnone} +\newcommand*{\LWR@closedepthtwelve}{\LWR@depthnone} +% \end{macrocode} + +% \subsection{Pushing and popping the stack} + +% \begin{macro}{\pushclose} \marg{action} \marg{depth} + +% Pushes one return action and its LaTeX depth onto the stacks. +% \begin{macrocode} +\NewDocumentCommand{\pushclose}{m m} +{ +\let\LWR@closetwelve\LWR@closeeleven +\let\LWR@closeeleven\LWR@closeten +\let\LWR@closeten\LWR@closenine +\let\LWR@closenine\LWR@closeeight +\let\LWR@closeeight\LWR@closeseven +\let\LWR@closeseven\LWR@closesix +\let\LWR@closesix\LWR@closefive +\let\LWR@closefive\LWR@closefour +\let\LWR@closefour\LWR@closethree +\let\LWR@closethree\LWR@closetwo +\let\LWR@closetwo\LWR@closeone +\let\LWR@closeone#1 +\let\LWR@closedepthtwelve\LWR@closedeptheleven +\let\LWR@closedepthelevel\LWR@closedepthten +\let\LWR@closedepthten\LWR@closedepthnine +\let\LWR@closedepthnine\LWR@closedeptheight +\let\LWR@closedeptheight\LWR@closedepthseven +\let\LWR@closedepthseven\LWR@closedepthsix +\let\LWR@closedepthsix\LWR@closedepthfive +\let\LWR@closedepthfive\LWR@closedepthfour +\let\LWR@closedepthfour\LWR@closedepththree +\let\LWR@closedepththree\LWR@closedepthtwo +\let\LWR@closedepthtwo\LWR@closedepthone +\let\LWR@closedepthone#2 +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\popclose} + +% Pops one action and its depth off the stacks. +% \begin{macrocode} +\newcommand*{\popclose} +{ +\let\LWR@closeone\LWR@closetwo +\let\LWR@closetwo\LWR@closethree +\let\LWR@closethree\LWR@closefour +\let\LWR@closefour\LWR@closefive +\let\LWR@closefive\LWR@closesix +\let\LWR@closesix\LWR@closeseven +\let\LWR@closeseven\LWR@closeeight +\let\LWR@closeeight\LWR@closenine +\let\LWR@closenine\LWR@closeten +\let\LWR@closeten\LWR@closeeleven +\let\LWR@closeeleven\LWR@closetwelve +\let\LWR@closedepthone\LWR@closedepthtwo +\let\LWR@closedepthtwo\LWR@closedepththree +\let\LWR@closedepththree\LWR@closedepthfour +\let\LWR@closedepthfour\LWR@closedepthfive +\let\LWR@closedepthfive\LWR@closedepthsix +\let\LWR@closedepthsix\LWR@closedepthseven +\let\LWR@closedepthseven\LWR@closedeptheight +\let\LWR@closedeptheight\LWR@closedepthnine +\let\LWR@closedepthnine\LWR@closedepthten +\let\LWR@closedepthten\LWR@closedeptheleven +\let\LWR@closedeptheleven\LWR@closedepthtwelve +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{Data arrays} +% \label{sec:dataarray} +% +% These macros are similar to the \pkg{arrayjobx} package, except +% that \cs{LWR@setexparray}'s argument is expanded only once when assigned. +% +% |name| has no backslash, |index| can be a number or a text name, +% and an empty |value| must be |\relax| instead of empty. +% +% To assign an empty value: \\ +% \hspace*{2em}|\LWR@setexparray{name}{index}{\relax}| +% +% \changes{v0.20}{2017/01/07}{Added single-expansion data arrays.} +% +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% \begin{macro}{\LWR@setexparray} \marg{name} \marg{index} \marg{contents} +% \begin{macrocode} +\NewDocumentCommand{\LWR@setexparray}{m m m}{% +\expandafter\edef\csname #1#2\endcsname{\expandonce#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@getexparray} \marg{name} \marg{index} +% \begin{macrocode} +\newcommand*{\LWR@getexparray}[2]{\csuse{#1#2}} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{HTML entities} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \acro{HTML} entites and \acro{HTML} Unicode entities: +% \begin{macrocode} +\let\LWR@origampersand\& +% \end{macrocode} +% \begin{macro}{\HTMLentity} \marg{entitytag} +% \begin{macrocode} +\newcommand*{\HTMLentity}[1]{\LWR@origampersand#1;} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\HTMLunicode} \marg{hex\_unicode} +% \begin{macrocode} +\newcommand*{\HTMLunicode}[1]{\HTMLentity{\#x#1}} +% \end{macrocode} +% \end{macro} + +% \DescribeMacro{\&} +% \begin{macrocode} +\renewcommand*{\&}{\HTMLentity{amp}} +% \end{macrocode} + +% \begin{macro}{\textless} +% \begin{macro}{\textgreater} +% \begin{macrocode} +\let\LWR@origtextless\textless +\renewcommand*{\textless}{\HTMLentity{lt}} + +\let\LWR@origtextgreater\textgreater +\renewcommand*{\textgreater}{\HTMLentity{gt}} +% \end{macrocode} +% \end{macro} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{HTML filename generation} +% + +% The filename of the homepage is set to |\HomeHTMLFileName.html|. +% The filenames of additional sections start with |\HTMLFileName|, to which is +% appended a section number or a simplified section name, depending on |FileSectionNames|. +% + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + + +% \begin{macro}{\BaseJobname} +% The \cs{jobname} of the printed version, even if currently +% compiling the \acro{HTML} version. +% I.e. this is the \cs{jobname} without |_html| appended. +% This is used to set \cs{HomeHTMLFileName} if the user did not provide one. +% \begin{macrocode} +\providecommand*{\BaseJobname}{\jobname} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\HTMLFileName} +% \changes{v0.19}{2016/05/28}{Docs: Escape filename underscores.} +% \changes{v0.20}{2016/12/18}{No longer escape underscores.} +% The prefix for all generated \acro{HTML} files other than the home page, +% defaulting to empty. See \cref{sec:filenameexamples}. +% +% \begin{macrocode} +\providecommand*{\HTMLFileName}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\HomeHTMLFileName} +% \changes{v0.19}{2016/05/28}{Docs: Escape filename underscores.} +% \changes{v0.20}{2016/12/18}{No longer escape underscores.} +% The filename of the home page, defaulting to the \cs{BaseJobname}. +% See \cref{sec:filenameexamples}. +% +% \begin{macrocode} +\providecommand*{\HomeHTMLFileName}{\BaseJobname} +% \end{macrocode} +% \end{macro} +% + +% \begin{macro}{\SetHTMLFileNumber} \marg{number} +% +% \changes{v0.20}{2016/09/11}{Add: Control file numbers.} +% Sets the file number for the next +% file to be generated. 0 is the home page. +% Use just before the next sectioning command, and set it to one less than the +% desired number of the next section. +% May be used to generate numbered groups of nodes +% such as 100+ for one chapter, 200+ for another chapter, etc. +% \begin{macrocode} +\newcommand*{\SetHTMLFileNumber}[1]{% +\setcounter{LWR@htmlfilenumber}{#1}% +} +% \end{macrocode} +% \end{macro} + +% \DescribeBoolean{FileSectionNames} +% Selects how to create \acro{HTML} file names. +% +% Defaults to use section names in the filenames. +% \begin{macrocode} +\newbool{FileSectionNames} +\booltrue{FileSectionNames} +% \end{macrocode} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \DescribeCounter{LWR@htmlfilenumber} +% Records the number of each \acro{HTML} file as it is being created. +% Number 0 is the home page. +% \begin{macrocode} +\newcounter{LWR@htmlfilenumber} +\setcounter{LWR@htmlfilenumber}{0} +% \end{macrocode} + + +% \begin{macro}{\LWR@htmlsectionfilename} \marg{htmlfilenumber or name} +% +% \changes{v0.14}{2016/03/28}{Fix: Links to home page.} +% \changes{v0.17}{2016/04/11}{Fix: Links when entire doc is one HTML page.} +% \changes{v0.20}{2016/09/11}{HTMLFileName: removed additional trailing '-', and may be empty.} +% \changes{v0.20}{2016/09/11}{Sections called ``Index'' or ``index'' have an underscore +% prepended to their filenames if no prefix.} +% +% Prints the filename for a given section: |\HTMLFileName{}filenumber/name.html| +% \begin{macrocode} +\newcommand*{\LWR@htmlsectionfilename}[1]{% +\LWR@traceinfo{LWR@htmlsectionfilename A}% +% \end{macrocode} +% Section 0 or empty is given the home filename. +% The filename must be detokenized for underscores. +% \begin{macrocode} +\LWR@traceinfo{about to assign temp}% +\edef\LWR@tempone{#1}% +\LWR@traceinfo{about to compare with ??}% +\ifthenelse{\equal{\LWR@tempone}{??}}% +{% +\LWR@traceinfo{found ??}% +}{% +\LWR@traceinfo{not found ??}% +}% +\LWR@traceinfo{about to compare with zero or empty}% +\ifthenelse{% +\equal{\LWR@tempone}{0}% +\OR \equal{\LWR@tempone}{}% +\OR \equal{\LWR@tempone}{??}% +}% +{% +\LWR@traceinfo{LWR@htmlsectionfilename B \HomeHTMLFileName.html}% +\HomeHTMLFileName.html% +}% +% \end{macrocode} +% For a \LaTeX\ section named ``Index'' or ``index'' without a prefix, create a filename +% with a leading underscore to avoid colliding with the HTML filename |index.html|: +% \begin{macrocode} +{% +\LWR@traceinfo{LWR@htmlsectionfilename C}% +\ifthenelse{% +\equal{\HTMLFileName}{} \AND \equal{\LWR@tempone}{Index} \OR \equal{\LWR@tempone}{index}% +}% +{\_#1.html}% +% \end{macrocode} +% Otherwise, create a filename with the chosen prefix: +% \begin{macrocode} +{\HTMLFileName#1.html}% +}% +\LWR@traceinfo{LWR@htmlsectionfilename Z}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@htmlrefsectionfilename} \marg{label} +% +% Prints the filename for the given label +% \begin{macrocode} +\newcommand*{\LWR@htmlrefsectionfilename}[1]{% +\LWR@traceinfo{LWR@htmlrefsectionfilename A: !#1!}% +\LWR@htmlsectionfilename{\LWR@htmlfileref{#1}}% +\LWR@traceinfo{LWR@htmlrefsectionfilename B}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{Homepage link} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\LinkHome} +% |\LinkHome| may be used wherever you wish to place a link back to the homepage. +% The filename must be detokenized for underscores. +% \begin{macrocode} +\newcommand*{\LinkHome}{% +\LWR@subhyperrefclass{% +\HomeHTMLFileName.html}% +{Home}{linkhome}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@topnavigation} +% +% Creates a link to the homepage at the top of the page for use when the window is too +% narrow for the sidetoc. +% \begin{macrocode} +\newcommand*{\LWR@topnavigation}{ +\LWR@htmlelementclassline{nav}{topnavigation}{\LinkHome} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@botnavigation} +% +% Creates a link to the homepage at the bottom of the page for use when the window is too +% narrow for the sidetoc. +% \begin{macrocode} +\newcommand*{\LWR@botnavigation}{ +\LWR@htmlelementclassline{nav}{botnavigation}{\LinkHome} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{\textbackslash{}PrintStack diagnostic tool} + +% Diagnostics tool: +% Prints the LaTeX nesting depth values for the stack levels. +% Must have |\LWR@startpars| active while printing the stack, so |\PrintStack| may +% \watchout +% be called from anywhere in the normal text flow. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\PrintStack} Prints the closedepth stack. +% \begin{macrocode} +\newcommand*{\PrintStack}{ +\LWR@startpars +\LWR@closedepthone{} \LWR@closedepthtwo{} \LWR@closedepththree{} +\LWR@closedepthfour{} \LWR@closedepthfive{} \LWR@closedepthsix{} +\LWR@closedepthseven{} \LWR@closedeptheight{} \LWR@closedepthnine{} +\LWR@closedepthten{} \LWR@closedeptheleven{} \LWR@closedepthtwelve{} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \section{Closing stack levels} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% Close one nested level: +% \begin{macrocode} +\newcommand*{\LWR@closeoneprevious}{% + +\LWR@closeone{} + +\popclose{} +} +% \end{macrocode} + +% \begin{macro}{\LWR@closeprevious} \marg{depth} +% Close everything up to the given depth: +% \begin{macrocode} +\newcommand*{\LWR@closeprevious}[1]{ +% \end{macrocode} +% Close any pending paragraph: +% \begin{macrocode} +\LWR@stoppars +% \end{macrocode} +% Close anything nested deeper than the desired depth: +% \begin{macrocode} +\whiledo{\not\(\LWR@closedepthone<#1\)}{\LWR@closeoneprevious} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{HTML tags, spans, divs, elements} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \subsection{Mapping \LaTeX{} Sections to HTML Sections} + +% \begin{macrocode} +\newcommand*{\LWR@tagpart}{h2} +\newcommand*{\LWR@tagpartend}{/h2} +\newcommand*{\LWR@tagchapter}{h3} +\newcommand*{\LWR@tagchapterend}{/h3} +\newcommand*{\LWR@tagsection}{h4} +\newcommand*{\LWR@tagsectionend}{/h4} +\newcommand*{\LWR@tagsubsection}{h5} +\newcommand*{\LWR@tagsubsectionend}{/h5} +\newcommand*{\LWR@tagsubsubsection}{h6} +\newcommand*{\LWR@tagsubsubsectionend}{/h6} +\newcommand*{\LWR@tagparagraph}{span class="paragraph"{}} +\newcommand*{\LWR@tagparagraphend}{/span} +\newcommand*{\LWR@tagsubparagraph}{span class="subparagraph"{}} +\newcommand*{\LWR@tagsubparagraphend}{/span} + +\newcommand*{\LWR@tagregularparagraph}{p} +% \end{macrocode} + + +% \subsection{HTML tags} + +% \begin{macro}{\LWR@htmltagc} \marg{tag} +% Break ligatures in \acro{HTML} tags. +% +%|\protect| is in case the tag appears in TOC, LOF, LOT. +% \begin{macrocode} +\newcommand*{\LWR@htmltagc}[1]{% +{% +\LWR@origttfamily% +% \protect\LWR@origtexttt{% +% \protect\LWR@origtextbf{% +\LWR@origtextless#1\LWR@origtextgreater% +% }% +% }% +}% +} +% \end{macrocode} +% \end{macro} +% + + +% \begin{environment}{LWR@nestspan} Disable \env{minipage}, \cs{parbox} inside a |span|. +% +% |\begin{LWR@nestspan}| must follow the opening |<span>| tag to allow +% \watchout +% a paragraph to start if the span is at the beginning of a new paragraph. +% +% |\end{LWR@nestspan}| must follow the |/span| or an extra |<p>| may appear. +% \watchout +% +% \changes{v0.20}{2016/12/24}{Fix: Minipages inside a span.} +% +% \begin{macrocode} +\newenvironment*{LWR@nestspan} +{% +\addtocounter{LWR@spandepth}{1}% +\RenewDocumentEnvironment{minipage}{O{t} o O{t} m}{}{}% +}% +{\addtocounter{LWR@spandepth}{-1}} +% \end{macrocode} +% \end{environment} + + +% \begin{macro}{\LWR@htmlspan} \marg{tag} \marg{text} +% +% \cs{LWR@spandepth} is used to ensure that paragraph tags are not +% generated inside a span. The exact sequence of when to add and subtract +% \watchout +% the counter is important to correctly handle the paragraph tags before +% and after the span. +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@htmlspan}{m +m}{% +\LWR@ensuredoingapar% +\LWR@htmltagc{#1}% +\begin{LWR@nestspan}% +#2% +\LWR@htmltagc{/#1}% +\end{LWR@nestspan}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@htmlspanclass} \marg{class} \oarg{style} \marg{text} +% \begin{macrocode} +\NewDocumentCommand{\LWR@htmlspanclass}{m o +m}{% +\LWR@ensuredoingapar% +\LWR@subhtmlelementclass{span}{#1}[#2]% +\begin{LWR@nestspan}% +#3% +\LWR@htmltagc{/span}% +\end{LWR@nestspan}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@htmltag} \marg{tag} + +% print an HTML tag: \textless{}tag\textgreater{} +% \begin{macrocode} +\newcommand*{\LWR@htmltagb}[1]{% +\LWR@htmltagc{#1}% +\endgroup% +} + +\newcommand*{\LWR@htmltag}{% +\begingroup\catcode`\_=12 +\LWR@htmltagb% +} +% \end{macrocode} +% \end{macro} + +% \subsection{Block tags and comments} + +% In the following, |\origtexttt| breaks ligatures, which may not be used for \acro{HTML} codes: +% +% \begin{macro}{\LWR@htmlopencomment} +% \begin{macro}{\LWR@htmlclosecomment} +% \begin{macrocode} +\newcommand*{\LWR@htmlopencomment}{% +% \LWR@origtexttt{\LWR@origtextbf{\LWR@origtextless{}!{-}{-}}}% +\begingroup\LWR@origttfamily\LWR@origtextless{}!{-}{-}\endgroup% +} + +\newcommand*{\LWR@htmlclosecomment}{% +% \LWR@origtexttt{\LWR@origtextbf{{-}{-}\LWR@origtextgreater{}}}% +\begingroup\LWR@origttfamily{-}{-}\LWR@origtextgreater{}\endgroup% +} +% \end{macrocode} +% \end{macro} +% \end{macro} + +% \begin{macro}{\LWR@htmlcomment} \marg{comment} +% \begin{macrocode} +\newcommand{\LWR@htmlcomment}[1]{% +\LWR@htmlopencomment{}% +\LWR@origtextrm{#1}% +\LWR@htmlclosecomment{}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LWR@htmlblockcomment} \marg{comment} +% \begin{macrocode} +\newcommand{\LWR@htmlblockcommentb}[1] +{\LWR@stoppars\LWR@htmlcomment{#1}\LWR@startpars\endgroup} + +\newcommand{\LWR@htmlblockcomment} +{% +\begingroup\catcode`\_=12% +\LWR@htmlblockcommentb% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@htmlblocktag} \marg{tag} print a stand-alone \acro{HTML} tag +% \begin{macrocode} +\newcommand*{\LWR@htmlblocktag}[1]{% +\LWR@stoppars% +\LWR@htmltag{#1}% +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@htmlblocktagcomment} \marg{tag} \marg{HTML comment} +% \begin{macrocode} +\NewDocumentCommand{\LWR@htmlblocktagcomment}{m +m}{% +\LWR@stoppars% +\LWR@htmltag{#1}\LWR@htmlcomment{#2}\LWR@orignewline% +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} + + +% \subsection{Div class and element class} + + +% \begin{macro}{\LWR@subhtmlelementclass} \marg{element} \marg{class} \oarg{style} +% +% Factored and reused in several places. +% +% \changes{v0.20}{2017/01/17}{Factored code.} +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@subhtmlelementclass}{m m o}{% +\IfValueTF{#3}% +{% option +\ifthenelse{\equal{#3}{}}% +{\LWR@htmltag{#1 class="#2"}}% empty option +{\LWR@htmltag{#1 class="#2" style="#3"}}% non-empty option +}% option +{\LWR@htmltag{#1 class="#2"}}% no option +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@htmlelementclass} \marg{element} \marg{class} \oarg{style} +% +% \changes{v0.20}{2017/01/17}{Added optional style.} +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@htmlelementclass}{m m o}{% +\LWR@stoppars% +\LWR@subhtmlelementclass{#1}{#2}[#3]% +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@htmlelementclassend} \marg{element} \marg{class} +% \begin{macrocode} +\newcommand*{\LWR@htmlelementclassend}[2]{% +\LWR@stoppars% +\LWR@htmltag{/#1}% +\LWR@htmlcomment{End of #1 ``#2''}% +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@htmldivclass} \marg{class} \oarg{style} +% +% \changes{v0.20}{2017/01/17}{Added optional style.} +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@htmldivclass}{m o}{% +\LWR@htmlelementclass{div}{#1}[#2]% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@htmldivclassend} \marg{class} +% \begin{macrocode} +\newcommand*{\LWR@htmldivclassend}[1]{% +\LWR@htmlelementclassend{div}{#1}% +} +% \end{macrocode} +% \end{macro} + +% \subsection{Single-line elements} + +% A single-line element, without a paragraph tag for the line of text: + +% \begin{macro}{\LWR@htmlelementclassline} +% \marg{element} \marg{class} \oarg{style} \marg{text} +% \begin{macrocode} +\NewDocumentCommand{\LWR@htmlelementclassline}{m m o +m}{% +\LWR@stoppars +\LWR@subhtmlelementclass{#1}{#2}[#3]% +#4% +\LWR@htmltag{/#1} +\LWR@startpars +} +% \end{macrocode} +% \end{macro} +% +% + + +% \subsection{HTML5 semantic elements} + + +% \begin{macro}{\LWR@htmlelement} \marg{element} +% \begin{macrocode} +\newcommand*{\LWR@htmlelement}[1]{% +\LWR@htmlblocktag{#1} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@htmlelementend} \marg{element} +% \begin{macrocode} +\newcommand*{\LWR@htmlelementend}[1]{% +\LWR@stoppars +\LWR@htmltag{/#1} +\LWR@startpars +} + +\end{warpHTML} +% \end{macrocode} +% \end{macro} + + + +% \subsection{High-level block and inline classes} +% \label{sec:highlevelclasses} +% + +% These are high-level commands which allow the creation of +% arbitrary block or inline +% sections which may be formatted with \acro{CSS}. + +% For other direct-formatting commands, see \cref{sec:directformatting}. + + +% \begin{environment}{BlockClass} \marg{class} \oarg{style} \quad +% High-level interface for div classes. +% +% \qquad Ex: |\begin{BlockClass}{class}| text |\end{BlockClass}| +% +% \changes{v0.20}{2017/01/03}{Renamed from "blockclass".} +% \changes{v0.20}{2017/01/17}{Added optional style.} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\NewDocumentEnvironment{BlockClass}{m o} +{ +\LWR@htmldivclass{#1}[#2] +} +{ +\LWR@htmldivclassend{#1} +} +\end{warpHTML} +% \end{macrocode} +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\NewDocumentEnvironment{BlockClass}{m o}{}{} +\end{warpprint} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\BlockClassSingle} \marg{class} \marg{text} \quad +% A single-line |div|, without a paragraph tag for the line of text. +% +% \changes{v0.20}{2017/01/03}{Renamed from "LWR@htmldivclassline".} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\newcommand{\BlockClassSingle}[2]{% +\LWR@htmlelementclassline{div}{#1}{#2}% +} +\end{warpHTML} +% \end{macrocode} +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newcommand{\BlockClassSingle}[2]{#2} +\end{warpprint} +% \end{macrocode} +% +% \end{macro} + + +% \begin{macro}{\InlineClass} \marg{class} \oarg{style} \marg{text} \quad +% High-level interface for inline span classes. +% +% \changes{v0.20}{2017/01/03}{Renamed from "inlineclass".} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\NewDocumentCommand{\InlineClass}{m o m}{% +\LWR@htmlspanclass{#1}[#2]{#3}% +} +\end{warpHTML} +% \end{macrocode} +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\NewDocumentCommand{\InlineClass}{m o m}{#3} +\end{warpprint} +% \end{macrocode} +% \end{macro} + + +% \subsection{Closing HTML tags} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% Sections H1, H2, etc.\ do not need a closing \acro{HTML} tag, but we add a comment for readability: +% \begin{macrocode} +\newcommand*{\LWR@printclosepart} + {\LWR@htmlcomment{Closing part}} +\newcommand*{\LWR@printclosechapter} + {\LWR@htmlcomment{Closing chapter}} +\newcommand*{\LWR@printclosesection} + {\LWR@htmlcomment{Closing section}} +\newcommand*{\LWR@printclosesubsection} + {\LWR@htmlcomment{Closing subsection}} +\newcommand*{\LWR@printclosesubsubsection} + {\LWR@htmlcomment{Closing subsubsection}} +\newcommand*{\LWR@printcloseparagraph} + {\LWR@htmlcomment{Closing paragraph}} +\newcommand*{\LWR@printclosesubparagraph} + {\LWR@htmlcomment{Closing subparagraph}} +% \end{macrocode} + +% Lists require closing \acro{HTML} tags: +% \begin{macrocode} +\newcommand*{\LWR@printcloselistitem} + {\LWR@htmltag{/li}} +\newcommand*{\LWR@printclosedescitem} + {\LWR@htmltag{/dd}} +\newcommand*{\LWR@printcloseitemize} + {\LWR@htmltag{/ul}} +\newcommand*{\LWR@printcloseenumerate} + {\LWR@htmltag{/ol}} +\newcommand*{\LWR@printclosedescription} + {\LWR@htmltag{/dl}} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Paragraph handling} +% \label{sec:parhanding} +% +% These commands generate the HTML paragraph tags when allowed and +% required. +% +% Paragraph tags are or are not allowed depending on many conditions. +% \Cref{sec:parstartstop} has high-level commands which allow +% paragraph-tag generation to start/stop. +% Even when allowed (\cs{LWR@doingstartpars}), +% tags are not generated until a \LaTeX{} paragraph +% is being used (\cs{LWR@doingapar}). +% |LWR@lateximagedepth| is used to prevent nesting tags inside +% a |lateximage|. +% |LWR@spandepth| is used to prevent nesting paragraph tags inside +% a paragraph, which became important inside \cs{fbox} commands and other spans. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \DescribeCounter{LWR@spandepth} +% Do not create paragraph tags inside of an \acro{HTML} span. +% \begin{macrocode} +\newcounter{LWR@spandepth} +\setcounter{LWR@spandepth}{0} +% \end{macrocode} + + +% \DescribeBoolean{LWR@doingstartpars} +% Tells whether paragraphs may be generated. +% \begin{macrocode} +\newbool{LWR@doingstartpars} +\boolfalse{LWR@doingstartpars} +% \end{macrocode} + +% \DescribeBoolean{LWR@doingapar} +% Tells whether have actually generated and are currently processing paragraph text. +% \begin{macrocode} +\newbool{LWR@doingapar} +\global\boolfalse{LWR@doingapar} +% \end{macrocode} + + +% \begin{macro}{\LWR@ensuredoingapar} +% If are about to print something visible, and +% if allowed to start a new paragraph, +% ensure that are |LWR@doingapar|, so that paragraph tags are placed: +% \begin{macrocode} +\newcommand*{\LWR@ensuredoingapar}{% +\ifbool{LWR@doingstartpars}% +{\global\booltrue{LWR@doingapar}}% +{}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@openparagraph} +% \begin{macrocode} +\newcommand*{\LWR@openparagraph} +{% +% \end{macrocode} +% See if paragraph handling is enabled: +% \begin{macrocode} +\ifbool{LWR@doingstartpars}% +{% handling pars +% \end{macrocode} +% See if have already started a \env{lateximage} or a |span|. +% If so, do not generate nested paragraph tags. +% \begin{macrocode} +\ifthenelse{% +\cnttest{\value{LWR@lateximagedepth}}{>}{0} \OR% +\cnttest{\value{LWR@spandepth}}{>}{0}% +}% nested par tags? +% \end{macrocode} +% If so: Do nothing if already started a \env{lateximage} page. Cannot nest a \env{lateximage}. +% Also do nothing if already inside a |span|. Do not nest paragraph tags +% inside a |span|. +% \begin{macrocode} +{}% no nested par tags +% \end{macrocode} +% Else: No \env{lateximage} or |span| has been started yet, +% so it's OK to generate paragraph tags. +% \begin{macrocode} +{% yes nest par tags +\LWR@htmltagc{\LWR@tagregularparagraph}% +% \end{macrocode} +% Manually indent item list labels to avoid left margin intrustion: +% +% \LaTeX{} default list environments use |\@itemdepth| and |\@enumdepth|, but +% \pkg{lwarp} uses the \pkg{enumitem} package, which uses |\@listdepth|. +% +% See if are nested inside an item list: +% \begin{macrocode} +\ifnumcomp{\@listdepth}{>}{0}% +{% +% \end{macrocode} +% If so, leave some horizontal room in the \LaTeX{} \acro{PDF} output for list labels: +% \begin{macrocode} +\LWR@orighspace{1in}% +}{}% +% \end{macrocode} +% Now have started a paragraph. +% \begin{macrocode} +\global\booltrue{LWR@doingapar}% +% \end{macrocode} +% At the endof each paragraph, +% generate closing tag and do regular |/par| stuff. +% (Attempting to use the \pkg{everyhook} |cr| hook +% for \cs{LWR@closeparagraph} does not work well.) +% \begin{macrocode} +\let\par\LWR@closeparagraph% +}% end of yes nest par tags +}% end of handling pars +{}% not handling pars +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\LWR@closeparagraph} +% \changes{v0.20}{2017/01/17}{No break tags in the start/end of a tabular.} +% \changes{v0.20}{2017/01/17}{\cs{unskip} extra spaces.} +% \begin{macrocode} +\newcommand*{\LWR@closeparagraph} +{% +% \end{macrocode} +% See if paragraph handling is enabled: +% \begin{macrocode} +\ifbool{LWR@doingapar}% +% \end{macrocode} +% If currently in paragraph mode: +% \begin{macrocode} +{% handling pars +% \end{macrocode} +% See if already started a \env{lateximage} or a |span|: +% \begin{macrocode} +\ifthenelse{% +\cnttest{\value{LWR@lateximagedepth}}{>}{0} \OR% +\cnttest{\value{LWR@spandepth}}{>}{0}% +}% +% \end{macrocode} +% Do nothing if already started a \env{lateximage} or a |span|, +% but add a parbreak if in a span but not a \env{lateximage}. +% \begin{macrocode} +{% no nested par tags +\ifthenelse{% +\cnttest{\value{LWR@spandepth}}{>}{0}% +\AND% +\cnttest{\value{LWR@lateximagedepth}}{=}{0}% +}% +{% +\ifbool{LWR@intabularmetadata}{}{\unskip\LWR@htmltagc{br /}}% +}% +{}% +}% no nested par tags +% \end{macrocode} +% If have not already started a \env{lateximage} or a |span|: +% \begin{macrocode} +{% yes nest par tags +% \end{macrocode} +% Print a closing tag: +% \begin{macrocode} +\unskip% +\LWR@htmltagc{/\LWR@tagregularparagraph}% +% \end{macrocode} +% No longer doing a paragraph: +% \begin{macrocode} +\global\boolfalse{LWR@doingapar}% +% Disable the special \env{minipage} \& \cs{hspace} interaction +% until a new minipage is found: +% \begin{macrocode} +\global\boolfalse{LWR@minipagethispar}% +}% end of yes nest par tags +}% end of handling pars +% \end{macrocode} +% Add a parbreak if in a span, +% but not in a table outside a row: +% \begin{macrocode} +{% not handling pars +\ifthenelse{\cnttest{\value{LWR@spandepth}}{>}{0}}% +{\ifbool{LWR@intabularmetadata}{}{\unskip\LWR@htmltagc{br /}}}% +{}% +}% not handling pars +% \end{macrocode} +% Finish with regular paragraph processing +% \begin{macrocode} +\LWR@origpar% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \section{Paragraph start/stop handling} +% \label{sec:parstartstop} +% These commands allow/disallow the generation of \acro{HTML} +% paragraph tags. +% +% \Cref{sec:parhanding} has the commands which actually generate +% the tags. +% +% The |everyhook| package is used to generate the opening +% paragraph tags. The closing tags are generated by |\par|. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\LWR@startpars} +% Begin handling \acro{HTML} paragraphs. +% This allows an \acro{HTML} paragraph to start, but one has not yet begun. +% \begin{macrocode} +\newcommand*{\LWR@startpars}% +{% +% \end{macrocode} +% See if currently handling \acro{HTML} paragraphs: +% \begin{macrocode} +\ifbool{LWR@doingstartpars}% +% \end{macrocode} +% If already in paragraph mode, do nothing. +% \begin{macrocode} +{}% +% \end{macrocode} +% If not currently in paragraph mode: +% \begin{macrocode} +{% +% \end{macrocode} +% At the start of each paragraph, generate an opening tag: +% \begin{macrocode} +\PushPreHook{par}{\LWR@openparagraph}% +% \end{macrocode} +% At the end of each paragraph, generate closing tag and do regular |/par| actions: +% \begin{macrocode} +\let\par\LWR@closeparagraph + +}% an intentionally blank line +% \end{macrocode} +% Are now handling paragraphs, but have not yet actually started one: +% \begin{macrocode} +\global\setbool{LWR@doingstartpars}{true}% +% \end{macrocode} +% No <par> tag yet to undo: +% \begin{macrocode} +\global\boolfalse{LWR@doingapar}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@stoppars} +% Stop handling \acro{HTML} paragraphs. +% Any currently open \acro{HTML} paragraph is closed, and no more will be opened. +% \begin{macrocode} +\newcommand*{\LWR@stoppars}% +{% +% \end{macrocode} +% See if currently handling \acro{HTML} paragraphs: +% \begin{macrocode} +\ifbool{LWR@doingapar}% +% \end{macrocode} +% if currently in an \acro{HTML} paragraph: +% \begin{macrocode} +{% +% \end{macrocode} +% Print a closing tag: +% \begin{macrocode} +\unskip% +\LWR@htmltagc{/\LWR@tagregularparagraph}% +% \end{macrocode} +% No longer have an open HTML paragraph: +% \begin{macrocode} +\global\boolfalse{LWR@doingapar}% +% \end{macrocode} +% Disable the special \env{minipage} \& \cs{hspace} interaction +% until a new minipage is found: +% \begin{macrocode} +\global\boolfalse{LWR@minipagethispar} + +}% an intentionally blank line +% \end{macrocode} +% If was not in an \acro{HTML} paragraph: +% \begin{macrocode} +{}% +% \end{macrocode} +% See if currently allowing \acro{HTML} paragraphs: +% \begin{macrocode} +\ifbool{LWR@doingstartpars}% +% \end{macrocode} +% If so: clear the |par| hook to no longer catch paragraphs: +% \begin{macrocode} +{% +\ClearPreHook{par}% +}% +% \end{macrocode} +% Else: do nothing +% \begin{macrocode} +{}% +% \end{macrocode} +% no longer in paragraph mode +% \begin{macrocode} +\global\setbool{LWR@doingstartpars}{false}% +% \end{macrocode} +% no |<p>| tag to undo: +% \begin{macrocode} +\global\boolfalse{LWR@doingapar}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{Page headers and footers} + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% In the following, catcode is manually changes back and forth +% without groups, since new macros are being defined which must +% not be contained within the groups. +% \begin{macrocode} +\newcommand{\LWR@firstpagetop}{} % for the home page alone +\newcommand{\LWR@pagetop}{} % for all other pages +\newcommand{\LWR@pagebottom}{} + +\newcommand{\LWR@setfirstpagetopb}[1]{% +\renewcommand{\LWR@firstpagetop}{#1} +\catcode`\_=8 +} +% \end{macrocode} +% \begin{macro}{\SetFirstPageTop} \marg{text and logos} +% \begin{macrocode} +\newcommand{\SetFirstPageTop}{% +\catcode`\_=12 +\LWR@setfirstpagetopb +} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\newcommand{\LWR@setpagetopb}[1]{% +\renewcommand{\LWR@pagetop}{#1} +\catcode`\_=8 +} +% \end{macrocode} +% \begin{macro}{\SetPageTop} \marg{text and logos} +% \begin{macrocode} +\newcommand{\SetPageTop}{% +\catcode`\_=12 +\LWR@setpagetopb +} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\newcommand{\LWR@setpagebottomb}[1]{% +\renewcommand{\LWR@pagebottom}{#1} +\catcode`\_=8 +} +% \end{macrocode} +% \begin{macro}{\SetPageBottom} \marg{text and logos} +% \begin{macrocode} +\newcommand{\SetPageBottom}{% +\catcode`\_=12 +\LWR@setpagebottomb +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + + +% \section{CSS} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@currentcss} The \acro{CSS} filename to use. +% This may be changed mid-document using \cs{NewCSS}, +% allowing different \acro{CSS} files to be used +% for different sections of the document. + +% \begin{macrocode} +\newcommand*{\LWR@currentcss}{lwarp.css} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\NewCSS} \marg{new-css-filename.css} +% +% Assigns the \acro{CSS} file to be used by the following \acro{HTML} pages. +% \begin{macrocode} +\newcommand*{\LWR@newcssb}[1]{% +\renewcommand*{\LWR@currentcss}{#1} +\catcode`\_=8 +} + +\newcommand*{\NewCSS}{ +\catcode`\_=12 +\LWR@newcssb +} +\end{warpHTML} +% \end{macrocode} +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newcommand*{\NewCSS}[1]{} +\end{warpprint} +% \end{macrocode} +% \end{macro} + + + +% \section{HTML meta description} +% \changes{v0.20}{2016/06/27}{Added \cs{NewHTMLdescription}.} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@currentHTMLdescription} The \acro{HTML} meta description to use. +% +% This is placed inside an \acro{HTML} meta tag at the start of each file. +% This may be changed mid-document using \cs{NewHTMLdescription}, +% allowing different \acro{HTML} descriptions to be used +% for different sections of the document. +% +% Do not use double quotes, and do not exceed 150 characters. + +% \begin{macrocode} +\newcommand{\LWR@currentHTMLdescription}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\NewHTMLdescription} \marg{New \acro{HTML} meta description.} +% +% Assigns the \acro{HTML} file's description meta tag +% \index{HTML>meta tag>description} +% \index{description>HTML meta tag} +% \index{meta tag, HTML>description} +% \begin{macrocode} +\newcommand{\NewHTMLdescription}[1]{% +\renewcommand{\LWR@currentHTMLdescription}{#1} +} + +\end{warpHTML} +% \end{macrocode} +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newcommand{\NewHTMLdescription}[1]{} +\end{warpprint} +% \end{macrocode} +% \end{macro} + + + +% \section{Footnotes} +% \label{sec:footnotes} +% +% \index{footnotes} +% +% +% Several kinds of footnotes are used: in a regular page, in a minipage, or +% as thanks in the titlepage. Each of these is handle differently. +% +% \subsection{Regular page footnotes} +% In \LaTeXe{} printed documents, footnotes are placed at the bottom of the printed page. +% For \acro{HTML}, footnotes will be replaced by page notes +% using the \pkg{pagenote} package. +% Footnotes will then appear at the bottom of the \acro{HTML} page. +% +% See \cref{sec:footnotesregular} for the implementation. +% +% \subsection{Minipage footnotes} +% See \cref{sec:footnotesminipage} for minipage footnotes. +% +% \subsection{Titlepage thanks} +% See \cref{sec:titlehtml} for titlepage footnotes. +% +% +% \subsection{Regular page footnote implementation} +% \label{sec:footnotesregular} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% Delayed in case the user's preamble loaded and adjusted \pkg{pagenote}: +% \begin{macrocode} +\AtEndPreamble{ +% \end{macrocode} + + +% \begin{macro}{\notedivision} +% +% Prints the footnote heading at the end of the page. +% \begin{macrocode} +\renewcommand*{\notedivision} + {\BlockClassSingle{footnoteheader}{}} +% \end{macrocode} +% \end{macro} + +% \begin{docsidebar}[To print the word ``Notes:'' at the top of the footnotes:] +% \begin{Verbatim}[gobble=2,obeytabs,tabsize=4] +% \renewcommand*{\notedivision}| \\ +% {\BlockClassSingle{footnoteheader}{Notes:}} +% \end{Verbatim} +% \end{docsidebar} + +% \begin{macro}{\pagenotesubhead} \marg{num} \marg{title} +% +% Don't print page note headings in \acro{HTML} page notes. +% \begin{macrocode} +\renewcommand{\pagenotesubhead}[2]{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnote} \oarg{id} \marg{text} +% Footnotes now become page notes. +% \begin{macrocode} +\let\footnote\LWR@origpagenote +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\notenuminnotes} \marg{number} +% +% Sets the page notes to use superscripts to match standard classes. +% \begin{macrocode} +\renewcommand{\notenuminnotes}[1]{% + \textsuperscript{#1} } +% \end{macrocode} +% \end{macro} + + +%\begin{macro}{\noteentry} \marg{1: note number} \marg{2: id} \marg{3: text} \marg{4: pagenum} +% +% \changes{v0.14}{2016/03/28}{Fix for label inside a footnote.} +% +% \begin{macrocode} +\let\LWR@orignoteentry\noteentry +\renewcommand{\noteentry}[4]{% +% \end{macrocode} +% \DescribeMacro{\@currentlabel} +% \DescribeMacro{\cref@currentlabel} +% A label may be used inside a note, so the proper \cs{@currentlabel} must be set +% inside a group. Likewise for \pkg{cleveref}'s \cs{cref@currentlabel}. +% \begin{macrocode} +\begingroup% +\renewcommand*{\@currentlabel}{#1}% +\renewcommand*{\cref@currentlabel}{[pagenote][#1][]{#1}}% +% \end{macrocode} +% Re-use \pkg{pageref}'s code, with an extra endgroup: +% \begin{macrocode} +\LWR@orignoteentry{#1}{#2}{#3}{#4}% +\endgroup% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@printpendingnotes} +% Prints the page notes at the end of the section. +% \begin{macrocode} +\newcommand*{\LWR@printpendingnotes}{ +% \end{macrocode} +% If there are footnotes to print, open a new |div| and print the notes. +% \begin{macrocode} +\ifthenelse{\cnttest{\value{pagenote}}{>}{0}}% +{ +\begin{BlockClass}{footnotes} +% \end{macrocode} +% Print any pending endnotes, allowing new endnotes to accumulate. +% \begin{macrocode} +\LWR@origprintnotes* +% \end{macrocode} +% Start over with new page notes. +% \begin{macrocode} +\setcounter{pagenote}{0} +\end{BlockClass} +} +{} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +}% \AtEndPreamble +% \end{macrocode} + + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{Marginpars} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\marginpar} \oarg{left} \marg{right} +\renewcommand{\marginpar}[2][]{% +\LWR@htmlspanclass{marginpar}{#2}% +} +% \end{macro} +% + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \section{Splitting HTML files} +% +% \begin{itemize} +% \item Files are split according to |FileDepth| and |CombineHigherDepths|. +% \item Filenames are sanitized by |\LWR@filenamenoblanks|. +% \item |\LWR@newhtmlfile| finishes an \acro{HTML} page, +% adds a comment to tell where and how to split the file, +% then starts a new \acro{HTML} page. +% \end{itemize} + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \DescribeCounter{FileDepth} \marg{section depth} determines how deeply +% to break into new \acro{HTML} files, similar to |tocdepth|. +% The default of -5 produces one large \acro{HTML} file. +% \begin{macrocode} +\newcounter{FileDepth} +\setcounter{FileDepth}{-5} +% \end{macrocode} + + +% \DescribeBoolean{CombineHigherDepths} Combile higher-level sections +% together into one file? +% \begin{macrocode} +\newbool{CombineHigherDepths} +\booltrue{CombineHigherDepths} +% \end{macrocode} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@thisfilename} +% The currently-active filename or number. +% \begin{macrocode} +\newcommand*{\LWR@thisfilename}{} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@thisnewfilename} +% The filename being sanitized. +% \begin{macrocode} +\newcommand*{\LWR@thisnewfilename}{} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@filenamenoblanks} \marg{filename} +% +% Convert blanks into dashes, removes short words, +% store result in \\ |\LWR@thisfilename|. +% +% Be sure that this does not result in filename collisions! +% \watchout +% Use the optional TOC caption entry parameter for formatting. +% Remember to |\protect| \LaTeX{} commands which appear in +% section names and TOC captions. +% \begin{macrocode} +\newcommand*{\LWR@filenamenoblanks}[1]{% +\begingroup +% \end{macrocode} + +% Locally temporarily disable direct-formatting commands, +% not used in filenames: +% \begin{macrocode} +\renewcommand*{\HTMLunicode}[1]{} +\renewcommand*{\HTMLentity}[1]{##1} +\renewcommand*{\LWR@htmltagc}[1]{} +\DeclareExpandableDocumentCommand{\InlineClass}{m o m}{##3} +% \end{macrocode} +% Ampersand becomes ``and'', which is a short word and is then removed from the filename. +% \begin{macrocode} +\renewcommand*{\&}{and} +\renewcommand{\textit}[1]{##1} +\renewcommand{\textsc}[1]{##1} +\renewcommand{\textsl}[1]{##1} +\renewcommand{\textbf}[1]{##1} +\renewcommand{\texttt}[1]{##1} +\renewcommand{\textsf}[1]{##1} +\renewcommand{\textrm}[1]{##1} +\renewcommand{\textsuperscript}[1]{##1} +\renewcommand{\textsubscript}[1]{##1} +% \end{macrocode} +% Replaces common symbols and short words with hyphens: +% +% \begin{macrocode} +\edef\LWR@thisnewfilename{#1} +\fullexpandarg +% \end{macrocode} +% Convert spaces into hyphens: +% \begin{macrocode} +\StrSubstitute{\LWR@thisnewfilename}{ }{-}[\LWR@thisnewfilename] +% \end{macrocode} +% Convert punctutation into hyphens: +% ^^A \StrSubstitute{\LWR@thisnewfilename}{é}{e}[\LWR@thisnewfilename] +% \begin{macrocode} +\StrSubstitute{\LWR@thisnewfilename}{,}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{'}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}% +{\LWR@origampersand}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{+}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{,}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{/}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{:}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{;}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{=}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{?}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{@}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{"}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}% +{\textless}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}% +{\textgreater}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{\#}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{\%}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{\{}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{\}}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{|}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}% +{\textbackslash}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{^}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{~{}}{-}[\LWR@thisnewfilename] +% "~{}" for babel +\StrSubstitute{\LWR@thisnewfilename}{[}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{]}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{`}{-}[\LWR@thisnewfilename] +% \end{macrocode} +% Convert short words: +% \begin{macrocode} +\StrSubstitute{\LWR@thisnewfilename}{-s-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-S-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-a-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-A-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-an-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-AN-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-to-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-TO-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-by-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-BY-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-of-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-OF-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-and-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-AND-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-for-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-FOR-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-the-}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{-THE-}{-}[\LWR@thisnewfilename] +% \end{macrocode} +% Convert multiple hyphens: +% \begin{macrocode} +\StrSubstitute{\LWR@thisnewfilename}{-----}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{----}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{---}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{--}{-}[\LWR@thisnewfilename] +\StrSubstitute{\LWR@thisnewfilename}{—}{-}[\LWR@thisnewfilename] +% emdash +\StrSubstitute{\LWR@thisnewfilename}{–}{-}[\LWR@thisnewfilename] +% endash +\global\let\LWR@thisfilename\LWR@thisnewfilename% return a global result +\endgroup +} +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\LWR@newhtmlfile} \marg{section name} +% \changes{v0.18}{2016/04/23}{Sidetoc after title, improving responsive design.} +% +% Finishes the current \acro{HTML} page with footnotes, footer, navigation, +% then starts a new \acro{HTML} page with an \acro{HTML} comment telling where to +% split the page and what the new filename and \acro{CSS} are, then adds +% navigation, side TOC, header, and starts the text body. +% \begin{macrocode} +\newcommand*{\LWR@newhtmlfile}[1]{ +% \end{macrocode} + +% At the bottom of the ending file: + +% \begin{macrocode} +\LWR@htmlelementclassend{section}{textbody} + +\LWR@printpendingnotes + +\LWR@htmlelement{footer} + +\LWR@pagebottom + +\LWR@htmlelementend{footer} +% \end{macrocode} + +% No bottom navigation if are finishing the home page: +% Presumably has a table-of-contents printed. +% \begin{macrocode} +\ifnumcomp{\value{LWR@htmlfilenumber}}{>}{0}{\LWR@botnavigation}{} +% \end{macrocode} + +% End of this \acro{HTML} file: +% \begin{macrocode} +\LWR@stoppars +\LWR@htmltag{/body}\LWR@orignewline +\LWR@htmltag{/html}\LWR@orignewline + +\addtocounter{LWR@htmlfilenumber}{1}% +% \end{macrocode} + +% If using a filename, create a version without blanks. +% The filename without blanks will be placed into \cs{LWR@thisfilename}. +% If not using a filename, the file number will be used instead. +% \changes{v0.12}{2016/03/13}{Bugfix: TOC with numbered files.} +% \begin{macrocode} +\ifbool{FileSectionNames}% +{\LWR@filenamenoblanks{#1}} +{\renewcommand*{\LWR@thisfilename}{\theLWR@htmlfilenumber}} +% \end{macrocode} + +% Include an \acro{HTML} comment to instruct lwarpmk +% where to split the files apart. +% Uses pipe-separated fields for |split_html.gawk|. +% Uses monospaced font with ligatures disabled for everything except the title. +% \begin{macrocode} +\LWR@htmlblockcomment{% +\LWR@origtexttt{|Start file|% +\LWR@htmlsectionfilename{\LWR@thisfilename}|}% +} +% \end{macrocode} + + +% At the top of the starting file: +% \begin{macrocode} +\LWR@stoppars + +\LWR@filestart{ — #1}% there is an EMdash in front of the #1 + +\LWR@topnavigation + +\LWR@htmlelement{header} + +\LWR@pagetop + +\LWR@htmlelementend{header} + +\LWR@printthetitle + +\LWR@sidetoc + +\LWR@htmlelementclass{section}{textbody} + +\LWR@stoppars + +\setcounter{LWR@latestautopage}{\value{page}} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{Sectioning} + +% +% Sectioning and cross-references have been emulated from scratch, rather +% than try to patch several layers of existing \LaTeX{} code and packages. +% Formatting is handled by \acro{CSS}, so the emulated code has much less +% work to do than the print versions. +% +% Section names and the resulting filenames with accented characters +% \margintag{Unicode} +% are partially supported, depending on the ability of +% |pdflatex| to generate characters and |pdftotext| to read them. +% If extra symbols appear in the text, +% \watchout +% it may be that |pdflatex| is actually producing a symbol over or under a +% character, resulting in |pdftotext| picking up the accent symbol separately. +% +% \XeLaTeX{} and \LuaLaTeX{} directly support accented section and file names. +% \index{accents}\index{Unicode>file \& section names}\index{UTF-8>file \& section names} +% \index{XeLaTeX>file \& section names} +% \index{LuaLaTeX>file \& section names} +% +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% +% \subsection{Book class commands} +% +% +% \begin{macro}{\mainmatter} +% +% Declare the main matter section of the document. Does not reset the page number, +% \watchout +% which must be consecutive arabic numbers for the \acro{HTML} conversion. +% \begin{macrocode} +\newbool{LWR@mainmatter} +\DeclareDocumentCommand{\mainmatter}{}{% +\booltrue{LWR@mainmatter}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\frontmatter} +% +% Declare the front matter section of the document, +% using arabic numbering for the internal numbering. Does not reset the page number. +% \begin{macrocode} +\DeclareDocumentCommand{\frontmatter}{}{% +\boolfalse{LWR@mainmatter}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\backmatter} +% +% Declare the back matter section of the document. Does not reset the page number. +% \begin{macrocode} +\DeclareDocumentCommand{\backmatter}{}{% +\boolfalse{LWR@mainmatter} +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Sectioning support macros} +% +% \begin{macro}{\LWR@sectionumber} \marg{section type} +% +% Typeset a section number and its trailing space with CSS formatting: +% \begin{macrocode} +\newcommand*{\LWR@sectionnumber}[1]{% +\InlineClass{sectionnumber}{#1} % +} +% \end{macrocode} +% \end{macro} + + +% \DescribeObject{autosec} A tag used by the TOC and index. +% +% \begin{macro}{\LWR@createautosec} \marg{section type} +% +% Create an autosection tag. +% \begin{macrocode} +\newcommand*{\LWR@createautosec}[1]{% +\LWR@htmltag{#1 id="autosec-\thepage"{}}% +} +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\LWR@pushoneclose} \marg{depth} \marg{printclose} +% Stacks the new sectioning level's closing tag, +% to be used when this section is closed some time later. +% +% |\LWR@stoppars| must be executed first. +% \watchout +% \begin{macrocode} +\NewDocumentCommand{\LWR@pushoneclose}{m m}{\pushclose{#2}{#1}} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@startnewdepth} \marg{depth} \marg{printclose} +% +% Closes currently stacked tags of a lesser level, +% then opens the new nesting level by saving this new sectioning +% level's closing tag for later use. +% +% |\LWR@stoppars| must be executed first. +% \watchout +% \begin{macrocode} +\NewDocumentCommand{\LWR@startnewdepth}{m m}{% +% \end{macrocode} +% Close any stacked sections up to this new one. +% \begin{macrocode} +\LWR@closeprevious{#1}% +% \end{macrocode} +% Push a new section depth: +% \begin{macrocode} +\LWR@pushoneclose{#1}{#2}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% \DescribeCounter{LWR@prevFileDepth} Remembers the previous |LWR@FileDepth|. +% +% Initialized to a deep level so that any section will trigger a new \acro{HTML} +% page after the home page. +% \begin{macrocode} +\newcounter{LWR@prevFileDepth} +\setcounter{LWR@prevFileDepth}{\LWR@depthsubparagraph} +% \end{macrocode} +% +% +% +% \begin{macro}{\LWR@section} * \oarg{TOC name} \marg{name} \marg{sectiontype} +% +% \changes{v0.20}{2017/01/09}{Combined higher-level sections together into files.} +% +% The common actions for the high-level sectioning commands. +% \begin{macrocode} +\DeclareDocumentCommand{\LWR@section}{m m m m}{% +\LWR@traceinfo{LWR@section}% +\LWR@stoppars% +% \end{macrocode} +% Cancel special \env{minipage} horizontal space interaction: +% \begin{macrocode} +\global\boolfalse{LWR@minipagethispar}% +% \end{macrocode} +% Generate a new LaTeX page so that TOC and index page number points to the section: +% \begin{macrocode} +\LWR@orignewpage% + +% \end{macrocode} +% Start a new \acro{HTML} file if not starred, and is a shallow sectioning depth: +% \begin{macrocode} +\LWR@traceinfo{LWR@section: testing about to start a new HTML file}% +\IfBooleanTF{#1}{}{% not starred +\ifthenelse{% +\cnttest{\csuse{LWR@depth#4}}{<=}{\value{FileDepth}}% +\AND% +\(% +\NOT\boolean{CombineHigherDepths}\OR% +\cnttest{\csuse{LWR@depth#4}}{<=}{\value{LWR@prevFileDepth}}% +\)% +}% +% \end{macrocode} +% If so: start a new \acro{HTML} file: +% \begin{macrocode} +{% new file +\LWR@traceinfo{LWR@section: new HTML file}% +% \end{macrocode} +% See if there was an optional TOC name entry: +% \begin{macrocode} +\IfNoValueTF{#2}% +% \end{macrocode} +% If no optional entry +% \begin{macrocode} +{\LWR@newhtmlfile{#3}}% +% \end{macrocode} +% If yes an optional entry +% \begin{macrocode} +{\LWR@newhtmlfile{#2}}% +}% new file +% \end{macrocode} +% Else: No new \acro{HTML} file: +% \begin{macrocode} +{}% not new file +}% not starred +% \end{macrocode} +% Remember this section's name for \cs{nameref}: +% \begin{macrocode} +\LWR@traceinfo{LWR@section: about to LWR@setlatestname}% +\IfValueTF{#2}{\LWR@setlatestname{#2}}{\LWR@setlatestname{#3}}% +% \end{macrocode} +% Print an opening comment with the level and the name; +% ex: ``section'' ``Introduction'' +% \begin{macrocode} + +\LWR@htmlcomment{Opening #4 ``#3''{}} + +% \end{macrocode} +% For inline sections paragraph and subparagraph, start a new paragraph now: +% \begin{macrocode} +\ifthenelse{% +\cnttest{\csuse{LWR@depth#4}}{>=}{\LWR@depthparagraph}% +}% +{\LWR@startpars} +{} +% \end{macrocode} +% Create the opening tag with an autosec: +% \begin{macrocode} +\LWR@createautosec{\csuse{LWR@tag#4}}% +% \end{macrocode} +% If not starred, step counter and add to TOC: +% \begin{macrocode} +\IfBooleanTF{#1}% +{}% starred +{% not starred +% \end{macrocode} +% Only add a numbered TOC entry if section number is not too deep: +% \begin{macrocode} +\ifthenelse{% +\cnttest{\csuse{LWR@depth#4}}{<=}{\value{secnumdepth}}% +}% +{% if secnumdepth +% \end{macrocode} +% If in the main matter, step the counter and add the TOC entry. +% For |article| class, \pkg{lwarp} assumes that all is mainmatter. +% \begin{macrocode} +\LWR@traceinfo{LWR@section: about to test main matter}% +\ifbool{LWR@mainmatter}% +{% +\LWR@traceinfo{LWR@section: yes mainmatter}% +\refstepcounter{#4}% +% \end{macrocode} +% Add main matter numbered TOC entry with the TOC name or the regular name: +% \begin{macrocode} +\LWR@traceinfo{LWR@section: about to addcontentsline}% +\addcontentsline{toc}{#4}% +{\protect\LWR@sectionnumber{\csuse{the#4}}% +\IfValueTF{#2}{#2}{#3}}% +\LWR@traceinfo{LWR@section: finished addcontentsline}% +}% end of if main matter +% \end{macrocode} +% If not main matter, add unnumbered TOC name or regular name: +% \begin{macrocode} +{% not main matter +\LWR@traceinfo{LWR@section: no main matter}% +\addcontentsline{toc}{#4}{\IfValueTF{#2}{#2}{#3}}% +}% end of not main matter +}% end of secnumdepth +% \end{macrocode} +% Deeper than secnumdepth, so add an unnumbered TOC entry: +% \begin{macrocode} +{% +\addcontentsline{toc}{#4}{\IfValueTF{#2}{#2}{#3}}% +}% +% \end{macrocode} +% For part, print the section type: +% \begin{macrocode} +\ifbool{LWR@mainmatter}% +{% +\ifthenelse{% +\(\cnttest{\csuse{LWR@depth#4}}{<=}% +{\value{secnumdepth}}\) \AND +\(\cnttest{\csuse{LWR@depth#4}}{<=}{\LWR@depthpart}\) +}% +{\csuse{#4name}~{}}% +{}% +% \end{macrocode} +% Print the section number: +% \begin{macrocode} +\LWR@traceinfo{LWR@section: about to print section number}% +\ifthenelse{% +\cnttest{\csuse{LWR@depth#4}}{<=}{\value{secnumdepth}}% +}% +{\protect\LWR@sectionnumber{\csuse{the#4}}}% +{}% +\LWR@traceinfo{LWR@section: finished print section number}% +}{}% +}% end of not starred +% \end{macrocode} +% Print the section name: +% \begin{macrocode} +#3 +% \end{macrocode} +% close the heading tag, such as /H2 +% \begin{macrocode} +\LWR@htmltag{\csuse{LWR@tag#4end}}% +% \end{macrocode} +% Generate a \LaTeX{} label: +% \begin{macrocode} +\label{autopage-\thepage}% +% \end{macrocode} +% Start paragraph handing unless is an inline paragraph or subparagraph: +% \begin{macrocode} +\ifthenelse{% +\cnttest{\csuse{LWR@depth#4}}{<}{\LWR@depthparagraph}}% +{\LWR@startpars}% +{}% +% \end{macrocode} +% If not starred, remember the previous depth to +% possibly trigger a new \acro{HTML} page. +% +% A starred section does not trigger a new \acro{HTML} page at the beginning +% of this macro, so it should not affect it here at the end either. +% This became an issue when a \cs{listoftables} was tested in the middle of +% the document. The \cs{chapter*} for the list was not allowing +% a new \acro{HTML} page for the section following it +% while |CombineHigherDepths| was true. +% \begin{macrocode} +\IfBooleanTF{#1}{}{% not starred +\setcounter{LWR@prevFileDepth}{\csuse{LWR@depth#4}}% +}% not starred +\LWR@traceinfo{LWR@section: done}% +} +% \end{macrocode} +% \end{macro} + + + +% \subsection{\textbackslash{}section and friends} + +% \begin{macro}{\part} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\@ifundefined{chapter} +{} +{% +\DeclareDocumentCommand{\part}{s o m}{% +\LWR@stoppars% + +\LWR@startnewdepth{\LWR@depthpart}{\LWR@printclosepart}% + +\LWR@section{#1}{#2}{#3}{part}% +} +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\chapter} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\@ifundefined{chapter} +{} +{% +\DeclareDocumentCommand{\chapter}{s o m}{% +\LWR@traceinfo{chapter #3}% +\LWR@stoppars% +\LWR@startnewdepth{\LWR@depthchapter}{\LWR@printclosechapter}% + +\LWR@traceinfo{chapter: about to LWR@section}% +\LWR@section{#1}{#2}{#3}{chapter}% +\LWR@traceinfo{chapter: done}% +} +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\section} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\DeclareDocumentCommand{\section}{s o m}{% +\LWR@stoppars% + +\LWR@startnewdepth{\LWR@depthsection}{\LWR@printclosesection}% + +\LWR@section{#1}{#2}{#3}{section}% +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\subsection} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\DeclareDocumentCommand{\subsection}{s o m}{% +\LWR@stoppars% + +\LWR@startnewdepth{\LWR@depthsubsection}{\LWR@printclosesubsection}% + +\LWR@section{#1}{#2}{#3}{subsection}% +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\subsubsection} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\DeclareDocumentCommand{\subsubsection}{s o m}{% +\LWR@stoppars% + +\LWR@startnewdepth{\LWR@depthsubsubsection}% +{\LWR@printclosesubsubsection}% + +\LWR@section{#1}{#2}{#3}{subsubsection}% +} +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\paragraph} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\DeclareDocumentCommand{\paragraph}{s o m}{% +\LWR@stoppars% + +\LWR@startnewdepth{\LWR@depthparagraph}{\LWR@printcloseparagraph}% + +\LWR@section{#1}{#2}{#3}{paragraph}% +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\subparagraph} * \oarg{TOC name} \marg{name} +% \begin{macrocode} +\DeclareDocumentCommand{\subparagraph}{s o m}{% +\LWR@stoppars% + +\LWR@startnewdepth{\LWR@depthsubparagraph}{\LWR@printclosesubparagraph}% + +\LWR@section{#1}{#2}{#3}{subparagraph}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Starting a new file} +% \label{sec:startingfile} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\MetaLanguage} Default language for the \acro{HTML} |lang| tag. +% \index{language HTML metadata} +% \begin{macrocode} +\newcommand*{\MetaLanguage}{en-US} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@filestart} \marg{title\_suffix} +% Creates the opening \acro{HTML} tags. +% \changes{v0.19}{2016/05/25}{lwarp\_mathjax.txt loaded.} +% \changes{v0.20}{2016/06/27}{Adds meta description.} +% +% \begin{macrocode} +\newcommand*{\LWR@filestart}[1]{ +% \end{macrocode} +% Locally temporarily disable direct-formatting commands: +% \begin{macrocode} +\begingroup +\renewcommand{\textit}[1]{##1}% not used in filenames +\renewcommand{\textsc}[1]{##1} +\renewcommand{\textsl}[1]{##1} +\renewcommand{\textbf}[1]{##1} +\renewcommand{\texttt}[1]{##1} +\renewcommand{\textsf}[1]{##1} +\renewcommand{\textrm}[1]{##1} +\renewcommand{\textsuperscript}[1]{##1} +\renewcommand{\textsubscript}[1]{##1} +\renewcommand*{\HTMLunicode}[1]{} +\renewcommand*{\HTMLentity}[1]{} +\RenewDocumentCommand{\LWR@htmlspanclass}{m o +m}{##3} +\DeclareExpandableDocumentCommand{\InlineClass}{m o m}{##3} +% \end{macrocode} +% Create the page's \acro{HTML} header: +% \begin{macrocode} +\LWR@htmltag{!DOCTYPE html}\LWR@orignewline +% \end{macrocode} +% The language is user-adjustable: +% \begin{macrocode} +\LWR@htmltag{html lang="\MetaLanguage"{}}\LWR@orignewline +% \end{macrocode} +% Start of the meta data: +% \begin{macrocode} +\LWR@htmltag{head}\LWR@orignewline +% \end{macrocode} +% Charset is fixed at UTF-8: +% \begin{macrocode} +\LWR@htmltag{meta charset="UTF-8" /}\LWR@orignewline +% \end{macrocode} +% \pkg{lwarp} is the generator: +% \index{HTML>meta tag>generator} +% \index{generator>HTML meta tag} +% \index{meta tag, HTML>generator} +% \begin{macrocode} +\LWR@htmltag{meta name="generator" content="LaTeX lwarp package" /}% + \LWR@orignewline +% \end{macrocode} +% If there is a description, add it now: +% \begin{macrocode} +\ifdefempty{\LWR@currentHTMLdescription}{}{% +\LWR@htmltag{% +meta name="description" content="\LWR@currentHTMLdescription" /}% + \LWR@orignewline +}% +% \end{macrocode} +% Mobile-friendly viewport: +% \index{HTML>meta tag>viewport} +% \index{viewport>HTML meta tag} +% \index{meta tag, HTML>viewport} +% \begin{macrocode} +\LWR@htmltag{meta name="viewport" % +content="width=device-width, initial-scale=1.0" /}% + \LWR@orignewline +% \end{macrocode} +% IE patch: +% \begin{macrocode} +\LWR@htmltag{!{-}{-}[if lt IE 9]}\LWR@orignewline +\LWR@htmltag{% +script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"{}} +\LWR@htmltag{/script}\LWR@orignewline +\LWR@htmltag{![endif]{-}{-}}\LWR@orignewline +% \end{macrocode} +% The page's title: +% \begin{macrocode} +\LWR@htmltag{title}\thetitle#1\LWR@htmltag{/title}\LWR@orignewline +% \end{macrocode} +% The page's stylesheet: +% \begin{macrocode} +\LWR@htmltag{% +link rel="stylesheet" type="text/css" href="\LWR@currentcss" /}% +\LWR@orignewline +% \end{macrocode} +% Optional MathJax support. The \acro{HTML} tags must be turned off +% during the verbatim input, and the paragraph handling which was +% turned on at the end of verbatim input must be immediately turned off +% again. +% \begin{macrocode} +\ifbool{mathjax}% +{% +\boolfalse{LWR@verbtags} +\VerbatimInput{lwarp_mathjax.txt}% +\booltrue{LWR@verbtags} +\LWR@stoppars +}% end of mathjax +{}% +% \end{macrocode} +% End of the header: +% \begin{macrocode} +\LWR@htmltag{/head}\LWR@orignewline +% \end{macrocode} +% Start of the body: +% \begin{macrocode} +\LWR@htmltag{body}\LWR@orignewline +\endgroup +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + +% \section{Starting HTML output} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\LWR@LwarpStart} +% \changes{v0.19}{2016/06/01}{Enabled \textbackslash\textbackslash{} equal to \cs{newline}.} +% Executed at the beginning of the entire document. +% \begin{macrocode} +\newcommand*{\LWR@LwarpStart} +{% +% \end{macrocode} +% Expand and detokenize \cs{HomeHTMLFileName} and \cs{HTMLFileName}: +% \begin{macrocode} +\edef\LWR@strresult{\HomeHTMLFileName} +\edef\HomeHTMLFileName{\detokenize\expandafter{\LWR@strresult}} +\edef\LWR@strresult{\HTMLFileName} +\edef\HTMLFileName{\detokenize\expandafter{\LWR@strresult}} +% \end{macrocode} +% Force onecolumn: +% \begin{macrocode} +\LWR@origonecolumn% +% \end{macrocode} +% Reduce chance of line overflow in verbatim environments: +% \begin{macrocode} +\LWR@origscriptsize% +% \end{macrocode} +% In \acro{PDF} output, don't allow line breaks to interfere with \acro{HTML} tags: +% \begin{macrocode} +\LWR@origraggedright% +\let\\\LWR@endofline% +% \end{macrocode} +% Spread the lines for |pdftotext| to read them well: +% \begin{macrocode} +\linespread{1.3}% +% \end{macrocode} +% For |pdftotext| to reliably identify paragraph splits: +% \begin{macrocode} +\setlength{\parindent}{0pt} +\setlength{\parskip}{2ex} +% \end{macrocode} +% +% For the |lateximages| command file: +% +% \begin{macrocode} +\ifbool{usingOSwindows} +{% Windows: +\immediate\openout\LWR@file=lateximages.cmd +} +{% Unix: +\immediate\openout\LWR@file=lateximages.sh +\immediate\write\LWR@file{\LWR@hashmark!\OSShellPath} +} +% \end{macrocode} +% The first action of the command file is to create the +% |lateximages| directory: +% \begin{macrocode} +\immediate\write\LWR@file{\OSmkdir lateximages\OSPathSymbol} +% \end{macrocode} +% +% Removes space after the caption in the \acro{HTML}: +% \begin{macrocode} +\setlength{\belowcaptionskip}{-3ex} +% \end{macrocode} +% Redefine the plain page style to be empty when used by index pages: +% \begin{macrocode} +\renewcommand{\ps@plain}{} +% \end{macrocode} +% Not used in the \acro{HTML} environment: +% \DescribeMacro{\centering} +% \DescribeMacro{\raggedleft} +% \DescribeMacro{\raggedright} +% \begin{macrocode} +\renewcommand*{\centering}{} +\renewcommand*{\raggedleft}{} +\renewcommand*{\raggedright}{} +% \end{macrocode} +% Plug in some new actions. +% This is done just before the document start +% so that they won't be over-written by some other package. +% \changes{v0.13}{2016/03/23}{\cs{up} and \cs{fup}} +% +% Tabular: +% \begin{macrocode} +\let\LWR@origtabular\tabular +\let\LWR@origendtabular\endtabular +\let\tabular\LWR@tabular +\let\endtabular\endLWR@tabular +% \end{macrocode} +% Float captions: +% \begin{macrocode} +\let\LWR@origcaption\caption +% \end{macrocode} +% +% Labels: +% \cs{ltx@label} is used in \pkg{amsmath} environments and is also +% patched by \pkg{cleveref}. +% \index{label>in HTML} +% \margintag{Label in \acro{HTML}} +% \changes{v0.20}{2017/01/30}{Fix: math cross references.} +% \begin{macrocode} +\let\ltx@label\LWR@htmlmathlabel +% \end{macrocode} +% Logos: +% \begin{macrocode} +\let\TeX\LWR@TeX +\let\LaTeX\LWR@LaTeX +\let\LuaTeX\LWR@LuaTeX +\let\LuaLaTeX\LWR@LuaLaTeX +\let\XeTeX\LWR@XeTeX +\let\XeLaTeX\LWR@XeLaTeX +\let\ConTeXt\LWR@ConTeXt +% \end{macrocode} +% Graphics: +% \begin{macrocode} +\let\textcolor\LWR@textcolor +\let\pagecolor\LWR@pagecolor +\let\colorbox\LWR@colorbox +\let\fcolorbox\LWR@fcolorbox +\let\rotatebox\LWR@rotatebox +\let\scalebox\LWR@scalebox +\let\reflectbox\LWR@reflectbox +% \end{macrocode} +% Not yet started any paragraph handling: +% \begin{macrocode} +\global\boolfalse{LWR@doingapar} +\global\boolfalse{LWR@doingstartpars} +% \end{macrocode} +% Start a new \acro{HTML} file and a header: +% \begin{macrocode} +\LWR@filestart{} +\LWR@htmltag{header}\LWR@orignewline +\LWR@startpars +\LWR@firstpagetop +\LWR@stoppars +\LWR@htmltag{/header}\LWR@orignewline +\LWR@htmltag{section class="textbody"{}} +\LWR@origpagestyle{empty} +% \end{macrocode} +% Document and page settings: +% \begin{macrocode} +\mainmatter +\LWR@origpagenumbering{arabic} +% \end{macrocode} +% Set default titlepage thanks footnote marks. See \cref{sec:titlehtml}. +% \begin{macrocode} +\if@titlepage + \thanksmarkseries{arabic} +\else + \thanksmarkseries{fnsymbol} +\fi +% \end{macrocode} +% +% Initial default patch for fancyvrb: +% \begin{macrocode} +\fvset{frame=none}% +% \end{macrocode} +% +% The ampersand is redefined active, and acts depending +% on whether it is inside a tabular. +% \begin{macrocode} +\catcode`\&=\active +% \end{macrocode} +% Allow \acro{HTML} paragraphs to begin: +% \begin{macrocode} +\LWR@startpars +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Ending HTML output} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\LWR@requesttoc} \marg{boolean} \marg{suffix} +% \changes{v0.18}{2016/05/19}{Reorganize \cs{HomeHTMLFilename} logic.} +% Requests that a toc, lof, or lot be generated. + +% \begin{macrocode} +\newcommand*{\LWR@requesttoc}[2]{% +\ifbool{#1} +{ +\expandafter\newwrite\csuse{tf@#2} +\immediate\openout \csuse{tf@#2} \jobname.#2\relax +}{} +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@LwarpEnd} +% Final stop of all \acro{HTML} output: +% \begin{macrocode} +\newcommand*{\LWR@LwarpEnd} +{ +\LWR@stoppars +\LWR@closeprevious{\LWR@depthfinished} +% \end{macrocode} +% At the bottom of the ending file: + +% Close the textbody: +% \begin{macrocode} +\LWR@htmlelementclassend{section}{textbody} +% \end{macrocode} +% Print any pending footnotes: +% \begin{macrocode} +\LWR@printpendingnotes +% \end{macrocode} +% Create the footer: +% \begin{macrocode} +\LWR@htmlelement{footer} + +\LWR@pagebottom + +\LWR@htmlelementend{footer} +% \end{macrocode} + +% No bottom navigation if are finishing the home page: \\ +% Presumably has a table-of-contents printed. +% \begin{macrocode} +\ifnumcomp{\value{LWR@htmlfilenumber}}{>}{0}{\LWR@botnavigation}{} +% \end{macrocode} +% \begin{macrocode} +\LWR@stoppars% final stop of all paragraphs +% \end{macrocode} +% Finish the HTML file: +% \begin{macrocode} +\LWR@htmltag{/body}\LWR@orignewline +\LWR@htmltag{/html}\LWR@orignewline +% \end{macrocode} +% Seems to be required sometimes: +% \begin{macrocode} +\LWR@orignewpage +% \end{macrocode} +% For \env{lateximage} commands: +% \begin{macrocode} +\immediate\closeout\LWR@file +} +% \end{macrocode} +% \end{macro} + + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + +% \section{Titles and the \protect\pkg{titling} package} +% \label{sec:titles} +% Supports and extends the \pkg{titling} package. +% +% Additional functions include \cs{published} and \cs{subtitle}, and the +% \cs{author} command has an additional \cs{affiliation} command to provide +% an affiliation and other additional information for each author in the +% title page. The affiliation information is removed when using \cs{theauthor} +% in the main text. +% +% The \pkg{titling} package maintains the definitions of \cs{thetitle}, +% \cs{theauthor}, etc., after the title has been typeset. +% These commands are to be used to refer to the document's title +% and author, etc., in the main text. +% These definitions +% have the \cs{thanks} and \cs{affiliation} removed, and for author the +% \cs{and} is replaced to generate a simple inline list of authors separated +% by commas. +% +% \cs{printtitle}, \cs{printauthor}, etc., are provided for use inside +% the \env{titlepage} or \env{titlingpage} environments, and these retain +% the \cs{thanks} and \cs{affiliation}. +% +% Several additional hooks are provided in addition to \pkg{titling}: +% \begin{description} +% \ItemDescribeMacro{\maketitlehookaa} Between ``published'' and the title. +% \ItemDescribeMacro{\maketitlehookaaa} Between the title and the subtitle. +% \ItemDescribeMacro{\prepublished} Before the ``published'' field. +% \ItemDescribeMacro{\postpublished} After the ``published'' field. +% \ItemDescribeMacro{\presubtitle} Before the subtitle. +% \ItemDescribeMacro{\postsubtitle} After the subtitle. +% \end{description} +% +% \DescribeMacro{\printthanks} +% \cs{printthanks} has been added to force the printing of thanks inside +% a \env{titlingpage} environment when \cs{maketitle} is not used. +% +% Inside a \cs{titlepage} or \cs{titlingpage} environment, use +% \cs{thanks} for footnotes, do not use \cs{footnote}. +% \watchout[No footnotes!] +% +% At the end of the \env{titlingpage} environment, footnote marks are forced to +% reset to zero. +% +% Inside a \env{titlingpage} environment with the |article| document class, +% thanks marks will be |fnsymbol| instead of |arabic|. |arabic| is usually +% used when inside \env{titlepage} environments where the title page is +% on its own page, but is not automatically used +% inside a \env{titlingpage} environment. +% +% To force the thanks marks to +% be |arabic|: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \begin{titlingpage} +% \thanksmarkseries{arabic} +% ... +% \end{Verbatim} +% +% +% +% \subsection{Setting the title, etc.} +% +% The following provide setting commands for both \acro{HTML} and print outputs. +% +% \DescribeMacro{@published} +% \DescribeMacro{@title} +% \DescribeMacro{@subtitle} +% \DescribeMacro{@author} +% \DescribeMacro{@date} +% \cs{@title}, \cs{@subtitle}, \cs{@author}, etc.\ store the values +% as originally assigned, including any \cs{thanks}, \cs{and}, or \cs{affiliation}. +% These are low-level macros intended to be used by other macros +% only inside a \env{titlepage} or \env{titlingpage}, +% and are used by \cs{maketitle}. +% The author is printed inside a single-column table, +% which becomes multiple single-column tables if multiples authors are included. +% +% \DescribeMacro{\printpublished} +% \DescribeMacro{\printtitle} +% \DescribeMacro{\printsubtitle} +% \DescribeMacro{\printauthor} +% \DescribeMacro{\printdate} +% \cs{printtitle}, \cs{printsubtitle}, etc.\ are user-level macros intended to +% be used in \env{titlepage} and \env{titlingpage} environments in cases where +% \cs{maketitle} is not desired. These commands preserve the \cs{thanks}, etc., +% and should not be used in the main text. +% The author is printed inside a single-column table, +% which becomes multiple single-column tables if multiples authors are included. +% +% \DescribeMacro{\thepublished} +% \DescribeMacro{\thetitle} +% \DescribeMacro{\thesubtitle} +% \DescribeMacro{\theauthor} +% \DescribeMacro{\thedate} +% \cs{thetitle}, \cs{thesubtitle}, \cs{theauthor}, etc.\ are user-level +% sanitized versions which have removed the \cs{thanks} and \cs{affiliation}, +% and \cs{and} is changed for inline text usage. +% The author is printed inline without \cs{affiliation} or \cs{thanks}, +% with \cs{and} placing commas between multiple authors. +% Thus, these commands are to be used in the main text whenever the user +% wishes to refer to the document's title and such. One practical use for this +% is to place the authors at the bottom of each \acro{HTML} page, such as: +% +% \DescribeMacro{\SetPageBottom} \marg{text} +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \SetPageBottom{ +% \begin{center}\textcopyright~2016 \theauthor\end{center} +% } +% \end{Verbatim} + + +% +% \DescribeMacro{\author} \marg{author} +% \DescribeMacro{\and} +% While using \cs{maketitle}, the author is treated as a single-column table +% and the \cs{and} feature finishes the current table then starts a new one for +% the next author. Each author thus is placed into its own table, and an +% affiliation may be placed on its own line such as +% +% |\author{Name \\ Affiliation \and Second Name \\ Second Affiliation}| +% +% After \cs{maketitle} has completed, \cs{theauthor} retains the definition of +% the author, but \cs{and} is changed to become a comma and a space, intending to +% print the authors names separated by spaces. This fails when affiliations are +% included on their own table rows. +% +% A solution, provide here, is to define a macro \cs{affiliation} which +% during \cs{maketitle} starts a new table row and adds the affiliation, +% but after \cs{maketitle} is finished \cs{affiliation} is re-defined +% to throw away its argument, thus printing only the author names +% when \cs{author} is later used inline. +% +% +% \begin{macro}{\affiliation} \marg{text} +% +% Adds the affiliation to the author for use in \cs{maketitle}. +% Nullified when later used for inline use of \cs{theauthor}. +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\newrobustcmd{\affiliation}[1]{\\ \InlineClass{affiliation}{#1}} +\end{warpHTML} +% \end{macrocode} +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newrobustcmd{\affiliation}[1]{\\ \textsc{\small#1}} +\end{warpprint} +% \end{macrocode} +% \end{macro} +% +% +% +% The following are based on the original \pkg{titling} code: +% +% +% +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} +% +% \begin{macro}{\author} \marg{text} +% +% Redefined to nullify \cs{affiliation}, etc.\ before printing the authors inline. +% +% \cs{@author} retains the entire author with its \cs{thanks}, while +% \cs{theauthor} will have \cs{thanks} removed and \cs{and} simplified. +% \begin{macrocode} +\renewcommand{\author}[1]{% +\gdef\@author{#1} +\begingroup + \renewcommand{\thanks}[1]{} + \renewcommand{\and}{\unskip, } + \renewcommand{\thanksmark}[1]{} + \renewcommand{\thanksgap}[1]{} + \renewcommand{\affiliation}[1]{} + \protected@xdef\theauthor{#1} +\endgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\published} \marg{text} +% \changes{v0.13}{2016/03/23}{Default to empty published.} +% \begin{macrocode} +\newcommand{\published}[1]{% +\gdef\@published{#1} +\begingroup + \renewcommand{\thanks}[1]{} + \renewcommand{\thanksmark}[1]{} + \renewcommand{\thanksgap}[1]{} + \protected@xdef\thepublished{#1} +\endgroup +} +\newcommand{\@published}{} +\newcommand{\thepublished}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subtitle} \marg{text} +% \changes{v0.13}{2016/03/23}{Default to empty subtitle.} +% \begin{macrocode} +\newcommand{\subtitle}[1]{% +\gdef\@subtitle{#1} +\begingroup + \renewcommand{\thanks}[1]{} + \renewcommand{\thanksmark}[1]{} + \renewcommand{\thanksgap}[1]{} + \protected@xdef\thesubtitle{#1} +\endgroup +} +\newcommand{\@subtitle}{} +\newcommand{\thesubtitle}{} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\end{warpall} +% \end{macrocode} +% +% +% \subsection{Changes to HTML titlepage and titlingpage} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% +% \begin{environment}{titlepage} +% Sets up a titlepage div with a \LaTeX{} \acro{PDF} minipage inside. +% \begin{macrocode} +\renewenvironment*{titlepage} + {\BlockClass{titlepage}\LWR@subminipage} + {\LWR@endsubminipage\endBlockClass} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{titlingpage} +% \begin{macrocode} +\renewenvironment*{titlingpage} +{% +% \end{macrocode} +% Start an HTML titlepage div: +% \begin{macrocode} +\begin{titlepage} +% \end{macrocode} +% Prepare for a custom version of \cs{maketitle} inside the \env{titlingpage}: +% \begin{macrocode} +\LWR@maketitlesetup +\let\maketitle\LWR@titlingmaketitle +} +{ +% \end{macrocode} +% At the end of the environment, +% end the HTML titlepage div: +% \begin{macrocode} +\end{titlepage} +% \end{macrocode} +% Reset the footnote counter: +% \begin{macrocode} +\@bscontmark +} +% \end{macrocode} +% \end{environment} +% +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} +% \DescribeMacro{\printthanks} Forces the \cs{thanks} to be printed. +% +% This is necessary in a \env{titlingpage} environment +% when \cs{maketitle} was not used. +% \begin{macrocode} +\newcommand*{\printthanks}{\@thanks} +% \end{macrocode} +% +% \begin{environment}{titlingpage} +% At the end of the titlingpage for both print and HTML, +% reset footnote markers to zero. +% \begin{macrocode} +\AtEndEnvironment{titlingpage}{\@bscontmark} +% \end{macrocode} +% \end{environment} +% +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + + + +% \subsection{Printing the title, etc.\ in HTML} +% +% \changes{v0.20}{2017/01/21}{Enhanced \pkg{titling} support.} +% +% The following are for printing the title, etc. +% in a \env{titlepage} or a \env{titlingpage} +% in \acro{HTML}: +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% +% +% Patch the pre/post title/author/date to add \acro{HTML} tags, +% then initilize: +% \begin{macrocode} +\newcommand{\prepublished}[1]{% +\def\@bsprepublished{\BlockClass{published}#1}% +} + +\newcommand{\postpublished}[1]{% +\def\@bspostpublished{#1\endBlockClass}% +} + +\renewcommand{\pretitle}[1]{% +\def\@bspretitle{#1\LWR@stoppars\LWR@htmltag{h1}}% +} + +\renewcommand{\posttitle}[1]{% +\def\@bsposttitle{\LWR@htmltag{/h1}\LWR@startpars#1}% +} + +\newcommand{\presubtitle}[1]{% +\def\@bspresubtitle{\BlockClass{subtitle}#1}% +} + +\newcommand{\postsubtitle}[1]{% +\def\@bspostsubtitle{#1\endBlockClass}% +} + +\renewcommand{\preauthor}[1]{% +\def\@bspreauthor{\BlockClass{author}#1}% +} + +\renewcommand{\postauthor}[1]{% +\def\@bspostauthor{#1\endBlockClass}% +} + +\renewcommand{\predate}[1]{% +\def\@bspredate{#1\BlockClass{titledate}}% +} + +\renewcommand{\postdate}[1]{% +\def\@bspostdate{\endBlockClass#1}% +} + +\prepublished{\begin{center}} +\postpublished{\par\end{center}} + +\pretitle{\begin{center}} +\posttitle{\par\end{center}} + +\presubtitle{\begin{center}} +\postsubtitle{\par\end{center}} + +\preauthor{\begin{center}% +\begin{tabular}[t]{c}% +} +\postauthor{\end{tabular}\par\end{center}} + +\predate{\begin{center}} +\postdate{\par\end{center}} +% \end{macrocode} +% +% +% \begin{macro}{\printpublished} +% \changes{v0.15}{2015/04/05}{No div if empty.} +% \begin{macrocode} +\newcommand*{\printpublished}{ +\ifthenelse{\equal{\thepublished}{}} +{} +{ +\begin{BlockClass}{published} +\@published +\end{BlockClass} +} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printtitle} +% \begin{macrocode} +\newcommand*{\printtitle} +{ +\LWR@stoppars +\LWR@htmltag{h1}% +\@title% +\LWR@htmltag{/h1} +\LWR@startpars +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LWR@printthetitle} +% +% A private version which prints the title without footnotes, +% used to title each \acro{HTML} page. +% \begin{macrocode} +\newcommand*{\LWR@printthetitle} +{ +\LWR@stoppars +\LWR@htmltag{h1}% +\thetitle% +\LWR@htmltag{/h1} +\LWR@startpars +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printsubtitle} +% \changes{v0.15}{2015/04/05}{No div if empty.} +% \begin{macrocode} +\newcommand*{\printsubtitle}{ +\ifthenelse{\equal{\thesubtitle}{}} +{} +{ +\begin{BlockClass}{subtitle} +\@subtitle +\end{BlockClass} +} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printauthor} +% \begin{macrocode} +\newcommand*{\printauthor}{ +\begin{BlockClass}{author} +\begin{tabular}{c}\@author\end{tabular} +\end{BlockClass} +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\printdate} +% \begin{macrocode} +\newcommand*{\printdate}{% +\begin{BlockClass}{titledate} +\@date +\end{BlockClass} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \subsection{Printing the title, etc.\ in print form} +% +% The following are for printing the title, etc. +% in a \env{titlepage} or a \env{titlingpage} +% in print form: +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +% \end{macrocode} + +% \changes{v0.16}{2016/04/07}{\cs{titlingpage}: Improved print-output spacing.} +% \changes{v0.16}{2016/04/07}{Test Suite: Improved titlingpage.} +% \begin{macro}{\printpublished} +% \begin{macrocode} +\newcommand*{\printpublished}{{\Large\scshape\@published}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printtitle} +% \begin{macrocode} +\newcommand*{\printtitle}{{\Huge\@title}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printsubtitle} +% \begin{macrocode} +\newcommand*{\printsubtitle}{{\Large\itshape\@subtitle\bigskip}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printauthor} +% \begin{macrocode} +\newcommand*{\printauthor} + {{\large\begin{tabular}[t]{c}\@author\end{tabular}}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\printdate} +% \begin{macrocode} +\newcommand*{\printdate}{{\small\textit{\@date}}} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{\cs{maketitle} for print output} +% +% +% \DescribeMacro{\maketitle} +% From the \pkg{titling} package, patched to add the publisher and subtitle. +% +% \begin{macrocode} +\providecommand{\maketitle}{} +\if@titlepage + \renewcommand{\maketitle}{\begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \let \footnote \thanks + \@bsmarkseries + \def\@makefnmark{\rlap{\@textsuperscript{% + \normalfont\@bsthanksheadpre \tamark \@bsthanksheadpost}}}% + \long\def\@makefntext##1{\makethanksmark ##1} + \null\vfil + \vskip 60\p@ + \vspace*{\droptitle} + \maketitlehooka + \ifcsempty{@published} + {} + {{\@bsprepublished \@published \@bspostpublished}\maketitlehookaa} + {\@bspretitle \@title \@bsposttitle} + \ifcsempty{@subtitle} + {} + {\maketitlehookaaa{\@bspresubtitle \@subtitle \@bspostsubtitle}} + \maketitlehookb + {\@bspreauthor \@author \@bspostauthor} + \maketitlehookc + {\@bspredate \@date \@bspostdate} + \maketitlehookd + \par + \@thanks + \vfil\null + \end{titlepage}% + \@bscontmark % \setcounter{footnote}{0}% +%%% \@bsmtitlempty + } % end titlepage defs +\else + \renewcommand{\maketitle}{\par + \begingroup + \@bsmarkseries + \def\@makefnmark{\rlap{\@textsuperscript{% + \normalfont\@bsthanksheadpre \tamark \@bsthanksheadpost}}}% + \long\def\@makefntext##1{\makethanksmark ##1} + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ + \@maketitle + \fi + \thispagestyle{plain}\@thanks + \endgroup + \@bscontmark % \setcounter{footnote}{0}% +%%% \@bsmtitlempty + } % end non-titlepage + + \def\@maketitle{% + \newpage + \null + \vskip 2em% + \vspace*{\droptitle} + \maketitlehooka + \ifcsempty{@published} + {} + {{\@bsprepublished \@published \@bspostpublished}\maketitlehookaa} + {\@bspretitle \@title \@bsposttitle} + \ifcsempty{@subtitle} + {} + {\maketitlehookaaa{\@bspresubtitle \@subtitle \@bspostsubtitle}} + \maketitlehookb + {\@bspreauthor \@author \@bspostauthor} + \maketitlehookc + {\@bspredate \@date \@bspostdate} + \maketitlehookd + \par + \vskip 1.5em} +\fi + +\providecommand{\maketitlehookaa}{} + +\providecommand{\maketitlehookaaa}{} + +\newcommand{\prepublished}[1]{% +\def\@bsprepublished{#1}% +} + +\newcommand{\postpublished}[1]{% +\def\@bspostpublished{#1}% +} + +\newcommand{\presubtitle}[1]{% +\def\@bspresubtitle{#1}% +} +% \end{macrocode} +% +% \DescribeMacro{\presubtitle} Hook after printing the subtitle. +% \begin{macrocode} +\newcommand{\postsubtitle}[1]{% +\def\@bspostsubtitle{#1}% +} +% \end{macrocode} +% +% Initial settings: +% +% \begin{macrocode} +\if@titlepage +\prepublished{ +\vspace*{-\baselineskip}\vspace*{-\medskipamount}\vspace*{-2em} +\begin{center}} +\postpublished{\par\end{center}\vskip 2em} + +\presubtitle{\unskip\begin{center}\unskip} +\postsubtitle{\par\end{center}\vskip 2em} +\else +\prepublished{\begin{center}} +\postpublished{\par\end{center}\vskip 0.5em} + +\presubtitle{\begin{center}\unskip} +\postsubtitle{\par\end{center}\vskip 0.5em} +\fi +% \end{macrocode} +% +% \begin{macrocode} +\end{warpprint} +% \end{macrocode} +% +% +% \subsection{\protect\textbackslash{}maketitle for HTML output} +% \label{sec:titlehtml} +% +% An \acro{HTML} div of class |titlepage| is created, inside of which +% a \LaTeX{} \acro{PDF} minipage is generated (without \acro{HTML} tags), +% allowing the |\thanks| footnotes to be generated immediately at the end +% of the title page during \acro{HTML} output. This is desirable when +% a large table of contents immediately follows the title. +% +% |\thanks| are a form of footnotes used in the title page. +% See \cref{sec:footnotes} for other kinds of footnotes. +% +% See |\thanksmarkseries{series}|, below, to set the style of the footnote marks. +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +%\begin{macro}{\LWR@maketitlesetup} Patches \cs{thanks} macros to +% use \LaTeX{} minipage footnotes. +% +% \begin{macrocode} +\newcommand*{\LWR@maketitlesetup}{% +% \end{macrocode} +% Select which kind of footnote marks to use: +% \begin{macrocode} +\@bsmarkseries +\@mpbsmarkseries +% \end{macrocode} +% +% Redefine the footnote mark: +% +% \begin{macrocode} +\def\@makefnmark{\textsuperscript{\thefootnote}}% +% \end{macrocode} +% \begin{center} +% \begin{minipage}{.7\linewidth} +% \cs{thefootnote} \goesto\ \cs{nameuse}\{arabic\}\{footnote\}, or +% +% \cs{thefootnote} \goesto\ \cs{nameuse}\{fnsymbol\}\{footnote\} +% \end{minipage} +% \end{center} +% +% Redefine the footnote text: +% +% \begin{macrocode} +\long\def\@makefntext##1{% +% \end{macrocode} +% Make the footnote mark and some extra horizontal space for the tags: +% \begin{macrocode} +\makethanksmark \LWR@orighspace{1in} +% \end{macrocode} +% \begin{center} +% \begin{minipage}{.7\linewidth} +% \cs{makethanksmark} \goesto\ \cs{thanksfootmark} \goesto\ \cs{tamark} \goesto\ +% +% \hfill \cs{@thefnmark} \goesto\ \cs{itshape} a (or similar) +% \end{minipage} +% \end{center} +% +% Print the text and a closing paragraph tag: +% \begin{macrocode} +##1\LWR@htmltagc{/\LWR@tagregularparagraph}% +}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\@fnsymbol} \marg{counter} +% +% Re-defined to use an \acro{HTML} entity for the double vertical bar symbol. +% The original definition used \cs{\textbar} which was not being found by \cmds{pdftotext}. +% \begin{macrocode} +\def\@fnsymbol#1{\ensuremath{\ifcase#1\or *\or \dagger\or \ddagger\or + \mathsection\or \mathparagraph\or \text{\HTMLunicode{2016}}\or + **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi}} +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\maketitle} Creates an \acro{HTML} titlepage div +% and typesets the title, etc. +% +% Code from the \pkg{titling} package is adapted, simplified, and +% modified for \acro{HTML} output. +% +% \begin{macrocode} +\renewcommand*{\maketitle}{% +% \end{macrocode} +% An \acro{HTML} titlepage div is used for all classes. +% \begin{macrocode} +\begin{titlepage} +% \end{macrocode} +% Set up special patches: +% \begin{macrocode} +\LWR@maketitlesetup +% \end{macrocode} +% Typeset the title, etc: +% \begin{macrocode} +\@maketitle +% \end{macrocode} +% Immediately generate any |\thanks| footnotes: +% \begin{macrocode} +\@thanks +% \end{macrocode} +% Close the \acro{HTML} titlepage div: +% \begin{macrocode} +\end{titlepage} +% \end{macrocode} +% Reset the footnote counter: +% \begin{macrocode} +\@bscontmark +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\@maketitle} Typesets the title, etc. for \acro{HTML}: +% \begin{macrocode} +\DeclareDocumentCommand{\@maketitle}{}{% + \maketitlehooka + \ifcsempty{@published} + {} + {{\@bsprepublished \@published \@bspostpublished}\maketitlehookaa} + {\@bspretitle \@title \@bsposttitle} + \ifcsempty{@subtitle} + {} + {\maketitlehookaaa{\@bspresubtitle \@subtitle \@bspostsubtitle}} + \maketitlehookb + {\@bspreauthor \@author \@bspostauthor} + \maketitlehookc + {\@bspredate \@date \@bspostdate} + \maketitlehookd +} +% \end{macrocode} +% \end{macro} + + +% \begin{macrocode} +\providecommand{\maketitlehookaa}{} +\providecommand{\maketitlehookaaa}{} +% \end{macrocode} + + +% \begin{macro}{\LWR@titlingmaketitle} +% \cs{maketitle} for use inside an \acro{HTML} \env{titlingpage} environment. +% \begin{macrocode} +\newcommand*{\LWR@titlingmaketitle}{% +% \end{macrocode} +% Typeset the title, etc: +% \begin{macrocode} +\@maketitle +% \end{macrocode} +% Immediately generate any |\thanks| footnotes: +% \begin{macrocode} +\@thanks +} +% \end{macrocode} +% \end{macro} + + +% +% \begin{macro}{\thanksmarkseries} \marg{series} +% +% Sets the type of footnote marks used by |\thanks|, +% where type is `arabic', `roman', `fnsymbol', etc. Modified to +% use the \LaTeX{} \acro{PDF} minipage which is included with the title page. +% \begin{macrocode} +\let\LWR@origthanksmarkseries\thanksmarkseries +\renewcommand{\thanksmarkseries}[1]{% +\def\@mpbsmarkseries{% +\renewcommand*{\thempfootnote}{\@nameuse{#1}{mpfootnote}}} +\LWR@origthanksmarkseries{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + +% \section{Abstract} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\abstractname} +% User-redefinable title for the abstract. +% +% Also over-written by the \pkg{babel} package. +% \begin{macrocode} +\providecommand*{\abstractname}{Abstract} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{abstract} +% \begin{macrocode} +\DeclareDocumentEnvironment{abstract}{} +{ +\BlockClass{abstract} +\BlockClassSingle{abstracttitle}{\abstractname} +} +{ +\endBlockClass +} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + +% \section{Quote and verse} + +% \subsection{Citations and attributions} + +% \begin{macro}{\attribution} +% for use inside quote, quotation, verse: + +% ex: |\attribution{author name} --- \citetitle{book name}| + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\newcommand{\attribution}[1]{% +\InlineClass{attribution}{—\,#1}}% emdash +\end{warpHTML} +% \end{macrocode} +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newcommand{\attribution}[1]{\textsc{---\,#1}} +\end{warpprint} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\citetitle} +% for use inside quote, quotation, verse: +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +\newcommand{\citetitle}[1]{% +\InlineClass{citetitle}{—\,#1}}% emdash +\end{warpHTML} +% \end{macrocode} +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newcommand{\citetitle}[1]{\textsl{---\,#1}} +\end{warpprint} +% \end{macrocode} +% \end{macro} + + + +% \subsection{Quotes, quotations} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% \begin{environment}{quote} +% \begin{macrocode} +\renewenvironment*{quote} +{\LWR@htmlblocktag{blockquote}} +{\LWR@htmlblocktag{/blockquote}} + +\renewenvironment*{quotation} +{\LWR@htmlblocktag{blockquotation}} +{\LWR@htmlblocktag{/blockquotation}} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \subsection{Verse} +% +% \limitsverse +% +% \bigskip +% +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} +% +% The following lengths may be set in either print or \acro{HTML} output, +% but are only used in \acro{HTML}. +% This allows the user to set \cs{vleftskip} and \cs{leftmargini} for +% print output, and optionally select different values for \acro{HTML}. +% + +% \DescribeLength{HTMLvleftskip} +% Sets \cs{vleftskip} inside a \env{verse} environment in \acro{HTML}. +% \begin{macrocode} +\newlength{\HTMLvleftskip} +\setlength{\HTMLvleftskip}{1em} +% \end{macrocode} + +% \DescribeLength{HTMLleftmargini} +% Sets \cs{leftmargini} inside a \env{verse} environment in \acro{HTML}. +% \begin{macrocode} +\newlength{\HTMLleftmargini} +\setlength{\HTMLleftmargini}{4.5em} +% \end{macrocode} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + + +% +% +% \begin{environment}{verse} +% \changes{v0.18}{2016/05/13}{Supports verse, memoir packages.} +% The \env{verse} environment will be placed inside a \acro{HTML} |pre|. +% \begin{macrocode} +\AfterEndPreamble{ +% \end{macrocode} +% At the beginning of the \env{verse} environment: +% \begin{macrocode} +\AtBeginEnvironment{verse} +{% +% \end{macrocode} +% \DescribePackage{verse}\DescribePackage{memoir}\index{memoir>verse} +% The \pkg{verse} or \pkg{memoir} packages can place stanza numbers to the left +% with their \cs{flagverse} command. \DescribeMacro{\flagverse} +% Do not allow them to go into the left margin, which would cause |pdfcrop| +% to crop the entire page further to the left: +% \DescribeLength{vleftskip} +% \begin{macrocode} +\ifdef{\vleftskip}{% +\setlength{\vleftskip}{\HTMLvleftskip} +\setlength{\leftmargini}{\HTMLleftmargini} +}{} +\LWR@atbeginverbatim{verse} +\unskip\vspace{-\baselineskip} +} +% \end{macrocode} +% After the end of the \env{verse} environment, which places the |pre| tag at the +% regular left margin: +% \begin{macrocode} +\AfterEndEnvironment{verse}{ +\unskip\vspace{-\baselineskip} +\LWR@afterendverbatim +} +% \end{macrocode} +% Patch to place poemtitle inside an \acro{HTML} span of class |poemtitle|: +% \begin{macrocode} +\ifdef{\poemtitle}{ +\DeclareDocumentCommand{\@vstypeptitle}{m}{% + \vspace{\beforepoemtitleskip}% + {\InlineClass{poemtitle}{\poemtitlefont #1}\par}% + \vspace{\afterpoemtitleskip}% + } +}{} + +} +\end{warpHTML} +% \end{macrocode} +% \end{environment} + + + + + + + + + +% \section{Verbatim} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{environment}{verbatim} +% +% \changes{v0.20}{2016/12/24}{Added.} +% +% \begin{macrocode} +\AfterEndPreamble{ +\AtBeginEnvironment{verbatim}{\LWR@atbeginverbatim{verbatim}\unskip\vspace*{-\baselineskip}} +\AfterEndEnvironment{verbatim}{\unskip\vspace*{-\baselineskip}\LWR@afterendverbatim} +} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{Fancyvrb} + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} +% +% +% \DescribeLength{\VerbatimHTMLWidth} Width to use in HTML Verbatim environment. +% +% This width is used when placing line numbers to the right. +% Ignored during print output. +% \begin{macrocode} +\newlength{\VerbatimHTMLWidth} +\setlength{\VerbatimHTMLWidth}{4in} +\end{warpall} +% \end{macrocode} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% \DescribeBoolean{LWR@verbtags} Used to temporarily turn off verbatim tags +% while doing \env{VerbatimInput} in the \acro{HTML} head. +% \begin{macrocode} +\newbool{LWR@verbtags} +\booltrue{LWR@verbtags} +% \end{macrocode} + + +% For \cs{VerbatimFootnotes}: +% \begin{macrocode} +\renewcommand{\VerbatimFootnotes}{ +\PackageError{lwarp} +{Verbatim footnotes are not yet supported by lwarp.} +{This may be improved when lwarp uses LaTeX footnotes instead of pagenotes.} +} +% \end{macrocode} + + +% \begin{macro}{\LWR@atbeginverbatim} \marg{class} +% +% Encloses a verbatim environment with the given \acro{CSS} class. +% \begin{macrocode} +\newcommand*{\LWR@atbeginverbatim}[1] +{% +% \end{macrocode} +% Avoid excessive space between lines: +% \begin{macrocode} +\setlength{\parskip}{0ex}% +% \end{macrocode} +% Stop generating \acro{HTML} paragraph tags: +% \begin{macrocode} +\LWR@stoppars% +% \end{macrocode} +% Create a new |pre| of the given class: +% \begin{macrocode} +\ifbool{LWR@verbtags}{\LWR@htmltag{pre class="#1"{}}}{}% +% \end{macrocode} +% Use a mono-spaced font to preserve horizontal positioning. +% If horizontal alignment is important for the user, use a mono-spaced font +% in the \acro{CSS} for the |verse| class. +% \begin{macrocode} +\LWR@origttfamily% +% \end{macrocode} +% Do not produce \acro{HTML} tags for \cs{hspace} inside a verse |par|. +% Restore plain \LaTeX{} \cs{hspace} functionality: +% \begin{macrocode} +\let\hspace\LWR@orighspace% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@afterendverbatim} Finishes enclosing a verbatim environment. +% \begin{macrocode} +\newcommand*{\LWR@afterendverbatim}{% +% \end{macrocode} +% Remove excess vertical space at the end of the |pre|: +% \begin{macrocode} +\unskip% +% \end{macrocode} +% At the end of the environment, close the |pre|: +% \begin{macrocode} +\ifbool{LWR@verbtags}{\noindent\LWR@htmltag{/pre} + +}{}% +% \end{macrocode} +% Resume regular paragraph handling: +% \begin{macrocode} +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LWR@Verbatimclass} Holds the class of the following verbatim. +% +% \begin{macrocode} +\newcommand*{\LWR@Verbatimclass}{fancyvrb} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{VerbatimClass} \marg{class} \oarg{Verbatim options} +% +% Creates a \env{Verbatim} enclosed in a \acro{DIV} of the given class. +% \begin{macrocode} +\NewDocumentEnvironment{VerbatimClass}{m O{}} +{% +\renewcommand*{\LWR@Verbatimclass}{#1}% +\LWR@origVerbatim[#2]% +} +{\endVerbatim} +% \end{macrocode} +% \end{environment} +% +% After the preamble is loaded, after any patches to \env{Verbatim}: +% \begin{macrocode} +\AfterEndPreamble{ +% \end{macrocode} +% +% Remember the original defintion of \env{Verbatim}: +% \begin{macrocode} +\let\LWR@origVerbatim\Verbatim +% \end{macrocode} +% +% +% \begin{environment}{Verbatim} +% +% Patched to place the environment in a |fancyvrb| div, +% and the label in a |fancyvrblabel| div. +% Also corrects the left margin for line numbers. +% Also uses |VerbatimHTMLWidth| to control placement of line numbers on the right. +% Aligning the right margin requires knowing the width. +% +% \changes{v0.20}{2016/12/24}{Added.} +% +% \begin{macrocode} +\renewcommand*{\Verbatim}{% +\renewcommand*{\LWR@Verbatimclass}{fancyvrb}% +\LWR@origVerbatim% +} +% \end{macrocode} +% \end{environment} +% +% +% The following patches to \env{Verbatim} are executed at the +% start and end of the environment, depending on the choice of |frame|. +% Original code is from the \pkg{fancyvrb} package. +% \begin{macrocode} +\newcommand*{\LWR@fvstartnone}{% +% \typeout{fvstartnone}% +\ifbool{LWR@verbtags}{\hbox to\z@{\LWR@htmltagc{div class="\LWR@Verbatimclass"}}}{}% +\hbox to\z@{\LWR@atbeginverbatim{verbatim}}% +} + +\newcommand*{\LWR@fvendnone}{% +% \typeout{fvendnone}% +\hbox to\z@{\LWR@afterendverbatim}% +\ifbool{LWR@verbtags}{\hbox to\z@{\LWR@htmltagc{/div}}}{}% +} + +\newcommand*{\LWR@fvstartsingle}{% +% \typeout{fvstartsingle}% +\LWR@fvstartnone% +\FV@BeginListFrame@Single% +} + +\newcommand*{\LWR@fvendsingle}{% +% \typeout{fvendsingle}% +\FV@EndListFrame@Single% +\LWR@fvendnone% +} + +\newcommand*{\LWR@fvstartline}{% +% \typeout{fvstartline}% +\LWR@fvstartnone% +\FV@BeginListFrame@Lines% +} + +\newcommand*{\LWR@fvendline}{% +% \typeout{fvendline}% +\FV@EndListFrame@Lines% +\LWR@fvendnone% +} +% \end{macrocode} +% +% The following patches select the start/left/right/end +% behaviors depending on |frame|. +% Original code is from the \pkg{fancyvrb} package. +% \begin{macrocode} +\def\FV@Frame@none{% +\let\FV@BeginListFrame\LWR@fvstartnone% +\let\FV@LeftListFrame\relax% +\let\FV@RightListFrame\relax% +\let\FV@EndListFrame\LWR@fvendnone} + +\def\FV@Frame@single{% +\let\FV@BeginListFrame\LWR@fvstartsingle% +\let\FV@LeftListFrame\FV@LeftListFrame@Single% +\let\FV@RightListFrame\FV@RightListFrame@Single% +\let\FV@EndListFrame\LWR@fvendsingle} + +\def\FV@Frame@lines{% +\let\FV@BeginListFrame\LWR@fvstartline% +\let\FV@LeftListFrame\relax% +\let\FV@RightListFrame\relax% +\let\FV@EndListFrame\LWR@fvendline} + +\def\FV@Frame@topline{% +\let\FV@BeginListFrame\LWR@fvstartline% +\let\FV@LeftListFrame\relax% +\let\FV@RightListFrame\relax% +\let\FV@EndListFrame\LWR@fvendnone} + +\def\FV@Frame@bottomline{% +\let\FV@BeginListFrame\LWR@fvstartnone% +\let\FV@LeftListFrame\relax% +\let\FV@RightListFrame\relax% +\let\FV@EndListFrame\LWR@fvendline} + +\def\FV@Frame@leftline{% +% To define the \FV@FrameFillLine macro (from \FV@BeginListFrame) +\ifx\FancyVerbFillColor\relax% +\let\FV@FrameFillLine\relax% +\else% +\@tempdima\FV@FrameRule\relax% +\multiply\@tempdima-\tw@% +\edef\FV@FrameFillLine{% +{\noexpand\FancyVerbFillColor{\vrule\@width\number\@tempdima sp}% +\kern-\number\@tempdima sp}}% +\fi% +\let\FV@BeginListFrame\LWR@fvstartnone% +\let\FV@LeftListFrame\FV@LeftListFrame@Single% +\let\FV@RightListFrame\relax% +\let\FV@EndListFrame\LWR@fvendnone} +% \end{macrocode} +% +% Adds the optional label to the top and bottom edges. +% Original code is from the \pkg{fancyvrb} package. +% \begin{macrocode} +\def\FV@SingleFrameLine#1{% + \hbox to\z@{% +% \kern\leftmargin + \ifnum#1=\z@\relax + \let\FV@Label\FV@LabelBegin + \else + \let\FV@Label\FV@LabelEnd + \fi + \ifx\FV@Label\relax +% \FancyVerbRuleColor{\vrule \@width\linewidth \@height\FV@FrameRule}% + \else + \ifnum#1=\z@ +% \setbox\z@\hbox{\strut\enspace\FV@LabelBegin\enspace\strut}% + \ifx\FV@LabelPositionTopLine\relax + \else + \LWR@htmltagc{div class="fancyvrblabel"} + \LWR@origtextrm{\FV@LabelBegin}% \textrm preserves emdash + \LWR@htmltagc{/div} + \fi + \else +% \setbox\z@\hbox{\strut\enspace\FV@LabelEnd\enspace\strut}% + \ifx\FV@LabelPositionBottomLine\relax + \else + \LWR@htmltagc{div class="fancyvrblabel"} + \LWR@origtextrm{\FV@LabelEnd} + \LWR@htmltagc{/div} + \fi + \fi + + \fi + \hss + } +} +% \end{macrocode} +% +% Processes each line, adding optional line numbers. +% Original code is from the \pkg{fancyvrb} package. +% \begin{macrocode} +\def\FV@ListProcessLine#1{% + \hbox to \hsize{% +% \kern\leftmargin + \hbox to \VerbatimHTMLWidth {% + \ifcsvoid{FV@LeftListNumber}{}{\kern 2.5em}% + \FV@LeftListNumber% +% \FV@LeftListFrame + \FancyVerbFormatLine{#1}% + \hss% +% \FV@RightListFrame + \FV@RightListNumber% +}% + \hss% required to avoid underfull hboxes +} +} +% \end{macrocode} + +% \begin{environment}{BVerbatim} +% \begin{macrocode} +\AtBeginEnvironment{BVerbatim} +{ +\LWR@atbeginverbatim{bverbatim} + +} + +\AfterEndEnvironment{BVerbatim} +{ +\leavevmode\par\vspace{-\baselineskip} +\LWR@afterendverbatim +} +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{LVerbatim} No changes required. +% ^^A \begin{macrocode} +% ^^A \AtBeginEnvironment{LVerbatim} +% ^^A { +% ^^A \LWR@atbeginverbatim{lverbatim} +% ^^A \unskip\vspace{-\baselineskip} +% ^^A } + +% ^^A \AfterEndEnvironment{LVerbatim} +% ^^A { +% ^^A \unskip\vspace{-\baselineskip} +% ^^A \LWR@afterendverbatim +% ^^A } +% ^^A \end{macrocode} +% \end{environment} + +% End of the modifications to make at the end of the preamble: +% \begin{macrocode} +} % \AfterEndPreamble +% \end{macrocode} + +% +% \begin{macro}{\UseVerbatim} \marg{text} +% +% No changes required. +% ^^A \begin{macrocode} +% ^^A \let\LWR@origUseVerbatim\UseVerbatim +% ^^A +% ^^A \renewcommand*{\UseVerbatim}[1]{% +% ^^A \LWR@atbeginverbatim{bverbatim}% +% ^^A \unskip\vspace{-\baselineskip}% +% ^^A \LWR@origUseVerbatim{#1}% +% ^^A \unskip% +% ^^A \LWR@afterendverbatim% +% ^^A } +% ^^A \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{Theorems} +% +% \DescribeMacro{\newtheorem} \marg{text} \oarg{counter} -or- \oarg{oldname} \marg{text} +% +% A few minor changes are made to supply \acro{HTML} tags. +% +% \begin{itemize} +% \item The entire theorem is placed into a div of class |theorem|. +% \item The label for each theorem is placed inside a span of class |theoremlabel|. +% \item The contents are placed inside a div of class |theoremcontents|. +% \end{itemize} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\@begintheorem} \marg{name} \marg{number} +% \begin{macrocode} +\renewcommand{\@begintheorem}[2]{% +\LWR@htmldivclass{theorem} +\InlineClass{theoremlabel}{#1\ #2\ } +\LWR@htmldivclass{theoremcontents} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@opargbegintheorem} \marg{name} \marg{number} \marg{oparg} +% \begin{macrocode} +\renewcommand{\@opargbegintheorem}[3]{% +\BlockClass{theorem} +\InlineClass{theoremlabel}{#1\ #2\ (#3)\ } +\BlockClass{theoremcontents} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@endtheorem} +% \begin{macrocode} +\renewcommand*{\@endtheorem}{% +\endBlockClass% theoremcontents +\endBlockClass% theorem +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{Lists} +% +% \limitsbabelone +% +% \limitsenumitem +% + +% \subsection{Itemize} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macrocode} +\let\LWR@origitem\item +% \end{macrocode} + + +% \begin{macro}{\LWR@itemizeitem} \oarg{label} +% +% Handles |\item| inside an itemize or enumerate. +% +% See |\LWR@openparagraph| where extra |\hspace| is used to +% leave room for the label while inside a list during paragraph construction. +% \begin{macrocode} +\newcommand*{\LWR@itemizeitem}{% +\LWR@stoppars% +\LWR@startnewdepth{\LWR@depthlistitem}{\LWR@printcloselistitem{}}% +\LWR@htmltag{li}% +\LWR@startpars% +\LWR@origitem% +} +% \end{macrocode} +% \end{macro} + + +% To have a blank item, use |\mbox{}|. +% This forces a new line in print output, matching the new line which +% will appear in \acro{HTML} output. +% Ex: +%\begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +%\begin{itemize} +%\item \mbox{} +% \begin{itemize} +% ... +%\end{Verbatim} + +% \begin{environment}{itemize} \oarg{enumitem options} +% \begin{macrocode} +\AtBeginEnvironment{itemize}{\LWR@itemizestart} + +\newcommand*{\LWR@itemizestart}{% +\LWR@stoppars% +\LWR@pushoneclose{\LWR@depthlist}{\LWR@printcloseitemize{}}% +\LWR@htmltag{ul style="list-style-type:none"{}}% +\LWR@startpars% +\let\item\LWR@itemizeitem% +} + +\AtEndEnvironment{itemize}{\LWR@itemizeend} + +\newcommand*{\LWR@itemizeend}{% +\LWR@stoppars% +\LWR@closeprevious{\LWR@depthlistitem}% +\LWR@closeoneprevious{}% +\LWR@startpars% +} +% \end{macrocode} +% \end{environment} + + + +% \subsection{Enumerate} + +% An \acro{HTML} unordered list is used with customized \LaTeX-generated labels. + +% \begin{environment}{enumerate} \oarg{enumitem options} +% \begin{macrocode} +\AtBeginEnvironment{enumerate}{\LWR@enumeratestart} + +\newcommand*{\LWR@enumeratestart}{% +\LWR@stoppars% +\LWR@pushoneclose{\LWR@depthlist}{\LWR@printcloseitemize{}}% +\LWR@htmltag{ul style="list-style-type:none"{}}% +\LWR@startpars% +\let\item\LWR@itemizeitem% +} + + +\AtEndEnvironment{enumerate}{\LWR@enumerateend} + +\newcommand*{\LWR@enumerateend}{% +\LWR@stoppars% +\LWR@closeprevious{\LWR@depthlistitem}% +\LWR@closeoneprevious{}% +\LWR@startpars% +} +% \end{macrocode} +% \end{environment} + + +% \subsection{Description} + +% \begin{macro}{\LWR@descitem} \oarg{label} +% Handles an |\item| inside a description. +% \begin{macrocode} +\newcommand*{\LWR@descitem}[1][]% +{% +\LWR@stoppars% +\LWR@setlatestname{#1}% +\LWR@startnewdepth{\LWR@depthlistitem}{\LWR@printclosedescitem{}}% +\LWR@origitem[]% +% \end{macrocode} +% Be sure the label doesn't print to the left of the rest of the file: +% \begin{macrocode} +\LWR@orighspace{1in} +\LWR@htmltag{dt}#1\LWR@htmltag{/dt}% +\LWR@orignewline% +\LWR@htmltag{dd}% +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} + +% \begin{environment}{description} \oarg{enumitem options} +% \begin{macrocode} +\AtBeginEnvironment{description}{\LWR@descriptionstart} + +\newcommand*{\LWR@descriptionstart}{% +\LWR@stoppars% +\LWR@pushoneclose{\LWR@depthlist}{\LWR@printclosedescription{}}% +\LWR@htmltag{dl}% +\LWR@startpars% +\let\item\LWR@descitem% +} + +\AtEndEnvironment{description}{\LWR@descriptionend} + +\newcommand*{\LWR@descriptionend}{% +\LWR@stoppars% +\LWR@closeprevious{\LWR@depthlistitem}% +\LWR@closeoneprevious{}% +\LWR@startpars% +} +% \end{macrocode} +% \end{environment} + + +% \begin{macro}{\newlist} \marg{name} \marg{type} \marg{maxdepth} +% \begin{macro}{\renewlist} \marg{name} \marg{type} \marg{maxdepth} +% +% For \pkg{enumitem} lists, new lists must have the start and end actions assigned to +% the new environment. Renewed lists already have their actions assigned, and +% thus need no changes. +% \begin{macrocode} +\let\LWR@orignewlist\newlist + +\renewcommand*{\newlist}[3]{% +\LWR@orignewlist{#1}{#2}{#3}% +\AtBeginEnvironment{#1}{\csuse{LWR@#2start}}% +\AtEndEnvironment{#1}{\csuse{LWR@#2end}}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + +% \section{Tabular} +% +% This is arguably the most complicated part of the entire package. +% Numerous tricks are employed to handle the syntax which is involved. +% +% Limitations: +% \limitstabular +% +% \changes{v0.20}{2017/01/07}{Added @, \protect\textless, \protect\textgreater\ columns.} +% \changes{v0.20}{2017/01/17}{Tabular: \cs{unskip} extra spaces.} +% +% \subsection{Token lookahead} + +% Used by |\LWR@futurenonspacelet| to look at the next token. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@mynexttoken} +% \begin{macrocode} +\newcommand\LWR@mynexttoken\relax +% \end{macrocode} +% \end{macro} + +% |\futurelet| copies the next token then executes a function to analyze + +% |\LWR@futurenonspacelet| does the same, but ignores intervening white space + +% Based on the \pkg{booktabs} style: + +% \begin{macro}{\LWR@futurenonspacelet} +% \begin{macrocode} +\def\LWR@futurenonspacelet#1{\def\LWR@cs{#1}% +\afterassignment\LWR@fnslone\let\nexttoken= } +\def\LWR@fnslone{\expandafter\futurelet\LWR@cs\LWR@fnsltwo} +\def\LWR@fnsltwo{% +\expandafter\ifx\LWR@cs\@sptoken\let\next=\@BTfnslthree% +\else\let\next=\nexttoken\fi\next} +\def\@BTfnslthree{\afterassignment\LWR@fnslone\let\next= } +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@getmynexttoken} +% Looks ahead and copies the next token into |\LWR@mynexttoken|. +% \begin{macrocode} +\newcommand*{\LWR@getmynexttoken}{% +% nothing must follow this next line +\LWR@futurenonspacelet\LWR@mynexttoken\LWR@tabledatacolumntag +} +% \end{macrocode} +% \end{macro} + +% \subsection{Booleans} + +% \DescribeBoolean{LWR@startedrow} +% True if should print a row tag before this column. +% \begin{macrocode} +\newbool{LWR@startedrow} +\boolfalse{LWR@startedrow} +% \end{macrocode} + +% \DescribeBoolean{LWR@doinghline} +% True if the next row will have an hline above it. +% \begin{macrocode} +\newbool{LWR@doinghline} +\boolfalse{LWR@doinghline} +% \end{macrocode} + +% \DescribeBoolean{LWR@doingtbrule} +% True if the next row will have a top/bottom rule above it. +% \begin{macrocode} +\newbool{LWR@doingtbrule} +\boolfalse{LWR@doingtbrule} +% \end{macrocode} + +% \DescribeBoolean{LWR@tableparcell} +% True if are handling a paragraph inside a table cell, +% so must close the paragraph tag before moving on. +% \begin{macrocode} +\newbool{LWR@tableparcell} +% \end{macrocode} + +% \DescribeBoolean{LWR@skippingmrowcell} +% True if are doing an empty multi-row cell, +% and thus there is no data tag to close. +% \begin{macrocode} +\newbool{LWR@skippingmrowcell} +% \end{macrocode} + + +% \DescribeBoolean{LWR@intabularmetadata} +% True if are in a tabular but not in a data cell. +% Used to prevent extra \acro{HTML} breaks if not inside table data. +% \begin{macrocode} +\newbool{LWR@intabularmetadata} +\boolfalse{LWR@intabularmetadata} +% \end{macrocode} + + + +% \subsection{Handling \&} +% +% \begin{minipage}{\linewidth} +% For technical discussion regarding problems redefining |\&|, See: \\ +% \href{http://tex.stackexchange.com/questions/11638/where-do-i-find-futurelets-nasty-behaviour-documented/11860#11860} +% {http://tex.stackexchange.com/questions/11638/ \\ \hspace*{.25in} where-do-i-find-futurelets-nasty-behaviour-documented/11860\#11860} +% \end{minipage} +% + +% \begin{macro}{\LWR@closetabledatacell} +% If |LWR@skippingmrowcell| then there is no data tag to close. +% Otherwise, close any paragraphs, then close the data tag. +% \begin{macrocode} +\newcommand*{\LWR@closetabledatacell}{% +\global\booltrue{LWR@intabularmetadata}% +\ifbool{LWR@exitingtabular}{}% +{% not exiting tabular +\ifbool{LWR@skippingmrowcell}{}% +{% not skippingmrowcell +% \end{macrocode} +% Insert any |<| then any |@| column contents: +% \begin{macrocode} +\unskip% +\LWR@getexparray{LWR@colafterspec}{\theLWR@tablecolspos}% +\LWR@getexparray{LWR@colatspec}{\theLWR@tablecolspos}% +% \end{macrocode} +% Close paragraphs: +% \begin{macrocode} +\ifbool{LWR@tableparcell}{\LWR@stoppars}{}% +\global\boolfalse{LWR@tableparcell}% +% \end{macrocode} +% Close the table data cell: +% \begin{macrocode} +\unskip\LWR@htmltag{/td}\LWR@orignewline% +}% not skipping mrowcell +}% not exiting tabular +\global\boolfalse{LWR@skippingmrowcell}% +} +% \end{macrocode} +% \end{macro} + + +% |LWR@tabulardepth| tracks whether |&| is being used inside a \env{tabular}. +% \begin{macrocode} +\newcounter{LWR@tabulardepth} +\setcounter{LWR@tabulardepth}{0} + +% \end{macrocode} +% When not used inside a \env{tabular}, |&| performs its original +% function as recorded here ( with catcode 4 ). +% \begin{macrocode} +\def\LWR@origampmacro{&} +% \end{macrocode} +% See below for why the group is used. +% \begin{macrocode} +\begingroup +% \end{macrocode} +% +% \changes{v0.15}{2016/03/31}{Ampersand (\&): Fixed handling when passed as an argument.} +% +% \begin{macro}{&} Will behave depending on whether it is being used inside \env{tabular}. +% +% |&| is redefined to test whether it is inside a tabular environment, +% in which case it performs special processing for \acro{HTML} conversion. +% If not, it behaves normally. +% +% The |\catcode| allows the |&| character to be redefined. +% \begin{macrocode} +\catcode`\&=\active + +\gdef&{% +\ifthenelse{\cnttest{\value{LWR@tabulardepth}}{>}{0}}% +{% +% \end{macrocode} +% If not skipping a multirow cell, close the current data cell. +% \begin{macrocode} +\unskip% +\LWR@closetabledatacell% +% \end{macrocode} +% Move to the next column. +% \begin{macrocode} +\addtocounter{LWR@tablecolspos}{1}% +% \end{macrocode} +% Look at the next token to decide multi or single column data tag. +% \begin{macrocode} +\LWR@getmynexttoken% +}% +% \end{macrocode} +% If not inside a tabular, performs the original action: +% \begin{macrocode} +{\LWR@origampmacro}% +} +\endgroup +% \end{macrocode} +% Outside the group, |&| is left its original catcode for now. +% +% \pkg{tikz} package seems to require |&| be left alone until after +% \pkg{tikz} has been loaded. +% +% \cs{LWR@lwarpStart} finally makes |&| active at the beginning of the +% \acro{HTML} conversion. +% \end{macro} +% + + +% \subsection{Handling \protect\textbackslash\protect\textbackslash} + +% Inside tabular, |\\| is redefined to |\LWR@tabularendofline| +% +% Throws away options |\\[dim]| or |\\*| +% +% \begin{macro}{\LWR@tabularendofline} +% \begin{macrocode} +\NewDocumentCommand{\LWR@tabularendofline}{s o} +{% +\LWR@closetabledatacell% +% \end{macrocode} +% Finish the previous row: +% \begin{macrocode} +\LWR@htmltag{/tr}\LWR@orignewline +\global\booltrue{LWR@intabularmetadata} +% \end{macrocode} +% Not yet started a table row: +% \begin{macrocode} +\global\boolfalse{LWR@startedrow} +% \end{macrocode} +% Additional setup: +% \begin{macrocode} +\global\boolfalse{LWR@doinghline}% +\global\boolfalse{LWR@doingtbrule}% +\LWR@clearmidrules% +% \end{macrocode} +% Start at first column: +% \begin{macrocode} +\setcounter{LWR@tablecolspos}{1} +% \end{macrocode} +% Look at the next token to decide between single column data tag +% or a special case: +% \begin{macrocode} +\LWR@getmynexttoken% +} +% \end{macrocode} +% \end{macro} + +% \subsection{Variables} + +% \begin{macrocode} +\newcommand*{\LWR@colsresult}{}%temp storage for column format results +\newcommand*{\LWR@pposition}{} +\newcommand*{\LWR@pleft}{} +\newcommand*{\LWR@pright}{} +% \end{macrocode} + +% \begin{macro}{\LWR@tablecolspec} Holds the parsed column specification, +% of total width |LWR@tabletotalcols|. +% +% Will contain a string such as |llrrccpc|, exactly one letter per column, +% without |@|, |>|, |<|, or the vertical pipe. +% \begin{macrocode} +\newcommand*{\LWR@tablecolspec}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@strresult} Holds the result of |Str| functions. +% \begin{macrocode} +\newcommand*{\LWR@strresult}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@origcolspec} Holds the original column specs given to \env{tabular}. +% \begin{macrocode} +\newcommand*{\LWR@origcolspec}{} +% \end{macrocode} +% \end{macro} + + +% \DescribeCounter{LWR@tablecolswidth} +% Holds the width of the table specification. +% +% (This is not the total \# columns.) +% \begin{macrocode} +\newcounter{LWR@tablecolswidth} +% \end{macrocode} + + +% \DescribeCounter{LWR@tablecolspos} +% Where are currently looking into the table column specification. +% \begin{macrocode} +\newcounter{LWR@tablecolspos} +% \end{macrocode} + +% \DescribeCounter{LWR@tabletotalcols} +% Holds the final number of table columns. +% \begin{macrocode} +\newcounter{LWR@tabletotalcols} +% \end{macrocode} + +% \DescribeCounter{LWR@tabletotalcolsnext} +% Holds the next column while parsing. +% Is one more than |LWR@tabletotalcols|. +% \begin{macrocode} +\newcounter{LWR@tabletotalcolsnext} +% \end{macrocode} + +% \DescribeObject{LWR@colatspec}A data array of specifications for |@| columns. +% The leftmost's index is |leftedge|, the others are counter values. +% See \cref{sec:dataarray}. +% +% \DescribeObject{LWR@colbeforespec}A data array of specifications for |>| columns. +% +% \DescribeObject{LWR@colafterspec}A data array of specifications for |<| columns. + + + +% \subsection{Parsing @, >, <, ! columns} +% +% \begin{macro}{\LWR@parseatcolumn} +% +% Handles |@{text}| columns. +% +% +% \begin{macrocode} +\newcommand*{\LWR@parseatcolumn}{% +% \end{macrocode} +% Move to the next token after the '@': +% \begin{macrocode} +\LWR@traceinfo{at column}% +\addtocounter{LWR@tablecolspos}{1}% +% \end{macrocode} +% Read the next token into \cs{LWR@strresult}, expanding once: +% \begin{macrocode} +\LWR@traceinfo{about to read the next token:}% +\expandarg% +\StrChar{\LWR@origcolspec}{\theLWR@tablecolspos}[\LWR@strresult] +\fullexpandarg% +% \end{macrocode} +% Store the result into a data array, expanding once out of \cs{LWR@strresult}: +% \begin{macrocode} +\LWR@traceinfo{have now read the next token}% +\ifthenelse{\cnttest{\value{LWR@tabletotalcols}}=0} +{% left edge of the table: +\LWR@traceinfo{at the left edge}% +\LWR@setexparray{LWR@colatspec}{leftedge}{\LWR@strresult}% +\LWR@traceinfo{finished with the def}% +}% +{% not at the left edge: +\LWR@traceinfo{not at the left edge}% +\LWR@setexparray{LWR@colatspec}{\theLWR@tabletotalcols}{\LWR@strresult}% +\LWR@traceinfo{at \theLWR@tabletotalcols: \LWR@colatspec(\theLWR@tabletotalcols)!}% +}% +\let\LWR@strresult\relax% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LWR@parsebeforecolumn} +% +% Handles |>{text}| columns. +% +% \begin{macrocode} +\newcommand*{\LWR@parsebeforecolumn}{% +% \end{macrocode} +% Move to the next token after the '>': +% \begin{macrocode} +\addtocounter{LWR@tablecolspos}{1}% +% \end{macrocode} +% Read the next token, expanding once into \cs{LWR@strresult}: +% \begin{macrocode} +\expandarg% +\StrChar{\LWR@origcolspec}{\theLWR@tablecolspos}[\LWR@strresult]% +\fullexpandarg% +% \end{macrocode} +% Store the result into a data array, expanding once out of \cs{LWR@strresult}: +% \begin{macrocode} +\LWR@setexparray{LWR@colbeforespec}{\theLWR@tabletotalcolsnext}{\LWR@strresult}% +\let\LWR@strresult\relax% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@parseaftercolumn} +% +% Handles |<{text}| columns. +% +% \begin{macrocode} +\newcommand*{\LWR@parseaftercolumn}{% +% \end{macrocode} +% Move to the next token after the '<': +% \begin{macrocode} +\addtocounter{LWR@tablecolspos}{1}% +% \end{macrocode} +% Read the next token, expanding once into \cs{LWR@strresult}: +% \begin{macrocode} +% \StrChar{#1}{\theLWR@tablecolspos}[\LWR@strresult] +\expandarg% +\StrChar{\LWR@origcolspec}{\theLWR@tablecolspos}[\LWR@strresult]% +\fullexpandarg% +% \end{macrocode} +% Store the result into a data array, expanding once out of \cs{LWR@strresult}: +% \begin{macrocode} +\LWR@setexparray{LWR@colafterspec}{\theLWR@tabletotalcols}{\LWR@strresult}% +\let\LWR@strresult\relax% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@parseskipcolumn} +% +% Handles columns to skip, such as !. +% +% \begin{macrocode} +\newcommand*{\LWR@parseskipcolumn}{% +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Parsing `l', `c', or `r' columns} +% +% \begin{macro}{\LWR@parsenormalcolumn} \marg{thiscolumn} +% +% Add to the accumulated column specs, advance counters, +% and pre-clear another column of at, before, and after specs. +% \begin{macrocode} +\newcommand*{\LWR@parsenormalcolumn}[1]{% +\appto\LWR@tablecolspec{#1}% +\addtocounter{LWR@tabletotalcols}{1}% +\addtocounter{LWR@tabletotalcolsnext}{1}% +\LWR@setexparray{LWR@colatspec}{\theLWR@tabletotalcolsnext}{\relax}% +\LWR@setexparray{LWR@colbeforespec}{\theLWR@tabletotalcolsnext}{\relax}% +\LWR@setexparray{LWR@colafterspec}{\theLWR@tabletotalcolsnext}{\relax}% +} +% \end{macrocode} +% \end{macro} + +% \subsection{Parsing `p', `m', or `b' columns} + +% \begin{macro}{\LWR@parsepcolumn} \marg{thiscolumn} +% the width will be ignored +% \begin{macrocode} +\newcommand*{\LWR@parsepcolumn}[1]{% +% \end{macrocode} +% converts to the given column type +% \begin{macrocode} +\LWR@parsenormalcolumn{#1}% +% \end{macrocode} +% skips the following width +% \begin{macrocode} +\addtocounter{LWR@tablecolspos}{1}% +} +% \end{macrocode} +% \end{macro} + + +% \subsection{Parsing the column specifications} + +% \acro{HTML} \acro{CSS} cannot exactly match the \LaTeX{} concept of a baseline for +% a table row. +% \watchout +% \Cref{tab:baseline} shows the \LaTeX{} results for various +% vertical-alignment choices, with the baseline of the first column drawn across +% all the columns for comparison. +% See the |p| column specification in \cref{tab:columnconversions} for details. +% +% \begin{table} +% \caption{Tabular baseline\label{tab:baseline}} +% \index{tabular>baseline}\index{baseline>tabular} +% \centering +% \smallskip +% \begin{tabular}{lp{.25in}m{.25in}b{.25in}r} +% \toprule +% l & p & m & b & r \\ +% \midrule +% l \rule{1.65in}{.4pt} \hspace{-1.4in} & +% par \newline par \newline par & +% mid \newline mid \newline mid & +% bot \newline bot \newline bot & +% r \\ +% \bottomrule +% \end{tabular} +% \end{table} +% +% \Cref{tab:columnconversions} describes how each kind of column is +% converted to \acro{HTML}. +% +% \begin{table} +% \caption{Tabular \acro{HTML} column conversions\label{tab:columnconversions}} +% \index{tabular>HTML colummn conversion} +% \index{HTML>tabular column conversion} +% +% \medskip +% +% \hrule +% \begin{description}[parsep=.5ex] +% \item [l, r, c:] Converted to table cells without paragraph tags. \\ +% Uses \acro{CSS} |vertical-align:middle| so that top or bottom-aligned cells may go above or below this cell. +% \item [p:] Converted to table cells with paragraph tags. +% Ref: \Cref{tab:baseline}, +% \LaTeX{} places the top line of a parbox +% aligned with the rest of the text line, so \acro{CSS} |vertical-align:bottom| is used to +% have the \acro{HTML} result appear with the paragraph extending below the L, R, C cells at the middle, if possible. +% This may be confusing as a P cell may not top-align with an L,R,C cell in the \acro{HTML} +% conversion, especially in the presence of a B cell, and two P cells side-by-side will +% be aligned at the bottom instead of the top. +% Some adjustment of the \acro{CSS} may be desired, changing +% |td.tdp|, |td.tdP|, |td.tdprule|, and |td.tdPrule| to |vertical-align: middle|. +% Another possibility is to change L,R,C, and P to |vertical-align: top| and not worry +% about the alignment of B and M cells or trying to approximate \LaTeX{} baselines. +% \item [m:] With paragraph tags, \acro{CSS} |vertical-align:middle|. +% \item [b:] With paragraph tags, \acro{CSS} |vertical-align:top| so that the bottom of the +% text is closest to the middle of the text line. +% \item [P, M, B:] Horizontally-centered versions, +% \item [S:] Converted to 'r'. From the \pkg{siunitx} package. +% \item [@, \textgreater{}, \textless{}:] Ignored so far. +% \end{description} +% \hrule +% \end{table} +% +% +% \begin{macro}{\LWR@parsetablecols} \marg{colspecs} +% +% Scans the column specification left to right. +% +% Builds \cs{LWR@tablecolspec} with the final specification, +% one column per entry. The number of final columns is +% stored in |LWR@tabletotalcols|. +% +% \begin{macrocode} +\newcommand*{\LWR@parsetablecols}[1]{% +\LWR@traceinfo{LWR@parsetablecols started}% +% \end{macrocode} +% Remember the original supplied column spec: +% \begin{macrocode} +\renewcommand*{\LWR@origcolspec}{#1}% +% \end{macrocode} +% Clear the parsed resulting column spec: +% \begin{macrocode} +\renewcommand*{\LWR@tablecolspec}{}% +% \end{macrocode} +% Total number of columns found so far. +% Also pre-initialize the first several columns of specs: +% \begin{macrocode} +\setcounter{LWR@tabletotalcols}{0}% +\setcounter{LWR@tabletotalcolsnext}{1}% +\LWR@setexparray{LWR@colatspec}{leftedge}{\relax}% +\LWR@setexparray{LWR@colatspec}{1}{\relax}% +\LWR@setexparray{LWR@colatspec}{2}{\relax}% +\LWR@setexparray{LWR@colatspec}{3}{\relax}% +\LWR@setexparray{LWR@colbeforespec}{1}{\relax}% +\LWR@setexparray{LWR@colbeforespec}{2}{\relax}% +\LWR@setexparray{LWR@colbeforespec}{3}{\relax}% +\LWR@setexparray{LWR@colafterspec}{1}{\relax}% +\LWR@setexparray{LWR@colafterspec}{2}{\relax}% +\LWR@setexparray{LWR@colafterspec}{3}{\relax}% +% \end{macrocode} +% Starting at the first column specification: +% \begin{macrocode} +\setcounter{LWR@tablecolspos}{1}% +% \end{macrocode} +% Place the colspecs string length into \cs{LWR@strresult}, +% and remember the number of characters in the column specification: +% \begin{macrocode} +\LWR@traceinfo{about to StrLen}% +\noexpandarg% +\StrLen{#1}[\LWR@strresult]% +\fullexpandarg% +\LWR@traceinfo{finished StrLen}% +\setcounter{LWR@tablecolswidth}{\LWR@strresult}% +% \end{macrocode} +% Scan through the column specifications: +% \begin{macrocode} +\whiledo{\not\value{LWR@tablecolspos}>\value{LWR@tablecolswidth}}{% +% \end{macrocode} +% Place the next single-character column type into \cs{LWR@strresult}: +% \begin{macrocode} +\noexpandarg% +\StrChar{#1}{\theLWR@tablecolspos}[\LWR@strresult]% +\fullexpandarg% +% \end{macrocode} +% Note that the parameter for a |p{spec}| column is a token list which will NOT match l,c,r,p. +% \watchout +% \begin{macrocode} +\IfStrEq{\LWR@strresult}{l}{\LWR@parsenormalcolumn{l}}{}% +\IfStrEq{\LWR@strresult}{c}{\LWR@parsenormalcolumn{c}}{}% +\IfStrEq{\LWR@strresult}{r}{\LWR@parsenormalcolumn{r}}{}% +\IfStrEq{\LWR@strresult}{S}{\LWR@parsenormalcolumn{r}}{}% +\IfStrEq{\LWR@strresult}{\detokenize{@}}{\LWR@parseatcolumn}{}% +\IfStrEq{\LWR@strresult}{>}{\LWR@parsebeforecolumn}{}% +\IfStrEq{\LWR@strresult}{<}{\LWR@parseaftercolumn}{}% +\IfStrEq{\LWR@strresult}{!}{\LWR@parseskipcolumn}{}% +\IfStrEq{\LWR@strresult}{p}{\LWR@parsepcolumn{p}}{}% +\IfStrEq{\LWR@strresult}{m}{\LWR@parsepcolumn{m}}{}% +\IfStrEq{\LWR@strresult}{b}{\LWR@parsepcolumn{b}}{}% +% \end{macrocode} +% \begin{docsidebar} +% Many people define centered versions ``|P|'', ``|M|'', and ``|B|'': \\ +% \hspace*{1em}|\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}| +% \end{docsidebar} +% \begin{macrocode} +\IfStrEq{\LWR@strresult}{P}{\LWR@parsepcolumn{P}}{}% +\IfStrEq{\LWR@strresult}{M}{\LWR@parsepcolumn{M}}{}% +\IfStrEq{\LWR@strresult}{B}{\LWR@parsepcolumn{B}}{}% +\addtocounter{LWR@tablecolspos}{1}% +}% +}% +% \end{macrocode} +% \end{macro} + + +% \subsection{Starting a new row} + +% \begin{macro}{\LWR@maybenewtablerow} +% +% If have not yet started a new table row, begin one now. +% Creates a new row tag, adding a class for |hline| or |tbrule| if +% necessary. +% \begin{macrocode} +\newcommand*{\LWR@maybenewtablerow} +{% +\ifbool{LWR@startedrow}% +{}% started the row +{% not started the row +% \end{macrocode} +% Remember that now have started the row: +% \begin{macrocode} +\global\booltrue{LWR@startedrow}% +% \end{macrocode} +% Create the row tag, with a class if necessary. +% \begin{macrocode} +\global\booltrue{LWR@intabularmetadata}% +\ifbool{LWR@doinghline}% +{\LWR@htmltag{tr class="hline"{}}\LWR@orignewline}% +{% not doing hline +\ifbool{LWR@doingtbrule}% +{\LWR@htmltag{tr class="tbrule"{}}\LWR@orignewline}% +{\LWR@htmltag{tr}\LWR@orignewline}% +}% end of not doing hline +}% end of not started the row +} +% \end{macrocode} +% \end{macro} + + + +% \subsection{Data opening tag} + +% \begin{macro}{\LWR@tabledatasinglecolumntag} +% Print a table data opening tag with style for alignment +% \begin{macrocode} +\newcommand*{\LWR@tabledatasinglecolumntag}% +{% +\LWR@maybenewtablerow% +% \end{macrocode} +% If have found the end of tabular command, do not create the next data cell: +% \begin{macrocode} +\ifbool{LWR@exitingtabular}{}% +{% not exiting tabular +% \end{macrocode} +% Fetch the current column's alignment character into |\LWR@strresult|: +% \begin{macrocode} +\StrChar{\LWR@tablecolspec}{\theLWR@tablecolspos}[\LWR@strresult]% +% \end{macrocode} +% print the start of a new table data cell: +% \begin{macrocode} +\LWR@htmltag{td class="td% +% \end{macrocode} +% append this column's spec: +% \begin{macrocode} +\LWR@strresult% +% \end{macrocode} +% If this column has a cmidrule, add ``rule'' to the end of the \acro{HTML} class tag: +% \begin{macrocode} +\ifthenelse{\equal{\LWR@getexparray{LWR@midrules}{\theLWR@tablecolspos}}{Y}}{rule}{}% +"{}}% +% \end{macrocode} +% If this is a p, m, or b column, allow paragraphs: +% \begin{macrocode} +\ifthenelse{% +\equal{\LWR@strresult}{p}\OR% +\equal{\LWR@strresult}{m}\OR% +\equal{\LWR@strresult}{b}\OR% +\equal{\LWR@strresult}{P}\OR% +\equal{\LWR@strresult}{M}\OR% +\equal{\LWR@strresult}{B}% +}% +{% allow pars +\LWR@startpars% +\global\booltrue{LWR@tableparcell}% +}% allow pars +{}% no pars +% \end{macrocode} +% Print the |@| contents before first column, +% and then the |>| contents: +% \begin{macrocode} +\ifthenelse{\cnttest{\value{LWR@tablecolspos}}=1}% +{\LWR@getexparray{LWR@colatspec}{leftedge}}% left edge +{}% not left edge +\LWR@getexparray{LWR@colbeforespec}{\theLWR@tablecolspos}% +\global\boolfalse{LWR@intabularmetadata}% +}% not exiting tabular +}% +% \end{macrocode} +% \end{macro} + + +% \subsection{Midrules} +% +% \DescribeObject{LWR@midrules}|LWR@midrules| is a data array +% (\cref{sec:dataarray}) of columns containing +% |Y| if a midrule should be created for each column. + + +% \DescribeCounter{LWR@midrulecounter} +% Indexes across the |LWR@midrules| data array. +% \begin{macrocode} +\newcounter{LWR@midrulecounter} +% \end{macrocode} + +% \begin{macro}{\LWR@clearmidrules} +% Start new midrules. Called at beginning of tabular and also at |\\|. +% +% Clears all |LWR@midrules| markers for this line. +% \begin{macrocode} +\newcommand*{\LWR@clearmidrules} +{% +\setcounter{LWR@midrulecounter}{1}% +\whiledo{% +\cnttest{\value{LWR@midrulecounter}}{<=}{\value{LWR@tablecolswidth}}% +}% +{% +\LWR@setexparray{LWR@midrules}{\theLWR@midrulecounter}{\relax}% +\addtocounter{LWR@midrulecounter}{1}% +}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@subcmidrule} \oarg{width} \marg{trim} \marg{leftcolumn} \marg{rightcolumn} +% +% Marks |LWR@midrules| data array elements to be ``Y'' from left to right columns. +% \begin{macrocode} +\newcommand*{\LWR@subcmidrule}[4]{% +\setcounter{LWR@midrulecounter}{#3}% +\whiledo{\cnttest{\value{LWR@midrulecounter}}{<=}{#4}}% +{% +\LWR@setexparray{LWR@midrules}{\theLWR@midrulecounter}{Y}% +\addtocounter{LWR@midrulecounter}{1}% +}% end of the whiledo +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@docmidrule} \oarg{width} \marg{trim} \marg{leftcolumn-rightcolumn} +% +% Marks |LWR@midrules}| array elements to be ``Y'' from left to right columns. +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@docmidrule}{o d() >{\SplitArgument{1}{-}}m}% +{\LWR@subcmidrule{#1}{#2}#3} +% \end{macrocode} +% \end{macro} + + + + + +% \subsection{Multicolumns} + +% \subsubsection{Parsing multicolumns} + +% \begin{macrocode} +\newcounter{LWR@tablemulticolswidth} +\newcounter{LWR@tablemulticolspos} +% \end{macrocode} + + + +% \begin{macro}{\LWR@printmccoltype} \marg{colspec} +% Print any valid column type found. Does not print |@|, |>|, or |<| columns +% or their associated tokens. +% \begin{macrocode} +\newcommand*{\LWR@printmccoltype}[1]{% +\LWR@traceinfo{lwr@printmccoltype -#1-}% +% \end{macrocode} +% Get one token of the column spec: +% \begin{macrocode} +\StrChar{#1}{\theLWR@tablemulticolspos}[\LWR@strresult]% +% \end{macrocode} +% Add to the \acro{HTML} tag depending on which column type is found: +% \begin{macrocode} +\IfStrEq{\LWR@strresult}{l}{l}{}% +\IfStrEq{\LWR@strresult}{c}{c}{}% +\IfStrEq{\LWR@strresult}{r}{r}{}% +\IfStrEq{\LWR@strresult}{p}{p}{}% +\IfStrEq{\LWR@strresult}{m}{m}{}% +\IfStrEq{\LWR@strresult}{b}{b}{}% +\IfStrEq{\LWR@strresult}{P}{P}{}% +\IfStrEq{\LWR@strresult}{M}{M}{}% +\IfStrEq{\LWR@strresult}{B}{B}{}% +\IfStrEq{\LWR@strresult}{S}{r}{}% +\LWR@traceinfo{lwr@printmccoltype done}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@multicolpartext} +% Print the data with paragraph tags: +% \begin{macrocode} +\newcommand*{\LWR@multicolpartext}{% +\LWR@startpars% +\LWR@multicoltext% +\LWR@stoppars% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@multicolother} \marg{colspec} +% For |@|, |>|, |<|, print the next token without paragraph tags: +% \begin{macrocode} +\newcommand*{\LWR@multicolother}[1]{% +\addtocounter{LWR@tablemulticolspos}{1}% +\StrChar{#1}{\theLWR@tablemulticolspos}[\LWR@strresult]% +\LWR@strresult% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@printmccoldata} \marg{colspec} +% Print the data for any valid column type found. +% \begin{macrocode} +\newcommand*{\LWR@printmccoldata}[1]{% +\LWR@traceinfo{lwr@printmccoldata -#1}% +% \end{macrocode} +% Get one token of the column spec: +% \begin{macrocode} +\StrChar{#1}{\theLWR@tablemulticolspos}[\LWR@strresult]% +% \end{macrocode} +% Print the text depending on which column type is found. +% Also handles |@|, |>|, |<| as it comes to them. +% \begin{macrocode} +\IfStrEq{\LWR@strresult}{l}{\LWR@multicoltext}{}% +\IfStrEq{\LWR@strresult}{c}{\LWR@multicoltext}{}% +\IfStrEq{\LWR@strresult}{r}{\LWR@multicoltext}{}% +\IfStrEq{\LWR@strresult}{p}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{m}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{b}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{P}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{M}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{B}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{S}{\LWR@multicolpartext}{}% +\IfStrEq{\LWR@strresult}{\detokenize{@}}{\LWR@multicolother{#1}}{}% +\IfStrEq{\LWR@strresult}{\detokenize{>}}{\LWR@multicolother{#1}}{}% +\IfStrEq{\LWR@strresult}{\detokenize{<}}{\LWR@multicolother{#1}}{}% +% \addtocounter{LWR@tablemulticolspos}{1}% +% \StrChar{#1}{\theLWR@tablemulticolspos}[\LWR@strresult]% +% \LWR@strresult% +% }{}% +\LWR@traceinfo{lwr@printmccoldata done}% +} +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\parsemulticolumnalignment} +% \marg{1: colspec} \marg{2: printresults} +% +% Scan the multicolumn specification and execute the printfunction +% for each entry. +% +% Note that the spec for a |p{spec}| column, or |@|, |>|, |<|, is a token list +% which will NOT match |l|, |c|, |r|, or |p|. +% \begin{macrocode} +\newcommand*{\LWR@parsemulticolumnalignment}[2]{% +\setcounter{LWR@tablemulticolspos}{1}% +\StrLen{#1}[\LWR@strresult]% +\setcounter{LWR@tablemulticolswidth}{\LWR@strresult}% +% \end{macrocode} +% Scan across the tokens in the column spec: +% \begin{macrocode} +\whiledo{% +\not\value{LWR@tablemulticolspos}>\value{LWR@tablemulticolswidth}% +}% +{% +% \end{macrocode} +% Execute the assigned print function for each token in the column spec: +% \begin{macrocode} +#2{#1}% +% \end{macrocode} +% Move to the next token in the column spec: +% \begin{macrocode} +\addtocounter{LWR@tablemulticolspos}{1}% +}% +} +% \end{macrocode} +% \end{macro} + + +% \subsubsection{High-level multicolumn interface} + +% \begin{macro}{\LWR@domulticolumn} \marg{1: numcols} \marg{2: colspec} \marg{3: text} +% +% \begin{macrocode} +\newcommand{\LWR@multicoltext}{} + +\NewDocumentCommand{\LWR@domulticolumn}{m m +m}{% +\LWR@traceinfo{lwr@domulticolumn -#1- -#2-}% +\renewcommand{\LWR@multicoltext}{#3}% +\LWR@maybenewtablerow% +% \end{macrocode} +% Begin the opening table data tag: +% \begin{macrocode} +\LWR@htmltag{td colspan="#1" + class="td% +% \end{macrocode} +% Print the column type: +% \begin{macrocode} +\LWR@parsemulticolumnalignment{#2}{\LWR@printmccoltype}% +% \end{macrocode} +% If this column has a cmidrule, add ``rule'' to the end of the \acro{HTML} class tag. +% +% If this position had a ``Y'' then add ``rule''. +% \begin{macrocode} +\ifthenelse{\equal{\LWR@getexparray{LWR@midrules}{\theLWR@tablecolspos}}{Y}}{rule}{}% +% \end{macrocode} +% Close the class tag's opening quote: +% \begin{macrocode} +"% +}% end of the opening table data tag +\global\boolfalse{LWR@intabularmetadata}% +\LWR@parsemulticolumnalignment{#2}{\LWR@printmccoldata}% +} +% \end{macrocode} +% \end{macro} + + +% \subsubsection{Longtable captions} + +% \DescribeBoolean{LWR@starredlongtable} +% Per the \pkg{caption} pacakge, step the counter if |longtable*|. +% +% \begin{macrocode} +\newbool{LWR@starredlongtable} +\boolfalse{LWR@starredlongtable} +% \end{macrocode} +% +% +% Per the \pkg{caption} package. User-redefinable float type. +% \begin{macrocode} +\providecommand*{\LTcaptype}{table} +% \end{macrocode} +% +% +% \begin{macro}{\LWR@longtabledatacaptiontag} * \oarg{toc entry} \marg{caption} +% +% \changes{v0.20}{2017/01/08}{Fix: Pars in captions.} +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@longtabledatacaptiontag}{s o +m} +{% +% \end{macrocode} +% Remember the latest name for \cs{nameref}: +% \begin{macrocode} +\IfValueTF{#2}{% optional given? +\ifthenelse{\equal{#2}{}}% optional empty? +{\LWR@setlatestname{#3}}% empty +{\LWR@setlatestname{#2}}% given and non-empty +}% optional given +{\LWR@setlatestname{#3}}% no optional +% \end{macrocode} +% create a multicolumn across all the columns +% \begin{macrocode} +\LWR@domulticolumn{\theLWR@tabletotalcols}{P}{% \LWR@domulticolumn +% \IfBooleanTF{#1}% star? +% {\IfValueTF{#2}{\LWR@origcaption*[#2]{#3}}{\LWR@origcaption*{#3}}} +% {\IfValueTF{#2}{\LWR@origcaption[#2]{#3}}{\LWR@origcaption{#3}}} +\IfBooleanTF{#1}% star? +% \end{macrocode} +% Star version, show a caption but do not make a LOT entry: +% \begin{macrocode} +{% yes star +\LWR@htmlblocktag{figcaption}% +#3% +\LWR@htmlblocktag{/figcaption}% +}% +{% No star: +% \end{macrocode} +% Not the star version: +% +% Don't step the counter if |\caption[]{A caption.}| +% \begin{macrocode} +\ifbool{LWR@starredlongtable}% +{% +\ifthenelse{\equal{#2}{}}% TOC entry +{}% +{% +\refstepcounter{\LTcaptype}% +\protected@edef\@currentlabel{% +\csuse{p@\LTcaptype}\csuse{the\LTcaptype}}% +}% +}{}% +% \end{macrocode} +% Create an \acro{HTML} caption. Afterwards, maybe make a LOT entry. +% \begin{macrocode} +\LWR@htmlblocktag{figcaption}% +\csuse{fnum@\LTcaptype}\CaptionSeparator#3% +\LWR@htmlblocktag{/figcaption}% +% \end{macrocode} +% See if an optional caption was given: +% \begin{macrocode} +\ifthenelse{\equal{#2}{}}% TOC entry empty +% \end{macrocode} +% if the optional caption was given, but empty, do not form a TOC entry +% \begin{macrocode} +{}% +% \end{macrocode} +% If the optional caption was given, but might only be |[]|: +% \begin{macrocode} +{% TOC entry not empty +\IfNoValueTF{#2}% No TOC entry? +% \end{macrocode} +% The optional caption is |[]|: +% \begin{macrocode} +{% No TOC entry +\addcontentsline% +{\csuse{ext@\LTcaptype}}% +{\LTcaptype}% +{% +\protect\numberline% +{\csuse{p@\LTcaptype}\csuse{the\LTcaptype}}% +{\ignorespaces #3\protect\relax}% +}% +}% end of No TOC entry +% \end{macrocode} +% The optional caption has text enclosed: +% \begin{macrocode} +{% yes TOC entry +\addcontentsline% +{\csuse{ext@\LTcaptype}}% +{\LTcaptype}% +{% +\protect\numberline% +{\csuse{p@\LTcaptype}\csuse{the\LTcaptype}}% +{\ignorespaces #2\protect\relax}% +}% +}% end of yes TOC entry +}% end of TOC entry not empty +}% end of no star +}% end of \LWR@domulticolumn + +\addtocounter{LWR@tablecolspos}{\theLWR@tabletotalcols} +\addtocounter{LWR@tablecolspos}{-1} + +} +% \end{macrocode} +% \end{macro} + + + + +% \subsubsection{\textbackslash{}tabledatamulticolumntag} + +% \begin{macro}{\LWR@tabledatamulticolumntag} \marg{numcols} \marg{alignment} \marg{text} +% \begin{macrocode} +\NewDocumentCommand{\LWR@tabledatamulticolumntag}{m m +m}% +{% +\LWR@domulticolumn{#1}{#2}{#3}% +\addtocounter{LWR@tablecolspos}{#1}% +\addtocounter{LWR@tablecolspos}{-1}% +} +% \end{macrocode} +% \end{macro} + + + +% \subsection{Multirow} + +% \DescribePackage{multirow} + + + +% \begin{macro}{\LWR@tabledatamultirowtag} +% \marg{numrows} \oarg{bigstruts} \marg{width} \oarg{fixup} \marg{text} +% \changes{v0.19}{2015/05/28}{Added optional args.} +% \begin{macrocode} +\NewDocumentCommand{\LWR@tabledatamultirowtag}{m o m o m}% +{% +\LWR@maybenewtablerow% +% \end{macrocode} +% Print the start of a new table data cell: +% \begin{macrocode} +\LWR@htmltag{td rowspan="#1" class="td% +% \end{macrocode} +% Append this column's spec: +% \begin{macrocode} +\StrChar{\LWR@tablecolspec}{\theLWR@tablecolspos}% +% \end{macrocode} +% If this column has a cmidrule, add ``rule'' to the end of the \acro{HTML} class tag: +% \begin{macrocode} +\ifthenelse{\equal{\LWR@getexparray{LWR@midrules}{\theLWR@tablecolspos}}{Y}}{rule}{}% +"{}} +% \end{macrocode} +% While printing the text, redefine |\\| to generate a new line +% \begin{macrocode} +\begingroup \let\\\LWR@endofline #5 \endgroup +\LWR@stoppars% +\global\boolfalse{LWR@intabularmetadata}% +}% +% \end{macrocode} +% \end{macro} + + +% \subsection{Utility macros inside a table} +% \begin{macrocode} +\newcommand*{\LWR@donothing}{} +\newcommand*{\LWR@domidrule}{\booltrue{LWR@doinghline}} +\newcommand*{\LWR@dotbrule}{\booltrue{LWR@doingtbrule}} +% \end{macrocode} + + +% \subsection{Checking for a new table cell} + +% \begin{macro}{\LWR@tabledatacolumntag} +% Open a new \acro{HTML} table cell unless the next token is for a macro +% which does not create data, such as |\hline|, |\toprule|, etc: +% \begin{macrocode} +\newbool{LWR@exitingtabular} +\newcommand*{\LWR@tabledatacolumntag}% +{% +% \end{macrocode} +% \hspace*{.5in} |\show\LWR@mynexttoken| to see what tokens to look for +% \begin{macrocode} +% \end{macrocode} +% If not any of the below, start a new table cell: +% \begin{macrocode} +\let\mynext\LWR@tabledatasinglecolumntag% +% \end{macrocode} +% If exiting the tabular: +% \begin{macrocode} +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\end}}% +{\booltrue{LWR@exitingtabular}}{}% +% \end{macrocode} +% \env{longtable} can have a caption in a cell +% \begin{macrocode} +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\caption}}% +{\let\mynext\LWR@donothing}{}% +% \end{macrocode} +% Look for other things which would not start a table cell: +% \begin{macrocode} +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\multicolumn}}% +{\let\mynext\LWR@donothing}{}% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\multirow}}% +{\let\mynext\LWR@donothing}{}% +% \end{macrocode} +% if come to an |\mrowcell|, this is a cell to be skipped over +% \begin{macrocode} +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\mrowcell}}% +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\hline}}% +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\toprule}}% +{% +\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\midrule}}% +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\cmidrule}}% +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\cline}}% +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\bottomrule}}% +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\warpprintonly}} +{\let\mynext\LWR@donothing}{}% +% +\ifthenelse{\isequivalentto{\LWR@mynexttoken}{\warpHTMLonly}} +{\let\mynext\LWR@donothing}{}% +% \end{macrocode} +% no action for an |\end| token +% +% Add similar to the above for any other non-data tokens +% which might appear in the table. +% +% Start the new table cell if was not any of the above: +% \begin{macrocode} +\mynext% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \subsection{\textbackslash{}mrowcell} + +% \begin{macro}{\mrowcell} +% The user must insert |\mrowcell| into any multirow cells which must be skipped. +% This command has no action during print output. +% \watchout + +% \codeall +% \begin{macrocode} +\begin{warpall} +\newcommand*{\mrowcell}{} +\end{warpall} +% \end{macrocode} +% \end{macro} + + + +% \subsection{New \textbackslash{}tabular definition} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{environment}{LWR@tabular} \oarg{vertposition} \marg{colspecs} +% +% The new tabular environment will be |\let| in |\LWR@LwarpStart|, +% since \pkg{siunitx} might redefine tabular in the user's document. +% \begin{macrocode} +\newenvironment*{LWR@tabular}[2][] +{% +\LWR@traceinfo{tabular started}% +\begingroup% +\addtocounter{LWR@tabulardepth}{1}% +% \end{macrocode} +% Not yet started a table row: +% \begin{macrocode} +\global\boolfalse{LWR@startedrow}% +% \end{macrocode} +% Not yet doing an hline: +% \begin{macrocode} +\global\boolfalse{LWR@doinghline}% +% \end{macrocode} +% Not yet doing a top/bottom rule: +% \begin{macrocode} +\global\boolfalse{LWR@doingtbrule}% +% \end{macrocode} +% Have not yet found the end of tabular command: +% \begin{macrocode} +\boolfalse{LWR@exitingtabular}% +% \end{macrocode} +% Create the |table| tag: +% \begin{macrocode} +\global\booltrue{LWR@intabularmetadata}% +\LWR@htmlblocktag{table}% +% \end{macrocode} +% Parse the table columns: +% \begin{macrocode} +\LWR@parsetablecols{#2}% +% \end{macrocode} +% Table col spec is: \cs{LWR@tablecolspec} which is a string of |llccrr|, etc. +% +% Do not place the table inside a paragraph: +% \begin{macrocode} +\LWR@stoppars% +% \end{macrocode} +% Track column \# for setting text-align: +% \begin{macrocode} +\setcounter{LWR@tablecolspos}{1}% +% \end{macrocode} +% Start looking for midrules: +% \begin{macrocode} +\LWR@clearmidrules% +% \end{macrocode} +% |\\| becomes a macro to end the table row: +% \begin{macrocode} +\let\\\LWR@tabularendofline% +% \end{macrocode} +% The following may appear before a data cell is created, +% so after doing their actions, we look ahead with |\LWR@getmynextoken| +% to see if the next token might create a new data cell: +% \begin{macrocode} +\renewcommand*{\hline}{\LWR@domidrule\LWR@getmynexttoken}% +\newcommand*{\midrule}{\LWR@domidrule\LWR@getmynexttoken}% +\NewDocumentCommand{\cmidrule}{o d() m}% +{\LWR@docmidrule[##1](##2){##3}\LWR@getmynexttoken}% +\RenewDocumentCommand{\cline}{m}% +{\LWR@docmidrule{##1}\LWR@getmynexttoken}% +\newcommand*{\toprule}{\LWR@dotbrule\LWR@getmynexttoken}% +\newcommand*{\bottomrule}{\LWR@dotbrule\LWR@getmynexttoken}% +% \end{macrocode} +% The following create data cells and will have no more data in this cell, +% so we do not want to look ahead for a possible data cell, +% so do not want to use |\LWR@getmynexttoken|. +% \begin{macrocode} +\let\multicolumn\LWR@tabledatamulticolumntag% +\let\multirow\LWR@tabledatamultirowtag% +\renewcommand*{\mrowcell}{\global\booltrue{LWR@skippingmrowcell}}% +\let\caption\LWR@longtabledatacaptiontag% +% \end{macrocode} +% Reset for new processing: +% \begin{macrocode} +\global\boolfalse{LWR@tableparcell}% +\global\boolfalse{LWR@skippingmrowcell}% +% \end{macrocode} +% Look ahead for a possible table data cell: +% \begin{macrocode} +\LWR@getmynexttoken% +}% +% \end{macrocode} +% Ending the environment: +% \begin{macrocode} +{% +\LWR@closetabledatacell% +\LWR@htmlblocktag{/tr}% +\LWR@htmlblocktag{/table}% +\global\boolfalse{LWR@intabularmetadata}% +% \end{macrocode} +% \begin{macrocode} +\addtocounter{LWR@tabulardepth}{-1}% +\endgroup% +} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \subsection{Array} +% \label{sec:array} + +% \DescribePackage{array} +% +% \pkg{array} is also automatically loaded by siunitx. + + + + + +% \section{Cross-references} +% +% Sectioning commands have been emulated from scratch, so the cross-referencing +% commands are custom-written for them. +% Emulating both avoids several layers of patches. +% +% The \pkg{zref} package is used to remember section name, file, and +% lateximage depth and number for each label. +% +% \Cref{tab:crossrefdata} shows the data structures related to cross-referencing. +% +% \changes{v0.14}{2016/03/29}{Docs: Table: Cross-referencing data structures.} +% \changes{v0.19}{2016/05/25}{Docs: Table: Cross-referencing data structures, updated.} +% \begin{table} +% \caption{Cross-referencing data structures\label{tab:crossrefdata}} +% \medskip +% \hrule +% \smallskip +% \begin{description}[nosep] +% \raggedright +% \item [Original \LaTeX:] \hfill (print and \acro{HTML}) +% \begin{description} +% \item [\cs{refstepcounter}:] Steps the couunter and sets \cs{@currentlabel}. +% \item [\cs{@currentlabel}:] \cs{p@<ctr>}\cs{the<ctr>} Updated by \cs{refstepcounter}. +% \item [\cs{label}:] Writes to the |.aux| file: +% \qquad |\newlabel{<label>}{{\@currentlabel}{\thepage}}| +% \item [\cs{newlabel}:] When the |.aux| file is read, sets \cs{r@<label>}. +% \item [\cs{r@<label>}:] Set to: |{{\@currentlabel}{\thepage}}| +% \item [\cs{ref}:] Returns the first part of \cs{r@<label>}. +% \item [\cs{pageref}:] Returns the second part of \cs{r@<label>}. +% \end{description} +% \item [Added by \pkg{amsmath}:] \hfill (print and \acro{HTML}) +% \begin{description} +% \item [\cs{label}:] Delayed until math is completed. +% \end{description} +% \item [Added by \pkg{lwarp}:] \hfill (\acro{HTML} only) +% \begin{description} +% \item [\cs{nameref}:] Emualted from \pkg{hyperref} for \pkg{lwarp}. +% See \cref{sec:references}. +% \item [\cs{ref} and \cs{nameref}:] Adds \acro{HTML} tags. +% See \cref{sec:references}. +% \end{description} +% \item [Added by \pkg{cleverref}:] \hfill (print and \acro{HTML}) +% \begin{description} +% \item [\cs{refstepcounter:}] Added: sets \cs{cref@currentlabel}. +% \item [\cs{cref@currentlabel}:] (|<type>|=|<ctr>| unless an alias is used): +% \qquad |[<type>][\arabic{<ctr>}][<parent ctrs>]{\p@<ctr>\the<ctr>}| +% Also see \cref{sec:footnotesregular} for use with footnotes. +% \item [\cs{label}:] Writes to the |.aux| file: +% \qquad |\newlabel{<label>@cref}{{\cref@currentlabel}{\thepage}}| +% \item [\cs{newlabel}:] (Unchanged.) When the |.aux| file is read, sets \cs{r@<label>@cref}. +% \item [\cs{r@<label>@cref}:] Set to: |{{\cref@currentlabel}{\thepage}}| +% \item [Utility functions:] See \cs{cref@getlabel}, \cs{cref@gettype}, +% \cs{cref@getcounter}, \cs{cref@getprefix}. +% \item [Cross-referencing names:] \cs{crefname} and \cs{Crefname} assign +% human-readable names for references to this counter type. +% \end{description} +% \item [Additionally patched by \pkg{lwarp}:] \hfill (\acro{HTML} only) +% \begin{description} +% \item [\cs{cref}, etc.:] Modified for \pkg{lwarp}. +% See \cref{sec:cleveref}. +% \item [\cs{label}:] Adds \acro{HTML} tags (\cref{sec:labels}), +% plus \cs{splabel} data (\cref{sec:zrefsetup}): +% \begin{description} +% \item [zLWR@name:] The section name for this label. +% \item [zLWR@htmlfilenumer:] The filenumber or name for this label. +% \item [zLWR@lateximagedepth:] The |lateximagedepth| for this label. +% \item [zLWR@lateximagenumber:] The |lateximagenumber| for this label. +% \end{description} +% \item [\cs{label} inside math:] See \cref{sec:amsmathsupport}. +% \end{description} +% \item [Footnotes:] See \cs{noteentry} in \cref{sec:footnotesregular}. +% \end{description} +% \hrule +% \end{table} +% +% +% ^^A % See: +% ^^A % +% ^^A % \href{http://tex.stackexchange.com/questions/85956/redefining-label-and-ref-when-using-hyperref} +% ^^A % {\texttt{http://tex.stackexchange.com/questions/85956/redefining-label-and-ref-when-\\using-hyperref}} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \subsection{Setup} + +% +% +% \begin{macro}{\@currentlabelname} +% To remember the most recently defined section name, +% description, or caption, for \cs{nameref}. +% +% \begin{macrocode} +\newcommand*{\@currentlabelname}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@stripperiod} \marg{text} \oarg{.} +% +% Removes a trailing period. +% \begin{macrocode} +\def\LWR@stripperiod#1.\ltx@empty#2\@nil{#1}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LWR@setlatestname} \marg{object name} +% +% Removes \cs{label}, strips any final period, and remembers the result. +% \begin{macrocode} +\newcommand*{\LWR@setlatestname}[1]{% +% \end{macrocode} +% Remove \cs{label} and other commands from the name, the strip any final period. +% See \pkg{zref-titleref} and \pkg{gettitlestring}. +% \begin{macrocode} +\GetTitleStringExpand{#1}% +\edef\@currentlabelname{\detokenize\expandafter{\GetTitleStringResult}}% +\edef\@currentlabelname{% +\expandafter\LWR@stripperiod\@currentlabelname% +\ltx@empty.\ltx@empty\@nil% +}% +} +% \end{macrocode} +% \end{macro} + + +% \subsection{Zref setup} +% \label{sec:zrefsetup} + +% See: \\ +% \href{http://tex.stackexchange.com/questions/57194/extract-section-number-from-equation-reference} +% {\ttfamily http://tex.stackexchange.com/questions/57194/ \\ +% \hspace*{2em}extract-section-number-from-equation-reference} +% +% Create a new property list called special: +% \begin{macrocode} +\zref@newlist{special} +% \end{macrocode} +% Define a new property which has the name of the most recently declared section: +% \begin{macrocode} +\zref@newprop{zLWR@name}{\@currentlabelname} +% \end{macrocode} +% Define a new property which has either a filename or a file number: +% \begin{macrocode} +\zref@newprop{zLWR@htmlfilenumber}{% +\ifbool{FileSectionNames}{\LWR@thisfilename}{\theLWR@htmlfilenumber}% +}% +% \end{macrocode} +% Additional properties for lateximages: +% \begin{macrocode} +\zref@newprop{zLWR@lateximagedepth}{\arabic{LWR@lateximagedepth}} +\zref@newprop{zLWR@lateximagenumber}{\arabic{LWR@lateximagenumber}} +% \end{macrocode} +% +% |zLWR@htmlfilenumber| property holds the file number or name +% +% Add a |LWR@htmlfilenumber| property, and lateximage properties to special: +% \begin{macrocode} +\zref@addprop{special}{zLWR@name} +\zref@addprop{special}{zLWR@htmlfilenumber} +\zref@addprop{special}{zLWR@lateximagedepth} +\zref@addprop{special}{zLWR@lateximagenumber} +% \end{macrocode} +% Returns the selected field: +% \begin{macrocode} +\newcommand*{\LWR@spref}[2]{% +\zref@extractdefault{#1}{#2}{??}} +% \end{macrocode} +% \begin{macro}{\LWR@nameref} \marg{label} +% Returns the section name for this label: +% \begin{macrocode} +\newcommand*{\LWR@nameref}[1]{% +\LWR@spref{#1}{zLWR@name}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LWR@htmlfileref} \marg{label} +% Returns the file number for this label: +% \begin{macrocode} +\newcommand*{\LWR@htmlfileref}[1]{% +\LWR@traceinfo{LWR@htmlfileref A: !#1!}% +\LWR@spref{#1}{zLWR@htmlfilenumber}% +\LWR@traceinfo{LWR@htmlfileref B}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LWR@lateximagedepthref} \marg{label} +% Returns the |lateximagedepth| for this label: +% \begin{macrocode} +\newcommand*{\LWR@lateximagedepthref}[1]{% +\LWR@spref{#1}{zLWR@lateximagedepth}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LWR@lateximagenumberref} \marg{label} +% Returns the |lateximagenumber| for this label: +% \begin{macrocode} +\newcommand*{\LWR@lateximagenumberref}[1]{% +\LWR@spref{#1}{zLWR@lateximagenumber}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LWR@splabel} \marg{label} +% Sanitize the name and then creates the label: +% \begin{macrocode} +\newcommand*{\LWR@splabel}[1]{% +\LWR@setlatestname{\@currentlabelname}% +\zref@labelbylist{#1}{special}} +% \end{macrocode} +% \end{macro} + + + + +% \subsection{Labels} +% \label{sec:labels} + + +% \begin{macro}{\LWR@subsublabel} \marg{label} \quad +% Creates an \acro{HTML} id tag. +% \begin{macrocode} +\newcommand*{\LWR@subsublabel}[1]{% +% \end{macrocode} +% Create an \acro{HTML} id tag unless are inside a lateximage, +% since it would appear in the image: +% \begin{macrocode} +\ifthenelse{\cnttest{\value{LWR@lateximagedepth}}{>}{0}}% +{}% +{% not lateximage +% \end{macrocode} +% If not doing a lateximage, create an \acro{HTML} ID tag: +% (To be factored\dots) +% \begin{macrocode} +\ifbool{LWR@doingstartpars}% +{% pars allowed +\ifbool{LWR@doingapar} +{% par started +\LWR@htmltag{a id="#1"{}}\LWR@htmltag{/a}% +}% par started +{% par not started +\LWR@stoppars% +\LWR@htmltag{a id="#1"{}}\LWR@htmltag{/a}% +\LWR@startpars% +}% par not started +}% pars allowed +{% pars not allowed +\LWR@htmltag{a id="#1"{}}\LWR@htmltag{/a}% +}% pars not allowed +}% not lateximage +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\LWR@sublabel} \marg{label} +% +% \cs{label} during \acro{HTML} output. +% Creates a traditional \LaTeX\ label, +% adds a special label with additional information, +% and creates an \acro{HTML} id tag. +% +% Used by \cs{LWR@htmllabel} and \cs{LWR@htmlmathlabel}. +% \begin{macrocode} +\newcommand*{\LWR@sublabel}[1]{% +% \end{macrocode} +% Create a traditional LaTeX label, as modified by \pkg{cleveref}: +% \begin{macrocode} +\LWR@traceinfo{LWR@sublabel: !#1!}% +\LWR@origlabel{#1}% +% \end{macrocode} +% Create a special label which holds the section number, +% |LWR@htmlfilenumber|, |LWR@lateximagedepth|, and |LWR@lateximagenumber|: +% \begin{macrocode} +\LWR@traceinfo{about to splabel}% +\LWR@traceinfo{filesectionnames is \ifbool{FileSectionNames}{true}{false}}% +\LWR@traceinfo{LWR@thisfilename is !\LWR@thisfilename!}% +\LWR@traceinfo{LWR@htmlfilenumber is \theLWR@htmlfilenumber}% +\LWR@splabel{#1}% +\LWR@subsublabel{#1}% +\LWR@traceinfo{finished with LWR@sublabel}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\LWR@newlabel} \marg{label} +% +% \cs{label} during \acro{HTML} output when not in math mode, +% removing extra spaces around the label, as done by regular \LaTeX\ \cs{label}. +% \begin{macrocode} +\newcommand*{\LWR@newlabel}[1]{% +\LWR@traceinfo{lwr@newlabel: !#1!}% +% \@bsphack% +\LWR@sublabel{#1}% +% \@esphack% +\LWR@traceinfo{lwr@newlabel: done}% +} +% \end{macrocode} +% \end{macro} +% + + + + +% \subsection{References} +% \label{sec:references} + +% \begin{macro}{\LWR@startref} \marg{label} \quad +% (Common code for |\ref| and |\nameref|.) +% +% Open an \acro{HTML} tag reference to a filename, \# character, and a label. +% +% \begin{macrocode} +\newcommand*{\LWR@startref}[1] +{% +\edef\LWR@lidref{\LWR@lateximagedepthref{#1}} +% \typeout{***LWR@startref A: !#1!}% +% \end{macrocode} +% Create the tag: +% \begin{macrocode} +\LWR@htmltag{a href="% +% \typeout{***LWR@startref B}% +\LWR@htmlrefsectionfilename{#1}% +% \typeout{***LWR@startref C}% +\#% +% \end{macrocode} +% See if |LWR@lateximagedepth| is unknown: +% \begin{macrocode} +% \typeout{***LWR@startref D: !#1!}% +\ifthenelse{\equal{\LWR@lidref}{??}}% +% \end{macrocode} +% ``|??|'' if |LWR@lateximagedepth| is unknown: +% \begin{macrocode} +{??}% +% \end{macrocode} +% If |LWR@lateximagedepth| is known: +% \begin{macrocode} +{% +% \typeout{***LWR@startref D1}% +% \typeout{***depthref is \LWR@lidref}% +\ifthenelse{\cnttest{\LWR@lidref}{>}{0}}% +{% +% \typeout{***LWR@startref D2}% +lateximage\LWR@lateximagenumberref{#1}% +}% +{% +% \typeout{***LWR@startref D3}% +#1% +}% +}% +% \typeout{***LWR@startref E}% +% \end{macrocode} +% closing quote: +% \begin{macrocode} +"{}}% +% \typeout{***LWR@startref F}% +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\ref} * \marg{label} \quad +% Create an internal document reference link, +% or without a link if starred per \pkg{hyperref}. +% \begin{macrocode} +\NewDocumentCommand{\LWR@newref}{s m}{% +\LWR@traceinfo{LWR@newref #2}% +\IfBooleanTF{#1}% +{\LWR@origref{#2}}% +{% +\LWR@startref{#2}% +\LWR@origref{#2}% +\LWR@htmltag{/a}% +}% +} + +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\pagerefPageFor} Text for starred page references. +% +% \begin{macrocode} +\newcommand*{\pagerefPageFor}{page for} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pageref} * \marg{label} \quad +% Create an internal document reference, +% or just the unlinked number if starred, per \pkg{hyperref}. +% +% \changes{v0.20}{2017/01/03}{Added.} +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@newpageref}{s m}{% +\IfBooleanTF{#1}% +{(\pagerefPageFor\ \LWR@origref{#2})}% +{(\cpageref{#2})}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\nameref} \marg{label} +% \begin{macrocode} +\newcommand*{\nameref}[1]{% +\LWR@traceinfo{nameref A}% +\LWR@startref{#1}% +\LWR@traceinfo{nameref B}% +\LWR@nameref{#1}% +\LWR@traceinfo{nameref C}% +\LWR@htmltag{/a}% +\LWR@traceinfo{nameref D}% +} +% \end{macrocode} +% \end{macro} + + +% \subsection{Hyper-references} +% +% Note that the code currently only sanitizes the underscore character. +% \watchout +% Additional characters should be rendered inert as well. +% See the |hyperref.sty| definition of \cs{gdef}\cs{hyper@normalise} for an example. +% + +% \DescribePackage{hyperref} + +% Do not tell other packages that \pkg{hyperref} is emulated. +% \watchout +% Some packages patch various commands if \pkg{hyperref} is present, +% which will probably break something, and the emulation already handles +% whatever may be emulated anyhow. +% +% Any reference to |\usepackage{hyperref}| must be placed inside a \env{warpprint} environment. +% \watchout +% \begin{macrocode} +% DO NOT TELL OTHER PACKAGES TO ASSUME HYPERREF: +% \EmulatesPackage{hyperref}[2015/08/01]% Disabled. Do not do this. +% \end{macrocode} + +% Create a link with a text name: + +% \begin{macro}{\LWR@subhyperref} \marg{URL} \marg{text} +% \changes{v0.18}{2016/04/14}{Improved HTML output linebreaks.} +% \begin{macrocode} +\NewDocumentCommand{\LWR@subhyperref}{m +m}{% +\LWR@htmltag{a href="{#1}" target="\_{}blank"\LWR@orignewline}#2\LWR@htmltag{/a}% +\LWR@ensuredoingapar% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@subhyperrefclass} \marg{URL} \marg{text} \marg{htmlclass} +% \changes{v0.18}{2016/04/14}{Improved HTML output linebreaks.} +% \begin{macrocode} +\NewDocumentCommand{\LWR@subhyperrefclass}{m +m m}{% +\LWR@htmltag{a href="{#1}" +class="#3"\LWR@orignewline}#2\LWR@htmltag{/a}% +\LWR@ensuredoingapar% +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\href} \oarg{options} \marg{URL} \marg{text} +% +% Create a link with accompanying text: +% \begin{macrocode} +\NewDocumentCommand{\LWR@hrefb}{O{} m +m}{% +\LWR@subhyperref{#2}{#3}% +\endgroup% +\LWR@ensuredoingapar% +} + +\newcommand{\href}{% +\LWR@ensuredoingapar% +\begingroup% +\catcode`\_=12 +\LWR@hrefb% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\nolinkurl} \marg{URL} +% +% Print the name of the link without creating the link: +% \begin{macrocode} +\newcommand*{\LWR@nolinkurlb}[1]{#1\endgroup\LWR@ensuredoingapar} + +\newcommand{\nolinkurl}{% +\LWR@ensuredoingapar% +\begingroup\catcode`\_=12 +\LWR@nolinkurlb% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\url} \marg{URL} +% +% Create a link whose text name is the address of the link: +% \begin{macrocode} +\newcommand*{\LWR@urlb}[1]{% +\href{#1}{#1}% +\endgroup% +\LWR@ensuredoingapar% +} + +\newcommand{\url}{% +\LWR@ensuredoingapar% +\begingroup\catcode`\_=12 +\LWR@urlb% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@subinlineimage} \oarg{alttag} \marg{class} +% \marg{filename} \marg{extension} \marg{style} +% +% \changes{v0.18}{2016/05/18}{Surpress extra space.} +% +% \begin{macrocode} +\newcommand*{\LWR@subinlineimage}[5][]{% +\ifthenelse{\equal{#1}{}}% +{\LWR@htmltag{img src="#3.#4" alt="#3" style="#5" class="#2"{}}}% +{\LWR@htmltag{img src="#3.#4" alt="#1" style="#5" class="#2"{}}}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \clearpage + +% \section{Floats} +% \label{sec:floats} + +% Floats are supported, although partially through emulation. +% +% \Cref{tab:floatdata} shows the data structure associated with each |<type>| +% of float. + +% \changes{v0.14}{2016/03/28}{Docs: Table: Float data structures.} +% \begin{table} +% \caption{Float data structures\label{tab:floatdata}} +% +% \bigskip +% For each |<type>| of float (figure, table, etc.) there exists the following: +% +% \hrule +% \begin{description} +% \item [counter <type>:] A counter called |<type>|, such as |figure|, |table|. +% \item [\cs{<type>name}:] Name. \cs{figurename} prints ``Figure'', etc.% +% \item [\cs{ext@<type>}:] File extension. \cs{ext@figure} prints ``lof'', etc. +% \item [\cs{fps@<type>}:] Placement. +% \item [\cs{the<type>}:] Number. \cs{thetable} prints the number of the table, etc. +% \item [\cs{p@<type>}:] Parent's number. +% Prints the number of the [within] figure, etc. +% \item [\cs{fnum@<type>}:] Prints the figure number for the caption. \\ +% \cs{<type>name}~\cs{the<type>}, ``Figure 123''. +% \item [\cs{<type>}:] Starts the float environment. |\figure| or \cs{begin}|{figure}| +% \item [\cs{end<type>}:] Ends the float environment. |\endfigure| or \cs{end}|{figure}| +% \item [\cs{tf@<ext>}:] The \LaTeX{} file identifier for the output file. +% \item [\texttt{LWR@have<type>}:] A boolean rememebering whether a \cs{listof} was +% requested for a float of this type. +% \item [File with extension lo<f,t,a-z>:] An output file containing +% the commands to build the +% \cs{listof}{<type>}{<name>} ``table-of-contents'' structure. +% \item [Cross-referencing names:] For \pkg{cleveref}'s \cs{cref} and related, +% \cs{crefname} and \cs{Crefname} assign human-readable names for references to this float type. +% \end{description} +% \hrule +% \end{table} +% +% \cs{@makecaption} is redefined to print the float number and caption text, +% separated by \cs{CaptionSeparator}, which works with the \pkg{babel} package to +% adjust the caption separator according to the language. French, for example, +% uses an en-dash instead of a colon: ``Figure 123 -- Caption text''. + + +% \subsection{Float captions} +% \label{sec:floatcaptions} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\LWR@floatbegin} \marg{type} \oarg{placement} +% +% Begins a \cs{newfloat} environment. +% \begin{macrocode} +\NewDocumentCommand{\LWR@floatbegin}{m o}{% +\LWR@stoppars +% \end{macrocode} +% There is a new float, so increment the unique float counter: +% \begin{macrocode} +\addtocounter{LWR@thisfloat}{1}% +\booltrue{LWR@freezethisfloat}% +% \end{macrocode} +% +% \begin{macrocode} +\begingroup +% \end{macrocode} +% Settings while inside the environment: +% \begin{macrocode} +\LWR@origraggedright +% \end{macrocode} +% Open an \acro{HTML} |figure| tag: +% \begin{macrocode} +\LWR@htmltag{figure id="autofloat-\arabic{LWR@thisfloat}" class="#1"} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\@captype}{#1} +\caption@settype{#1} +\LWR@startpars +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@float} +% \begin{macro}{\@dlbfloat} Support packages which create floats directly. +% \begin{macrocode} +\let\@float\LWR@floatbegin +\let\@dblfloat\LWR@floatbegin +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\LWR@floatend} +% +% Ends a \cs{newfloat} environment. +% \begin{macrocode} +\newcommand*{\LWR@floatend}{% +\LWR@stoppars% +\LWR@htmlelementend{figure}% +\endgroup% +\boolfalse{LWR@freezethisfloat}% +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\end@float} +% \begin{macro}{\end@dlbfloat} Support packages which create floats directly. +% \begin{macrocode} +\let\end@float\LWR@floatend +\let\end@dblfloat\LWR@floatend +% \end{macrocode} +% \end{macro} +% \end{macro} + + + +% \DescribeCounter{LWR@thisfloat} +% A sequential counter for all floats. +% This is used to identify the float then reference it from the List of Figures and +% List of Tables. +% \begin{macrocode} +\newcounter{LWR@thisfloat} +% \end{macrocode} + +% \DescribeBoolean{LWR@freezethisfloat} +% Prevents multiple increments of \cs{LWR@thisfloat} inside a float. +% \begin{macrocode} +\newbool{LWR@freezethisfloat} +\boolfalse{LWR@freezethisfloat} +% \end{macrocode} + +% \begin{macro}{\LWR@maybeincthisfloat} +% \begin{macrocode} +\newcommand*{\LWR@maybeincthisfloat}{% +\ifbool{LWR@freezethisfloat}{}{\addtocounter{LWR@thisfloat}{1}}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\@captype} +% Remembers which float type is in use. +% \begin{macrocode} +\newcommand*{\@captype}{} +% \end{macrocode} +% \end{macro} + + +% \subsubsection{Caption inside a float environment} + +% \begin{macro}{\CaptionSeparator} How to separate the float number and the caption text. +% \changes{v0.13}{2016/03/23}{Fix for newer babel package.} +% \begin{macrocode} +\AtBeginDocument{\providecommand*{\CaptionSeparator}{:~}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\@makecaption} \marg{name and num} \marg{text} +% +% Prints the float type and number, the caption separator, and the caption text. +% \begin{macrocode} +\AtBeginDocument{\renewcommand{\@makecaption}[2]{#1\CaptionSeparator#2}} +% \end{macrocode} +% \end{macro} + + +% \subsubsection{Caption and LOF linking and tracking} + +% When a new \acro{HTML} file is marked in the \LaTeX\ \acro{PDF} file, +% the \LaTeX\ page number at that point is stored in |LWR@latestautopage|, +% (and the associated filename is remembered by the special \LaTeX\ labels). +% This page number is used to generate an |autofloat| \acro{HTML} \acro{ID} +% in the \acro{HTML} output at the start of the new \acro{HTML} file. +% Meanwhile, there is a float counter used to generate an \acro{HTML} |autofloat| +% \acro{ID}s at the start of the float itself in the \acro{HTML} file. +% The |autopage| and |autofloat| values to use for each float are written to the +% |.lof|, etc. files just before each float's entry. These values are used +% by \cs{l@figure}, etc. to create the \acro{HTML} links in the List of Figures, etc. +% +% \DescribeCounter{LWR@nextautofloat} Tracks autofloat for floats. +% \DescribeCounter{LWR@nextautopage} Tracks autopage for floats. +% +% These are updated per float as the |.lof| file is read. +% \begin{macrocode} +\newcounter{LWR@nextautofloat} +\newcounter{LWR@nextautopage} +% \end{macrocode} +% +% +% \begin{macro}{\LWRsetnextfloat} \marg{autopage} \marg{autofloat} +% +% This is written to the |.lof| file just before each float's usual entry. +% The autopage and autofloat are remembered for \cs{l@figure} to use when +% creating the \acro{HTML} links. +% +% \begin{macrocode} +\newcommand*{\LWRsetnextfloat}[2]{% +\setcounter{LWR@nextautopage}{#1}% +\setcounter{LWR@nextautofloat}{#2}% +} +% \end{macrocode} +% \end{macro} + +% \DescribeCounter{LWR@latestautopage} +% Updated each time a new \acro{HTML} file is begun. +% \cs{LWRsetnextfloat} is written with this and the autofloat +% by the modified \cs{addcontentsline} just before each float's entry. +% \begin{macrocode} +\newcounter{LWR@latestautopage}% updated each new HTML file +\setcounter{LWR@latestautopage}{1} +% \end{macrocode} + +% \begin{macrocode} +\let\LWR@origcaption@begin\caption@begin +\let\LWR@origcaption@end\caption@end +\let\LWR@orig@@par\@@par +% \end{macrocode} + +% \begin{macro}{\LWR@caption@begin} +% Low-level patches to create \acro{HTML} tags for captions. +% \begin{macrocode} +\newcommand{\LWR@caption@begin} +{ +\LWR@traceinfo{LWR@caption@begin}% +% \end{macrocode} +% Keep par and minipage changes local: +% \begin{macrocode} +\begingroup% +% \end{macrocode} +% The \pkg{caption} code was not allowing the closing |par| tag: +% \begin{macrocode} +\renewcommand{\@@par}{\LWR@closeparagraph\LWR@orig@@par}% +% \end{macrocode} +% No need for a minipage inside the caption: +% \begin{macrocode} +\RenewDocumentEnvironment{minipage}{O{t} o O{t} m}{}{}% +% \end{macrocode} +% Enclose the original caption code inside an \acro{HTML} tag: +% \begin{macrocode} +\LWR@htmlblocktag{figcaption}% +\LWR@origcaption@begin% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@caption@end} +% Low-level patches to create \acro{HTML} tags for captions. +% \begin{macrocode} +\newcommand{\LWR@caption@end} +{% +\LWR@origcaption@end% +% \end{macrocode} +% Subcaptions were being over-written by the closing \acro{HTML} tag: +% \begin{macrocode} +\vspace*{\baselineskip}% +% \end{macrocode} +% Closing tag: +% \begin{macrocode} +\LWR@htmlblocktag{/figcaption}% +\endgroup% +% \leavevmode% avoid bad space factor (0) error +\LWR@traceinfo{LWR@caption@end: done}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\caption@begin} +% \begin{macro}{\caption@end} +% Low-level patches to create \acro{HTML} tags for captions. +% \begin{macrocode} +\let\caption@begin\LWR@caption@begin +\let\caption@end\LWR@caption@end +% \end{macrocode} +% \end{macro} +% \end{macro} + + +% \begin{macro}{\captionlistentry} +% Tracks the float number for this caption used outside a float. +% Patched to create an \acro{HTML} anchor. +% \begin{macrocode} +\let\LWR@origcaptionlistentry\captionlistentry + +\renewcommand*{\captionlistentry}{% +\LWR@maybeincthisfloat% +\LWR@ensuredoingapar% +\LWR@htmltag{a id="autofloat-\arabic{LWR@thisfloat}"{}}\LWR@htmltag{/a}% +\LWR@origcaptionlistentry% +} + +\def\LWR@LTcaptionlistentry{% +\LWR@ensuredoingapar% +\LWR@htmltag{a id="autofloat-\arabic{LWR@thisfloat}"{}}\LWR@htmltag{/a}% + \bgroup + \@ifstar{\egroup\LWR@LT@captionlistentry}% gobble * + {\egroup\LWR@LT@captionlistentry}}% +\def\LWR@LT@captionlistentry#1{% + \caption@listentry\@firstoftwo[\LTcaptype]{#1}}% +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\addcontentsline} +% Patched to write the autopage and autofloat before each float's entry. +% No changes if writing |.toc|. +% \begin{macrocode} +\let\LWR@origaddcontentsline\addcontentsline + +\renewcommand*{\addcontentsline}[3]{% +\ifthenelse{\equal{#1}{toc}}{}{% +\addtocontents{\@nameuse{ext@#2}}{% +\protect\LWRsetnextfloat% +{\arabic{LWR@latestautopage}}% +{\arabic{LWR@thisfloat}}% +}% +}% +\LWR@origaddcontentsline{#1}{#2}{#3}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\captionof} +% Patched to track the float number since this is used outside a float, +% and also create an \acro{HTML} anchor for the virtual float. +% \begin{macrocode} +\AtBeginDocument{ +\let\LWR@origcaptionof\captionof + +\renewcommand*{\captionof}{% +\LWR@maybeincthisfloat% +\LWR@stoppars +\LWR@htmltag{a id="autofloat-\arabic{LWR@thisfloat}"{}}\LWR@htmltag{/a}% +\LWR@origcaptionof% +} +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Table of Contents, LOF, LOT} +% +% This section controls the generation of the TOC, LOF, LOT. +% +% The |.toc|, |.lof|, and |.lot| files are named by the source code \cs{jobname}. +% +% In \acro{HTML}, the printed tables are placed inside a div of class |.toc|, |.lof|, or |.lot|. +% +% A ``sidetoc'' is provided which prints a subset of the TOC on the side of each page other +% than the homepage. +% +% The regular \LaTeX{} infrastructure is used for TOC, +% along with some patches to generate \acro{HTML} output. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \subsection{Reading and printing the TOC} + +% \begin{macro}{\LWR@myshorttoc} \marg{toc/lof/lot} +% \changes{v0.18}{2016/05/19}{Reorganize \cs{HomeHTMLFilename} logic.} +% +% Reads in and prints the \acro{TOC}/\acro{LOF}/\acro{LOT} at the current position. +% While doing so, makes the |@| character into a normal letter to allow +% formatting commands in the section names. + +% Unlike in regular \LaTeX{}, the file is not reset after being read, since +% the \acro{TOC} may be referred to again in each \acro{HTML} page, and is +% used for the side\acro{TOC}. +% \begin{macrocode} +\newcommand*{\LWR@myshorttoc}[1]{ +\LWR@ensuredoingapar +% \end{macrocode} +% Only if the file exists: +% \begin{macrocode} +\IfFileExists{\jobname.#1}{ +% \end{macrocode} +% Make |@| a regular letter. +% Many of the commands in the file will have |@| characters in them, so |@| +% \watchout +% must be made a regular letter. +% +% For |pdflatex|, also change to |latin1| encoding. +% When reading back a file with accented characters, +% \watchout[disabled] +% the encoding change seems to be required, rather than leaving it |utf8|. +% \begin{macrocode} +\begingroup +% \ifxetexorluatex% +% \else +% \inputencoding{latin1}% currently disabled +% \fi +\makeatletter +% \end{macrocode} +% Read in the \acro{TOC} file: +% \begin{macrocode} +\@input{\jobname.#1} +% \makeatother +\endgroup +}% +{}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@subtableofcontents} \marg{toc/lof/lot} \marg{sectionstarname} +% +% Places a TOC/LOF/LOT at the current position. +% \begin{macrocode} +\NewDocumentCommand{\LWR@subtableofcontents}{m m}{% +% \end{macrocode} +% Closes previous levels: +% \begin{macrocode} +\@ifundefined{chapter} +{\LWR@closeprevious{\LWR@depthsection}} +{\LWR@closeprevious{\LWR@depthchapter}} +% \end{macrocode} +% Prints any pending footnotes so that they appear above the potentially +% large TOC: +% \begin{macrocode} +\LWR@printpendingnotes +% \end{macrocode} +% Place the list into its own chapter (if defined) or section: +% \begin{macrocode} +\@ifundefined{chapter}{\section*{#2}}{\chapter*{#2}} +% \end{macrocode} +% Create a new \acro{HTML} |nav| containing the TOC/LOF/LOT: +% \begin{macrocode} +\LWR@htmlelementclass{nav}{#1} +% \end{macrocode} +% Create the actual list: +% \begin{macrocode} +\LWR@myshorttoc{#1} +% \end{macrocode} +% Close the |nav|: +% \begin{macrocode} +\LWR@htmlelementclassend{nav}{#1} +} +% \end{macrocode} +% \end{macro} + +% +% Patch \cs{@starttoc} to encapsulate the \acro{TOC} inside \acro{HTML} tags: +% \begin{macrocode} +\let\LWR@orig@starttoc\@starttoc + +\renewcommand{\@starttoc}[1]{ +\LWR@htmlelementclass{nav}{#1} +\LWR@orig@starttoc{#1} +\LWR@htmlelementclassend{nav}{#1} +} +% \end{macrocode} +% +% Patch \cs{tableofcontents}, etc. to print footnotes first. +% \pkg{newfloat} uses \cs{listoffigures} for all future float types. +% \begin{macrocode} +\let\LWR@origtableofcontents\tableofcontents +\let\LWR@origlistoffigures\listoffigures +\let\LWR@origlistoftables\listoftables +\renewcommand*{\tableofcontents}{% +% \end{macrocode} +% Copy the |.toc| file to |.sidetoc| for printing the sidetoc. +% The original |.toc| file is renewed when \cs{tableofcontents} is finished. +% \begin{macrocode} +\LWR@copyfile{\jobname.toc}{\jobname.sidetoc}% +\LWR@printpendingnotes% +\LWR@origtableofcontents% +} +\renewcommand*{\listoffigures}{\LWR@printpendingnotes\LWR@origlistoffigures} +\renewcommand*{\listoftables}{\LWR@printpendingnotes\LWR@origlistoftables} +% \end{macrocode} + + +% \subsection{High-level TOC commands} + +% \label{sec:listof} +% \begin{macro}{\listof} \marg{type} \marg{title} +% +% Emulate the \cs{listof} command from the \pkg{float} package (\cref{sec:newfloat}). +% Used to create lists of custom float types. Also used to redefine +% the standard \LaTeX{} \cs{listoffigures} and \cs{listoftables} commands. +% \begin{macrocode} +\NewDocumentCommand{\listof}{m +m}{% +\LWR@subtableofcontents{\@nameuse{ext@#1}}{#2} +\expandafter\newwrite\csname tf@\csname ext@#1\endcsname\endcsname +\immediate\openout \csname tf@\csname ext@#1\endcsname\endcsname + \jobname.\csuse{ext@#1}\relax +} +% \end{macrocode} +% \end{macro} + + +% \subsection{Side TOC} +% \label{sec:sidetoc} + +% The ``side TOC'' is a table-of-contents positioned to the side. +% +% It may be renamed by redefining \cs{sidetocname}, and may contain paragraphs. +% +% \acro{CSS} may be used to format the sideTOC: +% +% \begin{docsidebar}[CSS related to sideTOC:] +% \begin{description}[parsep=0ex] +% \item [|nav.sidetoc|:] The entire sideTOC. +% \item [|div.sidetoctitle|:] The title. +% \item [|div.sidetoccontents|:] The table of contents. +% \end{description} +% \end{docsidebar} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \DescribeCounter{SideTOCDepth} +% Controls how deep the side-TOC gets. Use a standard \LaTeX{} section level +% similar to |tocdepth|. +% \begin{macrocode} +\newcounter{SideTOCDepth} +\setcounter{SideTOCDepth}{1} +% \end{macrocode} + +% \begin{macro}{\sidetocname} +% Holds the default name for the sidetoc. +% +% \begin{macrocode} +\newcommand{\sidetocname}{Contents} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@sidetoc} +% Creates the actual side-TOC. +% \begin{macrocode} +\newcommand*{\LWR@sidetoc}{ +\LWR@stoppars + +% \end{macrocode} +% The entire sideTOC is placed into a |nav| of class |sidetoc|. +% \begin{macrocode} +\LWR@htmlelementclass{nav}{sidetoc} + +\setcounter{tocdepth}{\value{SideTOCDepth}} + +% \end{macrocode} +% The title is placed into a div of class |sidetoctitle|, and may +% contain paragraphs. +% \begin{macrocode} +\begin{BlockClass}{sidetoctitle} +\sidetocname +\end{BlockClass} +% \end{macrocode} +% The table of contents is placed into a div of class |sidetoccontents|. +% \begin{macrocode} +\begin{BlockClass}{sidetoccontents} +\LinkHome + +\LWR@myshorttoc{sidetoc} +\end{BlockClass} +\LWR@htmlelementclassend{nav}{sidetoc} +} +% \end{macrocode} +% \end{macro} + + + + +% \subsection{Low-level TOC line formatting} + +% \begin{macro}{\numberline} \marg{number} +% +% (Called from each line in the |.aux|, |.lof| files.) +% +% Record this section number for further use: +% \begin{macrocode} +\renewcommand*{\numberline}[1]{% +\LWR@sectionnumber{#1}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\hypertoc} \marg{1: depth} \marg{2: class} \marg{3: name} \marg{4: page} +% +% Called by \cs{l@section}, etc. to create a hyperlink to a section. +% +% The autopage label is always created just after the section. +% +% \begin{description} +% \item[\#1] is depth +% \item[\#2] \acro{HTML} \acro{CSS} class is tocsection, tocsubsection, etc. +% \item[\#3] the text of the caption +% \item[\#4] page number +% \end{description} +% \begin{macrocode} +\NewDocumentCommand{\hypertoc}{m m +m m}{% +% \end{macrocode} +% Respond to tocdepth: +% \begin{macrocode} +\ifthenelse{\cnttest{#1}{<=}{\value{tocdepth}}}{% +\LWR@startpars% +% \end{macrocode} +% Create an \acro{HTML} link to filename\#autosec-(page), with text of the caption, +% of the given \acro{HTML} class. +% \begin{macrocode} +\LWR@subhyperrefclass{% +\LWR@htmlrefsectionfilename{autopage-#4}\#autosec-#4}{#3}{#2}% +\LWR@stoppars% +} +{} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\hypertocfloat} \marg{1: depth} \marg{2: class} +% \marg{3: caption} \marg{4: page} +% +% \begin{description} +% \item[\#1] is depth +% \item[\#2] \acro{HTML} \acro{CSS} class is tocfigure, toctable +% \item[\#3] the text of the caption +% \item[\#4] page number +% \end{description} + +% \begin{macrocode} +\newcommand{\hypertocfloat}[4]{% +\LWR@startpars +% \end{macrocode} +% Create an \acro{HTML} link to +% filename\#autofloat-(float number), with text of the caption, +% of the given \acro{HTML} class. +% \begin{macrocode} +\LWR@subhyperrefclass{% +\LWR@htmlrefsectionfilename{autopage-\arabic{LWR@nextautopage}}% +\#autofloat-\arabic{LWR@nextautofloat}}% +{#3}{#2}% +\LWR@stoppars% +} +% \end{macrocode} +% \end{macro} + +% Automatically called by |\contentsline|: +% \begin{macrocode} +\renewcommand{\l@part}[2]{\hypertoc{-1}{tocpart}{#1}{#2}} +\DeclareDocumentCommand{\l@chapter}{m m} + {\hypertoc{0}{tocchapter}{#1}{#2}} +\renewcommand{\l@section}[2]{\hypertoc{1}{tocsection}{#1}{#2}} +\renewcommand{\l@subsection}[2]{\hypertoc{2}{tocsubsection}{#1}{#2}} +\renewcommand{\l@subsubsection}[2] + {\hypertoc{3}{tocsubsubsection}{#1}{#2}} +\renewcommand{\l@paragraph}[2]{\hypertoc{4}{tocparagraph}{#1}{#2}} +\renewcommand{\l@subparagraph}[2]{\hypertoc{5}{tocsubparagraph}{#1}{#2}} +\renewcommand{\l@figure}[2]{\hypertocfloat{1}{tocfigure}{#1}{#2}} +\renewcommand{\l@table}[2]{\hypertocfloat{1}{toctable}{#1}{#2}} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \section{Index} + +% See:\\ +% \href{http://tex.stackexchange.com/questions/187038/how-to-mention-section-number-in-index-created-by-imakeidx} +% {\texttt{http://tex.stackexchange.com/questions/187038/\\ +% \hspace*{2em}how-to-mention-section-number-in-index-created-by-imakeidx}} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@indexsection} +% +% Controls whether the index will be in a section or a chapter, depending on +% the documentclass. +% \begin{macrocode} +\@ifundefined{chapter} + {\newcommand*{\LWR@indexsection}{\section{\indexname}}} + {\newcommand*{\LWR@indexsection}{\chapter{\indexname}}} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\printindex} +% \begin{macrocode} +\let\LWR@origprintindex\printindex + +\renewcommand*{\printindex} +{ +\LWR@indexsection +\LWR@startpars +\LWR@origprintindex +} +% \end{macrocode} +% \end{macro} + +% \begin{environment}{theindex} +% \begin{macrocode} +\renewenvironment*{theindex}{% +\let\item\LWR@indexitem% +\let\subitem\LWR@indexsubitem% +\let\subsubitem\LWR@indexsubsubitem% +}{} +% \end{macrocode} +% \end{environment} + + +% \begin{macro}{\LWR@indexitem} +% \begin{macrocode} +\newcommand{\LWR@indexitem}{ + +\InlineClass{indexitem}{} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@indexitem} +% \begin{macrocode} +\newcommand{\LWR@indexsubitem}{ + +\InlineClass{indexsubitem}{} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@indexitem} +% \begin{macrocode} +\newcommand{\LWR@indexsubsubitem}{ + +\InlineClass{indexsubsubitem}{} +} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\hyperindexref} \marg{autosecnumber} +% +% |\hyperindexref{web address}| is inserted into |*.ind| by +% the xindy style file |lwarp_html.xdy| +% +% \changes{v0.20}{2016/12/19}{Print mode provided in case hyperref not used.} +% \begin{macrocode} +\newcommand*{\hyperindexref}[1]{ +\LWR@htmltag{a href="% +% \end{macrocode} +% Create an \acro{HTML} reference to the autosection: +% \begin{macrocode} +\LWR@htmlrefsectionfilename{autopage-#1}\#autosec-#1"{}}% +% \end{macrocode} +% Add the section number and section name, then close the tag: +% \begin{macrocode} +\LWR@origref{autopage-#1}\enskip\LWR@nameref{autopage-#1}% +\LWR@htmltag{/a}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \codeprint +% +% A null command for print mode, in case \pkg{hyperref} was not used: +% \begin{macrocode} +\begin{warpprint} +\newcommand{\hyperindexref}[1]{#1} +\end{warpprint} +% \end{macrocode} + + + + +% \section{Math} +% \label{sec:math} +% +% \limitsmath +% +% +% \label{ex:mathjaxmacros} +% As an example of using custom \LaTeX\ macros with MathJax, +% \margintag{custom MathJax macros} +% place the following at the start of the document, +% after |\begin{document}|: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \begin{warpHTML} % Only for HTML output, +% \ifbool{mathjax} % and only for MathJax output: +% { +% \( % New macros for MathJax are placed inside a math expression: +% \newcommand{\expval}[1]{\langle#1\rangle} +% \newcommand{\abs}[1]{\lvert#1\rvert} +% \) +% }{} +% \end{warpHTML} +% \end{Verbatim} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + + +% \DescribeMacro{\$} +% Plain dollar signs appearing in the \acro{HTML} output may be interpreted +% by MathJax to be math shifts. +% For a plain text dollar |\$|, print it inside a span to avoid +% it being interpreted by MathJax. +% \changes{v0.19}{2016/06/08}{Avoids MathJax.} +% \begin{macrocode} +\let\LWR@origtextdollar\$ + +\renewcommand*{\$}{% +\LWR@htmltagc{span}% +\LWR@origtextdollar% +\LWR@htmltagc{/span}% +} +% \end{macrocode} + + + +% +% \DescribeCounter{LWR@externalfilecnt} +% Counter for the external files which are generated and then referenced from the \acro{HTML}: +% \begin{macrocode} +\newcounter{LWR@externalfilecnt} +% \end{macrocode} + + + +% \subsection{Inline and display math} + +% \begin{macrocode} +\let\LWR@origdollar=$ +\let\secondorigdollar=$% balance for editor syntax highlighting +% \end{macrocode} + +% \begin{macrocode} +\let\LWR@origopenparen\( +\let\LWR@origcloseparen\) +% \end{macrocode} + +% \DescribeObject{\$} +% \DescribeObject{\$\$} +% Redefine the dollar sign to place math inside a \env{lateximage}, or use MathJax: +% \begin{macrocode} +\begingroup +\catcode`\$=\active% +\protected\gdef${\@ifnextchar$\LWR@doubledollar\LWR@singledollar}% +% \end{macrocode} + + +% \begin{macro}{\LWR@doubledollar} +% \changes{v0.19}{2016/05/25}{MathJax support.} +% Redefine the double dollar sign to place math inside a \env{lateximage}, or use MathJax: +% \begin{macrocode} +\gdef\LWR@doubledollar$#1$${ +\ifbool{mathjax}% +% \end{macrocode} +% For MathJax, print the math between |\[| and |\]|: +% \begin{macrocode} +{\textbackslash[\LWR@HTMLsanitize{#1}\textbackslash]} +% \end{macrocode} +% For SVG, print the math inside a \env{lateximage}, with an ALT tag of the \LaTeX\ code: +% \begin{macrocode} +{% not mathjax + +\begin{lateximage}% +[\textbackslash{[} \LWR@HTMLsanitize{#1} \textbackslash{]}]% +\LWR@origdollar\LWR@origdollar#1\LWR@origdollar\LWR@origdollar% +\end{lateximage} + +} +}% +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@singledollar} +% \changes{v0.19}{2016/05/25}{MathJax support.} +% Redefine the single dollar sign to place math inside a \env{lateximage}, or use MathJax: +% \begin{macrocode} +\gdef\LWR@singledollar#1${% +\ifbool{mathjax}% +% \end{macrocode} +% For MathJax, print the math between |\(| and |\)|: +% \begin{macrocode} +{\textbackslash(\LWR@HTMLsanitize{#1}\textbackslash)} +% \end{macrocode} +% For SVG, print the math inside a \env{lateximage}, with an ALT tag of the \LaTeX\ code: +% \begin{macrocode} +{% not mathjax +\begin{lateximage}% +[\textbackslash( \LWR@HTMLsanitize{#1} \textbackslash)]% +\LWR@origdollar#1\LWR@origdollar% +\end{lateximage}% +}% +}% +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\(} +% \begin{macro}{\)} +% Redefine to the above dollar macros. +% \begin{macrocode} +\gdef\(#1\){$#1$} +\gdef\[#1\]{$$#1$$} + +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} + + +% Remove the old |math| and |displaymath| environments: +% \begin{macrocode} +\let\math\relax +\let\endmath\relax +\let\displaymath\relax +\let\enddisplaymath\relax +% \end{macrocode} + +% \begin{environment}{math} +% Set math mode then typeset the body of what was between the begin/end. +% See the \pkg{environ} package for \cs{BODY}. +% \begin{macrocode} +\NewEnviron{math}{\expandafter\(\BODY\)} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{displaymath} +% Set math mode then typeset the body of what was between the begin/end. +% See the \pkg{environ} package for \cs{BODY}. +% \begin{macrocode} +\NewEnviron{displaymath}{\expandafter\[\BODY\]\@ignoretrue} +% \end{macrocode} +% \end{environment} + +% When the document begins, the dollar sign must be made active to trigger the new math macros: +% \begin{macrocode} +\AtBeginDocument{\catcode`\$=\active} +% \end{macrocode} + + + +% \subsection{MathJax support} +% \changes{v0.19}{2016/05/25}{MathJax support added.} +% +% \DescribeCounter{LWR@nextequation} Used to add one to compute the next equation number. +% \begin{macrocode} +\newcounter{LWR@nextequation} +% \end{macrocode} +% +% +% +% \begin{macro}{\LWR@syncmathjax} Sets the MathJax equation format +% and number for the following equations. +% +% These MathJax commands are printed inside ``\cs{(}'' and ``\cs{)}'' characters. +% They are printed to \acro{HTML} output, not interpreted by \LaTeX. +% \begin{macrocode} +\newcommand*{\LWR@syncmathjax}{% +% \end{macrocode} +% If using chapters, place the chapter number in front of the equation. +% Otherwise, use the simple equation number. +% \begin{macrocode} +\ifcsdef{thechapter}{ +\BlockClassSingle{hidden}{ +\textbackslash( +\textbackslash{}seteqsection \{\thechapter\} +\textbackslash) +} +} +{}% not using chapters + +% \end{macrocode} +% MathJax doesn't allow setting the equation number to 1: +% \begin{macrocode} +\ifthenelse{\cnttest{\value{equation}}>0} +{ +% \end{macrocode} +% Tell MathJax that the next set of equations begins with the current \LaTeX{} equation +% number, plus one. +% \begin{macrocode} +\setcounter{LWR@nextequation}{\value{equation}} +\addtocounter{LWR@nextequation}{1} +% \end{macrocode} +% Place the MathJax command inside ``\cs{(}'' and ``\cs{)}'' characters, +% to be printed to \acro{HTML}, not interpreted by \LaTeX. +% \begin{macrocode} +\BlockClassSingle{hidden}{ +\textbackslash( +\textbackslash{}seteqnumber \{\arabic{LWR@nextequation}\} +\textbackslash) +} +}{}% not eq > 1 +} +% \end{macrocode} +% \end{macro} +% +% + + +% \begin{macro}{\LWR@restoremathlatexformatting} +% While producing math, use regular \LaTeX\ formatting instead of \acro{HTML} tags. +% \begin{macrocode} +\newcommand*{\LWR@restoremathlatexformatting}{% +\let\hspace\LWR@orighspace% +\let\rule\LWR@origrule% +\let\,\LWR@origcomma% disable HTML short unbreakable space +\let\textit\LWR@origtextit% +\let\textbf\LWR@origtextbf% +\let\texttt\LWR@origtexttt% +\let\textsc\LWR@origtextsc% +\let\textsf\LWR@origtextsf% +\let\textrm\LWR@origtextrm% +\renewcommand*{\thefootnote}{\fnsymbol{footnote}}% +\let\textsuperscript\LWR@origtextsuperscript% +\let\textsubscript\LWR@origtextsubscript% +\let~\LWR@origtilde% +\let\enskip\LWR@origenskip% +\let\quad\LWR@origquad% +\let\qquad\LWR@origqquad% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@hidelatexequation} \marg{environment} \marg{contents} +% +% Creates the \LaTeX{} version of the equation +% inside an \acro{HTML} comment. +% \begin{macrocode} +\NewDocumentCommand{\LWR@hidelatexequation}{m +m}{% +% \end{macrocode} +% Stop \acro{HTML} paragraph handling and open an \acro{HTML} comment: +% \begin{macrocode} +\LWR@stoppars +\LWR@htmlopencomment + +% \end{macrocode} +% Start the LaTeX math environment inside the \acro{HTML} comment: +% \begin{macrocode} +\begingroup +\csuse{LWR@orig#1} +% \end{macrocode} +% While in the math environment, +% restore various commands to their \LaTeX\ meanings. +% \begin{macrocode} +\LWR@restoremathlatexformatting +% \end{macrocode} +% When a label is encountered, the HTML comment is closed, +% the label is generated in an HTML-output context, +% then the HTML comment is opened again. +% See \cs{LWR@htmlmathlabel} in \cref{sec:amsmathsupport}. +% +% Print the contents of the equation: +% \begin{macrocode} +#2 +% \end{macrocode} +% End the \LaTeX{} math environment inside the \acro{HTML} comment: +% \begin{macrocode} +\csuse{LWR@origend#1} +\endgroup + +% \end{macrocode} +% Close the \acro{HTML} comment and resume \acro{HTML} paragraph handling: +% \begin{macrocode} +\LWR@htmlclosecomment +\LWR@startpars +} +% \end{macrocode} +% \end{macro} + + +% +% \begin{macro}{\LWR@addmathjax} \marg{environment} \marg{contents} +% +% Given the name of a math environment and its contents, +% create a MathJax instance. +% The contents are printed to \acro{HTML} output, not interpreted by \LaTeX. +% \begin{macrocode} +\NewDocumentCommand{\LWR@addmathjax}{m +m}{% + +% \end{macrocode} +% Enclose the MathJax environment inside printed ``\cs{(}'' and ``\cs{)}'' characters. +% \begin{macrocode} +\textbackslash{}begin\{#1\} +% \end{macrocode} +% Print the contents, sanitizing for \acro{HTML} special characters. +% \begin{macrocode} +\LWR@HTMLsanitizeexpand{\detokenize\expandafter{#2}} +% \end{macrocode} +% Close the MathJax environment: +% \begin{macrocode} +\textbackslash{}end\{#1\} + +} +% \end{macrocode} +% \end{macro} + + +% \subsection{Equation environment} +% +% Remember existing \env{equation} environment: +% \begin{macrocode} +\let\LWR@origequation\equation +\let\LWR@origendequation\endequation +% \end{macrocode} +% +% Remove existing \env{equation} environment: +% \begin{macrocode} +\let\equation\relax +\let\endequation\relax +% \end{macrocode} + + +% \begin{environment}{equation} +% \changes{v0.19}{2016/05/25}{MathJax support.} +% The new \env{equation} environment is created with +% \cs{NewEnviron} (from the \pkg{environ} package), +% which stores the contents of its environment in a +% macro called \cs{BODY}. +% +% For \acro{SVG} math output, +% the contents are typeset using the original \env{equation} +% inside a \env{lateximage}, along with an ALT tag +% containing a detokenized copy of the \LaTeX\ source for +% the math. +% +% For MathJax output, the contents are typeset in an +% original \env{equation} environment placed inside a \acro{HTML} +% comment, with special processing for \cs{label}s. +% The contents are also printed to the \acro{HTML} output +% for processing by the MathJax script. +% \begin{macrocode} +\NewEnviron{equation}{% + +\ifbool{mathjax} +% \end{macrocode} +% MathJax output: +% \begin{macrocode} +{ +% \end{macrocode} +% Print commands to syncronize MathJax's equation number and format +% to the current \LaTeX\ chapter/section and equation number: +% \begin{macrocode} +\LWR@syncmathjax +% \end{macrocode} +% Print the \LaTeX\ math inside an \acro{HTML} comment: +% \begin{macrocode} +\LWR@hidelatexequation{equation}{\BODY} +} +% \end{macrocode} +% SVG output: +% Create the |lateximage| along with an \acro{HTML} ALT tag +% having an equation number, the \LaTeX{} equation environment +% commmands, and the contents of the environment's \cs{BODY}. +% \begin{macrocode} +{% not mathjax +% \end{macrocode} +% Begin the \env{lateximage} with an ALT tag containing the math source: +% \begin{macrocode} +\begin{lateximage}[(\theequation) \textbackslash{begin\{equation\}}% + \LWR@HTMLsanitizeexpand{\detokenize\expandafter{\BODY}}% + \textbackslash{end\{equation\}}]% alt tag +% \end{macrocode} +% Create the actual \LaTeX-formatted equation inside +% the |lateximage| using the contents of the environment. +% \begin{macrocode} +\LWR@origequation +\BODY% contents collected by NewEnviron +\LWR@origendequation +\end{lateximage}% +} + +% \end{macrocode} +% After the environment, if MathJax, print the math to the \acro{HTML} output +% for MathJax processing: +% \begin{macrocode} +}[\ifbool{mathjax}{\LWR@addmathjax{equation}{\BODY}}{}] +% \end{macrocode} +% \end{environment} + + + +% \subsection{AMS Math environments} +% \changes{v0.19}{2016/05/25}{MathJax support added.} +% +% \subsubsection{Support macros} +% \label{sec:amsmathsupport} +% +% \DescribeBoolean{LWR@amsmultline} True if processing a multline environment. +% +% To compensate for \env{multline}-spefific code, +% |LWR@amsmultline| is used to add extra horizontal space in \cs{LWR@htmlmathlabel} if +% is used in an \pkg{amsmath} environment which is +% not a \env{multline} environment and not an \env{equation}. +% \begin{macrocode} +\newbool{LWR@amsmultline} +\boolfalse{LWR@amsmultline} +% \end{macrocode} + + +% \begin{macro}{\LWR@htmlmathlabel} \marg{label} +% \index{label>math environment} +% +% \cs{label} when called inside a \LaTeX{} AMS math environment's math mode +% which is encased inside an \acro{HTML} comment +% while creating a \acro{HTML} document. +% \begin{macrocode} + +\newcommand*{\LWR@htmlmathlabel}[1]{% +\LWR@traceinfo{LWR@htmlmathlabel #1}% +\ifbool{mathjax}{% +% \end{macrocode} +% The combined \LaTeX\ \& \acro{HTML} label is printed in a \cs{text} field: +% \begin{macrocode} +\text{ +% \end{macrocode} +% Shift the label over to the right side of the environment to avoid +% over-printing the math: +% \begin{macrocode} +\ifbool{LWR@amsmultline}{}{\hspace*{\totwidth@}} +% \end{macrocode} +% Temporarily end the \acro{HTML} comment, +% insert the \LaTeX{} \& \acro{HTML} label, then +% resume the \acro{HTML} comment. +% \cs{@firstofone} is required to remove extra braces +% introduced by the \pkg{amsmath} package.) +% \begin{macrocode} +\LWR@htmlclosecomment\LWR@sublabel{\@firstofone#1}\LWR@htmlopencomment}% +}% +{\LWR@sublabel{\@firstofone#1}}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@beginhideamsmath} +% Starts hiding \LaTeX\ math inside an \acro{HTML} comment. +% \begin{macrocode} +\newcommand*{\LWR@beginhideamsmath}{ +\LWR@stoppars + +\LWR@htmlopencomment + +\begingroup +\LWR@restoremathlatexformatting +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@endhideamsmath} +% Ends hiding \LaTeX\ math inside an \acro{HTML} comment. +% \begin{macrocode} +\newcommand*{\LWR@endhideamsmath}{ +\endgroup + +\LWR@htmlclosecomment + +\LWR@startpars +} +% \end{macrocode} +% \end{macro} + + + + +% \subsubsection{Environment patches} +% \changes{v0.19}{2016/05/25}{MathJax support added.} + +% The following \pkg{amsmath} environments already collect their contents +% in \cs{@envbody} for further processing. +% +% For \acro{SVG} math: Each envrionment is encapsulated inside a \env{lateximage} environment, +% along with a special |LWRAMSMATHBODY| argument +% telling \env{lateximage} to use as the \acro{HTML} ALT tag the environment's contents which +% were automatically captured by the \AmS{} environment. +% +% For MathJax: Each environment is syched with \LaTeX's equation numbers, +% typeset with \LaTeX\ inside an \acro{HTML} comment, then +% printed to \acro{HTML} output for MathJax to process. +% + +% \begin{environment}{multline} +% \begin{macrocode} +\BeforeBeginEnvironment{multline}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\booltrue{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{multline}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\boolfalse{LWR@amsmultline} +\LWR@addmathjax{multline}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{multline*} +% \begin{macrocode} +\BeforeBeginEnvironment{multline*}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\booltrue{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{multline*}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\boolfalse{LWR@amsmultline} +\LWR@addmathjax{multline*}{\the\@envbody} +} +{\endlateximage} + +} + +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{gather} +% \begin{macrocode} +\BeforeBeginEnvironment{gather}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\boolfalse{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{gather}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\LWR@addmathjax{gather}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + +% \begin{environment}{gather*} +% \begin{macrocode} +\BeforeBeginEnvironment{gather*}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\boolfalse{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{gather*}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\LWR@addmathjax{gather*}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{align} +% \begin{macrocode} +\BeforeBeginEnvironment{align}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\boolfalse{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{align}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\LWR@addmathjax{align}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{align*} +% \begin{macrocode} +\BeforeBeginEnvironment{align*}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\boolfalse{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{align*}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\LWR@addmathjax{align*}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{flalign} +% \begin{macrocode} +\BeforeBeginEnvironment{flalign}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\boolfalse{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{flalign}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\LWR@addmathjax{flalign}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + + +% \begin{environment}{flalign*} +% \begin{macrocode} +\BeforeBeginEnvironment{flalign*}{ +\ifbool{mathjax} +{ +\LWR@syncmathjax +\boolfalse{LWR@amsmultline} +\LWR@beginhideamsmath +} +{ +\lateximage[LWRAMSMATHBODY] +} +} + +\AfterEndEnvironment{flalign*}{ + +\ifbool{mathjax} +{ +\LWR@endhideamsmath +\LWR@addmathjax{flalign*}{\the\@envbody} +} +{\endlateximage} + +} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Lateximages} + +% A |\lateximage| is typeset on its own \acro{PDF} page inside an \acro{HTML} comment starting on the preceeding page +% and ending on following page, and instructions are written to +% |lateximage.sh| or |lateximages.cmd| to extract the |\lateximage| from the page of the \acro{PDF} file +% then generate an accompanying |.svg| file image file. Meanwhile, instructions to +% show this image are placed into the \acro{HTML} file after the comment. +% +% Since the |\lateximage| is placed onto its own \acro{PDF} page, which |pdftotext| will read +% and try to convert to text, an \acro{HTML} open comment is placed onto the bottom of the current +% page, but it must appear below any footnotes on the current page, so +% a special page style (|LWR@commentfooterstyle|) is used. +% +% An \acro{HTML} span is created to hold both the \acro{HTML} comment which will have the |pdftotext| conversion, +% and also the link to the final |.svg| image. +% +% \limitslateximagefontsize +% +% +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% \DescribeObject{LWR@commentfooterstyle} +% \begin{macrocode} +\newpagestyle{LWR@commentfooterstyle}{ + \sethead{}{}{} + \setfoot{\LWR@htmlopencomment}{}{} +} +% \end{macrocode} + +% \DescribeCounter{LWR@lateximagenumber} +% Sequence the images. +% \begin{macrocode} +\newcounter{LWR@lateximagenumber} +\setcounter{LWR@lateximagenumber}{0} +% \end{macrocode} +% \DescribeCounter{LWR@lateximagedepth} +% Do not create |\lateximage| inside of |\lateximage|. +% \begin{macrocode} +\newcounter{LWR@lateximagedepth} +\setcounter{LWR@lateximagedepth}{0} +% \end{macrocode} + +% Declare the |\LWR@file| for writing +% to generate file |lateximages.sh| or |lateximages.cmd|: +% \begin{macrocode} +\ifcsdef{LWR@file}{}{\newwrite{\LWR@file}} +% \end{macrocode} +% A few utility macros to write special characters: +% \begin{macrocode} +\edef\LWR@hashmark{\string#} % for use in \write +\edef\LWR@percent{\@percentchar} % for use in \write +% \end{macrocode} + +% \DescribeCounter{LWR@nextpage} +% Used to count ahead to the next page: +% \begin{macrocode} +\newcounter{LWR@nextpage} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \begin{macro}{\LateximageFontSizeName} +% \changes{v0.19}{2016/05/29}{Add: User-adjustable math/lateximage font size.} +% Declares how large to write text in the |\lateximage|. The |.svg| file text size +% should blend well with the surrounding \acro{HTML} text size. +% +% \emph{Do not include the leading backslash in the name.} +% \begin{macrocode} +\newcommand*{\LateximageFontSizeName}{normalsize} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@HTMLsanitize} \marg{text} +% +% Math expressions are converted to |lateximage|s, and some math environments may contain +% ``\&'', ``\textless'', or ``\textgreater'', which should not be allowed +% inside an \acro{HTML} ALT tag, so must convert them to \acro{HTML} entities. +% +% Two versions follow, depending on expansion needs. +% There may be a better way\dots +% \begin{macrocode} +\newcommand{\LWR@HTMLsanitize}[1]{% +\protect\StrSubstitute{\detokenize{#1}}% +{\detokenize{&}}% +{\detokenize{&}}[\LWR@strresult]% +\protect\StrSubstitute{\detokenize\expandafter{\LWR@strresult}}% +{\detokenize{<}}% +{\detokenize{<}}% +[\LWR@strresult]% +\protect\StrSubstitute{\detokenize\expandafter{\LWR@strresult}}% +{\detokenize{>}}% +{\detokenize{>}}% +[\LWR@strresult]% +\protect\StrSubstitute{\detokenize\expandafter{\LWR@strresult}}% +{\detokenize{##}}% +{\#}% +[\LWR@strresult]% +\LWR@strresult% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@HTMLsanitizeexpand} \marg{text} +% +% This version expands the argument before sanitizing it. +% \begin{macrocode} +\newcommand{\LWR@HTMLsanitizeexpand}[1]{% +\protect\StrSubstitute{\detokenize\expandafter{#1}}% +{\detokenize{&}}% +{\detokenize{&}}% +[\LWR@strresult]% +\protect\StrSubstitute{\detokenize\expandafter{\LWR@strresult}}% +{\detokenize{<}}% +{\detokenize{<}}% +[\LWR@strresult]% +\protect\StrSubstitute{\detokenize\expandafter{\LWR@strresult}}% +{\detokenize{>}}% +{\detokenize{>}}% +[\LWR@strresult]% +\LWR@strresult% +} +% \end{macrocode} +% \end{macro} + + + +% \begin{environment}{lateximage} \oarg{alttag} +% \changes{v0.18}{2016/05/18}{Surpress extra space.} +% \changes{v0.18}{2016/05/18}{pdfcrop: -{}-hires added.} +% \changes{v0.18}{2016/05/19}{Reorganize \cs{HomeHTMLFilename} logic.} +% \begin{macrocode} +\NewDocumentEnvironment{lateximage}{O{image}}{% +\ifthenelse{\cnttest{\value{LWR@lateximagedepth}}{>}{0}}% +% \end{macrocode} +% If nesting inside an already-existing lateximage, simply record one more level: +% \begin{macrocode} +{% +\addtocounter{LWR@lateximagedepth}{1}% +}% +% \end{macrocode} +% Otherwise, this is the outer-most lateximage: +% \begin{macrocode} +{% start of outer-most lateximage +% \end{macrocode} +% Starting a new lateximage: +% \begin{macrocode} +\addtocounter{LWR@lateximagenumber}{1}% +% \end{macrocode} +% While inside a lateximage, do not use mathjax: +% \begin{macrocode} +\boolfalse{mathjax} +% \end{macrocode} +% Be sure that are doing a paragraph: +% \begin{macrocode} +\LWR@ensuredoingapar% +% \end{macrocode} +% Next file: +% \begin{macrocode} +\addtocounter{LWR@externalfilecnt}{1}% +% \end{macrocode} +% Figure out what the next page number will be: +% \begin{macrocode} +\setcounter{LWR@nextpage}{\thepage}% +\addtocounter{LWR@nextpage}{1}% +% \end{macrocode} +% Create an \acro{HTML} span which will hold the comment which contains the |pdftotext| translation +% of the image's page, and also will hold the link to the |.svg| file: +% \begin{macrocode} +\LWR@htmltag{span id="lateximage\arabic{LWR@lateximagenumber}" % +class="lateximagesource"{}} \LWR@orignewline +% \end{macrocode} +% Write instructions to the lateximage.sh file: +% \begin{macrocode} +\immediate\write\LWR@file{% + pdfseparate -f \theLWR@nextpage \space -l % + \theLWR@nextpage \space % + \jobname.pdf lateximagetemp-\LWR@percent d.pdf}% +% keep the space before 'd.pdf' +\immediate\write\LWR@file{% + pdfcrop --hires lateximagetemp-\theLWR@nextpage.pdf + lateximage-\theLWR@externalfilecnt.pdf}% +\immediate\write\LWR@file{% + pdftocairo -svg lateximage-\theLWR@externalfilecnt.pdf + lateximage-\theLWR@externalfilecnt.svg}% +\immediate\write\LWR@file{% + \OSmv lateximage-\theLWR@externalfilecnt.svg % + lateximages\OSPathSymbol}% +\immediate\write\LWR@file{% + \OSrm lateximage-\theLWR@externalfilecnt.pdf + lateximagetemp-\theLWR@nextpage.pdf}% +% \end{macrocode} +% Place an open comment tag at the bottom of page; footnotes will be above this tag. +% This will hide any traces of the lateximage \acro{PDF} page which were picked up by +% |pdftotext|. +% \begin{macrocode} +\LWR@origthispagestyle{LWR@commentfooterstyle}% +\addtocounter{LWR@lateximagedepth}{1}% +% \end{macrocode} +% Start the new \acro{PDF} page: +% \begin{macrocode} +\LWR@orignewpage% +% \end{macrocode} +% Typeset the image in a ``standard'' width page and font size: +% \begin{macrocode} +\LWR@origminipage{6in}% +\csuse{LWR@orig\LateximageFontSizeName}% +% \end{macrocode} +% Temporarily restore formatting to its \acro{PDF} definitions: +% Do not produce \acro{HTML} tags for \cs{hspace}, etc. inside a lateximage. +% \begin{macrocode} +\let\hspace\LWR@orighspace% +\let\rule\LWR@origrule% +\let\,\LWR@origcomma% disable HTML short unbreakable space +\let\textit\LWR@origtextit% +\let\textbf\LWR@origtextbf% +\let\texttt\LWR@origtexttt% +\let\textsc\LWR@origtextsc% +\let\textsf\LWR@origtextsf% +\let\textrm\LWR@origtextrm% +\renewcommand*{\thefootnote}{\fnsymbol{footnote}}% +\let\textsuperscript\LWR@origtextsuperscript% +\let\textsubscript\LWR@origtextsubscript% +\let~\LWR@origtilde% +\let\enskip\LWR@origenskip% +\let\quad\LWR@origquad% +\let\qquad\LWR@origqquad% +\let\tabular\LWR@origtabular% +\let\endtabular\LWR@origendtabular% +\let\newline\LWR@orignewline% +}% end of outer-most lateximage +}% end of \begin{lateximage} +{% start of \end{lateximage} +\ifthenelse{\cnttest{\value{LWR@lateximagedepth}}{>}{1}}% +% \end{macrocode} +% If nesting inside an already-existing lateximage, simply record one more level: +% \begin{macrocode} +{% +\addtocounter{LWR@lateximagedepth}{-1}% +}% +% \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 \acro{PDF} page: +% \begin{macrocode} +\LWR@origendminipage% +\LWR@orignewpage% +\LWR@origscriptsize% +% \end{macrocode} +% Close the \acro{HTML} comment which encapsulated any traces of the lateximage picked up by |pdftotext|: +% \begin{macrocode} +\LWR@htmlclosecomment{}\LWR@orignewline% +% \end{macrocode} +% Create a link to the lateximage, allowing its natural height: +% +% If the alt tag is given as ``LWRAMSMATHBODY'', then use the text collected by the +% amsmath multline, gather, or align environments. +% \begin{macrocode} +\ifthenelse{\equal{#1}{LWRAMSMATHBODY}}% +{% +\LWR@subinlineimage[% +\LWR@HTMLsanitizeexpand{\detokenize\expandafter{\the\@envbody}}% +]% +{lateximage}% +{lateximages\OSPathSymbol{}lateximage-\theLWR@externalfilecnt}% +{svg}% +{}% +}% +{% +\LWR@subinlineimage[#1]{lateximage}% +{lateximages\OSPathSymbol{}lateximage-\theLWR@externalfilecnt}{svg}{}% +}% +% \LWR@orignewline% Removed to prevent extra space. +% \end{macrocode} +% Be sure that are doing a paragraph: +% \begin{macrocode} +\LWR@ensuredoingapar% +% \end{macrocode} +% Close the \acro{HTML} span which has the |pdftotext| comment and also the link to the |.svg| image: +% \begin{macrocode} +\LWR@htmltag{/span}% +\LWR@htmlcomment{End of lateximage}% +% \LWR@orignewline% Removed to prevent extra space. +% \end{macrocode} +% Undo one lateximage level: +% \begin{macrocode} +\addtocounter{LWR@lateximagedepth}{-1}% +}% end of outer-most lateximage +}% +\end{warpHTML} +% \end{macrocode} +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newenvironment{lateximage}[1][]{\begingroup}{\endgroup} +\end{warpprint} +% \end{macrocode} +% \end{environment} + + + + +% \section{\env{center}, \env{flushleft}, \env{flushright}} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{environment}{center} +% Replace \env{center} functionality with \acro{CSS} tags: +% \begin{macrocode} +\renewenvironment*{center} +{\BlockClass{center}} +{\endBlockClass} +% \end{macrocode} +% \end{environment} + +% \begin{environment}{flushright} +% \begin{macrocode} +\renewenvironment*{flushright} +{\BlockClass{flushright}} +{\endBlockClass} +% \end{macrocode} +% \end{environment} + +% \begin{environment}{flushleft} +% \begin{macrocode} +\renewenvironment*{flushleft} +{\BlockClass{flushleft}} +{\endBlockClass} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + + + + + + + +% \section{Siunitx} +% \label{sec:siunitx} + +% \DescribePackage{siunitx} +% +% \limitssiunitx +% + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% Options for siunitx: +% \begin{macrocode} +\PassOptionsToPackage{ + detect-mode=true, + per-mode=symbol, % fraction is not seen by pdftotext + text-celsius = {\HTMLentity{deg}C}, + text-degree = {\HTMLentity{deg}}, +}{siunitx} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + +% \section{Graphics} + +% \DescribePackage{graphics} +% +% \DescribePackage{graphicx} +% +% \index{images>graphicx package} +% +% \limitsgraphics +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + + +% \subsection{\cs{graphicspath}} + +% \begin{macro}{\graphicspath} \marg{path} +% \begin{macrocode} +\newcommand*{\thisgraphicspath}{{}} +\renewcommand*{\graphicspath}[1]{\renewcommand*{\thisgraphicspath}{#1}} +% \end{macrocode} +% \end{macro} + +% ^^A \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% ^^A \DeclareGraphicsExtensions{.svg,.gif,.png,.jpg} +% ^^A \DeclareGraphicsRule{.svg}{svg}{.png}{} +% ^^A \end{Verbatim} + +% \begin{macro}{\DeclareGraphicsExtensions} \marg{list} +% \begin{macro}{\DeclareGraphicsRule} \marg{} \marg{} \marg{} \marg{} +% \begin{macrocode} +\renewcommand*{\DeclareGraphicsExtensions}[1]{} +\renewcommand*{\DeclareGraphicsRule}[4]{} +% \end{macrocode} +% \end{macro} +% \end{macro} + + +% \subsection{Length conversions and graphics options} +% +% A scaled image in \LaTeX{} by default takes only as much space +% on the page as it +% requires, but \acro{HTML} browsers use as much space as the +% \watchout[whitespace] +% original unscaled image would have taken, +% with the scaled image over- or under-flowing the area. + +% \begin{macrocode} +\renewcommand*{\unitspace}{} +% \end{macrocode} + +% Used to store the user's selected dimensions and \acro{HTML} class. +% +% The class defaults to ``inlineimage'' unless changed by a |class=xyx| option. +% \begin{macrocode} +\newlength{\LWR@igwidth} +\newlength{\LWR@igheight} +\newcommand*{\LWR@igwidthstyle}{} +\newcommand*{\LWR@igheightstyle}{} +\newcommand*{\LWR@igorigin}{} +\newcommand*{\LWR@igangle}{} +\newcommand*{\LWR@igxscale}{1} +\newcommand*{\LWR@igyscale}{1} +\newcommand*{\LWR@igclass}{inlineimage} +% \end{macrocode} + +% Set the actions of each of the key/value combinations for +% \cs{includegraphics}. Many are ignored. +% +% If an optional width was given, set an \acro{HTML} style: +% \begin{macrocode} +\define@key{igraph}{width}{% +\setlength{\LWR@igwidth}{#1}% +\ifthenelse{\lengthtest{\LWR@igwidth > 0pt}}% +{% +% \end{macrocode} +% Default to use the converted fixed length given: +% \begin{macrocode} +\uselengthunit{PT}% +\renewcommand*{\LWR@igwidthstyle}{width:\rndprintlength{\LWR@igwidth}}% +% \end{macrocode} +% If ex or em dimensions were given, use those instead: +% \begin{macrocode} +\IfEndWith{#1}{ex}% +{\renewcommand*{\LWR@igwidthstyle}{width:#1}}% yes ex +{}% not ex +\IfEndWith{#1}{em}% +{\renewcommand*{\LWR@igwidthstyle}{width:#1}}% yes em +{}% not em +\IfEndWith{#1}{\%}% +{\renewcommand*{\LWR@igwidthstyle}{width:#1}}% yes percent +{}% not percent +\IfEndWith{#1}{px}% +{\renewcommand*{\LWR@igwidthstyle}{width:#1}}% yes px +{}% not px +}{}% end of length > 0pt +} +% \end{macrocode} +% +% If an optional height was given, set an \acro{HTML} style: +% \begin{macrocode} +\define@key{igraph}{height}{% +\setlength{\LWR@igheight}{#1}% +\ifthenelse{\lengthtest{\LWR@igheight > 0pt}}% +{% +% \end{macrocode} +% Default to use the converted fixed length given: +% \begin{macrocode} +\uselengthunit{PT}% +\renewcommand*{\LWR@igheightstyle}{% +height:\rndprintlength{\LWR@igheight} % +}% +% \end{macrocode} +% If ex or em dimensions were given, use those instead: +% \begin{macrocode} +\IfEndWith{#1}{ex}% +{\renewcommand*{\LWR@igheightstyle}{height:#1}}% yes ex +{}% not ex +\IfEndWith{#1}{em}% +{\renewcommand*{\LWR@igheightstyle}{height:#1}}% yes em +{}% not em +\IfEndWith{#1}{\%}% +{\renewcommand*{\LWR@igheightstyle}{height:#1}}% yes percent +{}% not percent +\IfEndWith{#1}{px}% +{\renewcommand*{\LWR@igheightstyle}{height:#1}}% yes px +{}% not px +}{}% end of length > 0pt +} +% \end{macrocode} +% +% +% Handle origin key: +% \begin{macrocode} +\define@key{igraph}{origin}{% +\renewcommand*{\LWR@igorigin}{#1}% +} +% \end{macrocode} +% +% +% Handle angle key: +% \begin{macrocode} +\define@key{igraph}{angle}{\renewcommand*{\LWR@igangle}{#1}} +% \end{macrocode} +% +% +% Handle class key: +% \begin{macrocode} +\define@key{igraph}{class}{\renewcommand*{\LWR@igclass}{#1}} + +% \end{macrocode} +% ^^A \define@key{igraph}{xscale}{\renewcommand*{\LWR@igxscale}{#1}} +% ^^A \define@key{igraph}{yscale}{\renewcommand*{\LWR@igyscale}{#1}} +% It appears that \pkg{graphicx} does not have separate keys for +% |xscale| and |yscale|. |scale| adjusts both at the same time. +% \begin{macrocode} +\define@key{igraph}{scale}{% +\renewcommand*{\LWR@igxscale}{#1}% +\renewcommand*{\LWR@igyscale}{#1}} +% \end{macrocode} +% +% Numerous ignored keys: +% \begin{macrocode} +\define@key{igraph}{bb}{} +\define@key{igraph}{bbllx}{} +\define@key{igraph}{bblly}{} +\define@key{igraph}{bburx}{} +\define@key{igraph}{bbury}{} +\define@key{igraph}{natwidth}{} +\define@key{igraph}{natheight}{} +\define@key{igraph}{hiresbb}{} +\define@key{igraph}{viewport}{} +\define@key{igraph}{trim}{} +\define@key{igraph}{totalheight}{} +\define@key{igraph}{keepaspectratio}{} +\define@key{igraph}{clip}{} +\define@key{igraph}{draft}{} +\define@key{igraph}{type}{} +\define@key{igraph}{ext}{} +\define@key{igraph}{read}{} +\define@key{igraph}{command}{} +% \end{macrocode} + + +% \begin{macro}{\LWR@rotstyle} \marg{prefix} \marg{degrees} +% +% Prints the rotate style with the given prefix. +% +% |prefix| is |-ms-| or |-webkit-| or nothing, and is used to generate +% three versions of the |transform:rotate| style. +% \begin{macrocode} +\newcommand*{\LWR@rotstyle}[2]{% + #1transform:rotate(-#2deg); +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@scalestyle} \marg{prefix} \marg{xscale} \marg{yscale} +% +% Prints the scale style with the given prefix. +% +% |prefix| is |-ms-| or |-webkit-| or nothing, and is used to generate +% three versions of the |transform:scale| style. +% \begin{macrocode} +\newcommand*{\LWR@scalestyle}[3]{% + #1transform:scale(#2,#3); +} +% \end{macrocode} +% \end{macro} + + + + +% \subsection{\cs{includegraphics}} + +% \DescribeBoolean{LWR@infloatrow} +% Used to compute \cs{linewidth}. +% \begin{macrocode} +\newbool{LWR@infloatrow} +\boolfalse{LWR@infloatrow} +% \end{macrocode} + + + +% \begin{macrocode} +\newcommand*{\LWR@imageextension}{} +\newcommand*{\LWR@expgraphicsfilename}{} +% \end{macrocode} + +% \begin{macro}{\LWR@includegraphicsb} \oarg{options} \marg{filename} +% \changes{v0.18}{2016/04/14}{Improved HTML output linebreaks.} +% \changes{v0.18}{2016/05/17}{Fix: \cs{linewidth}, \cs{textwidth}, \cs{textheight} +% inside a minipage.} +% \changes{v0.18}{2016/05/17}{em, ex, \%, px dimensions preserved.} +% \changes{v0.18}{2016/05/17}{Add: svgz file extension.} +% \changes{v0.20}{2016/08/20}{Fix: \cs{linewidth} in a floatrow.} +% \changes{v0.20}{2017/01/12}{Fix: Expands filename.} +% \begin{macrocode} + +\newcommand*{\LWR@includegraphicsb}[2][] +{% +% \end{macrocode} +% Start the image tag on a new line, allow \acro{PDF} output word wrap: +% \begin{macrocode} +\LWR@origtilde \LWR@orignewline% +% \end{macrocode} +% Temporarily compute |\linewidth|, |\textwidth|, |\textheight| arguments with a 6x9 inch size +% until the next |\endgroup|. +% \begin{macrocode} +\ifthenelse{\cnttest{\value{LWR@minipagedepth}}{=}{0}}{% +\ifbool{LWR@infloatrow}% +{} +{% not in a minipage or a floatrow: +\setlength{\linewidth}{6in}% +\setlength{\textwidth}{6in}% +\setlength{\textheight}{9in}% +}% +}{}% +% \end{macrocode} +% See if can find the image by adding an extension: +% +% Preference is |svgz|, then |svg|, |gif|, |png|, and |jpg|. +% +% |\detokenize\expandafter| allows underscore characters in filenames. +% +% \begin{macrocode} +\edef\LWR@expgraphicsfilename{#2} +\renewcommand*{\LWR@imageextension}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.jpg}% +{\renewcommand*{\LWR@imageextension}{.jpg}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.JPG}% +{\renewcommand*{\LWR@imageextension}{.JPG}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.png}% +{\renewcommand*{\LWR@imageextension}{.png}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.PNG}% +{\renewcommand*{\LWR@imageextension}{.PNG}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.gif}% +{\renewcommand*{\LWR@imageextension}{.gif}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.GIF}% +{\renewcommand*{\LWR@imageextension}{.GIF}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.svg}% +{\renewcommand*{\LWR@imageextension}{.svg}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.SVG}% +{\renewcommand*{\LWR@imageextension}{.SVG}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.svgz}% +{\renewcommand*{\LWR@imageextension}{.svgz}}{}% +\IfFileExists{\detokenize\expandafter\thisgraphicspath\LWR@expgraphicsfilename.SVGZ}% +{\renewcommand*{\LWR@imageextension}{.SVGZ}}{}% +% \end{macrocode} +% +% Convert a \acro{PDF} extension to \acro{SVG}, leave the result in |\LWR@strresult|: +% +% Must also |\detokenize| |.pdf| and |.svg| comparison strings. +% \begin{macrocode} +\StrSubstitute{\detokenize\expandafter{\LWR@expgraphicsfilename}}% +{\detokenize{.pdf}}{\detokenize{.svg}}[\LWR@strresult]% +% +\StrSubstitute{\LWR@strresult}% +{\detokenize{.PDF}}{\detokenize{.SVG}}[\LWR@strresult]% +% \end{macrocode} +% For correct em sizing during the width and height conversions: +% \begin{macrocode} +\large% +% \end{macrocode} +% Reset some defaults, possibly will be changed below if options were given: +% \begin{macrocode} +\setlength{\LWR@igwidth}{0pt}% +\setlength{\LWR@igheight}{0pt}% +\renewcommand*{\LWR@igwidthstyle}{}% +\renewcommand*{\LWR@igheightstyle}{}% +\renewcommand*{\LWR@igorigin}{}% +\renewcommand*{\LWR@igangle}{}% +\renewcommand*{\LWR@igxscale}{1}% +\renewcommand*{\LWR@igyscale}{1}% +\renewcommand*{\LWR@igclass}{inlineimage}% +% \end{macrocode} +% +% Options are in |#1| +% +% \begin{macrocode} +\setkeys{igraph}{#1}% +% \end{macrocode} +% Create the \acro{HTML} reference with the graphicspath, filename, extension, +% alt tag, style, and class. +% +% The \cs{LWR@origtilde} adds space between tags in case this +% is being done inside a \cs{savebox} where \cs{newline} has no effect. +% \begin{macrocode} +\href{\thisgraphicspath\LWR@strresult\LWR@imageextension}% +{% start of href +\LWR@htmltag{% start of image tags +img src="\thisgraphicspath\LWR@strresult\LWR@imageextension" \LWR@orignewline +\LWR@origtilde{} alt="\LWR@strresult" \LWR@orignewline +% \end{macrocode} +% Only include a style tag if a width, height, angle, or scale was given: +% \begin{macrocode} +\ifthenelse{ + \NOT\equal{\LWR@igwidthstyle}{} \OR + \NOT\equal{\LWR@igheightstyle}{} \OR + \NOT\equal{\LWR@igorigin}{} \OR + \NOT\equal{\LWR@igangle}{} \OR + \NOT\equal{\LWR@igxscale}{1} \OR + \NOT\equal{\LWR@igyscale}{1} +}% +{\LWR@origtilde{} style="% +\ifthenelse{\NOT\equal{\LWR@igwidthstyle}{}}% +{\LWR@igwidthstyle;}{}% +\ifthenelse{\NOT\equal{\LWR@igheightstyle}{}}% +{\LWR@igheightstyle;}{}% +\ifthenelse{\NOT\equal{\LWR@igorigin}{}}% +{\LWR@origtilde{} transform-origin: \LWR@originnames{\LWR@igorigin}; \LWR@orignewline}{}% +\ifthenelse{\NOT\equal{\LWR@igangle}{}}% +{% +\LWR@rotstyle{-ms-}{\LWR@igangle}% +\LWR@rotstyle{-webkit-}{\LWR@igangle}% +\LWR@rotstyle{}{\LWR@igangle% +}}{}% +\ifthenelse{\NOT\equal{\LWR@igxscale}{1}\OR% +\NOT\equal{\LWR@igyscale}{1}}% +{\LWR@scalestyle{-ms-}{\LWR@igxscale}{\LWR@igyscale}% +\LWR@scalestyle{-webkit-}{\LWR@igxscale}{\LWR@igyscale}% +\LWR@scalestyle{}{\LWR@igxscale}{\LWR@igyscale}}{}% +" \LWR@orignewline}{}% +% \end{macrocode} +% Set the class: +% \begin{macrocode} +\LWR@origtilde{} class="\LWR@igclass" \LWR@orignewline% +}% end of image tags +}% end of href +\endgroup +% \end{macrocode} +% Return to small-sized output: +% \begin{macrocode} +\LWR@origscriptsize +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\includegraphics} \oarg{key=val} \marg{filename} + +% Handles width and height, converted to fixed width and heights. + +% Converts any |.pdf| references to |.svg| for \acro{HTML} + +% The user should always refer to |.pdf| in the document source. + +% \begin{macrocode} +\renewcommand*{\includegraphics} +{% +% \end{macrocode} +% This graphic should trigger an \acro{HTML} paragraph even if alone, +% so ensure that are doing paragraph handling: +% \begin{macrocode} +\LWR@ensuredoingapar% +\begingroup% +\LWR@includegraphicsb% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + +% \codeprint +% +% For print output, accept and then discard the new |class| key: +% \begin{macrocode} +\begin{warpprint} +\define@key{Gin}{class}{} +\end{warpprint} +% \end{macrocode} + + +% \subsection{\cs{rotatebox}, \cs{scalebox}, \cs{reflectbox}} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@rotboxorigin} Holds the origin key letters. +% \begin{macrocode} +\newcommand*{\LWR@rotboxorigin}{} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LWR@originname} \marg{letter} +% +% Given one \LaTeX{} origin key value, +% translate into an \acro{HTML} origin word: +% \begin{macrocode} +\newcommand*{\LWR@originname}[1]{% +\ifthenelse{\equal{#1}{t}}{top}{}% +\ifthenelse{\equal{#1}{b}}{bottom}{}% +\ifthenelse{\equal{#1}{c}}{center}{}% +\ifthenelse{\equal{#1}{l}}{left}{}% +\ifthenelse{\equal{#1}{r}}{right}{}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LWR@originnames} \marg{letters} +% +% Given one- or two-letter \LaTeX{} origin key values, +% translate into \acro{HTML} origin words: +% \begin{macrocode} +\newcommand*{\LWR@originnames}[1]{% +\StrChar{#1}{1}[\LWR@strresult]% +\LWR@originname{\LWR@strresult} +\StrChar{#1}{2}[\LWR@strresult]% +\LWR@originname{\LWR@strresult} +} +% \end{macrocode} +% \end{macro} +% +% +% Handle the origin key for \cs{rotatebox}: +% \begin{macrocode} +\define@key{krotbox}{origin}{% +\renewcommand*{\LWR@rotboxorigin}{#1}% +} +% \end{macrocode} +% These keys are ignored: +% \begin{macrocode} +\define@key{krotbox}{x}{} +\define@key{krotbox}{y}{} +\define@key{krotbox}{units}{} +% \end{macrocode} +% +% +% \begin{macro}{\rotatebox} \oarg{keyval list} \marg{angle} \marg{text} +% +% Will \cs{let}\cs{rotatebox}\cs{LWR@rotatebox} at \cs{LWR@LwarpStart}, +% in case \cs{rotatebox} was over-written by a later package load. +% \begin{macrocode} +\NewDocumentCommand{\LWR@rotatebox}{O{} m +m}{% +% \end{macrocode} +% Reset the origin to ``none-given'': +% \begin{macrocode} +\renewcommand*{\LWR@rotboxorigin}{} +% \end{macrocode} +% Process the optional keys, which may set \cs{LWR@rotateboxorigin}: +% \begin{macrocode} +\setkeys{krotbox}{#1}% +% \end{macrocode} +% Select |inline-block| so that \acro{HTML} will transform this span: +% \begin{macrocode} +\LWR@htmltagc{span style="display: inline-block; +% \end{macrocode} +% If an origin was given, translate and print the origin information: +% \begin{macrocode} +\ifthenelse{\NOT\equal{\LWR@rotboxorigin}{}}% +{transform-origin: \LWR@originnames{\LWR@rotboxorigin};\LWR@origtilde}{}% +% \end{macrocode} +% Print the rotation information: +% \begin{macrocode} +\LWR@rotstyle{-ms-}{#2} % +\LWR@rotstyle{-webkit-}{#2} % +\LWR@rotstyle{}{#2} % +"{}}\LWR@orignewline% +% \end{macrocode} +% Print the text to be rotated: +% \begin{macrocode} +\begin{LWR@nestspan}% +#3% +% \end{macrocode} +% Close the span: +% \begin{macrocode} +\LWR@htmltagc{/span}% +\end{LWR@nestspan}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\scalebox} \marg{h-scale} \oarg{v-scale} \marg{text} +% +% Will \cs{let}\cs{scalebox}\cs{LWR@scalebox} at \cs{LWR@LwarpStart}, +% in case \cs{scalebox} was over-written by a later package load. +% \begin{macrocode} +\NewDocumentCommand{\LWR@scalebox}{m o m}{% +% \end{macrocode} +% Select |inline-block| so that \acro{HTML} will transform this span: +% \begin{macrocode} +\LWR@htmltagc{span style="display: inline-block; % +% \end{macrocode} +% Print the scaling information: +% \begin{macrocode} +\LWR@scalestyle{-ms-}{#1}{\IfNoValueTF{#2}{#1}{#2}} % +\LWR@scalestyle{-webkit-}{#1}{\IfNoValueTF{#2}{#1}{#2}} % +\LWR@scalestyle{}{#1}{\IfNoValueTF{#2}{#1}{#2}} % +"{}}% +% \end{macrocode} +% Print the text to be scaled: +% \begin{macrocode} +\begin{LWR@nestspan}% +#3% +% \end{macrocode} +% Close the span: +% \begin{macrocode} +\LWR@htmltagc{/span}% +\end{LWR@nestspan}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\reflectbox} \marg{text} +% +% Will \cs{let}\cs{reflectbox}\cs{LWR@reflectbox} at \cs{LWR@LwarpStart}, +% in case \\ +% \cs{reflectbox} was over-written by a later package load. +% \begin{macrocode} +\newcommand{\LWR@reflectbox}[1]{\LWR@scalebox{-1}[1]{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \subsection{Null functions} +% +% These functions are not supported by \pkg{lwarp}'s \acro{HTML} conversion. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\resizebox} \marg{h-length} \marg{v-length} \marg{text} +% +% Simply prints its text argument. +% \begin{macrocode} +\renewcommand{\resizebox}[3]{#3} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% ^^A \RequirePackage[version=3]{mhchem} +% ^^A +% ^^A +% ^^A % use before and after environment hooks +% ^^A \let\LWR@origce\ce +% ^^A +% ^^A \renewcommand{\ce}[1]{ +% ^^A \begin{lateximage} +% ^^A \LWR@origce{#1} +% ^^A \end{lateximage} +% ^^A } +% ^^A +% ^^A +% ^^A \RequirePackage{rsphrase} + + + + + +% \section{Cleverref} +% \label{sec:cleveref} + +% \DescribePackage{cleveref} +% \pkg{cleveref} package is used as-is with minor patches. +% +% \pkg{cleveref} and the following associated macro patches are +% \margintag{loading order} +% automatically preloaded at the end of the preamble via \cs{AtEndPreamble} +% and \cs{AfterEndPreamble}. +% This is done because the \acro{HTML} conversion requires \pkg{cleveref}. +% The user's document may not require \pkg{cleveref}, thus the user +% may never explicitly load it, so during \acro{HTML} output \pkg{lwarp} loads it last. +% If the user's document preamble uses \pkg{cleveref} options, or functions such as +% \cs{crefname}, then \pkg{cleveref} may be loaded in the user's preamble near the +% end, and \pkg{lwarp}'s additional loading of \pkg{cleveref} will have no effect. +% +% \Cref{tab:crossrefdata} on \pageref{tab:crossrefdata} +% shows the data structure of the label/reference system +% as revised by \pkg{lwarp} and \pkg{cleveref}. + + +% A few patches allow \pkg{cleveref} to work as-is: + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \changes{v0.19}{2016/06/06}{cleveref: Loaded \cs{AtEndPreamble}.} + + + +% +% \cs{AtEndPreable} forces \pkg{cleveref} to be loaded last: +% +% \changes{v0.14}{2016/03/29}{Pagenote: Assigned cleveref name.} +% \changes{v0.19}{2016/06/06}{cleveref: Loaded \cs{AtEndPreamble}.} +% +% \begin{macrocode} +\AtEndPreamble{ +\RequirePackage{cleveref} +\crefname{pagenote}{note}{notes} +} +% \end{macrocode} +% +% +% \changes{v0.20}{2017/01/05}{\pkg{cleveref} and referencing patches: Applied \cs{AfterEndPreamble}.} +% +% \begin{flushleft} +% The following patches are applied after \pkg{cleveref} has loaded, +% and after \cs{AtBeginDocument}: +% \end{flushleft} +% \begin{macrocode} +\AfterEndPreamble{ +% \end{macrocode} + +% \begin{macro}{\@@setcref} \marg{kindofref} \marg{label} + +% ^^A |\@templabel| becomes the section number + +% ^^A original: \def\@@setcref#1#2{\cref@getlabel{#2}{\@templabel}#1{\@templabel}{}{}} + +% \begin{macrocode} +\renewcommand*{\@@setcref}[2]{#1{\ref{#2}}{}{}} +% \end{macrocode} +% \end{macro} + +% ^^A orig: +% ^^A \def\@@setcrefrange#1#2#3{% +% ^^A \cref@getlabel{#2}{\@labela}% +% ^^A \cref@getlabel{#3}{\@labelb}% +% ^^A #1{\@labela}{\@labelb}{}{}{}{}} + +%\begin{macro}{\@@setcrefrange} \marg{text} \marg{label} \marg{label} +% \begin{macrocode} +\renewcommand{\@@setcrefrange}[3]{% +#1{\ref{#2}}{\ref{#3}}{}{}{}{}} +% \end{macrocode} +% \end{macro} + +% ^^A orig: +% ^^A \def\@@setcpageref#1#2{% +% ^^A \cref@getpageref{#2}{\@temppage}#1{\@temppage}{}{}} + + + +% \begin{macro}{\cpagerefFor} Redefinable word between ``page(s)'' and the page numbers. +% +% \changes{v0.20}{2017/01/03}{User-redefinable word for page references.} +% +% \begin{macrocode} +\newcommand*{\cpagerefFor}{for} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\@@setcpageref} \marg{typeofref} \marg{label}, +% where typeofref is ``page'' or ``pages'' +% +% \begin{macrocode} +\renewcommand*{\@@setcpageref}[2]{% +#1{\cpagerefFor\ \cref{#2}}{}{}% +} +% \end{macrocode} +% \end{macro} + + +% ^^A orig: +% ^^A \def\@@setcpagerefrange#1#2#3{% +% ^^A \cref@getpageref{#2}{\@pagea}% +% ^^A \cref@getpageref{#3}{\@pageb}% +% ^^A #1{\@pagea}{\@pageb}{}{}{}{}} + +% \begin{macrocode} +\renewcommand{\@@setcpagerefrange}[3]{% +#1{\cpagerefFor\ \cref{#2}}{\cref{#3}}{}{}{}{}} +% \end{macrocode} + +% Remember and patch some label-related defintions. +% +% \begin{macrocode} +\let\LWR@origlabel\label +\let\label\LWR@newlabel +\let\LWR@origref\ref +\let\ref\LWR@newref% \end{ syntax highlighting +\let\LWR@origpageref\pageref +\let\pageref\LWR@newpageref + + +}% AfterEndPreamble + +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Picture} +% \label{sec:picture} + +% \DescribeEnv{picture} The \env{picture} environment is enclosed +% inside a \cs{lateximage}. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{environment}{picture} +% \begin{macrocode} +\BeforeBeginEnvironment{picture}{ + +\lateximage} + +\AfterEndEnvironment{picture}{\endlateximage + +} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Tikzpicture} +% \label{sec:tikz} + +% \DescribePackage{tikz} +% +% \DescribeEnv{tikzpicture} May be used as-is, and its contents will be +% converted to an image. +% +% \limitstikz +% +% (\pkg{lwarp} changes the catcode of |$| for its own use. +% \margintag{catcodes} +% The \tikz{} |babel| library temporarily changes catcodes +% back to normal for \tikz's use, restoring them to their +% \pkg{lwarp} purpose while inside each \tikz{} node.) +% \index{tikz>dollar redefined} +% \index{tikz>catcodes} +% + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \DescribeBoolean{LWR@tikzbabel} +% \pkg{tikz} v3.0.0 introduced the |babel| library which handles catcode changes. +% For older versions, \pkg{lwarp} must change |$|'s catcode itself. +% \begin{macrocode} +\newbool{LWR@tikzbabel} +\boolfalse{LWR@tikzbabel} + +\AtBeginDocument{ +\@ifpackageloaded{tikz}{ +\@ifpackagelater{tikz}{2013/12/20}% Test for Tikz version v3.0.0 +{\booltrue{LWR@tikzbabel}} +{\boolfalse{LWR@tikzbabel}} +}{} +} +% \end{macrocode} + + + +% \begin{environment}{tikzpicture} +% |tikzpicture| environment is enclosed inside a |\lateximage|. +% +% \changes{v0.13}{2016/03/23}{Fix dollar-redefined bug for newer package.} +% \changes{v0.19}{2016/05/29}{Adapts to tikz version.} +% +% \begin{macrocode} +\BeforeBeginEnvironment{tikzpicture}{% + +\lateximage +\ifbool{LWR@tikzbabel} +{} +{\catcode`\$=3} % dollar sign is math shift +} + +\AfterEndEnvironment{tikzpicture}{% +\endlateximage + +\ifbool{LWR@tikzbabel} +{} +{\catcode`\$=\active} +} +% \end{macrocode} +% \end{environment} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{Boxes and Minipages} +% +% A \acro{CSS} flexbox is used for minipages and parboxes, +% allowing external and internal vertical positioning. +% +% +% \limitsminipage +% + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \subsection{Counters and lengths} + +% \DescribeCounter{LWR@minipagedepth} +% Used to only reset the line width at the outermost minipage. +% \begin{macrocode} +\newcounter{LWR@minipagedepth} +\setcounter{LWR@minipagedepth}{0} +% \end{macrocode} + + +% +% \DescribeLength{LWR@minipagewidth} +% Used to convert the width into printable units. +% \begin{macrocode} +\newlength{\LWR@minipagewidth} +% \end{macrocode} +% \DescribeLength{LWR@minipageheight} +% Used to convert the height into printable units. +% \begin{macrocode} +\newlength{\LWR@minipageheight} +% \end{macrocode} +% +% Remember the original definitions: +% \begin{macrocode} +\let\LWR@origminipage\minipage +\let\LWR@origendminipage\endminipage +% \end{macrocode} +% +% +% \subsection{Footnote handling} +% \label{sec:footnotesminipage} +% +% Also see \cref{sec:footnotes} for other forms of footnotes. +% +% +% +% \begin{macro}{\LWR@nullrule} \oarg{raise} \marg{width} \marg{height} +% +% Used to cancel the footnotesep rule during \acro{HTML} output. +% This rule was causing occasional end paragraph tags to be inserted +% for some (so far) undetermined reason, as well +% as adding purposeless code to the \acro{HTML} output. +% \begin{macrocode} +\NewDocumentCommand{\LWR@nullrule}{o m m}{} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LWR@makefntext} \marg{text} +% +% Adds a paragraph closing tag to the end of each footnote. +% \begin{macrocode} +\newcommand{\LWR@makefntext}[1]{% +\begingroup% +\let\rule\LWR@nullrule% +\textsuperscript{\@thefnmark} #1% +\endgroup% +\LWR@htmltagc{/\LWR@tagregularparagraph}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LWR@makefnmark} +% Creates an \acro{HTML} superscript footnote mark: +% \begin{macrocode} +\newcommand*{\LWR@makefnmark}{\textsuperscript{\@thefnmark}} +% \end{macrocode} +% \end{macro} +% +% + +% +% \subsection{Minipage handling} +% +% \begin{macro}{\LWR@endminipage} +% Used to close a minipage. +% +% Copied the \LaTeX{} definition and modified to create a |mpfootnotes| div class: +% \begin{macrocode} +\def\LWR@endminipage{% + \par + \unskip + \ifvoid\@mpfootins\else + \vskip\skip\@mpfootins + \normalcolor + \LWR@htmldivclass{mpfootnotes} + \unvbox\@mpfootins + \LWR@htmldivclassend{mpfootnotes} + \fi + \@minipagefalse + \color@endgroup + \egroup + \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@subminipage} +% Used to create a \acro{PDF} minipage without creating an \acro{HTML} minipage. +% This allows footnotes to appear at the bottom of the minipage instead of +% the bottom of the \acro{HTML} page. +% \begin{macrocode} +\newcommand*{\LWR@subminipage}{% +\LWR@stoppars +\LWR@origminipage{6in} +% \end{macrocode} +% |\raggedright| cancels hyphenation, which will be done by \acro{HTML} instead. +% \begin{macrocode} +\LWR@origraggedright% +% \end{macrocode} +% Minipage footnotes appear the bottom of the minipage. +% \begin{macrocode} +\let\footnote\LWR@origfootnote% +\let\@makefntext\LWR@makefntext% +\let\@makefnmark\LWR@makefnmark% +% \end{macrocode} +% Resume paragraph tag handling for the contents of the minipage: +% \begin{macrocode} +\LWR@startpars% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\LWR@endsubminipage} +% Closes the subminipage. +% \begin{macrocode} +\newcommand*{\LWR@endsubminipage}{% +\LWR@stoppars% +\LWR@endminipage% The following empty line is required: + +} +% \end{macrocode} +% \end{macro} + + +% \DescribeBoolean{LWR@minipagefullwidth} Should the next minipage have no \acro{HTML} |width|? +% \begin{macrocode} +\newbool{LWR@minipagefullwidth} +\boolfalse{LWR@minipagefullwidth} +% \end{macrocode} +% +% \begin{macro}{\minipagefullwidth} Requests that the next minipage +% have no |width| tag in \acro{HTML}: +% \changes{v0.19}{2016/05/28}{Added: No width tag for the next minipage in HTML.} +% +% \codehtml +% +% \begin{macrocode} +\newcommand*{\minipagefullwidth}{\booltrue{LWR@minipagefullwidth}} +\end{warpHTML} +% \end{macrocode} +% +% \codeprint +% +% \begin{macrocode} +\begin{warpprint} +\newcommand*{\minipagefullwidth}{} +\end{warpprint} +% \end{macrocode} +% +% \codehtml +% +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% \end{macro} +% +% +% \DescribeBoolean{LWR@minipagethispar} +% Has a minipage been seen this paragraph? +% If true, prevents paragraph tags around horizontal space +% between minipages. +% \begin{macrocode} +\newbool{LWR@minipagethispar} +\boolfalse{LWR@minipagethispar} +% \end{macrocode} +% +% +% \begin{environment}{minipage} \oarg{vert position} \oarg{height} \oarg{inner vert position} \marg{width} +% \changes{v0.18}{2016/05/17}{Fix: \cs{linewidth}, \cs{textwidth}, \cs{textheight} inside a minipage.} +% +% The vertical positions may be 'c', 't', or 'b'. +% The inner position may also be 's'. +% +% When using |\linewidth|, |\textwidth|, or |\textheight|, these are scaled proportionally to a +% 6\texttimes{}9 inch text area. +% +% \begin{macrocode} +\RenewDocumentEnvironment{minipage}{O{t} o O{t} m} +{% +% \end{macrocode} +% Pre-compute the given width and height: +% \begin{macrocode} +% \end{macrocode} +% Reset the text area if are starting the outer-most minipage: +% \begin{macrocode} +\LWR@traceinfo{starting minipage}% +\uselengthunit{in}% +\setlength{\LWR@minipagewidth}{#4}% +\ifthenelse{\cnttest{\value{LWR@minipagedepth}}{=}{0}}{% +\addtolength{\LWR@minipagewidth}{3em}% room for frames +\setlength{\linewidth}{6in}% +\setlength{\textwidth}{6in}% +\setlength{\textheight}{9in}% +}{}% +\addtocounter{LWR@minipagedepth}{1}% +\setlength{\LWR@minipageheight}{\textheight}% default unless specified +\IfValueTF{#2}{\setlength{\LWR@minipageheight}{#2}}{}% +% \end{macrocode} +% \LaTeX{} wants to start a paragraph for the new minipage, then start a paragraph again +% for the contents of the minipage, so cancel the paragraph tag handling +% until the minipage has begun. +% \begin{macrocode} +\LWR@stoppars% +% \end{macrocode} +% Create the |<div>| tag with optional alignment style: +% \begin{macrocode} +\LWR@traceinfo{minipage: creating div class}% +\LWR@htmltag{div class="minipage" style="% +\ifthenelse{\equal{#1}{t}}{vertical-align: bottom ; }{}% +\ifthenelse{\equal{#1}{c}}{vertical-align: middle ; }{}% +\ifthenelse{\equal{#1}{b}}{vertical-align: top ; }{}% +\ifthenelse{\equal{#3}{t}}{justify-content: flex-start ; }{}% +\ifthenelse{\equal{#3}{c}}{justify-content: center ; }{}% +\ifthenelse{\equal{#3}{b}}{justify-content: flex-end ; }{}% +\ifthenelse{\equal{#3}{s}}{justify-content: space-between ; }{}% +% \end{macrocode} +% Print the width and optional height styles: +% \begin{macrocode} +\LWR@traceinfo{minipage: about to print the width}% +\uselengthunit{PT}% +\ifbool{LWR@minipagefullwidth}% +{\boolfalse{LWR@minipagefullwidth}}% +{% +\ifthenelse{\lengthtest{#4}=\linewidth}% +{}% +{width:\rndprintlength{\LWR@minipagewidth} ; }% +}% +\LWR@traceinfo{minipage: about to print the height}% +\IfValueTF{#2}{height:\rndprintlength{\LWR@minipageheight} ; }{}% +"{}}% +% \end{macrocode} +% Finish with an empty line to start \LaTeX{} minipage processing on a new line. +% Use a large minipage area to avoid the unnecessary wrapping of tags. +% \begin{macrocode} + +\LWR@origminipage{6in}% The preceding empty line is required. +% \end{macrocode} +% Set the user-accessible minipage and text width and height values inside the minipage. +% These do not affect the actual size of the large minipage created by +% \cs{LWR@origminipage} above, but are used by any reference to \cs{linewidth}, etc. +% inside the \acro{PDF} minipage being created here. +% \begin{macrocode} +\setlength{\linewidth}{#4}% the original width +\setlength{\textwidth}{6in}% +\setlength{\textheight}{9in}% +% \end{macrocode} +% |\raggedright| cancels hyphenation, which will be done by \acro{HTML} instead. +% \begin{macrocode} +\LWR@origraggedright% +\let\footnote\LWR@origfootnote% +\let\@makefntext\LWR@makefntext% +\let\@makefnmark\LWR@makefnmark% +% \end{macrocode} +% Resume paragraph tag handling for the contents of the minipage: +% \begin{macrocode} +\LWR@startpars% +\LWR@traceinfo{minipage: finished starting the minipage}% +} +% \end{macrocode} +% End the environment with \LaTeX{} processing and closing tag: +% \begin{macrocode} +{% +\LWR@stoppars% +\LWR@endminipage% The following empty line is required: + +\LWR@htmldivclassend{minipage}% +\vspace{1\baselineskip}% required for subcaption +\addtocounter{LWR@minipagedepth}{-1}% +\LWR@startpars% +% \end{macrocode} +% Prevent paragraph tags around horizontal white space +% until the start of the next paragraph: +% \begin{macrocode} +\global\booltrue{LWR@minipagethispar}% +} +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Parbox, makebox, framebox, fbox, raisebox} +% +% +% \begin{macro}{\parbox} \oarg{pos} \oarg{height} \oarg{inner-pos} \marg{width} \marg{text} +% +% A parbox uses the minipage code: +% \begin{macrocode} +\RenewDocumentCommand{\parbox}{O{t} o O{t} m m} +{ +\begin{minipage}[#1][#2][#3]{#4} +#5 +\end{minipage} +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\makebox} \oarg{width} \oarg{pos} \marg{text} +% +% Width and position are ignored. +% \begin{macrocode} +\RenewDocumentCommand{\makebox}{o o m}{% +\mbox{#3} +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\framebox} \oarg{width} \oarg{pos} \marg{text} +% +% Width and position are ignored. +% \begin{macrocode} +\RenewDocumentCommand{\framebox}{o o m}{% +\fbox{#3} +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\fbox} \marg{text} +% \begin{macrocode} +\let\LWR@origfbox\fbox +% +\renewcommand*{\fbox}[1]{% +\InlineClass{framebox}{#1}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\raisebox} \marg{raiselen} \oarg{height} \oarg{depth} \marg{text} +% \begin{macrocode} +\RenewDocumentCommand{\raisebox}{m o o m}{% +#4% +} +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + + + + + + +% \section{Direct formatting} +% \label{sec:directformatting} +% +% \limitstext +% +% For high-level block and inline custom CSS classes, +% see \cref{sec:highlevelclasses}. + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\emph} \marg{text} +% \begin{macrocode} +\renewcommand{\emph}[1]{\LWR@htmlspan{em}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textmd} \marg{text} +% \begin{macrocode} +\renewcommand{\textmd}[1]{\LWR@htmlspan{textmd}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textbf} \marg{text} +% \begin{macrocode} +\renewcommand{\textbf}[1]{\LWR@htmlspan{b}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textrm} \marg{text} +% \begin{macrocode} +\renewcommand{\textrm}[1]{\InlineClass{textrm}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textsf} \marg{text} +% \begin{macrocode} +\renewcommand{\textsf}[1]{\InlineClass{textsf}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\texttt} \marg{text} +% \begin{macrocode} +\renewcommand{\texttt}[1]{\LWR@htmlspan{kbd}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textup} \marg{text} +% \begin{macrocode} +\renewcommand{\textup}[1]{\LWR@htmlspan{textup}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textit} \marg{text} +% \begin{macrocode} +\renewcommand{\textit}[1]{\LWR@htmlspan{i}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textsc} \marg{text} +% \begin{macrocode} +\renewcommand{\textsc}[1]{\InlineClass{textsc}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textnormal} \marg{text} +% \begin{macrocode} +\renewcommand{\textnormal}[1]{\textmd{\textrm{\textup{#1}}}} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\mdseries} +% \begin{macrocode} +\renewcommand*{\mdseries}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\bfseries} +% \begin{macrocode} +\renewcommand*{\bfseries}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\rmfamily} +% \begin{macrocode} +\renewcommand*{\rmfamily}{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\sffamily} + +% \begin{macrocode} +\renewcommand*{\sffamily}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ttfamily} +% \begin{macrocode} +\renewcommand*{\ttfamily}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\upshape} +% \begin{macrocode} +\renewcommand*{\upshape}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\itshape} +% \begin{macrocode} +\renewcommand*{\itshape}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\scshape} +% \begin{macrocode} +\renewcommand*{\scshape}{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\scshape} +% \begin{macrocode} +\renewcommand*{\normalfont}{} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\sp} \marg{text} + +% For \pkg{siunitx}. Must work in math mode. +% \begin{macrocode} +\renewcommand{\sp}[1]{\text{<sup>#1</sup>}{}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\sb} \marg{text} + +% For \pkg{siunitx}. Must work in math mode. +% \begin{macrocode} +\renewcommand{\sb}[1]{\text{<sub>#1</sub>}{}} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\textsuperscript} \marg{text} +% \begin{macrocode} +\renewcommand{\textsuperscript}[1]{\LWR@htmlspan{sup}{#1}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\textsubscript} \marg{text} +% \begin{macrocode} +\renewcommand{\textsubscript}[1]{\LWR@htmlspan{sub}{#1}} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\up} \marg{text} Prints superscript. +% +% This is \cs{let} at the beginning of the document in case some other package +% has changed the definition. +% \begin{macrocode} +\AtBeginDocument{\let\up\textsuperscript} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\fup} \marg{text} Prints superscript. +% +% Supports \pkg{fmtcount} package. +% +% This is \cs{let} at the beginning of the document in case some other package +% has changed the definition. +% \begin{macrocode} +\AtBeginDocument{\let\fup\textsuperscript} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\hfill} +% \changes{v0.20}{2016/12/12}{Inserts a \cs{qquad}.} +% \begin{macrocode} +\renewcommand*{\hfill}{\qquad} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\hrulefill} +% \changes{v0.20}{2017/01/19}{Inserts a short rule.} +% \begin{macrocode} +\renewcommand*{\hrulefill}{\rule{1in}{1pt}} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\dotfill} +% \changes{v0.20}{2017/01/19}{Inserts an ellipsis.} +% \begin{macrocode} +\renewcommand*{\dotfill}{\dots} +% \end{macrocode} +% \end{macro} + + + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{Skips, spaces, font sizes} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% |\,| must be redefined after |\RequirePackage{printlen}| +% \begin{macrocode} +\let\LWR@origcomma\, +\let\LWR@origtilde~ +\let\LWR@origenskip\enskip +\let\LWR@origquad\quad +\let\LWR@origqquad\qquad +\let\LWR@orighspace\hspace +\let\LWR@origrule\rule +% \end{macrocode} + +% Direct-formatting space commands become \acro{HTML} entities: +% \begin{macrocode} +\renewcommand*{\,}{\HTMLunicode{202f}} % HTML thin non-breakable space +% \end{macrocode} +% ^^A \renewcommand*{\,}{\HTMLunicode{2009}} % HTML thin wrappable space +% ^^A \renewcommand*{\,}{\HTMLentity{nbsp}} % regular-width non-breakable space +% \begin{macrocode} +\renewcommand*{~}{\HTMLentity{nbsp}} +\renewcommand*{\textellipsis}{\HTMLunicode{2026}} +% \end{macrocode} +% Direct-formatting font sizes are ignored: +% \begin{macrocode} +\let\LWR@orignormalsize\normalsize +\let\LWR@origsmall\small +\let\LWR@origfootnotesize\footnotesize +\let\LWR@origscriptsize\scriptsize +\let\LWR@origtiny\tiny +\let\LWR@origlarge\large +\let\LWR@origLarge\Large +\let\LWR@origLARGE\LARGE +\let\LWR@orighuge\huge +\let\LWR@origHuge\Huge +\renewcommand*{\normalsize}{} +\renewcommand*{\small}{} +\renewcommand*{\footnotesize}{} +\renewcommand*{\scriptsize}{} +\renewcommand*{\tiny}{} +\renewcommand*{\large}{} +\renewcommand*{\Large}{} +\renewcommand*{\LARGE}{} +\renewcommand*{\huge}{} +\renewcommand*{\Huge}{} + +\renewcommand*{\onecolumn}{} + +\renewcommand{\twocolumn}[1][]{ + +#1 + +} +% \end{macrocode} + + +% \begin{macro}{\newline} +% Uses \acro{HTML} |<br />| tag +% \begin{macrocode} +\newcommand*{\LWR@newlinebr}{\unskip\LWR@htmltag{br /}\LWR@orignewline}% +\let\newline\LWR@newlinebr +% \end{macrocode} +% \end{macro} + + +% \DescribeMacro{\\} Redefined to \cs{LWR@endofline} or \cs{LWR@tabularendofline}. +% +% \begin{macro}{\LWR@endofline} * \oarg{len} +% \changes{v0.20}{2016/08/20}{Fix: \protect\textbackslash\protect\textbackslash} +% +% |\\| is assigned to \cs{LWR@endofline} at \cs{LWR@LwarpStart}. +% +% Inside |tabular|, |\\| is temporarily changed to \cs{LWR@tabularendofline}. +% \begin{macrocode} +\NewDocumentCommand{\LWR@endofline}{s o} +{% +\newline% +} +% \end{macrocode} +% \end{macro} + + + + + +% \begin{macro}{\LWR@minipagestartpars} +% \changes{v0.19}{2016/05/31}{Surpresses paragraph tags between minipages.} +% \index{minipage>horizontal space between} +% \index{space>horizontal between minipages} +% \index{horizontal space>between minipages} +% Minipages are often placed side-by-side inside figures, with a bit of +% horizontal space to separate them. Since \acro{HTML} does not allow +% a |div| to be inside a |p|, paragraphs must be turned off during the +% generation of the minipage, then turned on after the minipage is complete. +% When this occurs between side-by-side minipages, |lwarp| correctly +% surpresses the paragraph tags between the minipages, unless some other +% text is between the minipages. Such text forms its own paragraph, resulting +% in text after a minipage to be on its own line. Since people often place +% \DescribeMacro{\hspace} +% \DescribeMacro{\enskip} +% \DescribeMacro{\quad} +% \DescribeMacro{\qquad} +% small horizontal space between minipages, it is desirable to maintain this +% space if possible. |lwarp| tries to do this by remembering that a minipage +% has been seen, in which case paragraph tags are surpressed around +% \cs{hspace}, \cs{enskip}, \cs{quad}, and \cs{qquad} until the end of the paragraph, when +% the closing |p| tag is created. +% +% When a minipage is seen, the boolean +% |LWR@minipagethispar| is set, telling the following horizontal +% whitespace commands to try to surpress their surrounding paragraph +% tags. |LWR@minipagethispar| is cleared at the next +% end of paragraph, when the \acro{HTML} paragraph closing tag is +% generated. +% +% Placed just before \cs{hspace}, \cs{quad}, or \cs{qquad}'s \acro{HTML} output. +% \begin{macrocode} +\newcommand*{\LWR@minipagestartpars}{% +\ifbool{LWR@minipagethispar}% +{% +\LWR@startpars% +}{}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\LWR@minipagestoppars} +% Placed just after \cs{hspace}, \cs{quad}, or \cs{qquad}'s \acro{HTML} output. +% \begin{macrocode} +\newcommand*{\LWR@minipagestoppars}{% +\ifbool{LWR@minipagethispar}% +{% +\LWR@stoppars% +}{}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\quad} +% Handles special minipage \& horizontal space interactions. +% \begin{macrocode} +\renewcommand*{\quad}{% +\LWR@minipagestoppars% +\HTMLunicode{2001}% +\LWR@minipagestartpars% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\qquad} +% Handles special minipage \& horizontal space interactions. +% \begin{macrocode} +\renewcommand*{\qquad}{\quad\quad} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\enskip} +% Handles special minipage \& horizontal space interactions. +% \begin{macrocode} +\renewcommand*{\enskip}{% +\LWR@minipagestoppars% +\HTMLunicode{2000}% +\LWR@minipagestartpars% +} +% \end{macrocode} +% \end{macro} + + +% \DescribeLength{LWR@tempwidth} +% \DescribeLength{LWR@tempheight} +% \DescribeLength{LWR@tempraise} +% Used to compute span width, height, raise for \cs{hspace} and \cs{rule}: +% \begin{macrocode} +\newlength{\LWR@tempwidth} +\newlength{\LWR@tempheight} +\newlength{\LWR@tempraise} +% \end{macrocode} +% + +% \begin{macro}{\LWR@hspace} * \marg{length} +% +% Handles special minipage \& horizontal space interactions. +% \changes{v0.18}{2016/05/13}{\cs{hspace} supported} +% \changes{v0.19}{2016/05/29}{Fix: \cs{hspace} length computations} +% \changes{v0.20}{2016/08/22}{Add: Supports HTML thin breakable space} +% +% Prints a span of a given width. Ignores the optional star. +% +% \cs{fill} is zero-width, so |\hspace{\fill}| is ignored. +% \begin{macrocode} + +\NewDocumentCommand{\LWR@hspace}{s m}{% +\setlength{\LWR@tempwidth}{#2}% +% \end{macrocode} +% Only if the width is not zero: +% \begin{macrocode} +\ifthenelse{\dimtest{\LWR@tempwidth}{=}{0pt}}{}{% +% \end{macrocode} +% If had a minipage this paragraph, try to inline the +% white space without generating paragraph tags: +% \begin{macrocode} +\LWR@minipagestoppars% +% \end{macrocode} +% Support the HTML thin wrappable space: +% \begin{macrocode} +\ifthenelse{\dimtest{\LWR@tempwidth}{=}{.16667em}} +{% +\HTMLunicode{2009}% thin breakable space +}% +% \end{macrocode} +% Print the span with the converted width. Not rounded. +% \begin{macrocode} +{% +\uselengthunit{PT}% +\LWR@htmltagc{% +span style="width:\printlength{\LWR@tempwidth}; display:inline-block;"% +}% +\LWR@htmltagc{/span}% +}% +% \end{macrocode} +% If had a minipage this paragraph, try to inline the +% white space without generating paragraph tags: +% \begin{macrocode} +\LWR@minipagestartpars% +}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\hspace} * \marg{length} +% +% Handles special minipage \& horizontal space interactions. +% \begin{macrocode} +\let\hspace\LWR@hspace +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\linebreak} \oarg{num} \qquad +% Inserts an \acro{HTML} |br| tag. +% \begin{macrocode} +\renewcommand*{\linebreak}[1][]{\newline} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\nolinebreak} \oarg{num} +% \begin{macrocode} +\renewcommand*{\nolinebreak}[1][]{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\pagebreak} \oarg{num} \qquad +% Starts a new paragraph. +% \begin{macrocode} +\renewcommand*{\pagebreak}[1][]{ + +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\nopagebreak} \oarg{num} +% \begin{macrocode} +\renewcommand*{\nopagebreak}[1][]{} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\enlargethispage} * \marg{len} +% \begin{macrocode} +\RenewDocumentCommand{\enlargethispage}{s m}{} +% \end{macrocode} +% \end{macro} + + + + + +% \begin{macro}{\LWR@rule} \oarg{raise} \marg{width} \marg{height} +% +% Handles special minipage \& horizontal space interactions. +% +% Creates a span of a given width and height. Ignores the optional star. +% +% \cs{fill} is zero-width, so |\hspace{\fill}| is ignored. +% \begin{macrocode} +\NewDocumentCommand{\LWR@rule}{o m m}{% +% \end{macrocode} +% The width is copied into a temporary \LaTeX\ length, from which +% comparisons and conversions may be made: +% \begin{macrocode} +\setlength{\LWR@tempwidth}{#2}% +% \end{macrocode} +% If it's zero-width then skip the entire rule: +% \begin{macrocode} +\ifthenelse{\lengthtest{\LWR@tempwidth=0pt}} +{}% zero- width +{% non-zero width +% \end{macrocode} +% If it's non-zero width, set a minimal thickness so that it +% more reliably shows in the browser: +% \begin{macrocode} +\ifthenelse{\lengthtest{\LWR@tempwidth>0pt}\AND% +\lengthtest{\LWR@tempwidth<1pt}}% +{\setlength{\LWR@tempwidth}{1pt}}{}% +% \end{macrocode} +% Likewise with height: +% \begin{macrocode} +\setlength{\LWR@tempheight}{#3}% +\ifthenelse{\lengthtest{\LWR@tempheight>0pt}\AND% +\lengthtest{\LWR@tempheight<1pt}}% +{\setlength{\LWR@tempheight}{1pt}}{}% +% \end{macrocode} +% If had a minipage this paragraph, try to inline the +% rule without generating paragraph tags: +% \begin{macrocode} +\LWR@minipagestoppars% +% \end{macrocode} +% Print the span with the converted width and height. +% The width and height are NOT rounded, since a height of +% less than 1pt is quite common in \LaTeX\ code. +% \begin{macrocode} +\uselengthunit{PT}% +\LWR@htmltagc{% +span +style=" % +% \end{macrocode} +% The background color is used to draw the filled rule. +% The color may be changed by \cs{textcolor}. +% \begin{macrocode} +background:\LWR@currenttextcolor; % +% \end{macrocode} +% The width and height are printed, converted to PT: +% \begin{macrocode} +width:\printlength{\LWR@tempwidth}; % +height:\printlength{\LWR@tempheight}; % +% \end{macrocode} +% The raise height is converted to a \acro{CSS} transform. +% The |*2| raise multiplier is to approximately match \acro{HTML} output's X height. +% Conversion to a \LaTeX\ length allows a typical \LaTeX\ expression to be +% used as an argument for the raise, whereas printing the raise argument +% directly to \acro{HTML} output without conversion to a \LaTeX\ length +% limits the allowable syntax. To do:\ A superior method would compute a +% ratio of \LaTeX\ ex height, then print that to \acro{HTML} with an ex unit. +% \begin{macrocode} +\IfValueTF{#1}% +{% +\setlength{\LWR@tempraise}{0pt-#1}% +\setlength{\LWR@tempraise}{\LWR@tempraise*2}% +\LWR@orignewline% +-ms-transform: translate(0pt,\printlength{\LWR@tempraise}); % +\LWR@orignewline% +-webkit-transform: translate(0pt,\printlength{\LWR@tempraise}); % +\LWR@orignewline% +transform: translate(0pt,\printlength{\LWR@tempraise}); % +\LWR@orignewline% +}{}% +% \end{macrocode} +% Display inline-block to place the span inline with the text: +% \begin{macrocode} +display:inline-block;"% +}% +\LWR@htmltagc{/span}% +% \end{macrocode} +% If had a minipage this paragraph, try to inline the +% white space without generating paragraph tags: +% \begin{macrocode} +\LWR@minipagestartpars% +}% non-zero width +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\rule} \oarg{raise} \marg{width} \marg{height} +% \changes{v0.19}{2016/06/01}{Added} +% +% Handles special minipage \& horizontal space interactions. +% \begin{macrocode} +\let\rule\LWR@rule +% \end{macrocode} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \section{\textbackslash{}phantomsection} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\phantomsection} +% Emulate the hyperref |\phantomsection| command, +% often used to insert the bibliography into table of contents: +% \begin{macrocode} +\newcommand*{\phantomsection}{\section*{}} +% \end{macrocode} +% \end{macro} + + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + + +% \section{\textbackslash{}LaTeX and other logos} + +% Logos for \acro{HTML} and print modes: +% +% Some of these logos may be redefined in a later package, +% so after loading other packages, and at the beginning of the document, their definitions +% are finally |\let| in |\LWR@LwarpStart|. +% +% For \acro{CSS} conversions, see: \\ +% \url{http://edward.oconnor.cx/2007/08/tex-poshlet} \\ +% \url{http://nitens.org/taraborelli/texlogo} +% +% +% +% \subsection{HTML logos} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% \begin{macro}{\TeX} \TeX +% \nopagebreak +% +% |latexlogo| is a \acro{CSS} class used to properly typeset the E and A in \LaTeX{} and friends. +% +% |latexlogofont| is a \acro{CSS} class used to select the font for the rest of the logo in +% \LaTeX, \LuaTeX, \ConTeXt, etc. +% \begin{macrocode} +\newcommand*{\LWR@TeX} +{\InlineClass{latexlogofont}% +{\InlineClass{latexlogo}{T\textsubscript{e}X}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LaTeX} +% \begin{macro}{\LaTeXe} \LaTeX, \LaTeXe +% \begin{macrocode} +\newcommand*{\LWR@LaTeX} +{\InlineClass{latexlogofont}% +{\InlineClass{latexlogo}% +{L\textsuperscript{a}T\textsubscript{e}X}}} + +\renewcommand*{\LaTeXe} +{\LaTeX\InlineClass{latexlogofont}% +{\,2\textsubscript{\textit{\HTMLunicode{3B5}}}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\LuaTeX} +% \begin{macro}{\LuaLaTeX} \LuaTeX, \LuaLaTeX +% \begin{macrocode} +\newcommand*{\LWR@LuaTeX}{\InlineClass{latexlogofont}{Lua}\TeX} +\newcommand*{\LWR@LuaLaTeX}{\InlineClass{latexlogofont}{Lua}\LaTeX} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\XeTeX} +% \begin{macro}{\XeLaTeX} \XeTeX, \XeLaTeX +% \nopagebreak +% +% |xetexlogo| is a \acro{CSS} class which aligns the backwards E in \XeTeX{} and spaces \TeX{} +% appropriately. +% +% |xelatexlogo| is a \acro{CSS} class which aligns the backwards E in \XeLaTeX{} and spaces +% \LaTeX{} appropriately. +% \begin{macrocode} +\newcommand*{\Xe} + {X\textsubscript{\HTMLunicode{18e}}} +\newcommand*{\LWR@XeTeX}{\InlineClass{xetexlogo}{\Xe}\TeX} +\newcommand*{\LWR@XeLaTeX}{\InlineClass{xelatexlogo}{\Xe}\LaTeX} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\ConTeXt} \ConTeXt +% \begin{macrocode} +\newcommand*{\LWR@ConTeXt} +{\InlineClass{latexlogofont}{Con}\TeX{}% +\InlineClass{latexlogofont}{t}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\BibTeX} +% \begin{macro}{\MakeIndex} \BibTeX, \MakeIndex +% \begin{macrocode} +\providecommand*{\BibTeX} +{\InlineClass{latexlogofont}{B\textsc{ib}}\TeX} + +\newcommand*{\MakeIndex} +{\InlineClass{latexlogofont}{\textit{MakeIndex}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\AmS} \AmS +% \nopagebreak +% +% |amslogo| is a \acro{CSS} class used for the \AmS logo. +% \begin{macrocode} +\AtBeginDocument{\DeclareDocumentCommand{\AmS}{} +{\InlineClass{amslogo}{\textit{A\textsubscript{M}S}}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MiKTeX} \MiKTeX +% \begin{macrocode} +\newcommand*{\MiKTeX}{\InlineClass{latexlogofont}{MiK}\TeX} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LyX} \LyX +% \nopagebreak +% +% |lyxlogo| is a \acro{CSS} class used for the \LyX logo. +% \begin{macrocode} +\newcommand*{\LyX}{\InlineClass{lyxlogo}{LyX}} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} +% +% \subsection{Print logos} +% +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\newcommand*{\XeTeXrevE} + {\hspace{-.1667em}\raisebox{-.5ex}{\reflectbox{E}}\hspace{-.125em}} +\providecommand*{\XeTeX}{\mbox{X\XeTeXrevE\TeX}} +\providecommand*{\XeLaTeX}{\mbox{X\XeTeXrevE\LaTeX}} +\providecommand*{\AmS}{% +\leavevmode\hbox{$\mathcal A\kern-.2em\lower.376ex% +\hbox{$\mathcal M$}\kern-.2em\mathcal S$}} +\newcommand*{\LyX}{\textsf{LyX}} +\providecommand*{\LuaTeX}{\mbox{Lua\TeX}} +\providecommand*{\LuaLaTeX}{\mbox{Lua\LaTeX}} +\providecommand*{\BibTeX}{\mbox{B\textsc{ib}\TeX}} +\providecommand*{\MakeIndex}{\mbox{\textit{MakeIndex}}} +\providecommand*{\ConTeXt}{\mbox{Con\TeX{}t}} +\providecommand*{\MiKTeX}{\mbox{MiK\TeX}} +\end{warpprint} +% \end{macrocode} + + +% \section{\textbackslash{}AtBeginDocument, \textbackslash{}AtEndDocument} + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macro}{\LWR@LwarpStart} +% \begin{macro}{\LWR@LwarpEnd} +% Automatically sets up the \acro{HTML}-related actions for the start and end of the +% document. +% \begin{macrocode} +\AfterEndPreamble{\LWR@LwarpStart} +\AtEndDocument{\LWR@LwarpEnd} +% \end{macrocode} +% \end{macro} +% \end{macro} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + + + +% \clearpage + +% \section{lwarpmk.conf} + +% \DescribeFile{lwarpmk.conf} +% |lwarpmk.conf| is automatically (re-)created by the \pkg{lwarp} package when +% executing\\ +% \hspace*{2ex} |pdflatex <project.tex>|,\\ +% or similar for |xelatex| or |lualatex|, in print-document generation mode, +% which is the default unless the |warpHTML| option is given. +% |lwarpmk.conf| is then used by the utility |lwarpmk|. +% +% An example |lwarpmk.conf|: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4,formatcom={\unskip}] +% opsystem = "Unix" -- or "Windows" +% latexname = "pdflatex" -- or "lualatex" or "xelatex" +% sourcename = "projectname" -- your .tex source +% homehtmlfilename = "index" -- or "projectname" +% htmlfilename = "" -- or "projectname" if numbered HTML files +% \end{Verbatim} +% +% Defaults unless already over-ridden by the user: +% \begin{macrocode} +\providecommand*{\HomeHTMLFileName}{\BaseJobname} +\providecommand*{\HTMLFileName}{} +\providecommand*{\UseLatexmk}{false} +% \end{macrocode} + + +% \codeprint +% \begin{macrocode} +\begin{warpprint} +\ifcsdef{LWR@file}{}{\newwrite{\LWR@file}} +\immediate\openout\LWR@file=lwarpmk.conf +\ifwindows +\immediate\write\LWR@file{opsystem = "Windows"} +\else +\immediate\write\LWR@file{opsystem = "Unix"} +\fi +\ifPDFTeX +\immediate\write\LWR@file{latexname = "pdflatex"} +\fi +\ifXeTeX +\immediate\write\LWR@file{latexname = "xelatex"} +\fi +\ifLuaTeX +\immediate\write\LWR@file{latexname = "lualatex"} +\fi +\immediate\write\LWR@file{sourcename = "\jobname"} +\immediate\write\LWR@file{% +homehtmlfilename = "\HomeHTMLFileName"% +} +\immediate\write\LWR@file{htmlfilename = "\HTMLFileName"} +\immediate\write\LWR@file{uselatexmk = "\UseLatexmk"} +\immediate\closeout\LWR@file +\end{warpprint} +% \end{macrocode} + + + + + + + + +% \clearpage +% \section{Trademarks} +% +% \changes{v0.14}{2016/03/29}{Docs: Trademarks section.} +% +% \begin{itemize} +% \item Adobe® and Adobe Framemaker® are either registered trademarks or +% trademarks of Adobe Systems Incorporated in the United States and/or other countries. +% \item Linux® is the registered trademark of Linus Torvalds in the U.S.\ and other countries. +% \item Mac\,OS® is a trademark of Apple Inc. +% \item MadCap Flare™ is the property of MadCap Software, Inc. +% \item MathJax is copyright 2009 and later. +% The MathJax Consortium is a joint venture of the American Mathematical Society (AMS) +% and the Society for Industrial and Applied Mathematics (SIAM) +% to advance mathematical and scientific content on the web. +% \item Microsoft®, Encarta, MSN, and Windows® are either registered trademarks or +% trademarks of Microsoft Corporation in the United States and/or other countries. +% \item UNIX® is a registered trademark of The Open Group. +% \end{itemize} + +% \iffalse +%</package> +% \fi + + + +% \clearpage + + +% \iffalse +%<*lwarp-newproject> +% \fi + +% \part{lwarp-newproject.sty} +% +% \changes{v0.20}{2016/12/20}{\pkg{lwarp-newproject}: Added.} +% +% \section{lwarp-newproject} +% +% \DescribePackage{lwarp-newproject} +% \pkg{lwarp-newproject} is used to create lwarp-specific +% system files in a new project. +% +% \DescribeOption[lwarp-newproject]{warpprint} Configuration files are only +% created if the |warpprint| option was used. When this is the case, +% \pkg{lwarp-newproject} knows that \cs{jobname} is the source code's filename +% (as opposed to the |<project>_html.tex| filename). +% +% \DescribeOption[lwarp-newproject]{warpHTML} Does not create configuration files. +% |warpprint| or |warpHTML| are passed to both \pkg{lwarp} and +% \pkg{lwarp-newproject} by |lwarpmk|, depending on whether |lwarpmk print| +% or |lwarpmk html| was used. +% +% \DescribeOption[lwarp-newproject]{BaseJobName} |BaseJobname=somename| sets +% \cs{BaseJobname} to |somename|, which is used to set \cs{HomeHTMLFileName}, +% which is then written to the |lwarpmk.conf| and |<project>.lwarpmkconf| +% configuration files. +% +% \cs{BaseJobname} is also written to |<project>_html.tex| as an option +% given for the \pkg{lwarp} and \pkg{lwarp-newproject} packages during the +% creation of \acro{HTML} output. +% +% \cs{BaseJobname} is the \cs{jobname} of the printed version, even while compiling +% the \acro{HTML} version, where \cs{jobname} has |_html| appended. +% +% \DescribeOption[lwarp-newproject]{lwarpmk} Tells |lwarp-newproject| to +% generate a local copy of |lwarpmk| called |lwarpmk.lua|. +% Useful for archiving for future use. +% This file may be made executable and acts just like |lwarpmk|. +% +% In the document source: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4,formatcom={\unskip}] +% \documentclass{article} % or book, report +% ... +% (font selection, input encoding) +% ... +% \newcommand*{\HomeHTMLFileName}{index}, or {projectname} +% \newcommand*{\HTMLFileName}{} +% \usepackage{lwarp-newproject} +% \usepackage{lwarp} +% ... +% (load other packages, the rest of the preamble) +% ... +% \NewCSS{project.css} +% \NewHTMLdescription{Summarize this webpage.} +% ... +% \begin{document} +% ... +% \end{document} +% \end{Verbatim} +% +% Place |\usepackage{lwarp-newproject}| just before |\usepackage{lwarp}| in the +% document source. The operating system and \TeX\ engine will be auto-detected, +% and a customized |lwarpmk.conf| file will be generated, along with +% the other support files (|*.css|, |lwarp_html.xdy|, |lwarp_mathjax.txt|). +% Rename |sample_project.css| to your own custom |projectname.css| and +% edit it if desired. +% +% After the first compile, |\usepackage{lwarp-newproject}| +% may be commented out unless the configuration changes. +% For example, it may be re-enabled +% to switch between |pdflatex|, |xelatex|, and |lualatex|, in which case +% a new manual compile (without using |lwarpmk|) will auto-configure and +% regenerate the files. It may also be left enabled at all times, in which case +% the configuration files will be regenerated each time. Note that your own +% |projectname.css| file will not be over-written by the newly regenerated +% |sample_project.css|. +% + +% Discard all options for \pkg{lwarp-newproject}: +% \begin{macrocode} +\ProvidesPackage{lwarp-newproject} + +\RequirePackage{etoolbox} +\RequirePackage{comment} +\RequirePackage{fancyvrb} +\RequirePackage{ifplatform}% sense op-system platform +\RequirePackage{iftex}% sense pdflatex/lualatex/xelatex +\RequirePackage{kvoptions} +\SetupKeyvalOptions{family=LWRNP,prefix=LWRNP@} +% \end{macrocode} + + +% Generate config files? +% \begin{macrocode} +\newbool{LWRNP@genconf} +\boolfalse{LWRNP@genconf} +% \end{macrocode} + +% Optionally generate a local copy of |lwarpmk|. Default to no: +% \begin{macrocode} +\excludecomment{LWR@createlwarpmk} +% \end{macrocode} + +% Process options: +% \begin{macrocode} +\DeclareVoidOption{warpprint}{\booltrue{LWRNP@genconf}} +\DeclareVoidOption{warpHTML}{\boolfalse{LWRNP@genconf}} +\DeclareVoidOption{lwarpmk}{\includecomment{LWR@createlwarpmk}} +\DeclareStringOption[\jobname]{BaseJobname} + +\booltrue{LWRNP@genconf}% warpprint + +\ProcessKeyvalOptions*\relax +% \end{macrocode} + + + + +% Assign the \cs{BaseJobname} if the user hasn't provided one: +% \begin{macrocode} +\providecommand*{\BaseJobname}{\LWRNP@BaseJobname} +% \end{macrocode} + +% Defaults unless already over-ridden by the user: +% \begin{macrocode} +% \ifbool{LWRNP@genconf}{ +\providecommand*{\HomeHTMLFileName}{\BaseJobname} +% }{} +\providecommand*{\HTMLFileName}{} +\providecommand*{\UseLatexmk}{false} +% \end{macrocode} +% +% + + +\ifbool{LWRNP@genconf}{\typeout{lwarp-newproject: generating configuration files}}{} + + +% \subsection{project\_html.tex} +% +% \DescribeFile{project_html.tex} Used to allow an \acro{HTML} version of the +% document to exist alongside the print version. +% +% Only write |\jobname_html.tex| if generating the print version. +% \begin{macrocode} +\ifbool{LWRNP@genconf}{ +\ifcsdef{LWR@file}{}{\newwrite{\LWR@file}} +\immediate\openout\LWR@file=\jobname_html.tex +\immediate\write\LWR@file{% +\detokenize{\PassOptionsToPackage}% +{warpHTML,BaseJobname=\jobname}{lwarp}% +} +\immediate\write\LWR@file{% +\detokenize{\PassOptionsToPackage}% +{warpHTML,BaseJobname=\jobname}{lwarp-newproject}% +} +\immediate\write\LWR@file{% +\detokenize{\input}\string{\jobname.tex\string }% +} +\immediate\closeout\LWR@file +}{} +% \end{macrocode} + + +% \subsection{project.lwarpmkconf} +% +% \DescribeFile{project.lwarpmkconf} The configuration file for |lwarpmk|. +% +% +% \begin{macrocode} +\ifbool{LWRNP@genconf}{ +\ifcsdef{LWR@file}{}{\newwrite{\LWR@file}} +\immediate\openout\LWR@file=\jobname.lwarpmkconf +\ifwindows +\immediate\write\LWR@file{opsystem = "Windows"} +\else +\immediate\write\LWR@file{opsystem = "Unix"} +\fi +\ifPDFTeX +\immediate\write\LWR@file{latexname = "pdflatex"} +\fi +\ifXeTeX +\immediate\write\LWR@file{latexname = "xelatex"} +\fi +\ifLuaTeX +\immediate\write\LWR@file{latexname = "lualatex"} +\fi +\immediate\write\LWR@file{sourcename = "\jobname"} +\immediate\write\LWR@file{% +homehtmlfilename = "\HomeHTMLFileName"% +} +\immediate\write\LWR@file{htmlfilename = "\HTMLFileName"} +\immediate\write\LWR@file{uselatexmk = "\UseLatexmk"} +\immediate\closeout\LWR@file +}{} +% \end{macrocode} + + + + +% \subsection{lwarp.css} + +% \DescribeFile{lwarp.css} +% This is the base \acro{css} layer used by \pkg{lwarp}. +% +% This must be present both when compiling the project +% and also when distributing the \acro{HTML} files. +% +% \begin{macrocode} +\begin{VerbatimOut}{lwarp.css} +/* + CSS stylesheet for the LaTeX lwarp package + Copyright 2016 Brian Dunn — BD Tech Concepts LLC +*/ + + +/* a fix for older browsers: */ +header, section, footer, aside, nav, main, + article, figure { display: block; } + + +A:link {color:#000080 ; text-decoration: none ; } +A:visited {color:#800000 ; } +A:hover {color:#000080 ; text-decoration: underline ;} +A:active {color:#800000 ; } + +a.tocpart {display: inline-block ; margin-left: 0em ; + font-weight: bold ;} +a.tocchapter {display: inline-block ; margin-left: 0em ; + font-weight: bold ;} +a.tocsection {display: inline-block ; margin-left: 1em ; + text-indent: -.5em ; font-weight: bold ; } +a.tocsubsection {display: inline-block ; margin-left: 2em ; + text-indent: -.5em ; } +a.tocsubsubsection {display: inline-block ; margin-left: 3em ; + text-indent: -.5em ; } +a.tocparagraph {display: inline-block ; margin-left: 4em ; + text-indent: -.5em ; } +a.tocsubparagraph {display: inline-block ; margin-left: 5em ; + text-indent: -.5em ; } +a.tocfigure {margin-left: 0em} +a.tocsubfigure {margin-left: 2em} +a.toctable {margin-left: 0em} +a.tocsubtable {margin-left: 2em} +a.toclstlisting {margin-left: 0em} + + +body { + font-family: "DejaVu Serif", "Bitstream Vera Serif", + "Lucida Bright", Georgia, serif; + background: #FAF7F4 ; + color: black ; + margin:0em ; + padding:0em ; + font-size: 100% ; + line-height: 1.2 ; +} + +p {margin: 1.5ex 0em 1.5ex 0em ;} + +/* Holds a section number to add space between it and the name */ +span.sectionnumber { margin-right: .6em } + +/* Inserted in front of index lines */ +span.indexitem {margin-left: 0em} +span.indexsubitem {margin-left: 2em} +span.indexsubsubitem {margin-left: 4em} + +div.hidden { display: none ; } + +kbd { + font-family: "DejaVu Mono", "Bitstream Vera Mono", "Lucida Console", + "Nimbus Mono L", "Liberation Mono", "FreeMono", "Andale Mono", + "Courier New", monospace; + font-size: 100% ; +} + +span.strong { font-weight: bold; } + +span.textmd { font-weight: normal; } + +span.textsc { font-variant: small-caps; } + +span.textup { font-variant: normal; } + +span.textrm { + font-family: "DejaVu Serif", "Bitstream Vera Serif", + "Lucida Bright", Georgia, serif; +} + +span.textsf { + font-family: "DejaVu Sans", "Bitstream Vera Sans", + Geneva, Verdana, sans-serif ; +} + +span.attribution { + margin-left: 1em ; font-size: 80% ; font-variant: small-caps; +} + +span.citetitle { + margin-left: 1em ; font-size: 80% ; font-style: oblique; +} + +span.poemtitle { + font-size: 120% ; font-weight: bold; +} + +blockquote { + margin-left: 0px ; + margin-right: 0px ; +} + +blockquote p { + line-height: 1.5; + text-align: left ; + font-size: .85em ; + margin-left: 3em ; + margin-right: 3em ; +} + +blockquotation { + margin-left: 0px ; + margin-right: 0px ; +} + +blockquotation p { + line-height: 1.5; + text-align: left ; + font-size: .85em ; + margin-left: 3em ; + margin-right: 3em ; +} + +div.epigraph { + line-height: 1.2; + text-align: left ; + padding: 3ex 1em 0ex 1em ; +/* margin: 3ex auto 3ex auto ; */ /* Epigraph centered */ + margin: 3ex 1em 3ex auto ; /* Epigraph to the right */ +/* margin: 3ex 1em 3ex 1em ; */ /* Epigraph to the left */ + font-size: .85em ; + max-width: 27em ; +} + + + +div.epigraphsource{ + text-align:right ; + margin-left:auto ; +/* max-width: 50% ; */ + border-top: 1px solid #A0A0A0 ; + padding-bottom: 3ex ; + line-height: 1.2; +} + +div.epigraph p { padding: .5ex ; margin: 0ex ;} +div.epigraphsource p { padding: .5ex 0ex 0ex 0ex ; margin: 0ex ;} + + + + +html body { + margin: 0 ; + line-height: 1.2; +} + + +body div { + margin: 0ex; +} + + +h1, h2, h3, h4, h5, h6, span.paragraph, span.subparagraph +{ + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + font-style: normal ; + font-weight: bold ; + text-align: left ; +} + +h1 { /* title of the entire website, used on each page */ + text-align: center ; + font-size: 2.5em ; + padding: .4ex 0em 0ex 0em ; +} +h2 { font-size: 2.25em } +h3 { font-size: 2em } +h4 { font-size: 1.75em } +h5 { font-size: 1.5em } +h6 { font-size: 1.25em } +span.paragraph {font-size: 1em ; font-variant: normal ; + margin-right: 1em ; } +span.subparagraph {font-size: 1em ; font-variant: normal ; + margin-right: 1em ; } + + + +/* Title of the file */ +h1 { + margin: 0ex 0em 0ex 0em ; + line-height: 1.3; + text-align: center ; +} + +/* Part */ +h2 { + margin: 1ex 0em 1ex 0em ; + line-height: 1.3; + text-align: center ; +} + +/* Chapter */ +h3 { + margin: 3ex 0em 1ex 0em ; + line-height: 1.3; +} + +/* Section */ +h4 { + margin: 3ex 0em 1ex 0em ; + line-height: 1.3; +} + +/* Sub-Section */ +h5 { + margin: 3ex 0em 1ex 0em ; + line-height: 1.3; +} + +/* Sub-Sub-Section */ +h6 { + margin: 3ex 0em 1ex 0em ; + line-height: 1.3; +} + + +div.titlepage { + text-align: center ; +} + +.footnotes { + font-size: .85em ; + margin: 3ex 1em 0ex 1em ; + padding-bottom: 1ex ; +} + +.marginpar { +width:20%; float:right; +text-align:left; +margin: 1ex 0.5em 1ex 1em ; +padding: 1ex 0.5em 1ex 0.5em ; +font-size: 85% ; +border-top: 1px solid silver ; +border-bottom: 1px solid silver ; +overflow-x: auto; +} + +.marginpar br { margin-bottom: 2ex ; } + +div.marginblock { +width:50%; float:right; +text-align:left; +margin: 1ex 0.5em 1ex 1em ; +padding: 1ex 0.5em 1ex 0.5em ; +overflow-x: auto; +} + +div.marginblock div.minipage p { font-size: 85%} + +div.marginblock br { margin-bottom: 2ex ; } + + +section.textbody div.footnotes{ + margin: 3ex 0em 0ex 0em ; + border-bottom: 2px solid silver ; +} + +.footnoteheader { + border-top: 2px solid silver ; + margin-top: 3ex ; + padding-top: 1ex ; + font-weight: bold ; +} + +.mpfootnotes { + text-align: left ; + font-size: .85em ; + margin: 3ex 0em 3ex 0em ; + border-top: 1px solid silver ; + border-bottom: 1px solid silver ; +/* padding-top: 1ex ; */ +} + +/* Remove footnote top border in the title page. */ +div.titlepage div.mpfootnotes { + border-top: none ; +} + + + +ol { + margin: 1ex 1em 1ex 0em; + line-height: 1.2; +} + +ul, body dir, body menu { + margin: 1ex 1em 1ex 0em; + line-height: 1.2; +} + +li { margin: 0ex 0em 1ex 0em; } + +html { + margin: 0; + padding: 0; +} + +.programlisting { + font-family: "DejaVu Mono", "Bitstream Vera Mono", "Lucida Console", + "Nimbus Mono L", "Liberation Mono", "FreeMono", "Andale Mono", + "Courier New", monospace; + margin: 1ex 0ex 1ex 0ex ; + padding: .5ex 0pt .5ex 0pt ; + overflow-x: auto; +} + +section.textbody>pre.programlisting { +border-top: 1px solid silver ; +border-bottom: 1px solid silver ; +} + + +.inlineprogramlisting { + font-family: "DejaVu Mono", "Bitstream Vera Mono", "Lucida Console", + "Nimbus Mono L", "Liberation Mono", "FreeMono", "Andale Mono", + "Courier New", monospace; + overflow-x: auto; +} + + +div.abstract { + margin: 2em 5% 2em 5% ; + padding: 1ex 1em 1ex 1em ; +/* font-weight: bold ; */ + font-size: 90% ; +} + +div.abstract dl {line-height:1.5;} +div.abstract dt {color:#304070;} + +div.abstracttitle{ + font-family: "URW Classico", Optima, "Linux Biolinum O", + "Linux Libertine O", "Liberation Serif", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + font-weight:bold; + font-size:1.25em; + text-align: center ; +} + + +.verbatim { + overflow-x: auto ; +} + +.alltt { + overflow-x: auto ; +} + + +.bverbatim { + margin: 1ex 0pt 1ex 0pt ; + padding: .5ex 0pt .5ex 0pt ; + overflow-x: auto ; +} + +.lverbatim { + margin: 1ex 0pt 1ex 0pt ; + padding: .5ex 0pt .5ex 0pt ; + overflow-x: auto ; +} + +.fancyvrb { + font-size:.85em ; + margin: 3ex 0pt 3ex 0pt +} + +.fancyvrblabel { + font-weight:bold; + text-align: center ; +} + + +.verse { + font-family: "Linux Libertine Mono O", "Lucida Console", + "Droid Sans Mono", "DejaVu Mono", "Bitstream Vera Mono", + "Liberation Mono", "FreeMono", "Andale Mono", + "Nimbus Mono L", "Courier New", monospace; + margin-left: 1em ; +} + + +div.singlespace { line-height: 1.2 ; } +div.onehalfspace { line-height: 1.5 ; } +div.doublespace { line-height: 2 ; } + + +.theorem { + background: #e0e0e0; + padding: 1ex ; + margin: 1em ; + border: 1px solid silver ; +} + +.theoremlabel { font-weight: bold ; } + +.theoremcontents { font-style: italic; margin-left: 1em ; } + + +/* Minipage environments, vertically aligned to top, center, bottom: */ +.minipage { + /* display: inline-block ; */ + /* Mini pages which follow each other will be tiled. */ + margin: .25em .25em .25em .25em; + padding: .25em .25em .25em .25em; + display: inline-flex; + flex-direction: column ; + overflow: auto; +} + +/* Paragraphs in the flexbox did not collapse their margins. */ +/* Have not yet researched this. */ +.minipage p {margin: .75ex 0em .75ex 0em ;} + + + +.framebox { + margin: 0ex ; + padding: 0ex ; + border: 1px solid black; + border-radius: 0px ; + padding: .3ex .2em 0ex .2em ; + margin: .1ex ; + display: inline-block ; +} + + +.mdframed { +/* padding: 0ex ; */ +/* border: 1px solid blafck; */ +/* border-radius: 0px ; */ + padding: 0ex ; + margin: 3ex 5% 3ex 5% ; +/* display: inline-block ; */ +} + +.mdframed p { padding: 0ex .5em 0ex .5em ; } + +.mdframed dl { padding: 0ex .5em 0ex .5em ; } + +.mdframedtitle { + padding: .5em ; + display: block ; + font-size: 130% +} + +.mdframedsubtitle { + padding: 0ex .5em 0ex .5em ; + display: block ; + font-size: 115% ; +} + +.mdframedsubsubtitle { + padding: 0ex .5em 0ex .5em ; + display: block ; +} + +.mdtheorem { + padding: 0ex .5em 0ex .5em ; + margin: 3ex 5% 3ex 5% ; +/* display: inline-block ; */ +} + + + + +dl { + margin: 1ex 2em 1ex 0em; + line-height: 1.3; +} + +dl dt { + margin-top: 1ex; + font-weight: bold; +} + +dl dd p { margin-top: 0em; } + + +nav.toc, nav.lof, nav.lot, nav.lol { + font-family: "URW Classico", Optima, "Linux Biolinum O", + "DejaVu Sans", "Bitstream Vera Sans", + Geneva, Verdana, sans-serif ; + margin-bottom: 4ex ; +} + +nav.toc p, nav.lof p, nav.lot p, nav.lol p { + line-height: 1.2 ; + margin-top:.5ex ; + margin-bottom:.5ex; + font-size: .9em ; +} + + + +img, img.hyperimage, img.borderimage { + max-width: 600px; + border: 1px solid silver; + box-shadow: 3px 3px 3px #808080 ; + padding: .5% ; + margin: .5% ; + background: none ; +} + +img.inlineimage{ + padding: 0px ; + box-shadow: none ; + border: none ; + background: none ; + margin: 0px ; + display: inline-block ; + border-radius: 0px ; +} + +img.logoimage{ + max-width: 300px ; + box-shadow: 3px 3px 3px #808080 ; + border: 1px solid black ; + background:none ; + padding:0 ; + margin:.5ex ; + border-radius: 10px ; +} + + +.section { +/* + To have each section float relative to each other: +*/ +/* + display: block ; + float: left ; + position: relative ; + background: white ; + border: 1px solid silver ; + padding: .5em ; +*/ + margin: 0ex .5em 0ex .5em ; + padding: 0 ; +} + + +figure { + margin: 3ex auto 3ex auto ; + padding: 1ex 1em 1ex 1em ; + overflow-x: auto ; +} + + +/* To automatically center images in figures: */ +/* +figure img.inlineimage { + margin: 0ex auto 0ex auto ; + display: block ; +} +*/ + +/* To automatically center minipages in figures: */ +/* +figure div.minipage, figure div.minipage div.minipage { + margin: 1ex auto 1ex auto ; + display: block ; +} +*/ + +figure div.minipage p { font-size: 85% ; } + +figure.subfigure, figure.subtable { + display: inline-block ; margin: 3ex 1em 3ex 1em ; +} + +div.floatrow { text-align: center; } + +div.floatrow figure { display: inline-block ; margin: 1ex 2% ; } + +div.floatfoot { font-size: .85em ; + border-top: 1px solid silver ; line-height: 1.2 ; } + +figcaption , .lstlistingtitle { + font-size: .85em ; + text-align: center ; + font-weight: bold ; + margin-top: 1ex ; + margin-bottom: 1ex ; +} + +figure.subfigure figcaption, figure.subtable figcaption { + border-bottom: none ; background: none ; +} + +div.nonfloatcaption { + margin: 1ex auto 1ex auto ; + font-size: .85em ; + text-align: center ; + font-weight: bold ; +} + +/* For a \RawCaption inside a minipage inside a figure's floatrow: */ +figure div.floatrow div.minipage figcaption { + border: none ; + background: none ; +} + + +table { + margin: 1ex auto 1ex auto ; + border-collapse: collapse ; + border-spacing: 0px ; + line-height: 1.3 ; + } + +tr.hline {border-top: 1px solid silver ; margin-top: 0ex ; + margin-bottom: 0ex ; } /* for \hline */ + +tr.tbrule {border-top: 1px solid black ; margin-top: 0ex ; + margin-bottom: 0ex ; } /* for \toprule, \bottomrule */ + +td {padding: 1ex .5em 1ex .5em ;} + +table td.tdl { text-align: left ; vertical-align: middle ; } +table td.tdc { text-align: center ; vertical-align: middle ; } +table td.tdr { text-align: right ; vertical-align: middle ; } +table td.tdp { text-align: left ; vertical-align: bottom ; } +table td.tdm { text-align: left ; vertical-align: middle ; } +table td.tdb { text-align: left ; vertical-align: top ; } +table td.tdP { text-align: center ; vertical-align: bottom ; } +table td.tdM { text-align: center ; vertical-align: middle ; } +table td.tdB { text-align: center ; vertical-align: top ; } +table td.tdlrule { text-align: left ; border-top: 1px solid silver ; + vertical-align: middle ; } /* for cmidrule */ +table td.tdcrule { text-align: center ; border-top: 1px solid silver ; + vertical-align: middle ; } +table td.tdrrule { text-align: right ; border-top: 1px solid silver ; + vertical-align: middle ; } +table td.tdprule { text-align: left ; border-top: 1px solid silver ; + vertical-align: bottom ; } +table td.tdmrule { text-align: left ; border-top: 1px solid silver ; + vertical-align: middle ; } +table td.tdbrule { text-align: left ; border-top: 1px solid silver ; + vertical-align: top ; } +table td.tdPrule { text-align: center ; border-top: 1px solid silver ; + vertical-align: bottom ; } +table td.tdMrule { text-align: center ; border-top: 1px solid silver ; + vertical-align: middle ; } +table td.tdBrule { text-align: center ; border-top: 1px solid silver ; + vertical-align: top ; } + +/* Margins of paragraphs inside table cells: */ +td.tdp p , td.tdprule p , td.tdP p , td.tdPrule p { padding-top: 1ex ; + padding-bottom: 1ex ; margin: 0ex ; } +td.tdm p , td.tmbrule p , td.tdM p , td.tdMrule p { padding-top: 1ex ; + padding-bottom: 1ex ; margin: 0ex ; } +td.tdb p , td.tdbrule p , td.tdB p , td.tdBrule p { padding-top: 1ex ; + padding-bottom: 1ex ; margin: 0ex ; } + +td.tdp , td.tdprule , td.tdP , td.tdPrule + { padding: 0ex .5em 0ex .5em ; } +td.tdm , td.tdmrule , td.tdM , td.tdMrule + { padding: 0ex .5em 0ex .5em ; } +td.tdb , td.tdbrule , td.tdB , td.tdBrule + { padding: 0ex .5em 0ex .5em ; } + + +/* table notes: */ +.tnotes { + margin: 0ex 5% 1ex 5% ; + padding: 0.5ex 1em 0.5ex 1em; + font-size:.85em; + text-align: left ; +} + +.tnotes dl dt p {margin-bottom:0px;} + +.tnoteitemheader {margin-right: 1em;} + + + +/* center, flushleft, flushright environments */ +div.center{text-align:center;} +div.center table {margin-left:auto;margin-right:auto;} +div.flushleft{text-align:left;} +div.flushleft table {margin-left:0em ; margin-right:auto;} +div.flushright{text-align:right;} +div.flushright table {margin-left:auto ; margin-right: 0em ;} + + + + +/* program listing callouts: */ +span.callout { + font-family: "DejaVu Sans", "Bitstream Vera Sans", + Geneva, Verdana, sans-serif ; + border-radius: .5em; + background-color:black; + color:white; + padding:0px .25em 0px .25em; + margin: 0 ; + font-weight: bold; + font-size:.72em ; +} + +div.programlisting pre.verbatim span.callout{ + font-size: .85em ; +} + + + + + +div.published +{ + text-align: center ; + font-variant: normal ; + font-style: italic ; + font-size: 1em ; + margin: 3ex 0em 3ex 0em ; +} + +div.subtitle +{ + text-align: center ; + font-variant: normal ; + font-style: italic ; + font-size: 1.25em ; + margin: 3ex 0em 3ex 0em ; +} + +div.subtitle p { margin: 1ex ; } + +div.author +{ + font-variant: normal ; + font-style: normal ; + font-size: 1em ; + margin: 3ex 0em 3ex 0em ; +} + +div.author table { + margin: 3ex auto 0ex auto ; + background: none ; +} + +div.author table tbody tr td { padding: .25ex ; } + +span.affiliation {font-size: .85em ; font-variant: small-caps; } + +div.titledate { + text-align: center ; + font-size: .85em ; + font-style: italic; + margin: 6ex 0em 6ex 0em ; +} + + +nav.topnavigation{ + text-align: left ; + padding: 0.5ex 1em 0.5ex 1em ; +/* margin: 2ex 0em 3ex 0em ; */ + margin: 0 ; + border-bottom: 1px solid silver ; + border-top: 1px solid silver ; + clear:right ; +} + +nav.botnavigation{ + text-align: left ; + padding: 0.5ex 1em 0.5ex 1em ; +/* margin: 3ex 0em 2ex 0em ; */ + margin: 0 ; + border-top: 1px solid silver ; + border-bottom: 1px solid silver ; + clear:right ; +} + + +header{ + line-height: 1.2 ; + font-size: 1em ; +/* border-bottom: 2px solid silver ; */ + margin: 0px ; + padding: 0ex 1em 0ex 1em ; + text-align:center ; +} + +header p {margin:0ex;padding:4ex 0em 2ex 0em ;text-align:center;} + + +footer{ + font-size: .85em ; + line-height: 1.2 ; + margin-top: 1ex ; + border-top: 2px solid silver ; + padding: 2ex 1em 2ex 1em ; + clear:right ; + text-align:left ; +} + + +a.linkhome { font-weight:bold ; font-size: 1em ;} + + +div.lateximagesource { padding: 0px ; margin: 0px ; display: none; } + +img.lateximage{ + padding: 0px 0px 0px 0px ; + box-shadow: none ; + border: none ; + background: none ; + margin: 0px 0px -.15ex 0px ; + /* pdfcrop leaves a slight margin, adjust to baseline */ + max-width: 100% ; + border-radius: 0ex ; + border: none ; +} + + + +nav.sidetoc { + font-family: "DejaVu Serif", "Bitstream Vera Serif", + "Lucida Bright", Georgia, serif; + float:right ; + width: 20%; + border-left: 1px solid silver; + border-top: 1px solid silver; + border-bottom: 1px solid silver; +/* border-top: 2px solid #808080 ; */ + background: #FAF7F4 ; + padding: 2ex 0em 2ex 1em ; + margin: 0ex 0em 2ex 1em ; + font-size:.9em ; + border-radius: 20px 0px 0px 20px ; + } + +div.sidetoccontents { +/* border-top: 1px solid silver ; */ + overflow-y: auto ; + width: 100% ; + text-align: left ; +} + +nav.sidetoc p {line-height:1.2 ; margin: 1ex .5em 1ex .5em ; + text-indent: 0 ; } +nav.sidetoc p a {color:black ; font-size: .7em ;} +div.sidetoctitle {font-size: 1.2em; font-weight:bold; text-align:center; + border-bottom: 1px solid silver ; } +nav.sidetoc a:hover {text-decoration: underline ; } + + + +section.textbody { margin: 0ex 1em 0ex 1em ;} + + +div.multicolsheading { -webkit-column-span: all; + -moz-column-span: all; column-span: all; } +div.multicols { -webkit-columns: 3 380px ; + -moz-columns: 3 380px ; columns: 3 380px ; } +div.multicols p {margin-top: 0ex} + +/* Used to support algorithmicx: */ +span.floatright { float: right ; } + + + +/* +For CSS LaTeX and related logos: +Based on: +http://edward.oconnor.cx/2007/08/tex-poshlet +http://nitens.org/taraborelli/texlogo +*/ + +.latexlogofont { + font-family: "Linux Libertine O", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + font-variant: normal ; +} + +.latexlogo { + font-family: "Linux Libertine O", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + letter-spacing: .03em ; + font-size: 1.1em; +} + +.latexlogo sup { + text-transform: uppercase; + letter-spacing: .03em ; + font-size: 0.85em; + vertical-align: 0.15em; + margin-left: -0.36em; + margin-right: -0.15em; +} + +.latexlogo sub { + text-transform: uppercase; + vertical-align: -0.5ex; + margin-left: -0.1667em; + margin-right: -0.125em; + font-size: 1em; +} + +.xetexlogo { + font-family: "Linux Libertine O", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + letter-spacing: .03em ; + font-size: 1.1em; +} + +/* A smaller gap between Xe and Tex v.s. LaTeX: */ +.xetexlogo sub { + text-transform: uppercase; + vertical-align: -0.5ex; + margin-left: -0.0667em; + margin-right: -0.2em; + font-size: 1em; + letter-spacing: .03em ; +} + +/* A large gap between Xe and LaTeX v.s. TeX: */ +.xelatexlogo sub { + text-transform: uppercase; + vertical-align: -0.5ex; + margin-left: -0.0667em; + margin-right: -.05em; + font-size: 1em; + letter-spacing: .03em ; +} + +.amslogo { + font-family: "TeXGyreChorus","URW Chancery L", + "Apple Chancery","ITC Zapf Chancery","Monotype Corsiva", + "Linux Libertine O", "Nimbus Roman No 9 L", "FreeSerif", + "Hoefler Text", Times, "Times New Roman", serif; + font-style: italic; +} + +.lyxlogo { + font-family: "URW Classico", Optima, "Linux Biolinum O", + "DejaVu Sans", "Bitstream Vera Sans", Geneva, + Verdana, sans-serif ; +} + + + + +/* Only display top and bottom navigation if a small screen: */ +/* Hide the sidetoc if a small screen: */ +nav.topnavigation { display:none; } +nav.botnavigation { display:none; } + +@media screen and (max-width: 45em) { +/* nav.sidetoc {display:none;} */ + nav.sidetoc { + float: none ; + width: 100% ; + margin: 5ex 0px 5ex 0px ; + padding: 0 ; + border-radius: 0 ; + border-bottom: 1px solid black ; + border-top: 1px solid black ; + box-shadow: none ; + } +/* nav.topnavigation { display:block } */ + nav.botnavigation { display:block } +} + +@media print { + body { + font-family: "Linux Libertine O", + "DejaVu Serif", "Bitstream Vera Serif", + "Liberation Serif", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + } + nav.sidetoc { display:none; } + nav.topnavigation { display: none; } + nav.botnavigation { display: none; } +} + +@media handheld { + nav.sidetoc { display:none; } + nav.topnavigation { display:block } + nav.botnavigation { display:block } +} + +@media projection { + nav.sidetoc { display:none; } + nav.topnavigation { display:block } + nav.botnavigation { display:block } +} +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + + + + +% \subsection{lwarp\_sagebrush.css} + +% \DescribeFile{lwarp_sagebrush.css} +% An optional \acro{css} which may be used for +% a semi-modern appearance. +% +% If used, this must be present both when compiling the project +% and also when distributing the \acro{HTML} files. +% +% \begin{macrocode} +\begin{VerbatimOut}{lwarp_sagebrush.css} +@import url("lwarp.css") ; + + +A:link {color:#105030 ; text-decoration: none ; } +A:visited {color:#705030 ; text-shadow:1px 1px 2px #a0a0a0;} +A:hover {color:#006000 ; text-decoration: underline ; text-shadow:0px 0px 2px #a0a0a0;} +A:active {color:#00C000 ; text-shadow:1px 1px 2px #a0a0a0;} + + + +h1, h2, h3, h4, h5, h6, span.paragraph, span.subparagraph +{ + font-family: "URW Classico", Optima, "Linux Biolinum O", + "Linux Libertine O", "Liberation Serif", + "Nimbus Roman No 9 L", "FreeSerif", + "Hoefler Text", Times, "Times New Roman", serif; + font-variant: small-caps ; + font-weight: normal ; + color: #304070 ; + text-shadow: 2px 2px 3px #808080; +} + +h1 { /* title of the entire website, used on each page */ + font-variant: small-caps ; + color: #304070 ; + text-shadow: 2px 2px 3px #808080; + background-color: #F7F7F0 ; + background-image: linear-gradient(to bottom, #F7F7F0, #C0C0C4); +} + +h1 { + border-bottom: 1px solid #304070; + border-top: 2px solid #304070; +} + +h2 { + border-bottom: 1px solid #304070; + border-top: 2px solid #304070; + background-color: #F7F7F0 ; + background-image: linear-gradient(to bottom, #F7F7F0, #DAD0C0); +} + + + +div.abstract { + background: #f5f5eb ; + background-image: linear-gradient(to bottom, #f5f5eb, #C8C8B8); + + border: 1px solid silver; + border-radius: 1em ; +} + +div.abstract dl {line-height:1.5;} +div.abstract dt {color:#304070;} + +div.abstracttitle{ + font-family: "URW Classico", Optima, "Linux Biolinum O", + "Linux Libertine O", "Liberation Serif", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + font-weight:bold; + font-variant: small-caps ; + font-size:1.5em; + border-bottom: 1px solid silver ; + color: #304070 ; + text-align: center ; + text-shadow: 1px 1px 2px #808080; +} + + +div.epigraph { + background: #f5f5eb ; + background-image: linear-gradient(to bottom, #f5f5eb, #C8C8B8); + + border: 1px solid silver ; + border-radius: 1ex ; + box-shadow: 3px 3px 3px #808080 ; +} + + +.example { + background-color: #f5f5eb ; + background-image: linear-gradient(to bottom, #f5f5eb, #C8C8B8); + +} + +div.exampletitle{ + font-family: "URW Classico", Optima, "Linux Biolinum O", + "Linux Libertine O", "Liberation Serif", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + font-weight:bold; + font-variant: small-caps ; + border-bottom: 1px solid silver ; + color: #304070 ; + text-align: center ; + text-shadow: 1px 1px 2px #808080; +} + + +.sidebar { + background-color: #f5f5eb ; + background-image: linear-gradient(to bottom, #f5f5eb, #C8C8B8); + +} + +div.sidebartitle{ + font-family: "URW Classico", Optima, "Linux Biolinum O", + "Linux Libertine O", "Liberation Serif", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + font-weight:bold; + font-variant: small-caps ; + border-bottom: 1px solid silver ; + color: #304070 ; + text-align: center ; + text-shadow: 1px 1px 2px #808080; +} + + +.fancyvrblabel { + font-family: "URW Classico", Optima, "Linux Biolinum O", + "Linux Libertine O", "Liberation Serif", "Nimbus Roman No 9 L", + "FreeSerif", "Hoefler Text", Times, "Times New Roman", serif; + font-weight:bold; + font-variant: small-caps ; + font-size: 1.5em ; + color: #304070 ; + text-align: center ; + text-shadow: 1px 1px 2px #808080; +} + + + +.minipage { + background-color: #eeeee7 ; + border: 1px solid silver ; + border-radius: 1ex ; +} + +figure.figure .minipage { border: none; } + +div.marginblock div.minipage { border: none; } + +figure , div.marginblock { + background-color: #eeeee7 ; + border: 1px solid silver ; + border-radius: 1ex ; + box-shadow: 3px 3px 3px #808080 ; +} + +figure figure { + border: 1px solid silver ; + margin: 0em ; + box-shadow: none ; +} + +/* +figcaption { + border-top: 1px solid silver ; + border-bottom: 1px solid silver ; + background-color: #e8e8e8 ; +} +*/ + + +div.table { + box-shadow: 3px 3px 3px #808080 ; +} + +/* +.tnotes { + background: #e8e8e8; + border: 1px solid silver; +} +*/ + + +nav.topnavigation{ + background-color: #b0b8b0 ; + background-image: linear-gradient(to bottom,#e0e0e0,#b0b8b0) ; +} + +nav.botnavigation{ + background-color: #b0b8b0 ; + background-image: linear-gradient(to top,#e0e0e0,#b0b8b0) ; +} + + + +header{ + background-color: #F7F7F0 ; + background-image: linear-gradient(to top, #F7F7F0, #b0b8b0); +} + +footer{ + background-color: #F7F7F0 ; + background-image: linear-gradient(to bottom, #F7F7F0, #b0b8b0); +} + + + +nav.sidetoc { + background-color: #F7F7F0 ; + background-image: linear-gradient(to bottom, #F7F7F0, #C0C0C0); + box-shadow: 3px 3px 3px #808080 ; + border-radius: 0px 0px 0px 20px ; + } + +div.sidetoctitle {color: #304070 ; } +nav.sidetoc a:hover {color:#006000 ; text-decoration: none ; text-shadow:0px 0px 2px #a0a0a0;} + + +@media screen and (max-width: 45em) { + nav.sidetoc { border-radius: 0 ; } +} + + +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + + + + +% \subsection{lwarp\_formal.css} + +% \DescribeFile{lwarp_formal.css} +% An optional \acro{css} which may be used for +% a more formal appearance. +% +% If used, this must be present both when compiling the project +% and also when distributing the \acro{HTML} files. +% +% \begin{macrocode} +\begin{VerbatimOut}{lwarp_formal.css} +@import url("lwarp.css") ; + + + +A:link {color:#802020 ; text-decoration:none; } +A:visited {color:#802020 ; text-shadow:none ;} +A:hover {color:#400000 ; text-shadow:none ;} +A:active {color:#C00000 ; text-shadow:none ;} + + +body { + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + background: #fffcf5; +} + +span.textrm { + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; +} + +span.textsf { + font-family: "DejaVu Sans", "Bitstream Vera Sans", + Geneva, Verdana, sans-serif ; +} + + + +h1, h2, h3, h4, h5, h6, span.paragraph, span.subparagraph +{ + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + color: #800000 ; + text-shadow: none ; +} + +h1, h2 { + background-color: #fffcf5 ; + background-image: none ; + border-bottom: 1px solid #808080; + border-top: 2px solid #808080; +} + +div.abstracttitle { + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + color: black ; + text-shadow: none ; +} + +div.abstract { font-size: 100% } + +.sidebar { + background: #fffcf5; + background-image: none ; + margin: 2em 5% 2em 5%; + padding: 0.5em 1em; + border: none ; + border-top : 1px solid silver; + border-bottom : 1px solid silver; + font-size: 90% ; +} + +div.sidebartitle{ + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + color: #800000 ; + text-shadow: none ; + border: none ; +} + +.example { + background: #fffcf5; + background-image: none ; + margin: 2em 5% 2em 5%; + padding: 0.5em 1em; + border: none ; + border-top : 1px solid silver; + border-bottom : 1px solid silver; +} + +div.exampletitle{ + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + color: #800000 ; + text-shadow: none ; + border: none ; +} + +div.fancyvrblabel{ + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + color: #800000 ; + text-shadow: none ; + border: none ; +} + + + +.verse { + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; +} + + +figure { + margin: 3ex 5% 3ex 5% ; + padding: 1ex 1em 1ex 1em ; + background-color: #fffcf5 ; + overflow-x: auto ; + border: none ; +/* border-top: 1px solid silver; */ +/* border-bottom: 1px solid silver; */ +} + + +figcaption , .lstlisting { + border: none ; +/* border-top: 1px solid silver ; */ +/* border-bottom: 1px solid silver ; */ + background-color: #fffcf5 ; +} + +.tnotes { + background: #fffcf5 ; +} + +.theorem { + background: none ; +} + +.minipage { + background-color: #fffcf5 ; + border: none ; + margin: 1em ; +} + +div.floatrow figure { border: none ; } + +figure figure { border: none ; } + + +nav.toc, nav.lof, nav.lot, nav.lol { + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; +} + +nav.sidetoc { + font-family: "Linux Libertine O", "Hoefler Text", "Garamond", + "Bembo", "Janson", "TeX Gyre Pagella", "Palatino", + "Liberation Serif", "Nimbus Roman No 9 L", "FreeSerif", Times, + "Times New Roman", serif; + background-image: linear-gradient(to bottom, #fffcf5, #C0C0C0); + border-radius: 0px 0px 0px 20px ; +} + +div.sidetoctitle{ + color: #800000 ; +} + +header{ + background-color: #e0e0e0 ; + background-image: linear-gradient(to top, #fffcf5, #b0b0b0); + text-align:center ; +} + +footer{ + background-color: #e0e0e0 ; + background-image: linear-gradient(to bottom, #fffcf5, #b0b0b0); + padding: 2ex 1em 2ex 1em ; + clear:right ; + text-align:left ; +} + +nav.botnavigation { + background: #dedcd5 ; + border-top: 1px solid black ; +} +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + + + +% \subsection{sample\_project.css} + +% \DescribeFile{sample_project.css} +% The project-specific \acro{css} file. Use with \cs{NewCSS}. +% +% If used, this must be present both when compiling the project +% and also when distributing the \acro{HTML} files. +% +% \begin{macrocode} +\begin{VerbatimOut}{sample_project.css} +/* ( --- Start of project.css --- ) */ +/* A sample project-specific CSS file for lwarp --- ) */ + +/* Load default lwarp settings: */ +@import url("lwarp.css") ; +/* or lwarp_formal.css, lwarp_sagebrush.css */ + +/* Project-specific CSS setting follow here. */ +/* . . . */ + +/* ( --- End of project.css --- ) */ +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + + + +% \subsection{lwarp\_html.xdy} + +% \DescribeFile{lwarp_html.xdy} +% Used to modify the index for \pkg{lwarp}. +% +% This must be present when compiling the project, +% but does not need to be present when distributing +% the resulting \acro{HTML} files. +% +% \begin{macrocode} +\begin{VerbatimOut}{lwarp_html.xdy} +(require "tex/inputenc/latin.xdy") +(merge-rule "\\PS *" "Postscript") +(require "texindy.xdy") +(require "page-ranges.xdy") +(require "book-order.xdy") +(markup-locref :open "\hyperindexref{" :close "}") +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + + + +% \subsection{lwarp\_mathjax.txt} + +% \DescribeFile{lwarp_mathjax.txt} +% Used by \pkg{lwarp} when using MathJax. +% +% This must be present when compiling the project, +% but does not need to be present when distributing +% the resulting \acro{HTML} files. + +% \begin{macrocode} +\begin{VerbatimOut}{lwarp_mathjax.txt} +<!-- https://groups.google.com/forum/#!topic/ + mathjax-users/jUtewUcE2bY --> +<script type="text/x-mathjax-config"> +MathJax.Hub.Register.StartupHook("TeX AMSmath Ready",function () { + var seteqsectionDefault = {name: "", num: 0}; + var seteqsections = {}, seteqsection = seteqsectionDefault; + var TEX = MathJax.InputJax.TeX, PARSE = TEX.Parse; + var AMS = MathJax.Extension["TeX/AMSmath"]; + TEX.Definitions.Add({ + macros: { + seteqsection: "mySection", + seteqnumber: "mySetEqNumber" + } + }); + + PARSE.Augment({ + mySection: function (name) { + seteqsection.num = AMS.number; + var n = this.GetArgument(name); + if (n === "") { + seteqsection = seteqsectionDefault; + } else { + if (!seteqsections["_"+n]) + seteqsections["_"+n] = {name:n, num:0}; + seteqsection = seteqsections["_"+n]; + } + AMS.number = seteqsection.num; + }, + mySetEqNumber: function (name) { + var n = this.GetArgument(name); + if (!n || !n.match(/^ *[0-9]+ *$/)) + n = ""; else n = parseInt(n)-1; + <!-- $ syntax highlighting --> + if (n === "" || n < 1) + TEX.Error + ("Argument to "+name+" should be a positive integer"); + AMS.number = n; + } + }); + MathJax.Hub.Config({ + TeX: { + equationNumbers: { + formatTag: function (n) + {return "("+(seteqsection.name+"."+n).replace(/^\./,"")+")"}, + formatID: function (n) { + n = (seteqsection.name+'.'+n).replace + (/[:"'<>&]/g,"").replace(/^\./,""); + return 'mjx-eqn-' + n; + } + } + } + }); +}); +</script> + +<!-- http://docs.mathjax.org/en/latest/options/ThirdParty.html --> +<script type="text/x-mathjax-config"> + MathJax.Ajax.config.path["Contrib"] = + "https://cdn.mathjax.org/mathjax/contrib"; +</script> + +<!-- https://github.com/mathjax/MathJax-third-party-extensions/ + tree/master/siunitx --> +<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ["tex2jax.js","[Contrib]/siunitx/siunitx.js"], + jax: ["input/TeX","output/HTML-CSS"], + tex2jax: {inlineMath: [["$","$"],["\\(","\\)"]]}, + TeX: {extensions: ["AMSmath.js","AMSsymbols.js", "sinuitx.js"]} + }); + </script> + +<script type="text/x-mathjax-config"> +MathJax.Hub.Config({ + TeX: { + equationNumbers: { + autoNumber: "AMS" + } + } +}); +</script> + +<script + src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML-full"> +</script> +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + + + +% \subsection{Lwarpmk option} + +% The following is only generated if the |lwarpmk| option +% was given to \pkg{lwarp-newproject}. +% \begin{macrocode} +\begin{LWR@createlwarpmk} +% \end{macrocode} + +% \DescribeFile{lwarpmk} Creates a local copy of |lwarpmk|: +% +% \begin{macrocode} +\begin{VerbatimOut}{lwarpmk.lua} +#!/usr/bin/env texlua + +-- Copyright 2016 Brian Dunn + +-- Print the usage of the lwarpmk command: + +printversion = "v0.20" + +function printhelp () +print ("lwarpmk: Use lwarpmk -h or lwarpmk --help for help.") ; +end + +function printusage () +print ( [[ + +lwarpmk print [project]: Compile a print version. +lwarpmk printindex [project]: Process the index for the print version. +lwarpmk html [project]: Compile an HTML version. +lwarpmk htmlindex [project]: Process the index for the html version. +lwarpmk again [project]: Touch the source code to trigger recompiles. +lwarpmk limages [project]: Process the "lateximages" created by lwarp.sty. +lwarpmk pdftohtml [project]: + For use with latexmk or a Makefile: + Convert project_html.pdf to project_html.html and + individual HTML files. +lwarpmk clean [project]: Remove project.aux, .toc, .lof, .lot, .idx, .ind, .log +lwarpmk cleanall [project]: Remove auxiliary files and also project.pdf, *.html +lwarpmk -h: Print this help message. +lwarpmk --help: Print this help message. + +]] ) +printconf () +end + +-- Print the format of the configuration file lwarpmk.conf: + +function printconf () +print ( [[ +An example lwarpmk.conf or <project>.lwarpmkconf project file: +-- +opsystem = "Unix" (or "Windows") +latexname = "pdflatex" (or "lualatex", or "xelatex") +sourcename = "projectname" (the source-code filename w/o .tex) +homehtmlfilename = "index" (or perhaps the project name) +htmlfilename = "" (or "projectname" - filename prefix) +uselatexmk = "false" (or "true" to use latexmk to build PDFs) +-- +Filenames must contain only letters, numbers, underscore, or dash. +Values must be in "quotes". + +]] ) ; +end + +-- Split one large sourcefile into a number of files, +-- starting with destfile. +-- The file is split at each occurance of <!--|Start file|newfilename|* + +function splitfile (destfile,sourcefile) +print ("lwarpmk: Splitting " .. sourcefile .. " into " .. destfile) ; +io.input(sourcefile) +io.output(destfile) +for line in io.lines() do +i,j,copen,cstart,newfilename = string.find (line,"(.*)|(.*)|(.*)|") ; +if ( (i~= nil) and (copen == "<!--") and (cstart == "Start file")) then -- split the file +io.output(newfilename) ; +else -- not a splitpoint +io.write (line .. "\n") ; +end +end -- do +end -- function + +-- Incorrect value, so print an error and exit. + +function cvalueerror ( line, linenum , cvalue ) + print ( linenum .. " : " .. line ) ; + print ("lwarpmk: incorrect variable value \"" .. cvalue .. "\" in lwarpmk.conf.\n" ) ; + printconf () ; + os.exit(1) ; +end + +-- Load settings from the project's "lwarpmk.conf" file: + +function loadconf () +-- Default configuration filename: +local conffile = "lwarpmk.conf" +-- Optional configuration filename: +if arg[2] ~= nil then conffile = arg[2]..".lwarpmkconf" end +-- Verify the file exists: +if (lfs.attributes(conffile,"mode")==nil) then -- file not exists +print("lwarpmk: " .. conffile .." does not exist.") +print("lwarpmk: " .. arg[2] .. " does not appear to be a project name.\n") +printhelp () ; +os.exit(1) -- exit the entire lwarpmk script +else -- file exists +-- Read the file: +print ("lwarpmk: Reading " .. conffile ..".") +io.input(conffile) ; +-- Scan each line: +local linenum = 0 +for line in io.lines() do -- scan lines +linenum = linenum + 1 +i,j,cvarname,cvalue = string.find (line,"([%w-_]*)%s*=%s*\"([%w-_]*)\"") ; +-- Error if incorrect enclosing characters: +if ( i == nil ) then +print ( linenum .. " : " .. line ) ; +print ( "lwarpmk: Incorrect entry in " .. conffile ..".\n" ) ; +printconf () ; +os.exit(1) ; +end +if ( cvarname == "opsystem" ) then + -- Verify choice of opsystem: + if ( (cvalue == "Unix") or (cvalue == "Windows") ) then + opsystem = cvalue + else + cvalueerror ( line, linenum , cvalue ) + end +elseif ( cvarname == "latexname" ) then + -- Verify choice of LaTeX compiler: + if ( + (cvalue == "pdflatex") or + (cvalue == "xelatex") or + (cvalue == "lualatex") + ) then + latexname = cvalue + else + cvalueerror ( line, linenum , cvalue ) + end +elseif ( cvarname == "sourcename" ) then sourcename = cvalue +elseif ( cvarname == "homehtmlfilename" ) then homehtmlfilename = cvalue +elseif ( cvarname == "htmlfilename" ) then htmlfilename = cvalue +elseif ( cvarname == "uselatexmk" ) then uselatexmk = cvalue +else +print ( linenum .. " : " .. line ) ; +print ("lwarpmk: Incorrect variable name \"" .. cvarname .. "\" in " .. conffile ..".\n" ) ; +printconf () ; +os.exit(1) ; +end +end -- do scan lines +end -- file exists +-- Select some operating-system commands: +if opsystem=="Unix" then -- For Unix / Linux / Mac OS: +rmname = "rm" +touchname = "touch" +chmodcmd = "chmod u+x lateximages.sh" +lateximagesname = "./lateximages.sh" +elseif opsystem=="Windows" then -- For Windows +rmname = "DEL" +touchname = "TOUCH" +chmodcmd = "" +lateximagesname = "lateximages.cmd" +else print ( "lwarpmk: Select Unix or Windows for opsystem" ) +end --- for Windows +end -- loadconf + +-- Scan the LaTeX log file for the phrase "Rerun to get", +-- indicating that the file should be compiled again. +-- Return true if found. + +function reruntoget (filesource) +io.input(filesource) +for line in io.lines() do +if ( string.find(line,"Rerun to get") ~= nil ) then return true end +end +return false +end + +-- Compile one time, return true if should compile again. +-- fsuffix is "" for print, "_html" for HTML output. + +function onetime (fsuffix) +print("lwarpmk: Compiling with " .. latexname .. " " .. sourcename..fsuffix) +err = os.execute( +-- "echo " .. + latexname .. " " .. sourcename..fsuffix ) +if ( err ~= 0 ) then print ( "lwarpmk: Compile error.") ; os.exit(1) ; end +return (reruntoget(sourcename .. fsuffix .. ".log") ) ; +end + +-- Compile up to five times. +-- fsuffix is "" for print, "_html" for HTML output + +function manytimes (fsuffix) +if onetime(fsuffix) == true then +if onetime(fsuffix) == true then +if onetime(fsuffix) == true then +if onetime(fsuffix) == true then +if onetime(fsuffix) == true then +end end end end end +end + +-- Exit if the given file does not exist. + +function verifyfileexists (filename) +if (lfs.attributes ( filename , "modification" ) == nil ) then +print ( "lwarpmk: " .. filename .. " not found." ) ; +os.exit (1) ; +end +end + +-- Convert <project>_html.pdf into HTML files: + +function pdftohtml () + -- Convert to text: + print ("lwarpmk: Converting " .. sourcename .."_html.pdf to " .. sourcename .. "_html.html") + os.execute("pdftotext -enc UTF-8 -nopgbrk -layout " .. sourcename .. "_html.pdf " .. sourcename .. "_html.html") + -- Split the result into individual HTML files: + splitfile (homehtmlfilename .. ".html" , sourcename .. "_html.html") +end + +-- Remove auxiliary files: + +function removeaux () + os.execute ( rmname .. " " .. + sourcename ..".aux " .. sourcename .. "_html.aux " .. + sourcename ..".toc " .. sourcename .. "_html.toc " .. + sourcename ..".lof " .. sourcename .. "_html.lof " .. + sourcename ..".lot " .. sourcename .. "_html.lot " .. + sourcename ..".idx " .. sourcename .. "_html.idx " .. + sourcename ..".ind " .. sourcename .. "_html.ind " .. + sourcename ..".log " .. sourcename .. "_html.log " + ) +end + +-- lwarpmk --version : + +if (arg[1] == "--version") then +print ( "lwarpmk: " .. printversion ) + +else -- not -- version + +-- print intro: + +print ("lwarpmk: " .. printversion .. " Automated make for the LaTeX lwarp package.") + +-- lwarpmk print: + +if arg[1] == "print" then +loadconf () +if ( uselatexmk == "true" ) then + os.execute ( "latexmk -pdf -dvi- -ps- -pdflatex=\"" .. latexname .." %O %S\" " .. sourcename ..".tex" ) ; + print ("lwarpmk: Done.") +else -- not latexmk + verifyfileexists (sourcename .. ".tex") ; + -- See if up to date: + if ( + ( lfs.attributes ( sourcename .. ".pdf" , "modification" ) == nil ) or + ( + lfs.attributes ( sourcename .. ".tex" , "modification" ) > + lfs.attributes ( sourcename .. ".pdf" , "modification" ) + ) + ) then + -- Recompile if not yet up to date: + manytimes("") + print ("lwarpmk: Done.") ; + else + print ("lwarpmk: " .. sourcename .. ".pdf is up to date.") ; + end +end -- not latexmk + +-- lwarp printindex: +-- Compile the index then touch the source +-- to trigger a recompile of the document: + +elseif arg[1] == "printindex" then +loadconf () +print ("lwarpmk: Processing the index.") +os.execute("texindy -M lwarp_html.xdy " .. sourcename .. ".idx") +print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.") +os.execute(touchname .. " " .. sourcename .. ".tex") +print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.") +print ("lwarpmk: Done.") + +-- lwarpmk html: + +elseif arg[1] == "html" then +loadconf () +if ( uselatexmk == "true" ) then + -- The recorder option is required to detect changes in <project>.tex + -- while we are loading <project>_html.tex. + err=os.execute ( "latexmk -pdf -dvi- -ps- -recorder " + .. "-e '$makeindex = q/texindy -M lwarp_html.xdy/' " + .. "-pdflatex=\"" .. latexname .." %O %S\" " + .. sourcename .."_html.tex" ) ; + if ( err ~= 0 ) then print ( "lwarpmk: Compile error.") ; os.exit(1) ; end + pdftohtml () + print ("lwarpmk: Done.") +else -- not latexmk + verifyfileexists ( sourcename .. ".tex" ) ; + -- See if exists and is up to date: + if ( + ( lfs.attributes ( homehtmlfilename .. ".html" , "modification" ) == nil ) or + ( + lfs.attributes ( sourcename .. ".tex" , "modification" ) > + lfs.attributes ( homehtmlfilename .. ".html" , "modification" ) + ) + ) then + -- Recompile if not yet up to date: + manytimes("_html") + pdftohtml () + print ("lwarpmk: Done.") + else + print ("lwarpmk: " .. homehtmlfilename .. ".html is up to date.") + end +end -- not latexmk + +elseif arg[1] == "pdftohtml" then + loadconf () + pdftohtml () + +-- lwarpmk htmlindex: +-- Compile the index then touch the source +-- to trigger a recompile of the document: + +elseif arg[1] == "htmlindex" then +loadconf () +print ("lwarpmk: Processing the index.") +os.execute("texindy -M lwarp_html.xdy " .. sourcename .. "_html.idx") +print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.") +os.execute(touchname .. " " .. sourcename .. ".tex") +print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.") +print ("lwarpmk: Done.") + +-- lwarpmk limages: +-- Make the lateximages command file executable, +-- execute it to create the images, +-- then touch the source to trigger a recompile. + +elseif arg[1] == "limages" then +loadconf () +print ("lwarpmk: Processing images.") +os.execute(chmodcmd) +os.execute(lateximagesname) +print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.") +os.execute(touchname .. " " .. sourcename .. ".tex") ; +print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.") +print ("lwarpmk: Done.") + +-- lwarpmk again: +-- Touch the source to trigger a recompile. + +elseif arg[1] == "again" then +loadconf () +print ("lwarpmk: Forcing an update of " .. sourcename ..".tex.") +os.execute(touchname .. " " .. sourcename .. ".tex") ; +print ("lwarpmk: " .. sourcename ..".tex is ready to be recompiled.") +print ("lwarpmk: Done.") + +-- lwarpmk clean: +-- Remove project.aux, .toc, .lof, .lot, .idx, .ind, .log + +elseif arg[1] == "clean" then +loadconf () +removeaux () +print ("lwarpmk: Done.") + +-- lwarpmk cleanall +-- Remove project.aux, .toc, .lof, .lot, .idx, .ind, .log +-- and also project.pdf, *.html + +elseif arg[1] == "cleanall" then +loadconf () +removeaux () +os.execute ( rmname .. " " .. + sourcename .. ".pdf " .. sourcename .. "_html.pdf " .. + "*.html" + ) +print ("lwarpmk: Done.") + +-- lwarpmk with no argument : + +elseif (arg[1] == nil) then +printhelp () + +-- lwarpmk -h or lwarpmk --help : + +elseif (arg[1] == "-h" ) or (arg[1] == "--help") then +printusage () + +else +print ("lwarpmk: Unknown command \""..arg[1].."\".\n") +printhelp () +end + +end -- not --version +\end{VerbatimOut} +% \end{Verbatim}% for syntax highlighting +% \end{macrocode} + +% \begin{macrocode} +\end{LWR@createlwarpmk} +% \end{macrocode} + + +% \iffalse +%</lwarp-newproject> +% \fi + + + + + +% \changes{v0.20}{2016/12/12}{Code factored into independent \texttt{lwarp\_html} files.} + + + + +% \iffalse +%<*afterpage> +% \fi + +% \part{lwarp-afterpage.sty} + +% \section{Afterpage} +% +% \DescribePackage{afterpage} +% +% \changes{v0.20}{2017/01/11}{\pkg{afterpage}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-afterpage}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{afterpage} +% \end{macrocode} + +% \begin{macrocode} +\newcommand{\afterpage}[1]{#1} +% \end{macrocode} + +% \iffalse +%</afterpage> +% \fi + + + +% \clearpage + +% \iffalse +%<*algorithmicx> +% \fi + +% \part{lwarp-algorithmicx.sty} + +% \section{Algorithmicx} +% \label{sec:algorithmicx} +% +% \DescribePackage{algorithmicx} +% \pkg{algorithmicx} is supported with minor adjustments. +% +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackagePass{algorithmicx} +% \end{macrocode} + + +% +% +% Inside the \env{algorithmic} environment, level indenting is converted to a |span| +% of the required length, and comments are placed inside a |span| which is floated right. +% +% \limitscombiningfloats +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macrocode} +\AtBeginEnvironment{algorithmic}{% +% +\let\origALG@doentity\ALG@doentity% +% +\renewcommand*{\ALG@doentity}{% +\origALG@doentity% +\uselengthunit{PT}% +\LWR@htmltagc{% +span style="width:\rndprintlength{\ALG@thistlm}; display:inline-block;"% +}% +\LWR@htmltagc{/span}% +}% +% +\let\origComment\Comment% +% +\renewcommand{\Comment}[1]{\InlineClass{floatright}{\origComment{#1}}}% +} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + +% \iffalse +%</algorithmicx> +% \fi + + + +% \iffalse +%<*alltt> +% \fi + +% \part{lwarp-alltt.sty} + +% \section{Alltt} +% +% \DescribePackage{alltt} +% +% \changes{v0.20}{2017/01/11}{\pkg{alltt}: Added.} +% +% \codehtml +% +% \pkg{alltt} is patched for use by \pkg{lwarp}. +% \begin{macrocode} +\LWR@ProvidesPackagePass{alltt} +% \end{macrocode} + +% \begin{macrocode} +\AfterEndPreamble{ +\AtBeginEnvironment{alltt}{\LWR@atbeginverbatim{alltt}\unskip\vspace*{-\baselineskip}} +\AfterEndEnvironment{alltt}{\unskip\vspace*{-\baselineskip}\LWR@afterendverbatim} +} +% \end{macrocode} + +% \iffalse +%</alltt> +% \fi + + + + +% \clearpage + +% \iffalse +%<*bookmark> +% \fi + +% \part{lwarp-bookmark.sty} + +% \section{Bookmark} +% +% \DescribePackage{bookmark} +% \pkg{bookmark} is emulated during \acro{HTML} output, and +% the \pkg{bookmark} package is ignored. + +% \changes{v0.20}{2017/01/03}{\pkg{bookmark}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-bookmark}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{bookmark} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*{\bookmarksetup}[1]{} +\newcommand*{\bookmarksetupnext}[1]{} +\newcommand*{\bookmark}[2][]{} +\newcommand*{\bookmarkdefinestyle}[2]{} +\newcommand*{\bookmarkget}[1]{} +\newcommand{\BookmarkAtEnd}[1]{} +% \end{macrocode} + +% \iffalse +%</bookmark> +% \fi + + + + +% \clearpage + +% \iffalse +%<*booktabs> +% \fi + +% \part{lwarp-booktabs.sty} + +% \section{Booktabs} +% \label{sec:booktabs} +% +% +% \DescribePackage{booktabs} +% \pkg{booktabs} is emulated during \acro{HTML} output, and +% the \pkg{booktabs} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{booktabs} +% \end{macrocode} +% +% Booktabs emulation is spread among the tabular code. +% +% +% Emulated for source compatibility. +% \begin{macrocode} +\newcommand*{\addlinespace}[1]{} +\newcommand*{\morecmidrules}{} +\newcommand*{\specialrule}[3]{} +% \end{macrocode} + +% \iffalse +%</booktabs> +% \fi + + + + + + + + +% \iffalse +%<*draftwatermark> +% \fi + +% \part{lwarp-draftwatermark.sty} + +% \section{Draftwatermark} +% \label{sec:draftwatermark} +% +% \changes{v0.20}{2017/01/11}{\pkg{draftwatermark}: Added.} +% +% \DescribePackage{draftwatermark} +% \pkg{draftwatermark} is emulated during \acro{HTML} output, and +% the \pkg{draftwatermark} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{draftwatermark} +% \end{macrocode} + +% \codehtml + +% \begin{macrocode} +\newcommand{\SetWatermarkAngle}[1]{} +\newcommand{\SetWatermarkColor}[1]{} +\newcommand{\SetWatermarkLightness}[1]{} +\newcommand{\SetWatermarkFontSize}[1]{} +\newcommand{\SetWatermarkScale}[1]{} +\newcommand{\SetWatermarkHorCenter}[1]{} +\newcommand{\SetWatermarkVertCenter}[1]{} +\newcommand{\SetWatermarkText}[1]{} +% \end{macrocode} + +% \iffalse +%</draftwatermark> +% \fi + + +% \iffalse +%<*epigraph> +% \fi + +% \part{lwarp-epigraph.sty} + +% \section{Epigraph} +% \label{sec:epigraph} +% +% +% \DescribePackage{epigraph} +% \pkg{epigraph} is emulated during \acro{HTML} output, and +% the \pkg{epigraph} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{epigraph} +% \end{macrocode} + +% \codehtml + +% \begin{macrocode} +\newcommand{\qitem}[2] +{ +\begin{BlockClass}{qitem} +#1 +\begin{BlockClass}{epigraphsource} +#2 +\end{BlockClass} +\end{BlockClass} +} +% \end{macrocode} + +% \begin{macrocode} +\newcommand{\epigraph}[2] +{ +\begin{BlockClass}{epigraph} +\qitem{#1}{#2} +\end{BlockClass} +} + +\newenvironment*{epigraphs} +{\BlockClass{epigraph}} +{\endBlockClass} +% \end{macrocode} +% +% Use \acro{CSS} to format epigraphs. +% +% The following are null commands for source compatibility: +% \begin{macrocode} +\newlength{\epigraphwidth} +\setlength{\epigraphwidth}{.5\linewidth} +\newenvironment*{flushepinormal}{}{} +\newcommand{\textflush}[1]{flushepinormal} +\newcommand{\epigraphflush}[1]{flushright} +\newcommand{\sourceflush}[1]{flushright} +\newcommand*{\epigraphsize}{\small} +\newlength{\epigraphrule} +\newlength{\beforeepigraphskip} +\newlength{\afterepigraphskip} +\newcommand{\epigraphhead}[2][0]{#2} +\newcommand{\dropchapter}[1]{} +\newcommand*{\undodrop}{} +\newcommand{\cleartoevenpage}[1][]{} +% \end{macrocode} + +% \iffalse +%</epigraph> +% \fi + + + + +% \iffalse +%<*eso-pic> +% \fi + +% \part{lwarp-eso-pic.sty} + +% \section{Eso-pic} +% \label{sec:eso-pic} +% +% \changes{v0.20}{2017/01/11}{\pkg{eso-pic}: Added.} +% +% \DescribePackage{eso-pic} +% \pkg{eso-pic} is emulated during \acro{HTML} output, and +% the \pkg{eso-pic} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{eso-pic} +% \end{macrocode} + +% \codehtml +% \begin{macrocode} +\newcommand*{\LenToUnit}{} +\newcommand{\AtPageUpperLeft}[1]{} +\newcommand{\AtPageLowerLeft}[1]{} +\newcommand{\AtPageCenter}[1]{} +\newcommand{\AtStockLowerLeft}[1]{} +\newcommand{\AtStockUpperLeft}[1]{} +\newcommand{\AtStockCenter}[1]{} +\newcommand{\AtTextUpperLeft}[1]{} +\newcommand{\AtTextLowerLeft}[1]{} +\newcommand{\AtTextCenter}[1]{} +\NewDocumentCommand{\AddToShipoutPictureBG}{s +m}{} +\let\AddToShipoutPicture\AddToShipoutPictureBG +\NewDocumentCommand{\AddToShipoutPictureFG}{s +m}{} +\newcommand*{\ClearShipoutPictureBG}{} +\newcommand*{\ClearShipoutPicture}{} +\newcommand*{\ClearShipoutPictureFG}{} +\newcommand{\gridSetup}[6][]{} +% \end{macrocode} + +% \iffalse +%</eso-pic> +% \fi + + + + + +% \iffalse +%<*everypage> +% \fi + +% \part{lwarp-everypage.sty} + +% \section{Everypage} +% \label{sec:everypage} +% +% \changes{v0.20}{2017/01/11}{\pkg{everypage}: Added.} +% +% \DescribePackage{everypage} +% \pkg{everypage} is emulated during \acro{HTML} output, and +% the \pkg{everypage} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{everypage} +% \end{macrocode} + +% \codehtml +% \begin{macrocode} +\newcommand*{\AddEverypageHook}[1]{} +\newcommand*{\AddThispageHook}[1]{} +% \end{macrocode} + +% \iffalse +%</everypage> +% \fi + + +% \iffalse +%<*extramarks> +% \fi + +% \part{lwarp-extramarks.sty} + +% \section{Extramarks} +% +% \DescribePackage{extramarks} +% +% \changes{v0.20}{2017/01/11}{\pkg{extramarks}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-extramarks}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{extramarks} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*{\extramarks}[2]{} +\newcommand*{\firstleftxmark}{} +\newcommand*{\lastleftxmark}{} +\newcommand*{\firstrightxmark}{} +\newcommand*{\lastrightxmark}{} +\newcommand*{\firstxmark}{} +\newcommand*{\lastxmark}{} +\newcommand*{\topxmark}{} +\newcommand*{\topleftxmark}{} +\newcommand*{\firstleftmark}{} +\newcommand*{\lastrightmark}{} +% \end{macrocode} + +% \iffalse +%</extramarks> +% \fi + + + + +% \iffalse +%<*fancyhdr> +% \fi + +% \part{lwarp-fancyhdr.sty} + +% \section{Fancyhdr} +% +% \DescribePackage{fancyhdr} +% +% \changes{v0.20}{2017/01/11}{\pkg{fancyhdr}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-fancyhdr}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{fancyhdr} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*{\fancyhead}[2][]{} +\newcommand*{\fancyfoot}[2][]{} +\newcommand*{\fancyhf}[2][]{} +\newcommand*{\fancypagestyle}[2]{} +\newcommand*{\lhead}[1]{} +\newcommand*{\chead}[1]{} +\newcommand*{\rhead}[1]{} +\newcommand*{\lfoot}[1]{} +\newcommand*{\cfoot}[1]{} +\newcommand*{\rfoot}[1]{} +\newcommand*{\headrulewidth}{} +\newcommand*{\footrulewidth}{} +\newcommand*{\fancyheadoffset}[2][]{} +\newcommand*{\fancyfootoffset}[2][]{} +\newcommand*{\fancyhfoffset}[2][]{} +\newcommand*{\iffloatpage}[2]{#2} +\newcommand*{\ifftopfloat}[2]{#2} +\newcommand*{\iffbotfloat}[2]{#2} +% \end{macrocode} + +% \iffalse +%</fancyhdr> +% \fi + + + + +% \clearpage + +% \iffalse +%<*float> +% \fi + +% \part{lwarp-float.sty} + +% \section{Float and \cs{newfloat}} +% \label{sec:newfloat} +% \label{sec:float} +% +% \DescribePackage{float} +% \pkg{float} is emulated during \acro{HTML} output, and +% the \pkg{float} package is ignored. +% +% \changes{v0.20}{2017/01/22}{Improved float caption type handling.} +% +% +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{float}[2016/03/04] +% \end{macrocode} + +% +% \DescribePackage{float} +% +% The \pkg{float} package is emulated. +% +% See \cref{sec:listof} for the \cs{listof} command. + + +% \begin{macro}{\newfloat} \marg{1: type} \marg{2: placement} +% \marg{3: ext} \oarg{4: within} +% +% Emulates the \cs{newfloat} command from the \pkg{float} package. +% +% ``placement'' is ignored. +% +% \begin{macrocode} +\NewDocumentCommand{\newfloat}{m m m o}{% +\IfValueTF{#4} +{ +\DeclareFloatingEnvironment[fileext=#3,within=#4]{#1} +} +{\DeclareFloatingEnvironment[fileext=#3]{#1}} +% \end{macrocode} +% \pkg{newfloat} package automatically creates the \cs{listof} command +% for new floats, but \pkg{float} does not, +% so remove \cs{listof} here in case it is manually created later. +% \begin{macrocode} +\cslet{listof#1s}\relax +\cslet{listof#1es}\relax +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\floatname} \marg{type} \marg{name} +% +% Sets the text name of the float, such as ``Figure''. +% \begin{macrocode} +\NewDocumentCommand{\floatname}{m +m}{% +\SetupFloatingEnvironment{#1}{name=#2}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\floatplacement} \marg{type} \marg{placement} +% +% Float placement is ignored. +% \begin{macrocode} +\newcommand*{\floatplacement}[2]{% +\SetupFloatingEnvironment{#1}{placement=#2}% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\floatstyle} \marg{style} +% +% Float styles are ignored. +% \begin{macrocode} +\newcommand{\floatstyle}[1]{% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\restylefloat} * \marg{style} +% +% Float styles are ignored. +% \begin{macrocode} +\NewDocumentCommand{\restylefloat}{s m}{% +} +% \end{macrocode} +% \end{macro} + +% \iffalse +%</float> +% \fi + + + + +% \clearpage + +% \iffalse +%<*floatrow> +% \fi + +% \part{lwarp-floatrow.sty} + +% \section{Floatrow} +% \label{sec:floatrow} +% +% \DescribePackage{floatrow} +% \pkg{floatrow} is emulated during \acro{HTML} output, and +% the \pkg{floatrow} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{floatrow} +% \end{macrocode} + + +% \changes{v0.14}{2016/03/31}{floatrow: Added package} + +% \DescribePackage{floatrow} +% +% The \pkg{floatrow} package is emulated. +% +% \limitsfloatrow + + +% ^^A \begin{macro}{\floatbox} \oarg{1 preamble} \marg{2 captype} +% ^^A \oarg{3 width} \oarg{4 height} \oarg{5 vert pos} +% ^^A \marg{6 caption} \marg{7 object} +% +% Only parameters for caption and object are used. +% +% |LWR@insubfloatrow| is true if inside a \env{subfloatrow} environment. +% \begin{macrocode} +\NewDocumentCommand{\floatbox}{o m o o o +m +m}{% +\ifbool{LWR@insubfloatrow} +{ +% \end{macrocode} +% Inside a \env{subfloatrow}. +% \env{subfigure} and \env{subtable} take a width argument. +% Defaults to \cs{linewidth} if none is given. +% \begin{macrocode} +\IfValueTF{#3} +{\@nameuse{sub#2}{#3}} +{\@nameuse{sub#2}{\linewidth}} +} +{ +% \end{macrocode} +% Not inside a \env{subfloatrow}. +% \env{figure} and \env{table} do not take a width argument. +% \begin{macrocode} +\@nameuse{#2} +} +#6 + +#7 +\ifbool{LWR@insubfloatrow} +{\@nameuse{endsub#2}} +{\@nameuse{end#2}} +} +% \end{macrocode} +% ^^A \end{macro} + + +% Not used: +% \begin{macrocode} +\newcommand*{\nocapbeside}{} +\newcommand*{\capbeside}{} +\newcommand*{\captop}{} +\newlength{\FBwidth} +\setlength{\FBwidth}{.3\linewidth} +\newlength{\FBheight} +\setlength{\FBheight}{2in} +\newcommand*{\useFCwidth}{} +\newcommand{\floatsetup}[2][]{} +\newcommand{\thisfloatsetup}[1]{} +\newcommand{\clearfloatsetup}[1]{} +\newcommand*{\killfloatstyle}{} +% \end{macrocode} + + +% ^^A \begin{macro}{\newfloatcommand} \marg{1 command} \marg{2 captype} +% ^^A \oarg{3 preamble} \oarg{4 default width} +% +% Preamble and default width are ignored. +% \begin{macrocode} +\NewDocumentCommand{\newfloatcommand}{m m o o}{% +\@namedef{#1}{ +\floatbox{#2} +} +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\renewfloatcommand} \marg{1 command} \marg{2 captype} +% ^^A \oarg{3 preamble} \oarg{4 default width} +% +% Preamble and default width are ignored. +% \begin{macrocode} +\NewDocumentCommand{\renewfloatcommand}{m m o o}{% +\@namedef{#1}{% +\floatbox{#2} +} +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\ffigbox} \oarg{width} \oarg{height} \oarg{vposn} +% ^^A \marg{caption commands} \marg{contents} +% \begin{macrocode} +\newfloatcommand{ffigbox}{figure}[\nocapbeside][] +% \end{macrocode} +% ^^A \end{macro} +% +% ^^A \begin{macro}{\ttabbox} \oarg{width} \oarg{height} \oarg{vposn} +% ^^A \marg{caption commands} \marg{contents} +% \changes{v0.15}{2016/03/31}{Fixed \& handling.} +% \begin{macrocode} +\newfloatcommand{ttabbox}{table}[\captop][\FBwidth] +% \end{macrocode} +% ^^A \end{macro} +% +% ^^A \begin{macro}{\fcapside} \oarg{width} \oarg{height} \oarg{vposn} +% ^^A \marg{caption commands} \marg{contents} +% \begin{macrocode} +\newfloatcommand{fcapside}{figure}[\capbeside][] +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{environment}{floatrow} \oarg{numfloats} +% \changes{v0.20}{2016/08/20}{Fix:\cs{linewidth} in a floatrow.} +% +% The row of floats is placed into a |div| of class |floatrow|. +% \begin{macrocode} +\newenvironment*{floatrow}[1][2] +{ +\BlockClass{floatrow} +% \end{macrocode} +% While inside the floatrow, divide the \cs{linewidth} by the number of floats. +% \begin{macrocode} +\booltrue{LWR@infloatrow} +\setlength{\linewidth}{6in/#1} +} +{ +\boolfalse{LWR@infloatrow} +\endBlockClass +} +% \end{macrocode} +% ^^A \end{environment} +% +% Keys for \cs{DeclareNewFloatType}: +% \begin{macrocode} +\newcommand*{\LWR@frowkeyplacement}{} +\newcommand*{\LWR@frowkeyname}{} +\newcommand*{\LWR@frowkeyfileext}{} +\newcommand*{\LWR@frowkeywithin}{} +\newcommand*{\LWR@frowkeycapstyle}{} + +\define@key{frowkeys}{placement}{}% +\define@key{frowkeys}{name}{\renewcommand{\LWR@frowkeyname}{#1}}% +\define@key{frowkeys}{fileext}{\renewcommand{\LWR@frowkeyfileext}{#1}}% +\define@key{frowkeys}{within}{\renewcommand{\LWR@frowkeywithin}{#1}}% +\define@key{frowkeys}{relatedcapstyle}{}% +% \end{macrocode} + +% ^^A \begin{macro}{\DeclareNewFloatType} \marg{type} \marg{options} +% +% Use |\listof{type}{Title}| to print a list of the floats. +% \begin{macrocode} +\newcommand*{\DeclareNewFloatType}[2]{% +% \end{macrocode} +% Reset key values: +% \begin{macrocode} +\renewcommand*{\LWR@frowkeyplacement}{} +\renewcommand*{\LWR@frowkeyname}{} +\renewcommand*{\LWR@frowkeyfileext}{} +\renewcommand*{\LWR@frowkeywithin}{} +\renewcommand*{\LWR@frowkeycapstyle}{} +% \end{macrocode} +% Read new key values: +% \begin{macrocode} +\LWR@traceinfo{about to setkeys frowkeys}% +\setkeys{frowkeys}{#2}% +\LWR@traceinfo{finished setkeys frowkeys}% +% \end{macrocode} +% Create a new float with optional [within]: +% \begin{macrocode} +\ifthenelse{\equal{\LWR@frowkeywithin}{}} +{ +\LWR@traceinfo{about to newfloat #1 \LWR@frowkeyplacement\ \LWR@frowkeyfileext}% +\newfloat{#1}{\LWR@frowkeyplacement}{\LWR@frowkeyfileext} +}% +{% +\LWR@traceinfo{about to newfloat #1\ \LWR@frowkeyplacement\ \LWR@frowkeyfileext\ \LWR@frowkeywithin}% +\newfloat{#1}{\LWR@frowkeyplacement}% +{\LWR@frowkeyfileext}[\LWR@frowkeywithin]% +\typeout{*** finished newfloat #1} +}% +% \end{macrocode} +% Rename the float if a name was given: +% \begin{macrocode} +\ifthenelse{\equal{\LWR@frowkeyname}{}} +{} +{\floatname{#1}{\LWR@frowkeyname}}% +} +% \end{macrocode} +% ^^A \end{macro} + +% Not used: +% \begin{macrocode} +\newcommand{\buildFBBOX}[2]{} +\newcommand*{\CenterFloatBoxes}{} +\newcommand*{\TopFloatBoxes}{} +\newcommand*{\BottomFloatBoxes}{} +\newcommand*{\PlainFloatBoxes}{} + +\newcommand{\capsubrowsettings}{} + +\NewDocumentCommand{\RawFloats}{o o}{} +% \end{macrocode} + +% ^^A \begin{macro}{\RawCaption} \marg{text} +% +% \changes{v0.15}{2016/03/31}{Fix: steps counter} +% +% To be used inside a minipage or parbox. +% \begin{macrocode} +\newcommand{\RawCaption}[1]{#1} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\floatfoot} \marg{text} +% +% Places additional text inside a float, +% inside a \acro{CSS} |div| of class |floatfoot|. +% \begin{macrocode} +\NewDocumentCommand{\floatfoot}{s +m}{% +\begin{BlockClass}{floatfoot} +#2 +\end{BlockClass} +} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \DescribeBoolean{LWR@insubfloatrow} +% Used to compute \cs{linewidth}. +% \begin{macrocode} +\newbool{LWR@insubfloatrow} +\boolfalse{LWR@insubfloatrow} +% \end{macrocode} + +% ^^A \begin{environment}{subfloatrow} \oarg{num\_floats} +% \changes{v0.15}{2016/04/01}{Added} +% \begin{macrocode} +\newenvironment*{subfloatrow}[1][2] +{ +% \end{macrocode} +% The row of floats is placed into a |div| of class |floatrow|: +% \begin{macrocode} +\BlockClass{floatrow} +% \end{macrocode} +% While inside the floatrow, |LWR@insubfloatrow| is set true, +% which tells \cs{floatbox} to use \cs{subfigure} or \cs{subtable}. +% \begin{macrocode} +\begingroup +\booltrue{LWR@insubfloatrow} +} +{ +\endgroup +\endBlockClass +\boolfalse{LWR@insubfloatrow} +} +% \end{macrocode} +% ^^A \end{environment} + +% \iffalse +%</floatrow> +% \fi + + + + + +% \iffalse +%<*geometry> +% \fi + +% \part{lwarp-geometry.sty} + +% \section{Geometry} +% +% \DescribePackage{geometry} +% +% \codehtml + +% Discard all options for \pkg{lwarp-geometry}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{geometry} +% \end{macrocode} + +% \iffalse +%</geometry> +% \fi + + + +% \iffalse +%<*graphics> +% \fi + +% \part{lwarp-graphics.sty} + +% \section{Graphics} +% +% \DescribePackage{graphics} +% \pkg{graphics} is not used. +% The user is required to use \pkg{graphicx} instead. + +% \codehtml +% \begin{macrocode} +\PackageError{lwarp-graphics} + {The graphics package is not supported by + the lwarp package's HTML conversion. + Please use graphicx instead. \protect\usepackage{graphicx}} + {Graphicx requires a different syntax but is more flexible, + and it is emulated by lwarp.} +% \end{macrocode} + + +% \iffalse +%</graphics> +% \fi + + + + + +% \clearpage + +% \iffalse +%<*graphicx> +% \fi + +% \part{lwarp-graphicx.sty} + +% \section{Graphicx} +% +% \DescribePackage{graphicx} +% \pkg{graphicx} is emulated during \acro{HTML} output, and +% the \pkg{graphicx} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{graphicx} +% \end{macrocode} + + +% \iffalse +%</graphicx> +% \fi + + + +% \clearpage + +% \iffalse +%<*hyperref> +% \fi + +% \part{lwarp-hyperref.sty} + +% \section{Hyperref} +% +% \DescribePackage{hyperref} +% \pkg{hyperref} is emulated during \acro{HTML} output, and +% the \pkg{hyperref} package is ignored. + +% \changes{v0.20}{2017/01/03}{\pkg{hyperref}: Additional user macros.} +% +% \codehtml +% \begin{macrocode} +% \LWR@ProvidesPackageDrop{hyperref} +\typeout{Using the lwarp html version of package `hyperref' — discarding options.} +\typeout{ Are not using ProvidesPackage, so that other packages} +\typeout{ do not attempt to patch lwarp's version of `hyperref'.} +% \ProvidesPackage{lwarp-#1-#2} +\DeclareOption*{} +\ProcessOptions\relax +% \end{macrocode} + +% \begin{macrocode} +\newcommand*{\hypersetup}[1]{} +\newcommand*{\hyperbaseurl}[1]{} +% \end{macrocode} + + + +% ^^A \begin{macro}{\hyperimage} \marg{url} \marg{alt text} +% +% Insert an image with alt text: +% \begin{macrocode} +\NewDocumentCommand{\LWR@hyperimageb}{m +m}{% +\LWR@htmltag{img src="#1" alt="#2" class="hyperimage"{}}% +\endgroup% +\LWR@ensuredoingapar% +} + +\newcommand{\hyperimage}{% +\LWR@ensuredoingapar% +\begingroup\catcode`\_=12 +\LWR@hyperimageb% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\hyperdef} \marg{1: category} \marg{2: name} \marg{3: text} +% Creates an HTML anchor to |category.name| with the given text. +% +% \begin{macrocode} +\NewDocumentCommand{\hyperdef}{m m +m}{% +\LWR@ensuredoingapar% +\LWR@subsublabel{#1.#2}% +#3% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\LWR@hyperrefb} \marg{1: URL} \marg{2: category} +% ^^A \marg{3: name} \marg{4: text} +% +% Creates an HTML link to |URL#category.name| with the given text. +% \begin{macrocode} +\NewDocumentCommand{\LWR@hyperrefb}{m m m +m}{% +\LWR@htmltag{a href="#1\LWR@hashmark#2.#3"}% +#4% +\LWR@htmltag{/a}% +\endgroup% +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\LWR@hyperrefc} \oarg{label} \marg{text} +% +% Creates text as an HTML link to the \LaTeX\ label. +% \begin{macrocode} +\NewDocumentCommand{\LWR@hyperrefc}{O{label} +m}{ +\LWR@startref{#1}% +#2% +\LWR@htmltag{/a}% +\endgroup% +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\hyperref} +% ^^A \marg{1: URL} \marg{2: category} \marg{3: name} \marg{4: text} \quad -or- +% +% ^^A \oarg{1: label} \marg{2: text} +% +% \begin{macrocode} +\newcommand{\hyperref}{% +\LWR@ensuredoingapar% +\begingroup\catcode`\_=12 +\@ifnextchar[\LWR@hyperrefc\LWR@hyperrefb% +} +% \end{macrocode} +% ^^A \end{macro} + + + +% ^^A \begin{macro}{\hypertarget} \marg{name} \marg{text} +% Creates an anchor to |name| with the given text. +% +% \begin{macrocode} +\NewDocumentCommand{\hypertarget}{m +m}{% +\label{#1}% +#2% +} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\hyperlink} \marg{name} \marg{text} +% +% Creates a link to the anchor created by hypertarget, +% with the given link text. +% +% \begin{macrocode} +\NewDocumentCommand{\hyperlink}{m +m}{% +\hyperref[#1]{#2}% +} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\autoref} * \marg{label} +% +% For \acro{HTML}, \cs{cleverref} is used instead. +% +% \begin{macrocode} +\NewDocumentCommand{\autoref}{s m}{% +\IfBooleanTF{#1}{\ref{#2}}{\cref{#2}}% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\autopageref} \marg{label} +% +% For \acro{HTML}, \cs{cleverref} is used instead. +% +% \begin{macrocode} +\NewDocumentCommand{\autopageref}{s m}{% +\IfBooleanTF{#1}{\cpageref{#2}}{\cref{#2}}% +} +% \end{macrocode} +% ^^A \end{macro} + + + +% ^^A \begin{macro}{\pdfstringdef} \marg{macroname} \marg{\TeX{}string} +% +% \begin{macrocode} +\newcommand{\pdfstringdef}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\pdfbookmark} \oarg{level} \marg{text} \marg{name} +% +% \begin{macrocode} +\newcommand{\pdfbookmark}[3][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\currentpdfbookmark} \marg{text} \marg{name} +% +% \begin{macrocode} +\newcommand{\currentpdfbookmark}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\subpdfbookmark} \marg{text} \marg{name} +% +% \begin{macrocode} +\newcommand{\subpdfbookmark}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\belowpdfbookmark} \marg{text} \marg{name} +% +% \begin{macrocode} +\newcommand{\belowpdfbookmark}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\texorpdfstring} \marg{\TeX{}string} \marg{PDFstring} +% +% \begin{macrocode} +\newcommand{\texorpdfstring}[2]{#2} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\hypercalcbp} \marg{dimen} \quad +% From \pkg{hyperref}. +% +% \begin{macrocode} +\def\hypercalcbp#1{% +\strip@pt\dimexpr 0.99626401\dimexpr(#1)\relax\relax +}% +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\Acrobatmenu} \marg{menuoption} \marg{text} +% +% \begin{macrocode} +\newcommand{\Acrobatmenu}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\TextField} \oarg{parameters} \marg{label} +% +% \begin{macrocode} +\newcommand*{\TextField}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\CheckBox} \oarg{parameters} \marg{label} +% +% \begin{macrocode} +\newcommand*{\CheckBox}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\ChoiceMenu} \oarg{parameters} \marg{label} \marg{choices} +% +% \begin{macrocode} +\newcommand{\ChoiceMenu}[3][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\PushButton} \oarg{parameters} \marg{label} +% +% \begin{macrocode} +\newcommand*{\PushButton}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\Submit} \oarg{parameters} \marg{label} +% +% \begin{macrocode} +\newcommand*{\Submit}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\Reset} \oarg{parameters} \marg{label} +% +% \begin{macrocode} +\newcommand*{\Reset}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\LayoutTextField} \marg{label} \marg{field} +% +% \begin{macrocode} +\newcommand*{\LayoutTextField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\LayoutChoiceField} \marg{label} \marg{field} +% +% \begin{macrocode} +\newcommand*{\LayoutChoiceField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\LayoutCheckField} \marg{label} \marg{field} +% +% \begin{macrocode} +\newcommand*{\LayoutCheckField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\MakeRadioField} \marg{width} \marg{height} +% +% \begin{macrocode} +\newcommand*{\MakeRadioField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\MakeCheckField} \marg{width} \marg{height} +% +% \begin{macrocode} +\newcommand*{\MakeCheckField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\MakeTextField} \marg{width} \marg{height} +% +% \begin{macrocode} +\newcommand*{\MakeTextField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\MakeChoiceField} \marg{width} \marg{height} +% +% \begin{macrocode} +\newcommand*{\MakeChoiceField}[2]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\MakeFieldButton} \marg{text} +% +% \begin{macrocode} +\newcommand{\MakeFieldButton}[1]{} +% \end{macrocode} +% ^^A \end{macro} + +% \iffalse +%</hyperref> +% \fi + + + +% \clearpage + +% \iffalse +%<*keyfloat> +% \fi + +% \part{lwarp-keyfloat.sty} + +% \section{Keyfloat} +% \label{sec:keyfloat} +% +% \DescribePackage{keyfloat} +% \pkg{keyfloat} is supported with minor adjustments. +% +% \changes{v0.20}{2017/01/16}{\pkg{keyfloat}: Added.} +% +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackagePass{keyfloat} +% \end{macrocode} + +% After \pkg{keyfloat} has loaded: +% \begin{macrocode} +\AtBeginDocument{ +% \end{macrocode} + + +% \begin{macrocode} +% \newsavebox{\KFLT@envbox} + +\let\KFLT@boxinner\relax +\let\endKFLT@boxinner\relax + +\NewEnviron{KFLT@boxinner} +{% +\LWR@traceinfo{kflt@boxinner}% +\LWR@stoppars% +\KFLT@frame{\BODY}% +\LWR@startpars% +\LWR@traceinfo{ended kflt@boxinner}% +} +% \end{macrocode} + + +% \begin{macrocode} +\RenewDocumentEnvironment{KFLT@marginfloat}{O{-1.2ex} m} +{% start +\LWR@maybeincthisfloat% +% \BlockClass{marginblock} +\LWR@stoppars% +\LWR@htmltag{div class="marginblock" id="autofloat-\arabic{LWR@thisfloat}"} +\LWR@startpars% +\captionsetup{type=#2}% +} +{ +% \endBlockClass +\LWR@htmldivclassend{div} +} +% \end{macrocode} + + +% \begin{macrocode} +}% AtBeginDocument +% \end{macrocode} + + +% \iffalse +%</keyfloat> +% \fi + + + +% \clearpage + +% \iffalse +%<*letterspace> +% \fi + +% \part{lwarp-letterspace.sty} + +% \section{Letterspace} +% +% \DescribePackage{letterspace} +% \pkg{letterspace} is a subset of microtype, which is pre-loaded by \pkg{lwarp}. +% All user options and macros are ignored and disabled. + +% \changes{v0.20}{2017/01/03}{\pkg{letterspace}: User-interface emulated.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-letterspace}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{letterspace} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*\lsstyle{} +\newcommand\textls[2][]{} +\def\textls#1#{} +\newcommand*\lslig[1]{#1} +% \end{macrocode} + +% \iffalse +%</letterspace> +% \fi + + + + +% \clearpage + +% \iffalse +%<*listings> +% \fi + +% \part{lwarp-listings.sty} + +% \section{Listings} +% \label{sec:listings} +% +% \DescribePackage{listings} +% \pkg{listings} is supported with some limitations. +% Text formatting is not yet supported. +% +% \changes{v0.20}{2017/01/01}{\pkg{listings}: Added.} +% +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} +% +% +% \begin{macrocode} +\LWR@ProvidesPackagePass{listings} +% \end{macrocode} + +% ^^A For passing optional arguments to an environment, see: +% ^^A \href +% ^^A {http://tex.stackexchange.com/questions/9035/how-to-pass-an-optional-argument-to-an-environment-with-verbatim-content} +% ^^A {\texttt{http://tex.stackexchange.com/questions/9035/ \\ +% ^^A \hspace*{3em}how-to-pass-an-optional-argument-to-\\ +% ^^A \hspace*{3em}an-environment-with-verbatim-content}} +% +% +% +% Patches to embed listings inside |pre| tags: +% +% \begin{macrocode} +\let\LWR@origlst@Init\lst@Init +\let\LWR@origlst@DeInit\lst@DeInit + +\let\LWR@origlsthkEveryPar\lsthk@EveryPar + +\renewcommand{\l@lstlisting}[2]{\hypertocfloat{1}{toclstlisting}{#1}{#2}} +% \end{macrocode} +% +% +% ^^A \begin{macro}{\lst@Init} \marg{backslash-processing} +% Done at the start of a listing. +% \begin{macrocode} +\renewcommand{\lst@Init}[1]{% +% \end{macrocode} +% First, perform the \pkg{listings} initialization: +% \begin{macrocode} +\LWR@traceinfo{lst@Init}% +\renewcommand*{\@captype}{lstlisting}% +\LWR@origlst@Init{#1}% +\LWR@traceinfo{finished origlst@Init}% +\lst@ifdisplaystyle% +% \end{macrocode} +% Creating a display. +% +% Disable line numbers, +% produce the |<pre>|, then +% reenable line numbers. +% \begin{macrocode} +\LWR@traceinfo{About to create verbatim.}% +\let\lsthk@EveryPar\relax% +\LWR@atbeginverbatim{programlisting}% + +\let\lsthk@EveryPar\LWR@origlsthkEveryPar% +\else% +% \end{macrocode} +% Inline, so open a |<span>| +% \begin{macrocode} +\ifbool{LWR@verbtags}{\LWR@htmltag{span class="inlineprogramlisting"}}{}% +\fi% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\lst@DeInit} Done at the end of a listing. +% \begin{macrocode} +\renewcommand*{\lst@DeInit}{% +\lst@ifdisplaystyle% +% \end{macrocode} +% Creating a display. +% +% Disable line numbers, +% produce the |</pre>|, then +% reenable line numbers: +% \begin{macrocode} +\let\lsthk@EveryPar\relax% + +\LWR@afterendverbatim% +\let\lsthk@EveryPar\LWR@origlsthkEveryPar% +\else% +% \end{macrocode} +% Inline, so create the closing |</span>|: +% \begin{macrocode} +\ifbool{LWR@verbtags}{\noindent\LWR@htmltag{/span}}{}% +\fi% +% \end{macrocode} +% Final \pkg{listings} deinit: +% \begin{macrocode} +\LWR@origlst@DeInit% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% +% ^^A \begin{macro}{\lst@MakeCaption} \marg{t/b} +% +% This is called BOTH at the top and at the bottom of each listing. +% +% Patched for \pkg{lwarp}. +% \begin{macrocode} +\def\lst@MakeCaption#1{% +\LWR@traceinfo{MAKING CAPTION at #1}% + \lst@ifdisplaystyle +\LWR@traceinfo{making a listings display caption}% + \ifx #1t% + \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else + \expandafter\refstepcounter + \fi {lstlisting}% +\LWR@traceinfo{About to assign label: !\lst@label!}% +% \ifx\lst@label\@empty\else +% \label{\lst@label}\fi +\LWR@traceinfo{Finished assigning the label.}% + \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl + \global\let\lst@name\lst@arg \global\let\lstname\lst@name + \lst@ifnolol\else + \ifx\lst@@caption\@empty + \ifx\lst@caption\@empty + \ifx\lst@intname\@empty \else \def\lst@temp{ }% + \ifx\lst@intname\lst@temp \else +% \end{macrocode} +% This code places a contents entry for a non-float. +% This would have to be modified for \pkg{lwarp}: +% \begin{macrocode} +\LWR@traceinfo{addcontents lst@name: -\lst@name-}% +% \addcontentsline{lol}{lstlisting}{\lst@name} + \fi\fi + \fi + \else +% \end{macrocode} +% This would have to be modified for \pkg{lwarp}: +% \begin{macrocode} +\LWR@traceinfo{addcontents lst@@caption: -\lst@@caption-}% + \addcontentsline{lol}{lstlisting}% + {\protect\numberline{\thelstlisting}{\protect\ignorespaces \lst@@caption \protect\relax}}% + \fi + \fi + \fi + \ifx\lst@caption\@empty\else +\LWR@traceinfo{lst@caption not empty-}% + \lst@IfSubstring #1\lst@captionpos + {\begingroup +\LWR@traceinfo{at the selected position}% +% \end{macrocode} +% These space and box commands are not needed for \acro{HTML} output: +% \begin{macrocode} +% \let\@@vskip\vskip +% \def\vskip{\afterassignment\lst@vskip \@tempskipa}% +% \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}% +% \par\@parboxrestore\normalsize\normalfont % \noindent (AS) +% \ifx #1t\allowbreak \fi + \ifx\lst@title\@empty +% \end{macrocode} +% New \pkg{lwarp} code to create a caption: +% \begin{macrocode} + \lst@makecaption\fnum@lstlisting{\ignorespaces \lst@caption} + \else +% \end{macrocode} +% New \pkg{lwarp} code to create a title: +% \begin{macrocode} +% \lst@maketitle\lst@title % (AS) +\LWR@traceinfo{Making title: \lst@title}% +\begin{BlockClass}{lstlistingtitle}% lwarp +\lst@maketitle\lst@title% lwarp +\end{BlockClass}% lwarp + \fi +\LWR@traceinfo{About to assign label: !\lst@label!}% + \ifx\lst@label\@empty\else +\leavevmode% gets rid of bad space factor error +\GetTitleStringExpand{\lst@caption}% +\edef\LWR@lntemp{\GetTitleStringResult}% +\edef\@currentlabelname{\detokenize\expandafter{\LWR@lntemp}}% +\label{\lst@label}\fi +\LWR@traceinfo{Finished assigning the label.}% +% \end{macrocode} +% Not needed for \pkg{lwarp}: +% \begin{macrocode} +% \ifx #1b\allowbreak \fi + \endgroup}{}% + \fi +\LWR@traceinfo{end of making a listings display caption}% + \else +\LWR@traceinfo{INLINE}% + \fi +\LWR@traceinfo{DONE WITH CAPTION at #1}% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% Patched to keep left line numbers outside of the left margin, and +% place right line numbers in a field \cs{VerbatimHTMLWidth} wide. +% +% ^^A \DescribeKey[listings]{numbers} Activates line numbers. +% \begin{macrocode} +\lst@Key{numbers}{none}{% + \let\lst@PlaceNumber\@empty + \lstKV@SwitchCases{#1}% + {none&\\% + left&\def\lst@PlaceNumber{% +% \llap{ +\LWR@orignormalfont% +\lst@numberstyle{\thelstnumber}\kern\lst@numbersep% +% } +} +\\% + right&\def\lst@PlaceNumber{\rlap{\LWR@orignormalfont + \kern\VerbatimHTMLWidth \kern\lst@numbersep + \lst@numberstyle{\thelstnumber}}}% + }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}} + +\end{warpHTML} +% \end{macrocode} + +% \iffalse +%</listings> +% \fi + + + + +% \clearpage + +% \iffalse +%<*longtable> +% \fi + +% \part{lwarp-longtable.sty} + +% \section{Longtable} +% \label{sec:longtable} +% +% +% \DescribePackage{longtable} +% \pkg{longtable} is emulated during \acro{HTML} output, and +% the \pkg{longtable} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{longtable} +% \end{macrocode} + +% +% To emulate longtable: + +% For longtable |\endhead|, |\endfoot|, and |\endlastfoot| rows, use \\ +% \watchout +% \hspace*{.25in}|\warpprintonly{row contents}|\\ +% instead of \\ +% \hspace*{.25in}|\begin{warpprint}| \ldots |\end{warpprint}|. \\ +% Doing so helps avoid ``Misplaced |\noalign|.'' when using |\begin{warpprint}|. +% +% Keep the |\endfirsthead| row, which is still relevent to \acro{HTML} output. +% +% See: \\ +% \href{http://tex.stackexchange.com/questions/43006/why-is-input-not-expandable} +% {\texttt{http://tex.stackexchange.com/questions/43006/\\why-is-input-not-expandable}} +% + + +% \begin{environment}{longtable} * \oarg{horizalignment} \marg{colspec} +% Emulates the \env{longtable} environment. +% +% Per the \pkg{caption} package, the starred version steps the counter per caption. +% The unstarred version steps the counter once at the beginning, but +% not at each caption. +% +% Options [c], [l], and [r] are thrown away. +% \begin{macrocode} +\newenvironment{longtable*}[2][]{% +\LWR@floatbegin{table}% +\setcaptiontype{\LTcaptype}% +\caption@setoptions{longtable}% +\caption@setoptions{@longtable}% +\caption@LT@setup% +\booltrue{LWR@starredlongtable}% +\let\captionlistentry\LWR@LTcaptionlistentry% +\LWR@tabular{#2} +} +{\endLWR@tabular\LWR@floatend} + +\newenvironment{longtable}[2][]{% +\LWR@floatbegin{table}% +\setcaptiontype{\LTcaptype}% +\caption@setoptions{longtable}% +\caption@setoptions{@longtable}% +\caption@LT@setup% +\refstepcounter{\LTcaptype}% +\let\captionlistentry\LWR@LTcaptionlistentry% +\LWR@tabular{#2} +} +{\endLWR@tabular\LWR@floatend} + +% \end{macrocode} +% \end{environment} + +% Provided for compatibility, but ignored: +% \begin{macrocode} +\newcounter{LTchunksize} +\def\endhead{\LWR@tabularendofline}% throws away options //[dim] and //* +\def\endfirsthead{\LWR@tabularendofline} +\def\endfoot{\LWR@tabularendofline} +\def\endlastfoot{\LWR@tabularendofline} +\newcommand\tabularnewline{\LWR@tabularendofline} +\newcommand{\setlongtables}{}% Obsolete command, does nothing. +\newlength{\LTleft} +\newlength{\LTright} +\newlength{\LTpre} +\newlength{\LTpost} +\newlength{\LTcapwidth} +% \end{macrocode} +% |\kill| is ignored, place a |\kill| line inside \\ +% \hspace*{2em}|\begin{warpprint}| \ldots |\end{warpprint}| +% or \cs{warpingprintonly}. +% \begin{macrocode} +\renewcommand*{\kill}{\LWR@tabularendofline} +% \end{macrocode} + +% \iffalse +%</longtable> +% \fi + + + + +% \clearpage + +% \iffalse +%<*ltcaption> +% \fi + +% \part{lwarp-ltcaption.sty} + +% \section{Ltcaption} +% \label{sec:ltcaption} +% +% +% \DescribePackage{ltcaption} +% \pkg{ltcaption} is emulated during \acro{HTML} output, and +% the \pkg{ltcaption} package is ignored. + +% \changes{v0.20}{2017/01/29}{\pkg{ltcaption}: Added.} + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{ltcaption} +% \end{macrocode} + +% +% \cs{LTcaptype} is already defined by \pkg{lwarp}. +% +% \env{longtable*} is already defined by \pkg{lwarp-longtable}. +% +% \begin{macrocode} +\newlength{\LTcapskip} +\newlength{\LTcapleft} +\newlength{\LTcapright} +\newcommand*{\LTcapmarginsfalse}{} +% \end{macrocode} + + +% \iffalse +%</ltcaption> +% \fi + + + +% \clearpage + +% \iffalse +%<*mdframed> +% \fi + +% \part{lwarp-mdframed.sty} + +% \section{Mdframed} +% \label{sec:mdframed} +% +% +% \DescribePackage{mdframed} +% \pkg{mdframed} is loaded with options forced to +% |framemethod=none|. +% +% \changes{v0.17}{2016/04/14}{\pkg{mdframed}: Added.} +% +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{mdframed} +% \end{macrocode} +% +% +% +% \limitsmdframed +% +% Environments created or encapsulated by \pkg{mdframed} are enclosed in a +% \margintag{CSS classes} +% |div| of class |md<environmentname>|, or |mdframed| otherwise. +% +% Frame titles are placed into a |span| of class |mdframedtitle|. +% Subtitles are in a |span| of class |mdframedsubtitle|, and likewise for subsubtitles. +% +% Pre-existing hooks are used to patch extra functions before and after the frames. +% + +% \pkg{amsthm} must be loaded before \pkg{mdframed} +% \begin{macrocode} +\LWR@origRequirePackage{amsthm} +% \end{macrocode} +% +% Do not require \tikz{} or pstricks: +% \begin{macrocode} +\LWR@origRequirePackage[framemethod=none]{mdframed} +% \end{macrocode} +% +% ^^A \DescribeMacro{\mdfsetup} +% To handle CSS and paragraphs, +% patch code at start and end of environment and contents: +% \begin{macrocode} +\mdfsetup{ +startcode={\LWR@mdframedstart}, +endcode={\LWR@mdframedend}, +startinnercode={\LWR@startpars}, +endinnercode={\LWR@stoppars}, +} +% \end{macrocode} +% +% +% ^^A \begin{macro}{\LWR@mdfprintcolor} \marg{mdfcolorkey} +% +% Given the \pkg{mdframed} key, print the color. +% \begin{macrocode} +\newcommand*{\LWR@mdfprintcolor}[1]{% +\convertcolorspec{named}{\csuse{mdf@#1}}{HTML}\LWR@tempcolor% +\#\LWR@tempcolor +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\LWR@mdfprintlength} \marg{mdflengthkey} +% +% Given the \pkg{mdframed} key, print the length. +% \begin{macrocode} +\newcommand*{\LWR@mdfprintlength}[1]{% +\rndprintlength{\csuse{mdf@#1@length}} +} +% \end{macrocode} +% ^^A \end{macro} + +% +% ^^A \begin{macro}{\LWR@mdframedstart} +% Actions before an mdframe starts. +% +% Encapsulate a frame inside a |div| of the desired |class|. +% \begin{macrocode} +\newcommand*{\LWR@mdframedstart}{% +% \end{macrocode} +% Turn off paragraph handling during the generation of +% the encapsulating tags: +% \begin{macrocode} +\LWR@stoppars% +% \end{macrocode} +% Below, print HTML pt units: +% \begin{macrocode} +\uselengthunit{PT}% +% \end{macrocode} +% Open a |div| and with custom |class| and custom |style|: +% \begin{macrocode} +\LWR@htmltagc{div class="\LWR@mdthisenv" \LWR@orignewline +style=" \LWR@orignewline +% \end{macrocode} +% Convert and print the background color: +% \begin{macrocode} +background: \LWR@mdfprintcolor{backgroundcolor} ; \LWR@orignewline +% \end{macrocode} +% Convert and print the border color and width: +% \begin{macrocode} +border: \LWR@mdfprintlength{linewidth} solid +\LWR@mdfprintcolor{linecolor} ; \LWR@orignewline +% \end{macrocode} +% Convert and print the border radius: +% \begin{macrocode} +border-radius: \LWR@mdfprintlength{roundcorner} ; \LWR@orignewline +% \end{macrocode} +% Convert and print the shadow: +% \begin{macrocode} +\ifbool{mdf@shadow}{% +box-shadow: +\LWR@mdfprintlength{shadowsize} +\LWR@mdfprintlength{shadowsize} +\LWR@mdfprintlength{shadowsize} +\LWR@mdfprintcolor{shadowcolor} ; +} +{box-shadow: none ;} +\LWR@orignewline +% \end{macrocode} +% \begin{macrocode} +"} +% \LWR@htmldivclass{\LWR@mdthisenv} +% \end{macrocode} +% \env{mdframed} environment may not work with the modified \cs{hspace} and \cs{rule}, +% so restore them to their originals while inside \env{mdframed}: +% \begin{macrocode} +\let\hspace\LWR@orighspace% +\let\rule\LWR@origrule% +} +% \end{macrocode} +% ^^A \end{macro} +% +% ^^A \begin{macro}{\LWR@mdframedend} +% Actions after an mdframe ends. +% +% After closing the |div|, globally restore to the default environment type: +% \begin{macrocode} +\newcommand*{\LWR@mdframedend}{ +% \end{macrocode} +% Close the custom |div|: +% \begin{macrocode} +\LWR@htmldivclassend{\LWR@mdthisenv} +% \end{macrocode} +% Reset future custom class to the default: +% \begin{macrocode} +\gdef\LWR@mdthisenv{mdframed} +% \end{macrocode} +% Resume paragraph handling: +% \begin{macrocode} +\LWR@startpars% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\mdfframedtitleenv} \marg{title} +% +% Encapsulation of the original which places the title +% inside a |span| of class |mdframedtitle|: +% \begin{macrocode} +\let\LWR@origmdfframedtitleenv\mdfframedtitleenv + +\newlength{\LWR@titleroundcorner} + +\renewrobustcmd\mdfframedtitleenv[1]{% +\LWR@origmdfframedtitleenv{% +% \end{macrocode} +% Below, print HTML pt lengths: +% \begin{macrocode} +\uselengthunit{PT}% +% \end{macrocode} +% Open a |span| with a custom |class| and custom |style|: +% \begin{macrocode} +\LWR@htmltagc{span class="mdframedtitle" \LWR@orignewline +style=" \LWR@orignewline +% \end{macrocode} +% Convert and print the title background color: +% \begin{macrocode} +background: +\LWR@mdfprintcolor{frametitlebackgroundcolor} +; \LWR@orignewline +% \end{macrocode} +% Convert and print the title rule: +% \begin{macrocode} +\ifbool{mdf@frametitlerule}{% +border-bottom: +\LWR@mdfprintlength{frametitlerulewidth} +solid +\LWR@mdfprintcolor{frametitlerulecolor} +; \LWR@orignewline +}{}% +% \end{macrocode} +% The title's top border radius is adjusted for the line width: +% \begin{macrocode} +border-radius: +\setlength{\LWR@titleroundcorner} + {\maxof{\mdf@roundcorner@length-\mdf@linewidth@length}{0pt}} + \rndprintlength{\LWR@titleroundcorner} + \rndprintlength{\LWR@titleroundcorner} + 0pt 0pt + \LWR@orignewline +% \end{macrocode} +% Finish the custom style and the opening span tag: +% \begin{macrocode} +" \LWR@orignewline +}% span +% \end{macrocode} +% Restrict paragraph tags inside a span: +% \begin{macrocode} +\begin{LWR@nestspan}% +% \end{macrocode} +% Print the title inside the span: +% \begin{macrocode} +#1% +% \end{macrocode} +% Closee the span and unnest the paragraph tag restriction: +% \begin{macrocode} +\LWR@htmltagc{/span}% +\end{LWR@nestspan}% +} +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\LWR@mdfsubtitlecommon} \marg{sub -or subsub} \oarg{options} \marg{title} +% +% Common code for \cs{LWR@mdfsubtitle} and \cs{LWR@mdfsubsubtitle}. +% +% Encapsulate the subtitle inside a |span| of class |mdframedsubtitle|: +% \begin{macrocode} +\NewDocumentCommand{\LWR@mdfsubtitlecommon}{m o m} +{% the following empty line is required + +% \end{macrocode} +% Special handling for mdframed: +% Subtitles have \cs{par}s around them, +% so temporarily disable them here. +% \begin{macrocode} +\let\par\LWR@origpar% +% \end{macrocode} +% Open a |span| with a custom |class| and custom |style|: +% \begin{macrocode} +\LWR@htmltagc{span class="mdframed#1title" +style=" \LWR@orignewline +% \end{macrocode} +% Convert and print the background color: +% \begin{macrocode} +background: +\LWR@mdfprintcolor{#1titlebackgroundcolor} +; \LWR@orignewline +% \end{macrocode} +% Convert and print the above line: +% \begin{macrocode} +\ifbool{mdf@#1titleaboveline}{% +border-top: +\LWR@mdfprintlength{#1titleabovelinewidth} +solid +\LWR@mdfprintcolor{#1titleabovelinecolor} +; \LWR@orignewline +}{}% +% \end{macrocode} +% Convert and print the below line: +% \begin{macrocode} +\ifbool{mdf@#1titlebelowline}{% +border-bottom: +\LWR@mdfprintlength{#1titlebelowlinewidth} +solid +\LWR@mdfprintcolor{#1titlebelowlinecolor} +; \LWR@orignewline +}{}% +% \end{macrocode} +% Finish the custom style and the opening span tag: +% \begin{macrocode} +"}% span +% \end{macrocode} +% Restrict paragraph tags inside a span: +% \begin{macrocode} +\begin{LWR@nestspan}% +% \end{macrocode} +% Perform the original subtitle action: +% \begin{macrocode} +\IfNoValueTF{#2} +{\csuse{LWR@origmdf#1title}{#3}}% +{\csuse{LWR@origmdf#1title}[#2]{#3}}% +% \end{macrocode} +% Close the span and unnest the paragraph tag restriction: +% \begin{macrocode} +\LWR@htmltagc{/span}% the following empty line is required +\end{LWR@nestspan}% must follow the /span or an extra <p> appears + +} +% \end{macrocode} +% ^^A \end{macro} +% +% ^^A \begin{macro}{\LWR@mdfsubtitle} \oarg{options} \marg{title} +% \begin{macrocode} +\let\LWR@origmdfsubtitle\mdfsubtitle + +\newcommand*{\LWR@mdfsubtitle}{% +\LWR@mdfsubtitlecommon{sub}% +} +\let\mdfsubtitle\LWR@mdfsubtitle +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\LWR@mdfsubsubtitle} \oarg{options} \marg{title} +% \begin{macrocode} +\let\LWR@origmdfsubsubtitle\mdfsubsubtitle + +\newcommand*{\LWR@mdfsubsubtitle}{% +\LWR@mdfsubtitlecommon{subsub}% +} +\let\mdfsubsubtitle\LWR@mdfsubsubtitle +% \end{macrocode} +% ^^A \end{macro} +% +% +% +% ^^A \begin{macro}{\LWR@mdthisenv} +% Stores the environment of the frame about to be created: +% \begin{macrocode} +\newcommand*{\LWR@mdthisenv}{mdframed} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\newmdenv} \oarg{options} \marg{env-name} +% +% Modified from the original to remember the environment. +% \begin{macrocode} +\renewrobustcmd*\newmdenv[2][]{% +\newenvironment{#2}% +{% +\mdfsetup{#1}% +\renewcommand*{\LWR@mdthisenv}{md#2}% +\begin{mdframed}% +} +{\end{mdframed}}% +} +% \end{macrocode} +% ^^A \end{macro} +% +% ^^A \begin{macro}{\surroundwithmdframed} \oarg{options} \marg{environment} +% +% Modified from the original to remember the environment. +% \begin{macrocode} +\renewrobustcmd*{\surroundwithmdframed}[2][]{% +\BeforeBeginEnvironment{#2}{% +\renewcommand*{\LWR@mdthisenv}{md#2}% +\begin{mdframed}[#1]}% +\AfterEndEnvironment{#2}{\end{mdframed}}% +} +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\mdtheorem} \oarg{mdframed-options}{envname} +% \oarg{numberedlike} \marg{caption} \oarg{within} +% +% Modified from the original to remember the environment. +% \begin{macrocode} +\let\LWR@origmdtheorem\mdtheorem + +\DeclareDocumentCommand{\LWR@mdtheorem}{O{} m o m o}{% +\LWR@origmdtheorem[#1]{#2}[#3]{#4}[#5]% +\BeforeBeginEnvironment{#2}{\renewcommand*{\LWR@mdthisenv}{md#2}}% +} + +\let\mdtheorem\LWR@mdtheorem +% \end{macrocode} +% ^^A \end{macro} +% +% +% ^^A \begin{macro}{\newmdtheoremenv} \oarg{mdframed-options}{envname} +% \oarg{numberedlike} \marg{caption} \oarg{within} +% +% Modified from the original to remember the environment. +% \begin{macrocode} +\DeclareDocumentCommand\newmdtheoremenv{O{} m o m o }{% + \ifboolexpr{ test {\IfNoValueTF {#3}} and test {\IfNoValueTF {#5}} }% + {\newtheorem{#2}{#4}}{% + \IfValueTF{#3}{\newtheorem{#2}[#3]{#4}}{}% + \IfValueTF{#5}{\newtheorem{#2}{#4}[#5]}{}% + }% +\BeforeBeginEnvironment{#2}{% +\renewcommand*{\LWR@mdthisenv}{md#2}% +\begin{mdframed}[#1]}% +\AfterEndEnvironment{#2}{% +\end{mdframed}}% +} +% \end{macrocode} +% ^^A \end{macro} + +% \iffalse +%</mdframed> +% \fi + + + + +% \clearpage + +% \iffalse +%<*microtype> +% \fi + +% \part{lwarp-microtype.sty} + +% \section{Microtype} +% +% \DescribePackage{microtype} +% \pkg{microtype} is pre-loaded by \pkg{lwarp}. +% All user options and macros are ignored and disabled. + +% \changes{v0.20}{2017/01/03}{\pkg{microtype}: User-interface emulated.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-microtype}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{microtype} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*\DeclareMicrotypeSet[3][]{} +\newcommand*\UseMicrotypeSet[2][]{} +\newcommand*\DeclareMicrotypeSetDefault[2][]{} +\newcommand*\SetProtrusion[3][]{} +\newcommand*\SetExpansion[3][]{} +\newcommand*\SetTracking[3][]{} +\newcommand*\SetExtraKerning[3][]{} +\newcommand*\SetExtraSpacing[3][]{} +\newcommand*\DisableLigatures[2][]{} +\newcommand*\DeclareCharacterInheritance[3][]{} +\newcommand*\DeclareMicrotypeVariants[1]{} +\newcommand*\DeclareMicrotypeAlias[2]{} +\newcommand*\LoadMicrotypeFile[1]{} +\newcommand*\DeclareMicrotypeBabelHook[2]{} +\newcommand*\microtypesetup[1]{} +\newcommand*\microtypecontext[1]{} +\newcommand*\textmicrotypecontext[2]{#2} +\@ifpackageloaded{letterspace}{\let\MT@textls\relax}{% +\newcommand*\lsstyle{} +\newcommand\textls[2][]{} +\def\textls#1#{} +\newcommand*\lslig[1]{#1} +} +\def\DeclareMicrotypeSet#1#{\@gobbletwo} +\def\DeclareMicrotypeVariants#1#{\@gobble} +\@onlypreamble\DeclareMicrotypeSet +\@onlypreamble\UseMicrotypeSet +\@onlypreamble\DeclareMicrotypeSetDefault +\@onlypreamble\DisableLigatures +\@onlypreamble\DeclareMicrotypeVariants +\@onlypreamble\DeclareMicrotypeBabelHook +% \end{macrocode} + +% \iffalse +%</microtype> +% \fi + + + +% \clearpage + +% \iffalse +%<*multicol> +% \fi + +% \part{lwarp-multicol.sty} + +% \section{Multicol} +% \label{sec:multicol} +% +% +% \DescribePackage{multicol} +% \pkg{multicol} is emulated during \acro{HTML} output, and +% the \pkg{multicol} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{multicol}[2015/09/13] +% \end{macrocode} + + + +% Multicols are converted into a 1--3 column display, browser-supported. + +% The optional multicols heading is placed inside a |div| of class |multicolsheading|. + +% The content is placed inside a |div| of class |multicols|. + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% ^^A \begin{environment}{multicols} * \marg{numcols} \oarg{heading} +% \begin{macrocode} +\NewDocumentEnvironment{multicols}{s m o} +% \end{macrocode} +% \acro{HTML} div class to contain everything: +% \begin{macrocode} +{\BlockClass{multicols} +% \end{macrocode} +% Optional \acro{HTML} div class for the heading: +% \begin{macrocode} +\IfValueTF{#3}{\begin{BlockClass}{multicolsheading}#3\end{BlockClass}}{}} +% \end{macrocode} +% When done with the environment, close the div: +% \begin{macrocode} +{\endBlockClass} +% \end{macrocode} +% ^^A \end{environment} + +% Emulated null functions which are not used in \acro{HTML}: +% \begin{macrocode} +\newcommand*{\columnbreak}{} +\newcommand*{\RLmulticolcolumns}{} +\newcommand*{\LRmulticolcolumns}{} + +\newlength{\premulticols} +\newlength{\postmulticols} +\newlength{\multicolsep} +\newlength{\multicolbaselineskip} +\newlength{\multicoltolerance} +\newlength{\multicolpretolerance} +\newcommand*{\columnseprulecolor}{\normalcolor} +\newcounter{columnbadness} +\newcounter{finalcolumnbadness} +\newcounter{collectmore} +\newcounter{unbalance} +\newlength{\multicolovershoot} +\newlength{\multicolundershoot} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + +% \iffalse +%</multicol> +% \fi + + + + + +% \clearpage + +% \iffalse +%<*multirow> +% \fi + +% \part{lwarp-multirow.sty} + +% \section{Multirow} +% \label{sec:multirow} +% +% \DescribePackage{multirow} +% \pkg{multirow} is emulated during \acro{HTML} output, and +% the \pkg{multirow} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{multirow} +% \end{macrocode} + +% \iffalse +%</multirow> +% \fi + + + + +% \iffalse +%<*needspace> +% \fi + +% \part{lwarp-needspace.sty} + +% \section{Needspace} +% +% \DescribePackage{needspace} +% \pkg{needspace} is not used during HTML conversion. +% +% \changes{v0.20}{2016/12/22}{\pkg{needspace}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-needspace}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{needspace} + +\newcommand*{\needspace}[1]{} +\DeclareDocumentCommand{\Needspace}{s m}{} +% \end{macrocode} + +% \iffalse +%</needspace> +% \fi + + + + +% \iffalse +%<*nowidow> +% \fi + +% \part{lwarp-nowidow.sty} + +% \section{Nowidow} +% +% \DescribePackage{nowidow} +% \pkg{nowidow} is not used during HTML conversion. +% +% \changes{v0.20}{2017/01/03}{\pkg{nowidow}: Added.} +% +% \codehtml + +% Discard all options for \pkg{lwarp-nowidow}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{nowidow} +% \end{macrocode} + +% ^^A \begin{macro}{\nowidow} \oarg{lines} +% ^^A \begin{macro}{\setnowidow} \oarg{lines} +% \begin{macrocode} +\newcommand*{\nowidow}[1][]{} +\newcommand*{\setnowidow}[1][]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\noclub} \oarg{lines} +% ^^A \begin{macro}{\setnoclub} \oarg{lines} +% \begin{macrocode} +\newcommand*{\noclub}[1][]{} +\newcommand*{\setnoclub}[1][]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% \iffalse +%</nowidow> +% \fi + + + + + +% \iffalse +%<*pagenote> +% \fi + +% \part{lwarp-pagenote.sty} + +% \section{Pagenote} +% +% \DescribePackage{pagenote} +% \pkg{pagenote} is used by \pkg{lwarp}, +% and its user-interface macros have been nullified. +% +% Both footnotes and pagenotes appear as footnotes in the \acro{HTML} output. +% +% Any manipulation of \pkg{pagenote} in the user's document after +% the preamble should be encased within a \env{warpprint} environment. +% +% \changes{v0.20}{2017/01/11}{\pkg{pagenote}: Added.} +% +% \codehtml + +% Discard all options for \pkg{lwarp-pagenote}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{pagenote} +% \end{macrocode} +% +% \cs{pagenote} is already modified to work with \pkg{lwarp}. +% +% \begin{macrocode} +\renewcommand*{\makepagenote}{} +\RenewDocumentCommand{\printnotes}{s}{} +\renewcommand{\printnotes}[2][]{} +\renewcommand{\addtonotes}[1]{} +% \end{macrocode} + + +% \iffalse +%</pagenote> +% \fi + + + + +% \clearpage +% +% \iffalse +%<*placeins> +% \fi +% +% \part{lwarp-placeins.sty} +% +% \section{Placeins} +% +% \DescribePackage{placeins} +% \pkg{placeins} is not used during HTML conversion. +% +% \changes{v0.20}{2017/01/19}{\pkg{placeins}: Added.} +% +% \codehtml + +% Discard all options for \pkg{lwarp-placeins}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{placeins} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*{\FloatBarrier}{} +% \end{macrocode} + +% \iffalse +%</placeins> +% \fi + + + + +% \clearpage +% +% \iffalse +%<*ragged2e> +% \fi +% +% \part{lwarp-ragged2e.sty} +% +% \section{Ragged2e} +% +% \DescribePackage{ragged2e} +% \pkg{ragged2e} is not used during HTML conversion. +% +% \changes{v0.20}{2017/01/19}{\pkg{ragged2e}: Added.} +% +% \codehtml + +% Discard all options for \pkg{lwarp-ragged2e}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{ragged2e} +% \end{macrocode} + +% \begin{macrocode} +\newcommand*{\Centering}{\centering} +\newcommand*{\RaggedLeft}{\raggedleft} +\newcommand*{\RaggedRight}{\raggedright} +\newcommand*{\justifying}{} +\newlength{\CenteringLeftskip} +\newlength{\RaggedLeftLeftskip} +\newlength{\RaggedRightLeftskip} +\newlength{\CenteringRightskip} +\newlength{\RaggedLeftRightskip} +\newlength{\RaggedRightRightskip} +\newlength{\CenteringParfillskip} +\newlength{\RaggedLeftParfillskip} +\newlength{\RaggedRightParfillskip} +\newlength{\JustifyingParfillskip} +\newlength{\CenteringParindent} +\newlength{\RaggedLeftParindent} +\newlength{\RaggedRightParindent} +\newlength{\JustifyingParindent} +\newenvironment*{Center}{\center}{\endcenter} +\newenvironment*{FlushLeft}{\flushleft}{\endflushleft} +\newenvironment*{FlushRight}{\flushright}{\endflushright} +\newenvironment*{justify}{\justifying}{\endjustifying} +% \end{macrocode} + + +% \iffalse +%</ragged2e> +% \fi + + + + +% \clearpage + +% \iffalse +%<*rotating> +% \fi + +% \part{lwarp-rotating.sty} + +% \section{Rotating} +% +% \DescribePackage{rotating} +% \pkg{rotating} is emulated during \acro{HTML} output, and +% the \pkg{rotating} package is ignored. +% +% \textcolor{red}{This code is untested.} +% +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{rotating} +% \end{macrocode} + +% \begin{macrocode} +\let\sidewaystable\table +\let\endsidewaystable\endtable + +\let\sidewaysfigure\figure +\let\endsidewaysfigure\endfigure + +\newenvironment*{sideways}{}{} +\newenvironment*{turn}[1]{}{} +\newenvironment*{rotate}[1]{}{} +\NewDocumentCommand{\turnbox}{m +m}{#2} +\let\rotcaption\caption +\let\@makerotcaption\@makecaption +% \end{macrocode} + + +% \iffalse +%</rotating> +% \fi + + + + + +% \iffalse +%<*setspace> +% \fi + +% \part{lwarp-setspace.sty} + +% \section{Setspace} +% +% \DescribePackage{setspace} +% \pkg{setspace} is not used during HTML conversion. +% +% \changes{v0.20}{2016/12/22}{\pkg{setspace}: Improved support.} +% +% \codehtml + +% Discard all options for \pkg{lwarp-setspace}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{setspace} + +\newcommand*{\setstretch}[1]{} +\newcommand*{\SetSinglespace}[1]{} +\newcommand*{\singlespacing}{} +\newcommand*{\onehalfspacing}{} +\newcommand*{\doublespacing}{} + +\newenvironment*{singlespace} +{\BlockClass{singlespace}} +{\endBlockClass} + +\newenvironment*{singlespace*} +{\BlockClass{singlespace}} +{\endBlockClass} + +\newenvironment*{spacing}[1]{ + +}{ + +} + +\newenvironment*{onehalfspace} +{\BlockClass{onehalfspace}} +{\endBlockClass} + +\newenvironment*{doublespace} +{\BlockClass{doublespace}} +{\endBlockClass} +% \end{macrocode} + +% \iffalse +%</setspace> +% \fi + + + + + +% \iffalse +%<*textpos> +% \fi + +% \part{lwarp-textpos.sty} + +% \section{Textpos} +% \label{sec:textpos} +% +% \changes{v0.20}{2017/01/11}{\pkg{textpos}: Added.} +% +% \DescribePackage{textpos} +% \pkg{textpos} is emulated during \acro{HTML} output, and +% the \pkg{textpos} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{textpos} +% \end{macrocode} + +% \codehtml +% \begin{macrocode} +\NewDocumentEnvironment{textblock}{m r()}{}{} +\NewDocumentEnvironment{textblock*}{m o r()}{}{} +\newcommand*{\TPGrid}[3][]{} +\NewDocumentCommand{\TPMargin}{s o}{} +\newcommand*{\textblockcolour}[1]{} +\newcommand*{\textblockrulecolour}[1]{} +\newcommand*{\textblockcolor}[1]{} +\newcommand*{\textblockrulecolor}[1]{} +\newcommand*{\tekstblokkulur}[1]{} +\newcommand*{\tekstblokrulekulur}[1]{} +\newlength{\TPHorizModule} +\newlength{\TPVertModule} +\newlength{\TPboxrulesize} +\newcommand{\textblocklabel}[1]{} +\newcommand*{\showtextsize}{} +\newcommand{\textblockorigin}[2]{} +% \end{macrocode} + +% \iffalse +%</textpos> +% \fi + + + + +% \clearpage + +% \iffalse +%<*threeparttable> +% \fi + +% \part{lwarp-threeparttable.sty} + +% \section{Threeparttable} +% \label{sec:threeparttable} +% +% +% \DescribePackage{threeparttable} +% \pkg{threeparttable} is emulated during \acro{HTML} output, and +% the \pkg{threeparttable} package is ignored. + +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackageDrop{threeparttable} +% \end{macrocode} + + + +% ^^A \begin{macro}{\LWR@printtablenote} \marg{text} +% +% Prints the table note item header inside a \acro{CSS} class of |tnoteitemheader|. +% \begin{macrocode} +\newcommand{\LWR@printtablenote}[1]{\InlineClass{tnoteitemheader}{#1}} +% \end{macrocode} +% ^^A \end{macro} + + + +% ^^A \begin{environment}{threeparttable} \oarg{alignment} +% To emulate threeparttable: +% \begin{macrocode} +\newenvironment*{threeparttable}[1][b]{}{} +% \end{macrocode} +% ^^A \end{environment} + +% ^^A \begin{environment}{tablenotes} \oarg{options} +% \changes{v0.19}{2016/06/01}{CSS for table note item.} +% \begin{macrocode} +\newenvironment*{tablenotes}[1][] +{% +\BlockClass{tnotes}% +\setlist[description]{format=\LWR@printtablenote}% +\description% +} +{% +\enddescription% +\endBlockClass% +} +% \end{macrocode} +% ^^A \end{environment} +% ^^A \begin{macro}{\tnote} +% \begin{macrocode} +\newcommand{\tnote}[1]{\textsuperscript{#1}} +% \end{macrocode} +% ^^A \end{macro} + +% \iffalse +%</threeparttable> +% \fi + + + + +% \clearpage + +% \iffalse +%<*titleps> +% \fi + +% \part{lwarp-titleps.sty} + +% \section{Titleps} +% +% \DescribePackage{titleps} +% \pkg{titleps} is loaded and used by \pkg{lwarp} during \acro{HTML} output. +% All user options and macros are ignored and disabled. + +% \changes{v0.20}{2017/01/03}{\pkg{titleps}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-titleps}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{titleps} +% \end{macrocode} +% +% \cs{pagestyle} and \cs{thispagestyle} are already disabled in the \pkg{lwarp} code. +% +% ^^A \begin{macro}{\newpagestyle} \marg{name} \oarg{style} \marg{commands} +% ^^A \begin{macro}{\renewpagestyle} \marg{name} \oarg{style} \marg{commands} +% \begin{macrocode} +\RenewDocumentCommand{\newpagestyle}{m o m}{} +\RenewDocumentCommand{\renewpagestyle}{m o m}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\sethead} \oarg{el} \oarg{ec} \oarg{er} \marg{ol} \marg{oc} \marg{or} +% ^^A \begin{macro}{\setfoot} \oarg{el} \oarg{ec} \oarg{er} \marg{ol} \marg{oc} \marg{or} +% \begin{macrocode} +\RenewDocumentCommand{\sethead}{o o o m m m}{} +\RenewDocumentCommand{\setfoot}{o o o m m m}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\settitlemarks} * \marg{names} +% \begin{macrocode} +\RenewDocumentCommand{\settitlemarks}{s m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\headrule} +% ^^A \begin{macro}{\footrule} +% \begin{macrocode} +\renewcommand*{\headrule}{} +\renewcommand*{\footrule}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\setheadrule} \marg{length} +% ^^A \begin{macro}{\setfootrule} \marg{length} +% \begin{macrocode} +\renewcommand*{\setheadrule}[1]{} +\renewcommand*{\setfootrule}[1]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\makeheadrule} +% ^^A \begin{macro}{\makefootrule} +% \begin{macrocode} +\newcommand*{\makeheadrule}{} +\newcommand*{\makefootrule}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\setmarkboth} \marg{code} +% \begin{macrocode} +\renewcommand{\setmarkboth}[1]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\widenhead} +% \begin{macrocode} +\RenewDocumentCommand{\widenhead}{s o o m m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\bottitlemarks} +% ^^A \begin{macro}{\toptitlemarks} +% ^^A \begin{macro}{\firsttitlemarks} +% ^^A \begin{macro}{\nexttitlemarks} +% ^^A \begin{macro}{\outertitlemarks} +% ^^A \begin{macro}{\innertitlemarks} +% \begin{macrocode} +\renewcommand*{\bottitlemarks}{} +\renewcommand*{\toptitlemarks}{} +\renewcommand*{\firsttitlemarks}{} +\renewcommand*{\nexttoptitlemarks}{} +\renewcommand*{\outertitlemarks}{} +\renewcommand*{\innertitlemarks}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\newtitlemark} * \marg{name} +% \begin{macrocode} +\RenewDocumentCommand{\newtitlemark}{s m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\pretitlemark} * \marg{section} \marg{text} +% \begin{macrocode} +\RenewDocumentCommand{\pretitlemark}{s m m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\ifsamemark} \marg{group} \marg{command} \marg{true} \marg{false} +% \begin{macrocode} +\renewcommand{\ifsamemark}[4]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\setfloathead} * \oarg{.} \oarg{.} \oarg{.} \marg{.} \marg{.} \marg{.} \marg{extra} \oarg{which} +% ^^A \begin{macro}{\setfloatfoot} * \oarg{.} \oarg{.} \oarg{.} \marg{.} \marg{.} \marg{.} \marg{extra} \oarg{which} +% \begin{macrocode} +\NewDocumentCommand{\setfloathead}{s o o o m m m m m}{} +\NewDocumentCommand{\setfloatfoot}{s o o o m m m m m}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\nextfloathead} * \oarg{.} \oarg{.} \oarg{.} \marg{.} \marg{.} \marg{.} \marg{extra} \oarg{which} +% ^^A \begin{macro}{\nextfloatfoot} * \oarg{.} \oarg{.} \oarg{.} \marg{.} \marg{.} \marg{.} \marg{extra} \oarg{which} +% \begin{macrocode} +\NewDocumentCommand{\nextfloathead}{s o o o m m m m m}{} +\NewDocumentCommand{\nextfloatfoot}{s o o o m m m m m}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\newmarkset} \marg{markset} +% \begin{macrocode} +\newcommand{\newmarkset}[1]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\newextramark} * \marg{markset} \marg{macro-name} +% \begin{macrocode} +\NewDocumentCommand{\newextramarkset}{s m m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\botextramarks} \marg{markset} +% ^^A \begin{macro}{\topextramarks} \marg{markset} +% ^^A \begin{macro}{\firstextramarks} \marg{markset} +% ^^A \begin{macro}{\nextextramarks} \marg{markset} +% ^^A \begin{macro}{\outerextramarks} \marg{markset} +% ^^A \begin{macro}{\innerextramarks} \marg{markset} +% \begin{macrocode} +\newcommand{\botextramarks}[1]{} +\newcommand{\topextramarks}[1]{} +\newcommand{\firstextramarks}[1]{} +\newcommand{\nexttopextramarks}[1]{} +\newcommand{\outerextramarks}[1]{} +\newcommand{\innerextramarks}[1]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% \iffalse +%</titleps> +% \fi + + + + +% \clearpage + +% \iffalse +%<*titlesec> +% \fi + +% \part{lwarp-titlesec.sty} + +% \section{Titlesec} +% +% \DescribePackage{titlesec} +% \pkg{titlesec} is emulated. +% All user options and macros are ignored and disabled. + +% \changes{v0.20}{2017/01/03}{\pkg{titlesec}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-titlesec}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{titlesec} +% \end{macrocode} + +% ^^A \begin{macro}{\titlelabel} \marg{label-format} +% \begin{macrocode} +\newcommand*{\titlelabel}[1]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\titleformat*} \marg{command} \marg{format} +% +% ^^A \begin{macro}{\titleformat} \marg{command} \oarg{shape} \marg{format} +% ^^A \marg{label} \marg{sep} \marg{begfore} \oarg{after} +% \begin{macrocode} +\newcommand\titleformat{% + \@ifstar{\ttl@format@s}% + {\ttl@format@i}} +\newcommand{\ttl@format@s}[1]{} +\NewDocumentCommand{\ttl@format@i}{m o m m m m o}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\chaptertitlename} +% \begin{macrocode} +\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{} +\newcommand\chaptertitlename{\@chapapp} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\titlespacing} * \marg{command} \marg{left} \marg{before} \marg{after} \oarg{right} +% +% \begin{macrocode} +\NewDocumentCommand{\titlespacing}{s m m m m o}{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\filright} +% ^^A \begin{macro}{\filcenter} +% ^^A \begin{macro}{\filleft} +% ^^A \begin{macro}{\fillast} +% ^^A \begin{macro}{\filinner} +% ^^A \begin{macro}{\filouter} +% \begin{macrocode} +\newcommand*{\filright}{} +\newcommand*{\filcenter}{} +\newcommand*{\filleft}{} +\newcommand*{\fillast}{} +\newcommand*{\filinner}{} +\newcommand*{\filouter}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\wordsep} +% \begin{macrocode} +\newcommand\wordsep{\fontdimen\tw@\font \@plus + \fontdimen\thr@@\font \@minus \fontdimen4\font} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\titleline} * \oarg{align} \marg{material} +% \begin{macrocode} +\NewDocumentCommand{\titleline}{s o m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\titlerule} \oarg{height} +% \begin{macrocode} +\providecommand*\titlerule{\@ifstar{\ttl@row}{\ttl@rule}} +\newcommand*{\ttl@rule}[1][]{} +\newcommand*{\ttl@row}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\iftitlemeasuring} \marg{true} \marg{false} +% \begin{macrocode} +\newcommand{\iftitlemeasuring}[2]{#2} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\assignpagestyle} \marg{command} \marg{pagestyle} +% \begin{macrocode} +\newcommand{\assignpagestyle}[2]{#2} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\titleclass} \marg{name} \oarg{startlevel} \marg{class} \oarg{cmd} +% \begin{macrocode} +\NewDocumentCommand{\titleclass}{m o m o} +% \end{macrocode} +% ^^A \end{macro} + +% \iffalse +%</titlesec> +% \fi + + + + + +% \clearpage + +% \iffalse +%<*titletoc> +% \fi + +% \part{lwarp-titletoc.sty} + +% \section{Titletoc} +% +% \DescribePackage{titletoc} +% \pkg{titletoc} is emulated. +% All user options and macros are ignored and disabled. + +% \changes{v0.20}{2017/01/03}{\pkg{titletoc}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-titletoc}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{titletoc} +% \end{macrocode} +% + +% ^^A \begin{macro}{\dottedcontents} \marg{section} \oarg{left} \marg{above} \marg{label} \marg{leader} +% \begin{macrocode} +\NewDocumentCommand{\dottedcontents}{m o m m m}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\titlecontents} * \marg{section} \oarg{left} \marg{above} +% ^^A \marg{numbered} \marg{numberless} \marg{filler} +% ^^A \oarg{below or begin} \oarg{separator} \oarg{end} +% \begin{macrocode} +\newcommand{\titlecontents}{\@ifstar{\ttl@tcstar}{\ttl@tcnostar}} +\NewDocumentCommand{\ttl@tcstar}{m o m m m m o o o}{} +\NewDocumentCommand{\ttl@tcnostar}{m o m m m m o}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\contentsmargin} \oarg{correction} \marg{right} +% \begin{macrocode} +\newcommand{\contentsmargin}[2][]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\thecontentslabel} +% ^^A \begin{macro}{\thecontentspage} +% \begin{macrocode} +\newcommand*{\thecontentslabel}{thecontentslabel} +\newcommand*{\thecontentspage}{thecontentspage} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\contentslabel} \oarg{format} \marg{space} +% ^^A \begin{macro}{\contentspage} \oarg{format} +% \begin{macrocode} +\newcommand{\contentslabel}[2][]{\thecontentslabel} +\newcommand{\contentspage}[1][]{\thecontentspage} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\contentspush} \marg{text} +% \begin{macrocode} +\newcommand{\contentspush}[1]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\contentsuse} \marg{name} \marg{text} +% \begin{macrocode} +\newcommand{\contentsuse}[2]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\startcontents} \oarg{name} +% ^^A \begin{macro}{\stopcontents} \oarg{name} +% ^^A \begin{macro}{\resumecontents} \oarg{name} +% \begin{macrocode} +\newcommand*{\startcontents}[1][]{} +\newcommand*{\stopcontents}[1][]{} +\newcommand*{\resumecontents}[1][]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\printcontents} \oarg{name} \marg{prefix} \marg{start} \marg{code} +% \begin{macrocode} +\newcommand{\printcontents}[4][]{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\startlist} \oarg{name} \marg{list} +% ^^A \begin{macro}{\stoplist} \oarg{name} \marg{list} +% ^^A \begin{macro}{\resumelist} \oarg{name} \marg{list} +% \begin{macrocode} +\newcommand{\startlist}[2][]{} +\newcommand{\stoplist}[2][]{} +\newcommand{\resumelist}[2][]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\printlist} \oarg{name} \marg{list} \marg{prefix} \marg{code} +% \begin{macrocode} +\newcommand{\printlist}[4][]{} +% \end{macrocode} +% ^^A \end{macro} + + +% \iffalse +%</titletoc> +% \fi + + + + +% \clearpage + +% \iffalse +%<*titling> +% \fi + +% \part{lwarp-titling.sty} + +% \section{Titling} +% +% \DescribePackage{titling} +% \pkg{titling} is used by \pkg{lwarp}. +% The following patches are not needed by \pkg{lwarp}, +% but are required if the user requests \pkg{titling}. +% +% \pkg{lwarp} uses page notes for footnotes, so the various +% \pkg{titling} footnote restyling commands have no effect. +% +% \changes{v0.20}{2017/01/22}{\pkg{titling}: Improved compatibility.} +% +% \codehtml +% +% Pass all options to \pkg{lwarp-titling}: +% \begin{macrocode} +\LWR@ProvidesPackagePass{titling} +% \end{macrocode} +% +% +% Patch \cs{@bsmtitlempty}: +% \begin{macrocode} +\let\LWR@orig@bsmtitlempty\@bsmtitlempty +\renewcommand*{\@bsmtitlempty}{% +\LWR@orig@bsmtitlempty% +\global\let\published\relax% +\global\let\subtitle\relax% +} +% \end{macrocode} +% +% +% Patch \cs{keepthetitle}: +% \begin{macrocode} +\let\LWR@origkeepthetitle\keepthetitle +\renewcommand*{\keepthetitle}{% +\LWR@orig@keepthetitle% +\global\let\@published\@empty% +\global\let\@subtitle\@empty% +} +% \end{macrocode} +% +% +% Patch \cs{killtitle}: +% \begin{macrocode} +\let\LWR@origkilltitle\killtitle +\renewcommand*{\killtitle}{% +\LWR@orig@killtitle% +\global\let\thepublished\relax% +\global\let\thesubtitle\relax% +} +% \end{macrocode} +% +% +% \iffalse +%</titling> +% \fi + + + + + +% \clearpage + +% \iffalse +%<*tocloft> +% \fi + +% \part{lwarp-tocloft.sty} + +% \section{Tocloft} +% +% \DescribePackage{tocloft} +% \pkg{tocloft} is emulated. +% Most user options and macros are ignored and disabled. +% \cs{newlistof} and \cs{cftchapterprecis} are supported. + +% \changes{v0.20}{2017/01/03}{\pkg{tocloft}: Added.} +% +% \codehtml +% +% Discard all options for \pkg{lwarp-tocloft}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{tocloft} +% \end{macrocode} +% + +% ^^A \begin{macro}{\tocloftpagestyle} \marg{style} +% \begin{macrocode} +\newcommand{\tocloftpagestyle}[1]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\cftmarktoc} +% ^^A \begin{macro}{\cfttoctitlefont} +% ^^A \begin{macro}{\cftaftertoctitle} +% \begin{macrocode} +\newcommand*{\cftmarktoc}{} +\newcommand*{\cfttoctitlefont}{} +\newcommand*{\cftaftertoctitle}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% \begin{macrocode} +\newlength{\cftbeforetoctitleskip} +\newlength{\cftaftertoctitleskip} +% \end{macrocode} + + +% ^^A \begin{macro}{\cftmarklof} +% ^^A \begin{macro}{\cftloftitlefont} +% ^^A \begin{macro}{\cftafterloftitle} +% \begin{macrocode} +\newcommand*{\cftmarklof}{} +\newcommand*{\cftloftitlefont}{} +\newcommand*{\cftafterloftitle}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% \begin{macrocode} +\newlength{\cftbeforeloftitleskip} +\newlength{\cftafterloftitleskip} +% \end{macrocode} + + +% ^^A \begin{macro}{\cftmarklot} +% ^^A \begin{macro}{\cftlottitlefont} +% ^^A \begin{macro}{\cftafterlottitle} +% \begin{macrocode} +\newcommand*{\cftmarklot}{} +\newcommand*{\cftlottitlefont}{} +\newcommand*{\cftafterlottitle}{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% \begin{macrocode} +\newlength{\cftbeforelottitleskip} +\newlength{\cftafterlottitleskip} +% \end{macrocode} + + +% ^^A \begin{macro}{\cftdot} +% ^^A \begin{macro}{\cftdotsep} +% ^^A \begin{macro}{\cftnodots} +% \begin{macrocode} +\newcommand*{\cftdot}{.} +\providecommand*{\cftdotsep}{1} +\newcommand*{\cftnodots}{5000} + +\providecommand{\cftdotfill}[1]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\cftsetpnumwidth} \marg{length} +% ^^A \begin{macro}{\cftsetrmarg} \marg{length} +% \begin{macrocode} +\newcommand*{\cftsetpnumwidth}[1]{} +\newcommand*{\cftsetrmarg}[1]{} +% \end{macrocode} +% ^^A \end{macro} +% ^^A \end{macro} + +% ^^A \begin{macro}{\cftpnumalign} \marg{alignment} +% \begin{macrocode} +\newcommand*{\cftpnumalign}[1]{} +% \end{macrocode} +% ^^A \end{macro} + +% \begin{macrocode} +\newlength{\cftparskip} +% \end{macrocode} + + + +% \begin{macrocode} +\newlength{\cftbeforepartskip} +\newlength{\cftpartindent} +\newlength{\cftpartnumwidth} +\newcommand*{\cftpartfont}{} +\newcommand*{\cftpartpresnum}{} +\newcommand*{\cftpartaftersnum}{} +\newcommand*{\cftpartaftersnumb}{} +\newcommand*{\cftpartleader}{} +\newcommand*{\cftpartdotsep}{1} +\newcommand*{\cftpartpagefont}{} +\newcommand*{\cftpartafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforechapskip} +\newlength{\cftchapindent} +\newlength{\cftchapnumwidth} +\newcommand*{\cftchapfont}{} +\newcommand*{\cftchappresnum}{} +\newcommand*{\cftchapaftersnum}{} +\newcommand*{\cftchapaftersnumb}{} +\newcommand*{\cftchapleader}{} +\newcommand*{\cftchapdotsep}{1} +\newcommand*{\cftchappagefont}{} +\newcommand*{\cftchapafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforesecskip} +\newlength{\cftsecindent} +\newlength{\cftsecnumwidth} +\newcommand*{\cftsecfont}{} +\newcommand*{\cftsecpresnum}{} +\newcommand*{\cftsecaftersnum}{} +\newcommand*{\cftsecaftersnumb}{} +\newcommand*{\cftsecleader}{} +\newcommand*{\cftsecdotsep}{1} +\newcommand*{\cftsecpagefont}{} +\newcommand*{\cftsecafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforesubsecskip} +\newlength{\cftsubsecindent} +\newlength{\cftsubsecnumwidth} +\newcommand*{\cftsubsecfont}{} +\newcommand*{\cftsubsecpresnum}{} +\newcommand*{\cftsubsecaftersnum}{} +\newcommand*{\cftsubsecaftersnumb}{} +\newcommand*{\cftsubsecleader}{} +\newcommand*{\cftsubsecdotsep}{1} +\newcommand*{\cftsubsecpagefont}{} +\newcommand*{\cftsubsecafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforesubsubsecskip} +\newlength{\cftsubsubsecindent} +\newlength{\cftsubsubsecnumwidth} +\newcommand*{\cftsubsubsecfont}{} +\newcommand*{\cftsubsubsecpresnum}{} +\newcommand*{\cftsubsubsecaftersnum}{} +\newcommand*{\cftsubsubsecaftersnumb}{} +\newcommand*{\cftsubsubsecleader}{} +\newcommand*{\cftsubsubsecdotsep}{1} +\newcommand*{\cftsubsubsecpagefont}{} +\newcommand*{\cftsubsubsecafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforeparaskip} +\newlength{\cftparaindent} +\newlength{\cftparanumwidth} +\newcommand*{\cftparafont}{} +\newcommand*{\cftparapresnum}{} +\newcommand*{\cftparaaftersnum}{} +\newcommand*{\cftparaaftersnumb}{} +\newcommand*{\cftparaleader}{} +\newcommand*{\cftparadotsep}{1} +\newcommand*{\cftparapagefont}{} +\newcommand*{\cftparaafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforesubparaskip} +\newlength{\cftsubparaindent} +\newlength{\cftsubparanumwidth} +\newcommand*{\cftsubparafont}{} +\newcommand*{\cftsubparapresnum}{} +\newcommand*{\cftsubparaaftersnum}{} +\newcommand*{\cftsubparaaftersnumb}{} +\newcommand*{\cftsubparaleader}{} +\newcommand*{\cftsubparadotsep}{1} +\newcommand*{\cftsubparapagefont}{} +\newcommand*{\cftsubparaafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforefigskip} +\newlength{\cftfigindent} +\newlength{\cftfignumwidth} +\newcommand*{\cftfigfont}{} +\newcommand*{\cftfigpresnum}{} +\newcommand*{\cftfigaftersnum}{} +\newcommand*{\cftfigaftersnumb}{} +\newcommand*{\cftfigleader}{} +\newcommand*{\cftfigdotsep}{1} +\newcommand*{\cftfigpagefont}{} +\newcommand*{\cftfigafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforesubfigskip} +\newlength{\cftsubfigindent} +\newlength{\cftsubfignumwidth} +\newcommand*{\cftsubfigfont}{} +\newcommand*{\cftsubfigpresnum}{} +\newcommand*{\cftsubfigaftersnum}{} +\newcommand*{\cftsubfigaftersnumb}{} +\newcommand*{\cftsubfigleader}{} +\newcommand*{\cftsubfigdotsep}{1} +\newcommand*{\cftsubfigpagefont}{} +\newcommand*{\cftsubfigafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforetabskip} +\newlength{\cfttabindent} +\newlength{\cfttabnumwidth} +\newcommand*{\cfttabfont}{} +\newcommand*{\cfttabpresnum}{} +\newcommand*{\cfttabaftersnum}{} +\newcommand*{\cfttabaftersnumb}{} +\newcommand*{\cfttableader}{} +\newcommand*{\cfttabdotsep}{1} +\newcommand*{\cfttabpagefont}{} +\newcommand*{\cfttabafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newlength{\cftbeforesubtabskip} +\newlength{\cftsubtabindent} +\newlength{\cftsubtabnumwidth} +\newcommand*{\cftsubtabfont}{} +\newcommand*{\cftsubtabpresnum}{} +\newcommand*{\cftsubtabaftersnum}{} +\newcommand*{\cftsubtabaftersnumb}{} +\newcommand*{\cftsubtableader}{} +\newcommand*{\cftsubtabdotsep}{1} +\newcommand*{\cftsubtabpagefont}{} +\newcommand*{\cftsubtabafterpnum}{} +% \end{macrocode} + +% \begin{macrocode} +\newcommand{\cftsetindents}[3]{} +% \end{macrocode} + +% \begin{macrocode} +\newcommand{\pagenumbersoff}[1]{} +\newcommand{\pagenumberson}[1]{} +% \end{macrocode} + + +% ^^A \begin{macro}{\newlistof} \oarg{within} \marg{type} \marg{ext} \marg{listofname} +% +% Emulated through the \cs{newfloat} mechanism. +% \begin{macrocode} +\NewDocumentCommand{\newlistof}{o m m m} +{% +\IfValueTF{#1} +{\newfloat{#2}{tbp}{#3}[#1]} +{\newfloat{#2}{tbp}{#3}} +\@namedef{listof#2}{\listof{#2}{#4}} +\@namedef{#2depth}{1} +\expandafter\newlength\csuse{cftbefore#2skip} +\expandafter\newlength\csuse{cft#2indent} +\expandafter\newlength\csuse{cft#2numwidth} +\@namedef{cft#2font}{} +\@namedef{cft#2presnum}{} +\@namedef{cft#2aftersnum}{} +\@namedef{cft#2aftersnumb}{} +\@namedef{cft#2leader}{} +\@namedef{cft#2dotsep}{1} +\@namedef{cft#2pagefont}{} +\@namedef{cft#2afterpnum}{} +} +% \end{macrocode} +% ^^A \end{macro} + + +% \cs{cftchapterprecis} from \pkg{tocloft}: +% \begin{macrocode} +\newcommand{\cftchapterprecis}[1]{% + \cftchapterprecishere{#1} + \cftchapterprecistoc{#1}} +\newcommand{\cftchapterprecishere}[1]{% + \begin{quote}\textit{#1}\end{quote}} +\newcommand{\cftchapterprecistoc}[1]{ + \addtocontents{toc}{% + { + \protect\begin{quote}#1\protect\end{quote}} + } +} +% \end{macrocode} + +% \iffalse +%</tocloft> +% \fi + + + + + + +% \clearpage + +% \iffalse +%<*trivfloat> +% \fi + +% \part{lwarp-trivfloat.sty} + +% \section{Trivfloat} +% \label{sec:trivfloat} +% +% \DescribePackage{trivfloat} +% \pkg{trivfloat} is forced to use the built-in \pkg{lwarp} +% emulation for floats. + +% \codehtml + +% Discard all options for \pkg{lwarp-trivfloat}: +% \begin{macrocode} +\LWR@ProvidesPackageDrop{trivfloat} +\LWR@origRequirePackage{trivfloat} +% \end{macrocode} + +% +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% Package \pkg{trivfloat} is supported via the \pkg{lwarp} emulation of \pkg{float}. +% For \acro{HTML} usage, use only |\usepackage{trivfloat}|, without any options, +% \watchout +% which tells \pkg{trivfloat} to use the emulated \pkg{float} functions instead +% of using \pkg{floatrow} or \pkg{memoir}. + +% ^^A \DescribeMacro{\trivfloat} \marg{type} +% +% To create a new float type and change its name: +% \begin{Verbatim}[gobble=2,frame=lines,obeytabs,tabsize=4] +% \trivfloat{example} +% \renewcommand{\examplename}{Example Name} +% \crefname{example}{example}{examples} +% \Crefname{example}{Example}{Examples} +% \end{Verbatim} +% +% +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + +% \DescribeMacro{\tfl@chapter@fix} +% Nullified at the beginning of the document. +% Is used by \pkg{trivfloat} to correct float chapter numbers, +% but is not needed for \pkg{lwarp}. + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + +% \begin{macrocode} +\AtBeginDocument{\DeclareDocumentCommand{\tfl@chapter@fix}{m m}{}} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + + +% \subsection{Combining \cs{newfloat}, \cs{trivfloat}, and \pkg{algorithmicx}} +% \label{sec:combiningfloats} +% \index{newfloat>with trivfloat, algorithmic} +% \index{trivfloat>with newfloat, algorithmic} +% \index{algorithmic>with newfloat, trivfloat} +% +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + +% \textcolor{red}{For both print and HTML output:} +% +% When using \pkg{float}, \pkg{trivfloat}, or \pkg{algorithmicx} at the same time, +% be aware of conflicting file usage. +% \watchout +% \pkg{algorithmicx} uses |.loa|. +% \pkg{trivfloat} by default starts with |.loa| and goes up for additional floats, +% skipping |.lof| and |.lot|. +% +% When using \cs{newfloat}, +% \watchout +% be sure to manually assign higher letters to the \cs{newfloat} +% files to avoid |.loa| used by \pkg{algorithmicx}, and any files used by \pkg{trivfloat}. +% Also avoid using |.lof| and |.lot|. +% +% When using \cs{trivfloat}, you may force it to avoid conflicting with +% \watchout +% \pkg{algorithmicx} by starting \pkg{trivfloat}'s file extensions with |.lob|: +% +% \begin{docsidebar} +% \cs{makeatletter} \\ +% \cs{setcounter\{tfl\@float\@cnt\}\{1\}} \% start trivfloats with .lob \\ +% \cs{makeatletter} +% \end{docsidebar} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + +% \iffalse +%</trivfloat> +% \fi + + + + + + +% \iffalse +%<*wallpaper> +% \fi + +% \part{lwarp-wallpaper.sty} + +% \section{Wallpaper} +% \label{sec:wallpaper} +% +% \changes{v0.20}{2017/01/11}{\pkg{wallpaper}: Added.} +% +% \DescribePackage{wallpaper} +% \pkg{wallpaper} is emulated during \acro{HTML} output, and +% the \pkg{wallpaper} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{wallpaper} +% \end{macrocode} + +% \codehtml +% \begin{macrocode} +\newcommand*{\CenterWallPaper}[2]{} +\newcommand*{\ThisCenterWallPaper}[2]{} +\newcommand*{\TileWallPaper}[3]{} +\newcommand*{\ThisTileWallPaper}[3]{} +\newcommand*{\TileSquareWallPaper}[2]{} +\newcommand*{\ThisTileSquareWallPaper}[2]{} +\newcommand*{\ULCornerWallPaper}[2]{} +\newcommand*{\ThisULCornerWallPaper}[2]{} +\newcommand*{\LLCornerWallPaper}[2]{} +\newcommand*{\ThisLLCornerWallPaper}[2]{} +\newcommand*{\URCornerWallPaper}[2]{} +\newcommand*{\ThisURCornerWallPaper}[2]{} +\newcommand*{\LRCornerWallPaper}[2]{} +\newcommand*{\ThisLRCornerWallPaper}[2]{} +\newcommand*{\ClearWallPaper}{} +\newlength{\wpXoffset} +\newlength{\wpYoffset} +% \end{macrocode} + +% \iffalse +%</wallpaper> +% \fi + + + + + +% \iffalse +%<*wrapfig> +% \fi + +% \part{lwarp-wrapfig.sty} + +% \section{Wrapfig} +% \label{sec:wrapfig} +% +% \changes{v0.20}{2017/01/11}{\pkg{wrapfig}: Added.} +% +% \DescribePackage{wrapfig} +% \pkg{wrapfig} is emulated during \acro{HTML} output, and +% the \pkg{wrapfig} package is ignored. + +% \begin{macrocode} +\LWR@ProvidesPackageDrop{wrapfig} +% \end{macrocode} + +% \codehtml + + +% Computed width of a wrapped object. +% Used to print the \acro{HTML} style. +% \begin{macrocode} +\newlength{\LWR@wrapwidth} +% \end{macrocode} + + +% \begin{macrocode} + +\newcommand*{\LWR@wrapposition}{} + +\newcommand*{\LWR@subwrapfigure}[2]{% +\LWR@maybeincthisfloat% +\renewcommand*{\LWR@wrapposition}{}% +\ifthenelse{% +\equal{#1}{r}\OR\equal{#1}{R}\OR% +\equal{#1}{o}\OR\equal{#1}{O}% +}% +{\renewcommand*{\LWR@wrapposition}{float:right}}% +{\renewcommand*{\LWR@wrapposition}{float:left}}% +\setlength{\LWR@wrapwidth}{#2}% +\addtolength{\LWR@wrapwidth}{4em}% +\uselengthunit{PT}% +% \BlockClass{marginblock}[% +% width:\rndprintlength{\LWR@wrapwidth} ; % +% \LWR@wrapposition% +% ]% +\LWR@stoppars% +\LWR@htmltag{div class="marginblock" id="autofloat-\arabic{LWR@thisfloat}" +style="width:\rndprintlength{\LWR@wrapwidth} ; % +\LWR@wrapposition"% +} +\LWR@startpars +} + + +\NewDocumentEnvironment{wrapfigure}{o m o m} +{% +\LWR@subwrapfigure{#2}{#4}% +\captionsetup{type=figure}% +} +{ +\LWR@htmldivclassend{div} +} + + +\NewDocumentEnvironment{wraptable}{o m o m} +{% +\LWR@subwrapfigure{#2}{#4}% +\captionsetup{type=table}% +} +{ +\LWR@htmldivclassend{div} +} + + +\NewDocumentEnvironment{wrapfloat}{m o m o m} +{% +\LWR@subwrapfigure{#3}{#5}% +\captionsetup{type=#1}% +} +{ +\LWR@htmldivclassend{div} +} + +\newlength{\wrapoverhang} +% \end{macrocode} + +% \iffalse +%</wrapfig> +% \fi + + + + + +% \clearpage + +% \iffalse +%<*xcolor> +% \fi + +% \part{lwarp-xcolor.sty} + +% \section{Xcolor} +% +% \DescribePackage{xcolor} +% +% \limitsxcolor + +% \codehtml +% +% \begin{macrocode} +\LWR@ProvidesPackagePass{xcolor} +% \end{macrocode} + + +% ^^A \begin{macro}{\LWR@tempcolor} The color converted to \acro{HTML} colorspace. +% \begin{macrocode} +\newcommand*{\LWR@tempcolor}{} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\LWR@currenttextcolor} The color to use for text and \cs{rule}, +% defaulting to black. +% \begin{macrocode} +\newcommand*{\LWR@currenttextcolor}{black} +% \end{macrocode} +% ^^A \end{macro} + + + +% ^^A \begin{macro}{\LWR@colorstyle} \marg{1: styletext} \marg{2: model} +% ^^A \marg{3: color} \marg{4: spancontents} +% +% \changes{v0.19}{2016/06/01}{Supports colored \cs{rule}.} +% +% Creates a styled span with a color converted to \acro{HTML} hex colorspace. +% Uses |LWR@spandepth| to prevent paragraph tags inside the span. +% If used for \cs{textcolor}, with a styletext of |color:|, then the new color is +% copied into \\ \cs{LWR@currenttextcolor} for possible re-use in \cs{rule}. +% \begin{macrocode} +\NewDocumentCommand{\LWR@colorstyle}{m m m +m}{% +% \end{macrocode} +% Use the \pkg{xcolor} package to convert to an \acro{HTML} color space: +% \begin{macrocode} +\convertcolorspec{#2}{#3}{HTML}\LWR@tempcolor% +% \end{macrocode} +% If is a \cs{textcolor}, save a copy of this color for use by \cs{rule}: +% \begin{macrocode} +\ifthenelse{\equal{#1}{color:}}% +{\renewcommand*{\LWR@currenttextcolor}{\#\LWR@tempcolor}}{}% +% \end{macrocode} +% Create the \acro{HTML} |span| with the styled color: +% \begin{macrocode} +\LWR@htmltagc{span style="#1\#\LWR@tempcolor"{}}% +\begin{LWR@nestspan}% +% \end{macrocode} +% Prevent additional paragraph tags inside this span: +% \begin{macrocode} +% \end{macrocode} +% Print the contents then close the span: +% \begin{macrocode} +#4% +\LWR@htmltagc{/span}% +\end{LWR@nestspan}% +% \end{macrocode} +% For paragraph-tag handling: +% \begin{macrocode} +\LWR@ensuredoingapar% +} +% \end{macrocode} +% ^^A \end{macro} + + +% \DescribeMacro{\color} appears in the \LaTeX{} \acro{PDF} output, but is ignored by +% |pdftotext| and thus is ignored in the \acro{HTML} file. Text styling by local group +% is not yet supported. + +% Each of the following macros is given a temporary name, and is |\let| to the final +% name once the \acro{HTML} conversion starts. + +% ^^A \begin{macro}{\textcolor} \oarg{model} \marg{color} \marg{text} +% +% is converted into an \acro{HTML} hex color span. +% \begin{macrocode} +\NewDocumentCommand{\LWR@textcolor}{O{named} m +m}{% +\begingroup% +\LWR@colorstyle{color:}{#1}{#2}{#3}% +\endgroup% +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\pagecolor} \oarg{model} \marg{color} +% +% Ignored. Use |\NewCSS| instead. +% \begin{macrocode} +\newcommand*{\LWR@pagecolor}[2][named]{} +% \end{macrocode} +% ^^A \end{macro} + + +% ^^A \begin{macro}{\colorbox} \oarg{model} \marg{color} \marg{text} +% +% is converted into an \acro{HTML} hex background color span. +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@colorbox}{O{named} m m}{% +\begingroup% +\LWR@colorstyle{background:}{#1}{#2}{#3}% +\endgroup% +} +% \end{macrocode} +% ^^A \end{macro} + +% ^^A \begin{macro}{\fcolorbox} +% \oarg{framemodel} \marg{framecolor} \oarg{boxmodel} \marg{boxcolor} \marg{text} +% +% is converted into a framed \acro{HTML} hex background color span. +% +% \begin{macrocode} +\NewDocumentCommand{\LWR@fcolorbox}{O{named} m O{named} m m}{% +\begingroup% +\LWR@colorstyle{border:1px solid }{#1}{#2}% +{\LWR@colorstyle{background:}{#3}{#4}{#5}}% +\endgroup% +} +% \end{macrocode} +% ^^A \end{macro} + + +% \iffalse +%</xcolor> +% \fi + + + + + + + + + + + + +% \clearpage + +% \iffalse +%<*xfrac> +% \fi + +% \part{lwarp-xfrac.sty} + +% \section{Xfrac} +% \label{sec:xfrac} +% +% \DescribePackage{xfrac} Supported by adding \pkg{xfrac} instances. +% +% \codehtml +% \begin{macrocode} +\LWR@ProvidesPackagePass{xfrac} +% \end{macrocode} + +% In the user's document preamble, \pkg{lwarp} should be loaded +% after font-related setup. +% \watchout[font size] +% During \acro{HTML} conversion, this font is used by \pkg{lwarp} +% to generate its initial \acro{PDF} output containing \acro{HTML} tags, +% later to be converted by |pdftotext| to a plain text file. +% While the text may be in any font which |pdftotext| can read, the math is +% directly converted into \acro{SVG} images using this same user-selected font. +% |xfrac| below is set for the Latin Modern (lmr) font. +% If another font is used, it may be desirable to redefine +% \cs{xfracHTMLfontsize} with a different em size. + + + + +% \DescribeMacro{\sfrac} \oarg{instance} \marg{num} \oarg{sep} \marg{denom} +% +% A text-mode instance for the default font is provided below. +% The numerator and denominator formats are adjusted to encase everything +% in \acro{HTML} tags. \cs{scalebox} is made null inside the numerator and +% denominator, since the \acro{HTML} tags should not be scaled, and we do not +% want to introduce additional \acro{HTML} tags for scaling. +% +% In math mode, which will appear inside a \env{lateximage}, no adjustments +% are necessary. + +% \codeall +% \begin{macrocode} +\begin{warpall} +% \end{macrocode} + + +% ^^A \begin{macro}{\xfracHTMLfontsize} +% \changes{v0.19}{2016/06/06}{Added.} +% \index{font>size --- xfrac} +% User-redefinable macro which controls the font size of the fraction. +% \begin{macrocode} +\newcommand*{\xfracHTMLfontsize}{.6em} +% \end{macrocode} +% ^^A \end{macro} + +% \begin{macrocode} +\end{warpall} +% \end{macrocode} + + +% \codehtml +% \begin{macrocode} +\begin{warpHTML} +% \end{macrocode} + + +% A span for a small font, used in the numerator and denominator: +% \margintag{font size} +% \begin{macrocode} +\newcommand*{\LWR@htmlsmallfontstart}{% +\LWR@htmltagc{span style="font-size:\xfracHTMLfontsize"{}}% +\LWR@nestspan% +% +} + +\newcommand*{\LWR@htmlsmallfontend}{% +\LWR@htmltagc{/span}% +\endLWR@nestspan% +} +% \end{macrocode} +% A nullified \cs{scalebox} command, to avoid introducing \acro{HTML} scaling tags: +% \margintag{\cs{scalebox}} +% \begin{macrocode} +\NewDocumentCommand{\LWR@noscalebox}{m o m}{#3} +% \end{macrocode} + +% Instances of \pkg{xfrac} for various font choices: +% \margintag{instances} +% +% Produce \acro{HTML} tags for a small superscript numerator and +% a small (non-subscript) denominator. +% +% Scaling is turned off so that \cmds{pdftotext} correctly reads the result. +% +% \changes{v0.16}{2016/04/07}{xfrac: Adjusted for the use of any font:} +% \begin{macrocode} +\DeclareInstance{xfrac}{default}{text}{ +numerator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart\textsuperscript{#1}\,\LWR@htmlsmallfontend}, +denominator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart{}\,#1\LWR@htmlsmallfontend}, +% \end{macrocode} +% For |pdftotext|, do not scale the text: +% \begin{macrocode} +scaling = false +} +\DeclareInstance{xfrac}{lmr}{text}{ +numerator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart\textsuperscript{#1}\,\LWR@htmlsmallfontend}, +denominator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart{}\,#1\LWR@htmlsmallfontend}, +% \end{macrocode} +% For |pdftotext|, do not scale the text: +% \begin{macrocode} +scaling = false +} +\DeclareInstance{xfrac}{lmss}{text}{ +numerator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart\textsuperscript{#1}\,\LWR@htmlsmallfontend}, +denominator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart{}\,#1\LWR@htmlsmallfontend}, +% \end{macrocode} +% For |pdftotext|, do not scale the text: +% \begin{macrocode} +scaling = false +} +\DeclareInstance{xfrac}{lmtt}{text}{ +numerator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart\textsuperscript{#1}\,\LWR@htmlsmallfontend}, +denominator-format = {% +\let\scalebox\LWR@noscalebox% +\LWR@htmlsmallfontstart{}\,#1\LWR@htmlsmallfontend}, +% \end{macrocode} +% For |pdftotext|, do not scale the text: +% \begin{macrocode} +scaling = false +} +% \end{macrocode} + +% \begin{macrocode} +\end{warpHTML} +% \end{macrocode} + +% \iffalse +%</xfrac> +% \fi + + + + + + + + + + + +% \clearpage +% \renewcommand*{\partname}{} +% \renewcommand*{\thepart}{} +% \part{Change History and Index} +% \label{sec:changehistory} +% +% \pagestyle{plain} +% +% \Finale + + + + + +\endinput + + + + + diff --git a/Master/texmf-dist/source/latex/lwarp/lwarp.ins b/Master/texmf-dist/source/latex/lwarp/lwarp.ins new file mode 100644 index 00000000000..0226e02107e --- /dev/null +++ b/Master/texmf-dist/source/latex/lwarp/lwarp.ins @@ -0,0 +1,92 @@ +%% lwarp.ins +%% Copyright 2016 Brian Dunn +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Brian Dunn. +%% +%% This work consists of the files lwarp.dtx and lwarp.ins +%% and the derived file lwarp.sty. +\input docstrip.tex +\keepsilent +%% \usedir{tex/latex/ package } +\preamble +This is a generated file. +Copyright 2016 Brian Dunn + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. +\endpreamble +\askforoverwritefalse +\generate{\file{lwarp.sty}{\from{lwarp.dtx}{package}}} +\generate{\file{lwarp-newproject.sty}{\from{lwarp.dtx}{lwarp-newproject}}} +\generate{\file{lwarp-afterpage.sty}{\from{lwarp.dtx}{afterpage}}} +\generate{\file{lwarp-algorithmicx.sty}{\from{lwarp.dtx}{algorithmicx}}} +\generate{\file{lwarp-alltt.sty}{\from{lwarp.dtx}{alltt}}} +\generate{\file{lwarp-bookmark.sty}{\from{lwarp.dtx}{bookmark}}} +\generate{\file{lwarp-booktabs.sty}{\from{lwarp.dtx}{booktabs}}} +\generate{\file{lwarp-draftwatermark.sty}{\from{lwarp.dtx}{draftwatermark}}} +\generate{\file{lwarp-epigraph.sty}{\from{lwarp.dtx}{epigraph}}} +\generate{\file{lwarp-eso-pic.sty}{\from{lwarp.dtx}{eso-pic}}} +\generate{\file{lwarp-everypage.sty}{\from{lwarp.dtx}{everypage}}} +\generate{\file{lwarp-extramarks.sty}{\from{lwarp.dtx}{extramarks}}} +\generate{\file{lwarp-fancyhdr.sty}{\from{lwarp.dtx}{fancyhdr}}} +\generate{\file{lwarp-float.sty}{\from{lwarp.dtx}{float}}} +\generate{\file{lwarp-floatrow.sty}{\from{lwarp.dtx}{floatrow}}} +\generate{\file{lwarp-geometry.sty}{\from{lwarp.dtx}{geometry}}} +\generate{\file{lwarp-graphicx.sty}{\from{lwarp.dtx}{graphicx}}} +\generate{\file{lwarp-graphics.sty}{\from{lwarp.dtx}{graphics}}} +\generate{\file{lwarp-hyperref.sty}{\from{lwarp.dtx}{hyperref}}} +\generate{\file{lwarp-keyfloat.sty}{\from{lwarp.dtx}{keyfloat}}} +\generate{\file{lwarp-letterspace.sty}{\from{lwarp.dtx}{letterspace}}} +\generate{\file{lwarp-listings.sty}{\from{lwarp.dtx}{listings}}} +\generate{\file{lwarp-longtable.sty}{\from{lwarp.dtx}{longtable}}} +\generate{\file{lwarp-ltcaption.sty}{\from{lwarp.dtx}{ltcaption}}} +\generate{\file{lwarp-mdframed.sty}{\from{lwarp.dtx}{mdframed}}} +\generate{\file{lwarp-microtype.sty}{\from{lwarp.dtx}{microtype}}} +\generate{\file{lwarp-multicol.sty}{\from{lwarp.dtx}{multicol}}} +\generate{\file{lwarp-multirow.sty}{\from{lwarp.dtx}{multirow}}} +\generate{\file{lwarp-needspace.sty}{\from{lwarp.dtx}{needspace}}} +\generate{\file{lwarp-nowidow.sty}{\from{lwarp.dtx}{nowidow}}} +\generate{\file{lwarp-pagenote.sty}{\from{lwarp.dtx}{pagenote}}} +\generate{\file{lwarp-placeins.sty}{\from{lwarp.dtx}{placeins}}} +\generate{\file{lwarp-ragged2e.sty}{\from{lwarp.dtx}{ragged2e}}} +\generate{\file{lwarp-rotating.sty}{\from{lwarp.dtx}{rotating}}} +\generate{\file{lwarp-setspace.sty}{\from{lwarp.dtx}{setspace}}} +\generate{\file{lwarp-textpos.sty}{\from{lwarp.dtx}{textpos}}} +\generate{\file{lwarp-threeparttable.sty}{\from{lwarp.dtx}{threeparttable}}} +\generate{\file{lwarp-titleps.sty}{\from{lwarp.dtx}{titleps}}} +\generate{\file{lwarp-titlesec.sty}{\from{lwarp.dtx}{titlesec}}} +\generate{\file{lwarp-titletoc.sty}{\from{lwarp.dtx}{titletoc}}} +\generate{\file{lwarp-tocloft.sty}{\from{lwarp.dtx}{tocloft}}} +\generate{\file{lwarp-trivfloat.sty}{\from{lwarp.dtx}{trivfloat}}} +\generate{\file{lwarp-wallpaper.sty}{\from{lwarp.dtx}{wallpaper}}} +\generate{\file{lwarp-wrapfig.sty}{\from{lwarp.dtx}{wrapfig}}} +\generate{\file{lwarp-xcolor.sty}{\from{lwarp.dtx}{xcolor}}} +\generate{\file{lwarp-xfrac.sty}{\from{lwarp.dtx}{xfrac}}} +\Msg{*********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the} +\Msg{* following file into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space lwarp.sty, lwarp-*.sty} +\Msg{*} +\Msg{* To produce the documentation run the file lwarp.dtx} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*********************************************************} +\endbatchfile |