diff options
author | Norbert Preining <norbert@preining.info> | 2021-05-12 03:01:15 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-05-12 03:01:15 +0000 |
commit | bcdf6c829c6761de02484473ebe43fa3760adcaa (patch) | |
tree | de384ae80a1a9e34f900739a9478f92a0660a9ef /support/TeX4ht/source/tex4ht-sty.tex | |
parent | 4a8a25f4c6acac624cf323115db94d934b19d6b1 (diff) |
CTAN sync 202105120301
Diffstat (limited to 'support/TeX4ht/source/tex4ht-sty.tex')
-rw-r--r-- | support/TeX4ht/source/tex4ht-sty.tex | 11285 |
1 files changed, 11285 insertions, 0 deletions
diff --git a/support/TeX4ht/source/tex4ht-sty.tex b/support/TeX4ht/source/tex4ht-sty.tex new file mode 100644 index 0000000000..58e9879626 --- /dev/null +++ b/support/TeX4ht/source/tex4ht-sty.tex @@ -0,0 +1,11285 @@ +% $Id: tex4ht-sty.tex 893 2021-03-06 00:10:06Z michal_h21 $ +% tex tex4ht-sty or ht tex tex4ht-sty +% +% Copyright 2009-2020 TeX Users Group +% Copyright 1996-2009 Eitan M. Gurari +% Released under LPPL 1.3c+. +% See tex4ht-cpright.tex for license text. + +\input common +\input DraTex.sty +\input AlDraTex.sty + +\DrawOff + +\writesixteen{----------Verify length of lines!!!!------------} +\writesixteen{----------Verify length of lines!!!!------------} +\writesixteen{----------Verify length of lines!!!!------------} +\writesixteen{----------Verify length of lines!!!!------------} + + +\newif\ifalprotex \alprotexfalse + +\hbadness=10000 \vbadness=10000 \hfuzz=99in \vfuzz=99in + + +\def\Link#1\EndLink{} + +\openin15=./tex4ht.sty + \ifeof15 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% replacement for TeX4ht %%%%%%%%%%%%%%%%%% +\writesixteen{........dvi mode} +\csname newif\endcsname\ifHtml \Htmlfalse +\def\-#1{\ifx#1-\expandafter\TEMP\else\expandafter#1\fi} +\expandafter\let\csname bye\endcsname=\end +\def\TEMP#1/#2/#3/{} +\def\HTable#1{} +\def\'#1'{} +\def\`#1'{} +\let\TableOfContents=\relax +\def\Part#1{} +\def\Chapter#1{} +\def\Appendix#1{} +\def\Section#1{} +\def\SubSection#1{} +\def\Margin#1{} +\def\HCode#1{} +\def\LinkPort#1\EndLink{} +\def\EndLink{} +\expandafter\let\csname bye\endcsname=\end +\def\TagSec#1{} +\def\RefSec#1{} +\def\List#1{} \let\ShortList=\List +\def\EndList{} +\def\item{} +\expandafter\let\expandafter\ifOption\csname iffalse\endcsname +\let\IgnorePar\empty +\let\EndP\empty +\catcode`\:=11 +\def\Verb{\bgroup \catcode`\^=10 \catcode`\\=10 \catcode`\%=10 + \catcode`\{=10 \catcode`\}=10 \catcode`\#=10 \catcode`\#=10 + \leavevmode \:ctgs} +\def\:ctgs#1{\def\:eat##1#1{\egroup}\:eat } +\csname newcount\endcsname\tmp:cnt + \def\no:catcodes#1#2#3{% + \tmp:cnt=#1 + \def\no::catcodes{% + \catcode\tmp:cnt=#3 + \ifnum\tmp:cnt<#2 + \advance\tmp:cnt by 1 \expandafter\no::catcodes + \fi }% + \no::catcodes } + \let\:oldlq=\` +\let\:oldrq=\' +\def\'{\leavevmode \:cats \::cats} +\def\::cats#1{\if #1"\expandafter\:oldrq + \else \def\:eat##1#1{\tt ##1\egroup}\expandafter\:eat\fi} +\def\`{\leavevmode \:cats \:::cats} +\def\:::cats#1{\if #1"\expandafter\:oldlq + \else \def\:eat##1#1{`{\tt ##1}'\egroup}\expandafter\:eat\fi} +\def\:cats{\bgroup \no:catcodes0{255}{12}\catcode`\ = 10 + \catcode`\^^M = 10 \catcode`\^^I = 10 +} + +\def\HPage{} \def\EndHPage{} +\def\Verbatim{\bgroup\catcode`\\=12 \catcode`\#=12 + \catcode`\^=12 \catcode`\_=12 + \catcode`\{=12 \catcode`\}=12 \catcode`\%=12 \:vrb} +\long\def\:vrb#1EndVerbatim{\egroup} + + + \closein15 + \def\next{%\input DraTex.sty +\writesixteen{.................requesting non-html mode}% + \input ProTex.sty + \AlProTex{sty,<<<>>>,|,title,list,[],ClearCode}} + \catcode`\:=12 +\else + \closein15 + \def\next{%\input DraTex.sty +\writesixteen{.................requesting html mode}% + \input tex4ht.sty + \Preamble{xhtml,th4,family,sections+} + \Configure{@HEAD}{\HCode{<link rev="made"\Hnewline + href="mailto:gurari@cse.ohio-state.edu" />}} +%% + \input ProTex.sty + \AlProTex{sty,<<<>>>,|,title,list,[],ClearCode} + \EndPreamble} + +\fi + +\next + + +\def\`{\Verb} +\def\'{\Verb} + + +\ifHtml + \TocAt{Chapter,Section,SubSection,LikeSection,/Appendix,/Part} + \TocAt{LikeChapter,Section,SubSection,LikeSection,/Appendix,/Part} + \TocAt{Appendix,Section,SubSection,LikeSection,/Appendix,/Part} + \CutAt{Chapter,LikeChapter,Appendix,Part} + \CutAt{LikeChapter,Chapter,Appendix,Part} + \CutAt{Appendix,Chapter,LikeChapter,Part} +\else + \def\ParentOf#1{} + \csname TableOfContents\endcsname +\fi + + +%%%%%%%%%%%%%%%%%%%%%%%%% +\def\by{by}\def\={=} +\let\pReModifyOutputCode=\ModifyOutputCode +\def\ModifyOutputCode{% + \def\by{}\def\={}% + \pReModifyOutputCode} + +\csname NoOutputCode\endcsname + +\let\coDE=\< +\def\<{\vfil\par\coDE} + +\tracingstats=1 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\IgnorePar \EndP +\HCode{<h1>A Literate View of tex4ht.sty</h1>} + + + + + + +\csname TableOfContents\endcsname[ParentOf,Part,Chapter,% + Appendix,LikeChapter,Section,LikeSection] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Chapter{Outline of the Code} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\Section{TeX4ht} + +\<tex4ht\><<< +\ifnum\the\catcode`\%=14\else\expandafter\edef\csname + \string:RestoreCatcodes\endcsname{\catcode`\%|=\the + \catcode`\%}\catcode`\%|=14\fi +|<copyright|> +\ifx \Preamble\UnDef \else + % fix for LaTeX hook system, \AtBeginDocument is not available at this moment + \let\origatbegindocument\AtBeginDocument + \def\AtBeginDocument#1{\AddToHook{begindocument/end}{#1}} + \csname expand:after\endcsname{\csname + BeforeTeXIVht\endcsname\let\BeforeTeXIVht|=\UnDef} + \let\AtBeginDocument\origatbegindocument + +\fi +\def\writesixteen#1{\immediate\write99999{#1}} +|<save cat codes|> +|<ifs for TeX4ht|> +|<check if latex|> +\ifx \Preamble\UnDef + \ifx \PLATFORM\:UnDef \else + \message{ [\PLATFORM] }\let\PLATFORM|=\:UnDef\fi + |<early utilities|> + |<first pass|> + |<first pass for latex|> + \expandafter\ifx \csname tex4ht\endcsname\relax + \let\:temp|=\empty + \else + |<temp := auto load Preamble|> + \fi + \let\:tempc|=\:temp + |<def early latex ifOption|> + \pend:def\:tempc{\:RestoreCatcodes } + \append:def\:tempc{\endinput} + \let\:temp|=\:tempc + \expandafter\:temp +\fi +|<second pass|> +\ifx \Hinput\:UnDef \else + \Hinput{tex4ht2} + |<load protex|> +\fi +|<TeXivht = user file requests|> +|<html-end of style file|> +\rmv:ifs \let\rmv:ifs|=\:UnDef +\:RestoreCatcodes \TeXivht +\endinput + >>> + + + + + + + + + + +\<load sub tex4ht styles\><<< +\ifHtml \def\:tempa{\:Hinclude} +\else + \:CheckOption{th4}\if:Option \def\:tempa{\input th4.4ht} + \else \let\:tempa|=\empty \fi +\fi +\:CheckOption{core} \if:Option \let\:tempa|=\empty \fi +\:CheckOption{base} \if:Option \let\:tempa|=\empty \fi +\:tempa +>>> + + + + + + + + + +We have in amsmath + + +\<utilities\><<< +\def\HLet#1{% + \expandafter\ifx + \csname o:\expandafter\:gobble\string#1:\endcsname\relax + |<save old def of macro|>% + \fi + |<selector between old and new def|>% + \expandafter\let + \csname n:\expandafter\:gobble\string#1:\endcsname} +>>> + + +The original definition of \`'\.....' is stored in \`'\o:...:', and +the new one in \`'\n:....:'. + The selector is outside the \''\ifx' so that the \''\HLet' will + work also on macros restored with \''\HRestore'. + + +\<utilities\><<< +\def\HRestore#1{\relax + \expandafter\ifx + \csname o:\expandafter\:gobble\string#1:\endcsname\relax + \:warning{\string\HRestore\noexpand#1?}% + \else + \expand:after{\let#1|=}\csname o:\expandafter + \:gobble\string#1:\endcsname + \fi}% +>>> + +Don't erase the \`'o:...:', just in case a saving with let +is done before restoring. + + +\<save old def of macro\><<< +\expandafter\let + \csname o:\expandafter\:gobble\string#1:\endcsname|=#1% +>>> + +\<selector between old and new def\><<< +\edef#1{\noexpand\ifx \noexpand\EndPicture\noexpand\:UnDef + \noexpand\expandafter \expandafter\noexpand + \csname n:\expandafter\:gobble\string#1:\endcsname + \noexpand\else \noexpand\expandafter \expandafter\noexpand + \csname o:\expandafter\:gobble\string#1:\endcsname + \noexpand\fi}% +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Support for ProTex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<first pass\><<< +\NewConfigure{ProTex}[1]{\def\a:ProTex{#1}} +>>> + + +\<load protex\><<< +\ifx \a:ProTex\:UnDef +\else \input ProTex.4ht \fi +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Support for httex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\<temp := auto load Preamble\><<< +|<util for extracting options|> +|<options from /tex4ht|> +\expandafter\expandafter\expandafter + \:temp\csname tex4ht\endcsname |<par del|>% +\ifx \:temp\relax + |<temp := load tex /Preample|> + \if:latex \let\:temp|=\empty \fi +\else + \if:latex + \let\config:file|=\:temp \let\:temp|=\empty + \else + \edef\:temp{\noexpand\input \:temp\space} +\fi \fi +>>> + + +\<extract tex4ht options\><<< +\ifx \:temp\relax + \let\:tempd|=\:temp + \let\:tempc|=\empty \config:opt #1,#2,|<par del|>% +\else \:temp + \let\:tempd|=\:temp + \let\:tempc|=\empty \config:opt #2,|<par del|>% +\fi +\let\config:opt|=\:tempc +\let\:temp|=\:tempd +>>> + +\<util for extracting options\><<< +\def\:tempc#1#2.#3|<par del|>{\edef\:tempa{#3}\edef\:temp{% + #1\ifx \:tempa\empty .cfg\fi}} +\def\config:opt#1,#2|<par del|>{\def\:temp{#1}\ifx \:temp\empty + \else \ifx \:tempc\empty + \def\:tempc{#1}% + \else + \append:def\:tempc{,#1} + \fi\fi + \def\:temp{#2}\ifx \:temp\empty + \else \def\:temp{\config:opt #2|<par del|>}\fi + \:temp} +>>> + + + +\<temp := load tex /Preample\><<< +\ifx \config:opt\:UnDef + \edef\config:opt{\ifx \config:file\empty html\fi}\fi +\def\:temp{\expandafter\expandafter\expandafter + \Preamble\expandafter{\config:opt}\EndPreamble} +>>> + + +\Section{First Pass} + +\<first pass\><<< +\ifx \Log:Needs\:UnDef \else + \:warning{Again `\noexpand\input tex4ht.sty'?}\fi +|<check that TeX4ht is not loaded after protex|> |%still necessary?|% +|<define for /Preamble|> +|<define /Preamble|> +>>> + + + +\<check if latex\><<< +\expandafter\ifx \csname @latex@error\endcsname\relax + \:latexfalse \tracingstats|=1 +\else + \if:latex\else |<usepackage for latex|>\fi + \:latextrue + \ifx \:providesfile \:UnDef + \let\:providesfile\@providesfile + \def\@providesfile#1{% + \expandafter\ifx\csname @filelist\endcsname\relax + \let\@providesfile\:providesfile + \else \xdef\@filelist{\@filelist,#1}% + \fi + \:providesfile{#1}% + } + \fi +\fi +>>> + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Start Preamble} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\<define /Preamble\><<< +\def\:Preamble{\ifx \:next[% + \def\Preamble[##1]##2{\egroup + |</def/Preamble(@@2)|>\input ##1 + } + \else + \def\Preamble##1{\egroup |</def/Preamble(@@1)|>% + \input |<TeX4ht name|>.sty } + \fi \let\:Preamble|=\:UnDef \Preamble } +\def\Preamble{\bgroup \catcode`\@|=12 \catcode`\_|=8 \catcode`\^|=7 + \futurelet\:next\:Preamble} +>>> + + +With the following definitions we can replace +\`'\input tex4ht.sty \Htmltrue .... \Htmlfalse \Preamble{html,...}' +with \`'\input tex4ht.sty \Htmltrue .... \Preamble{...}' +for defining html-enabled code between the \''\input' and the +\''\Preamble'. That is, for using code that employs the +\''\ifHtml' command. + + + +\</def/Preamble(@@1)\><<< +|<def :CheckOption|>% +\ifHtml \Htmlfalse + \def\Preamble{html,##1}\else \def\Preamble{##1}\fi +|<config options for /usepackage and httex|>% +|<extract Hinclude|>% +>>> + +\</def/Preamble(@@2)\><<< +|<def :CheckOption|>% +\ifHtml \Htmlfalse + \def\Preamble{html,##2}\else \def\Preamble{##2}\fi +|<config options for /usepackage and httex|>% +|<extract Hinclude|>% +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{End Preamble} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<define /Preamble\><<< +\def\EndPreamble{\b:Preamble \global\let\missing:endpream\empty + \csname |<live|>\file:id\endcsname \B:DY} +\def\B:DY{|<html paragraph breaks at entry to file|>% + \HtmlEnv \IgnorePar \IgnoreIndent {\ht:everypar{}\leavevmode}\a:BODY + \csname a:@BODY\endcsname} +\def\missing:endpream{\:warning{Missing \string\EndPreamble}} +>>> + + +\<close html doc\><<< +\missing:endpream +>>> + +\<define /Preamble\><<< +\NewConfigure{@HTML}[1]{\concat:config\a:@HTML{#1}} +\let\a:@HTML|=\empty +>>> + +\<needs preamble\><<< +\:tempb +>>> + + +\<html config util\><<< +\NewConfigure{Preamble}{2} +>>> + + + +\<remove garbage\><<< +\ifHtml \else \let\EndPreamble|=\empty \fi +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Selecting Preamble} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\<def :CheckOption\><<< +\def\:CheckOption####1{\def\:temp{####1}% + \:Optionfalse + \expandafter\:ScanOptions\Preamble,,//} +\def\:ScanOptions####1,####2//{\def\:next{####1}% + \ifx \:next\empty + \else \ifx \:temp\:next \:Optiontrue \let\:next|=\relax + \else \def\:next{\:ScanOptions####2//}% + \fi \fi \:next } +>>> + + + + + +\<Hinput Configs\><<< +\def\:temp{\def\ifOption##1} +\expandafter\expandafter\expandafter\:temp + \expandafter{\Preamble,,//\if:Option + |<ifOption true|>\else |<ifOption false|>\fi \tmp:toks=} +\pend:defI\ifOption{\def\:temp{##1}\:Optionfalse\:ScanOptions} +>>> + + +\<ifOption false\><<< +\def\:temp{% + \def\:temp{\the\tmp:toks}% + \afterassignment\:temp \tmp:toks=}% +\afterassignment\:temp +>>> + + +\<ifOption true\><<< +\def\:temp{\the\tmp:toks + \def\:temp{\tmp:toks={}}% + \afterassignment\:temp \tmp:toks=}% +\afterassignment\:temp +>>> + + + +The \''\ifOption' is implemented through a token list variable to +allow for nesting in macros and if statements. The older definition +hid the \''\if' under \''\ifOption' and exposed just the +\''\else' and \''\fi'. + + + + +\<new ifs\><<< +\:tempa{if:Option} +>>> + + + +The following code defines \`'\ifOption' just for flags defined in the +comamnd line (that is, flags known the first time tex4ht.sty is +loaded). It doesn't yet see those options introduced by \`'\Preamble' +and the *.4ht files. + + +\<def early latex ifOption\><<< +\ifx \config:opt\:UnDef \else + \ifx\tmp:toks\:UnDeF \csname newtoks\endcsname\tmp:toks\fi + \def\:temp{\def\ifOption##1} + \expandafter\expandafter\expandafter\:temp + \expandafter{\config:opt,,//\if:Option + |<ifOption true|>\else |<ifOption false|>\fi \tmp:toks=} + \pend:defI\ifOption{\def\:temp{##1}\:Optionfalse\:ScanOptions} +\fi +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{LaTeX at First Pass} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<first pass for latex\><<< +\if:latex + |<try taking care of hyperref.sty|> + |<early latex subs/sups|> +\fi +|<block package loading|> +|<xetex active characters|> +|<hook at usepackage|> +>>> + +The following is a temporary patch, waiting fo a fix in hyperref.sty. + + +\<try taking care of hyperref.sty\><<< +\expandafter\def\csname opt@hyperref.sty\endcsname{tex4ht} +>>> + +\<block package loading\><<< +\def\:dontusepackage#1{% + \typeout{tex4ht warning: package #1 was prevented from loading} + \@namedef{ver@#1.sty}{9999/12/31}% + \@namedef{opt@#1.sty}{\:currentoptions} +} +>>> + +Input definitions for Unicode blocks in XeLaTeX. It loads full Latin by +default, others must be activated using \`'xeuniuseblock{blockname}' + +\<xetex active characters\><<< +\ifx\XeTeXversion\@undefined\else +\ifx\xeuniuseblock\@undefined +\input tuenc-xetex-input.4ht +\fi\fi +>>> + +Add support for package commands redefining + +\<hook at usepackage\><<< +\def\:AtEndOfPackage{\expandafter\g@addto@macro\csname pkg:end:hook:\@currname.sty\endcsname} +\def\init:package:hooks#1{\expandafter\def\csname pkg:end:hook:#1\endcsname{}} +\def\package:hooks#1{\csname pkg:end:hook:#1\endcsname} +>>> + +\<hook at usepackage\><<< +\let\:onefilewithoptions\@onefilewithoptions +\def\@onefilewithoptions#1[#2][#3]#4{% +\init:package:hooks{#1.#4}% + \let\:temp\@reset@ptions + \def\@reset@ptions{% + \let\@reset@ptions\:temp + |<cats for usepackage|>\a:usepackage% + \a:usepackage:lthooks{#1}{#4} + |<recall usepackage cats|>}% + \def\:currentoptions{#2} +\:onefilewithoptions#1[#2][#3]{#4}\package:hooks{#1.#4}} +\def\a:usepackage{\input usepackage.4ht } +>>> +\<cats for usepackage\><<< +\edef\TivhTcats{% + \catcode`:=\the\catcode`:% + \catcode`@=\the\catcode`@}% +\catcode`\:=11 \catcode`\@=11 +>>> + +\<recall usepackage cats\><<< +\TivhTcats +>>> + +In October 2020, LaTeX kernel added new hook support. It can be used +for lot of stuff, including execution of code when a package is loaded. +It is more efficient and clean than the current TeX4ht system of package +handling. We can use it to execute code before and after package loading. + +Files that contain code that should be executed before the package is loaded +can be requested using PackageHooks configuration. It needs to be included +in the "add to usepackage" placeholder that is available in tex4ht-4ht.tex. + +Example: + +\Verbatim +\<add to usepackage\><<< +\Configure{PackageHooks}{packagename.sty}{packagename-hooks.4ht} +>>> + +\<packagename-hooks.4ht\><<< +% Some stuff executed before the package is loaded +\:AtEndOfPackage{ + % stuff executed after package is loaded + % macro redefinitions and so on +} +>>> \AddFile{9}{packagename-hooks} + +\EndVerbatim + +\<hook at usepackage\><<< +\NewConfigure{PackageHooks}[2]{\expandafter\def\csname package:hooks:#1\endcsname{\input #2}} +\def\a:usepackage:lthooks#1#2{% + \expandafter\ifcsname package:hooks:#1.#2\endcsname + \csname package:hooks:#1.#2\endcsname + \fi +} +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Second Pass} +%%%%%%%%%%%%%%%%%%%%%%%%% + + +The definitions of the configurations should be ready before +\''\Hinput' is called for loading their values. The cross references +also need to be resolved at that point (for the TITLE+, and possibly +other usages). + +\<second pass\><<< +|<html option|> |%should be first|% +|<html+nohtml common to TeX4ht and protex|> +|<utilities|> +|<cross references|> +\ifHtml + |<Hinput Configs|> + \Hinput{Preamble} \ht:special{t4ht.\:html} + |<scripting commands|> + |<html Configure's|> + \Hinput{tex4ht} + |<hook on end|> +\fi +|<divisions|> +|<files|> +|<cut points|> +|<imports|> +|<lists|> +|<blocs for tocs|> +\ifHtml + |<halign-based tables|> +\fi +|<streams|> +|<gif|> +|<fonts|> +|<math|> +|<core tex|> +|<at doc start|> |%after Preamble|% +\ifHtml + |<dvi-based hooks|> + |<more html tex|> +\fi +|<local env|> |% after accents, {\vrb:tt\`} in particular|% +\ifx\beginL\@undefined \else + \ifHtml + |<e tex|> + \Hinput{etex4ht} +\fi\fi +|<load sub tex4ht styles|> +|<debug|> +|<remove garbage|> +\ifHtml |<start html doc|> \fi |%should be last|% +>>> + + + +\Section{Copyright Note} + +\input tex4ht-cpright.tex + +\<copyright\><<< +% tex4ht.sty (|version), generated from |jobname.tex +% Copyright 2009-|the|year|empty TeX Users Group +% Copyright |CopyYear.1996. Eitan M. Gurari +|<TeX4ht copywrite|> +>>> + + + +\Section{Category Codes} + + +\<save cat codes\><<< +\expandafter\edef\csname :RestoreCatcodes\endcsname{% + \expandafter\ifx \csname :RestoreCatcodes\endcsname\relax\else + \csname :RestoreCatcodes\endcsname \fi + \ifnum \the\catcode`\ =10 \else + \catcode`\noexpand\ =\the\catcode`\ \fi + \ifnum \the\catcode`<=12 \else + \catcode`\noexpand <|=\the\catcode`<\fi + \ifnum \the\catcode`>=12 \else + \catcode`\noexpand >|=\the\catcode`>\fi + \ifnum \the\catcode`\?=12 \else + \catcode`\noexpand \?|=\the\catcode`\?\fi + \ifnum \the\catcode`+=12 \else + \catcode`\noexpand +|=\the\catcode`+\fi + \ifnum \the\catcode`*=12 \else + \catcode`\noexpand *|=\the\catcode`*\fi + \ifnum \the\catcode`;=12 \else + \catcode`\noexpand ;|=\the\catcode`;\fi + \ifnum \the\catcode`~=13 \else + \catcode`\noexpand ~|=\the\catcode`~\fi + \ifnum \the\catcode`$=3 \else + \catcode`\noexpand $|=\the\catcode`$\fi + \ifnum \the\catcode`&=4 \else + \catcode`\noexpand &|=\the\catcode`&\fi + \ifnum \the\catcode`\#=6 \else + \catcode`\noexpand \#|=\the\catcode`\#\fi + \catcode`\noexpand :|=\the\catcode`:% + \catcode`\noexpand "|=\the\catcode`"% + \catcode`\noexpand @|=\the\catcode`@% + \catcode`\noexpand _|=\the\catcode`_% + \catcode`\noexpand ^|=\the\catcode`^% + \catcode`\noexpand |||=\the\catcode`||% + \csname no:restore\endcsname + |<sp and sb for catcode 13|>% + \let\expandafter\noexpand\csname :RestoreCatcodes\endcsname|= + \noexpand\UnDefcS} +\catcode`~|=13 \catcode`$|=3 \catcode`&|=4 \catcode`\#|=6 +\catcode`\:|=11 \catcode`\@|=11 \catcode`;|=12 \catcode`\ |=10 +\catcode`\<|=12 \catcode`\>|=12 \catcode`+|=12 \catcode`*|=12 +\catcode`\?|=12 +|<record external sub-sup|> +\catcode`\^|=7 \catcode`\||=12 \catcode`"|=12 +>>> + + + + + + +\Section{Ifs} + + +\<ifs for TeX4ht\><<< + \def\:temp{\csname newif\endcsname} + \def\:tempa#1{% + \expandafter\ifx \csname #1\endcsname\relax + \expandafter\:temp \csname #1\endcsname + \fi} +|<new ifs|> + \def\:tempa#1{% + \expandafter\ifx \csname #1\endcsname\relax + \expandafter\:temp \csname #1\endcsname + \expandafter\expandafter\expandafter\expandafter\expandafter + \def\expandafter\expandafter\expandafter + \rmv:ifs\expandafter{\rmv:ifs + \expandafter\let \csname #1\endcsname |= \:UnDef} + \fi} + \let\rmv:ifs|=\empty +|<temp tex ifs|> +>>> + + +The temporary ifs are needed only for loading time to allow +TeX to scan material that will not be loaded. + + + +\<new ifs\><<< +\:tempa{if:latex} +>>> + +\Section{User File Requests} + +\<TeXivht = user file requests\><<< +\def\:usersty#1,#2|<par del|>{\def\:temp{#1}% + \ifx \:temp\empty \else + \expandafter\ifx \csname #1\endcsname\relax + \expandafter\let \csname #1\endcsname=\empty + \input #1 + \fi + \def\:temp{#2}\expandafter\:temp + \fi} +\edef\TeXivht{\expandafter\ifx \csname TeXivht\endcsname\relax + \else \noexpand\:usersty\TeXivht,|<par del|>\fi + \let\noexpand\TeXivht|=\noexpand\:UnDef + \let\noexpand\:usersty|=\noexpand\:UnDef } +>>> + + + + +\Section{Usepackage Interface for LaTeX} + + +\<usepackage for latex\><<< +\ifx \@currname\empty + |<requires /Preamble.../EndPreamble|> +\else + |<TeX4ht loaded with /usepackage|> +\fi +>>> + +Three ways for loading TeX4ht in LaTeX + +\List{a} +\item With \`'\usepackage{tex4ht}'. + +\Verbatim +\usepackage{tex4ht} +\begin{document} +\EndVerbatim + +It assumes a configuration file named \`latex4ht.cfg'. If none +is offered, the following code is available. + + +\Verbatim +\Preamble{html} + \begin{document} +\EndPreamble +\EndVerbatim + + +\item With \`'\usepackage[file-name]{tex4ht}'. As before, but with a + configuration file \`'file-name', instead of in \`'latex4ht.cfg'. + The extension \`'.cfg' is assumed, if none is provided. + +\item With inline (instead of off-line) configurartion file, e.g., +like \`'\input tex4ht.sty \Preamble{html} + \begin{document} +\EndPreamble' + +\EndList + +The indirection below on \''\enddocument' is needed for AmsTeX; there +the command is defined as outer. + + + +\<TeX4ht loaded with /usepackage\><<< +\ProvidesPackage{tex4ht} +\let\config:file|=\empty +|<options from /usepackage|> +\DeclareOption*{\load:cfg} +\ProcessOptions +\let\o:document|=\document +\def\document{% + |<check irregularities|>% + \ifdefined\AddToHook% + \def\document{\endgroup\o:document}% + % use new LaTeX hook system to execute \Configure{AtBeginDocument} + \AddToHook{begindocument/before}[tex4ht]{\csname a:AtBeginDocument\endcsname} + \AddToHook{begindocument/end}[tex4ht]{\csname b:AtBeginDocument\endcsname} + \else% + %\expandafter\let\csname enddocument\endcsname|=\empty + %\end{document}% + %\let\document|=\o:document + |<protect AtBeginDocument|>% + \let\document\o:document% + \fi% + \let\:latex@error|=\@latex@error + \def\@latex@error##1{\:latex@error{##1 in `\config:file'}}% + |<load latex /Preample|>% + \let\@latex@error|=\:latex@error +} +>>> + +\<check irregularities\><<< +\let\ht:empty|=\:UnDef +\def\:temp{}\ifx \:temp\empty \else + \gdef\:temp{}\ifx \:temp\empty \else + \:warning{Redefined \string\empty?} + \global\let\ht:empty|=\empty \gdef\empty{}% +\fi\fi +>>> + + + + +\<load latex /Preample\><<< +|</document recall sub/sup|>% +\ifx \config:file\empty + \def\:temp{|<default latex cfg file|>}% +\else + \def\:temp{|<user config file|>}% +\fi \:temp +>>> + + + + + + +\<early Configure\><<< +|<concat config|> +\NewConfigure{AtBeginDocument}[2]{% + \def\:temp{#1#2}\ifx \:temp\empty + \concat:config\a:AtBeginDocument{} + \concat:config\b:AtBeginDocument{}% + \else + \concat:config\a:AtBeginDocument{#1\relax}% + \concat:config\b:AtBeginDocument{#2\relax}% + \fi + \global\let\a:AtBeginDocument=\a:AtBeginDocument + \global\let\b:AtBeginDocument=\b:AtBeginDocument +} +\Configure{AtBeginDocument}{}{} +>>> + +\<protect AtBeginDocument\><<< +\let\:begindocumenthook|=\@begindocumenthook +\def\@begindocumenthook{\csname a:AtBeginDocument\endcsname +\:begindocumenthook \csname b:AtBeginDocument\endcsname }% +>>> + + + + +In optional parameters, the first one is assumed to be a +file name. A fake file name should be inserted, when we +want none. + +\<default latex cfg file\><<< +\ifx \config:opt\:UnDef + \edef\config:opt{\ifx \config:file\empty html\fi}\fi +\expandafter\Preamble\expandafter{\config:opt + }\csname begin\endcsname{document}\EndPreamble +>>> + +\''\begin' is defined as outer in texi, hence thr \''\csname'. + +\<default tex cfg file\><<< +\ifx \config:opt\:UnDef + \edef\config:opt{\ifx \config:file\empty html\fi}\fi +\expandafter\Preamble\expandafter{\config:opt + }\EndPreamble +>>> + + +\<user config file\><<< +\input \config:file\relax +>>> + +\<config options for /usepackage and httex\><<< +\ifx \config:opt\:UnDef + \let\:temp|=\Preamble +\else + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\:temp + \expandafter\expandafter\expandafter{% + \expandafter\config:opt\expandafter,\Preamble}% +\fi +\let\Preamble|=\empty +\expandafter\set:Preamble\:temp,|<par del|>% +>>> + + +The following removes duplications in \''\Preamble'. Important, in +particular, when 4ht configuration files are included in the +list of options. + +\<define for /Preamble\><<< +\def\set:Preamble#1,#2|<par del|>{% + \def\:temp{#1}\ifx \:temp\empty \else + \:CheckOption{#1}\if:Option \else + \ifx \Preamble\empty \def\Preamble{#1}% + \else \append:def\Preamble{,#1}% + \fi \fi \fi + \def\:temp{#2}\ifx \:temp\empty \let\set:Preamble|=\:UnDef + \else \expand:after{\set:Preamble#2|<par del|>}\fi +} +>>> + + +\''\ProcessOptions' calls \''\cfg:fl' repeatedly for each option. + +\List{} +\item{Empty, or Cfg File} + +\<options from /usepackage\><<< +\def\load:cfg{|<2nd option|>% + \def\:temp{\expandafter\cfg:fl\CurrentOption.|<par del|>}% + \def\:tempa{html}\ifx \:tempa\CurrentOption \let\:temp|=\load:cfg \fi + \def\:tempa{xhtml}\ifx \:tempa\CurrentOption \let\:temp|=\load:cfg \fi + \def\:tempa{htm}\ifx \:tempa\CurrentOption \let\:temp|=\load:cfg \fi + \def\:tempa{htm3}\ifx \:tempa\CurrentOption \let\:temp|=\load:cfg \fi + \def\:tempa{htm4}\ifx \:tempa\CurrentOption \let\:temp|=\load:cfg \fi + \def\:tempa{htm5}\ifx \:tempa\CurrentOption \let\:temp|=\load:cfg \fi + \:temp +} +\def\cfg:fl#1.#2|<par del|>{\edef\:tempa{#2}\edef\config:file{% + \CurrentOption \ifx \:tempa\empty .cfg\fi}} +>>> + +\<options from /tex4ht\><<< +\def\:temp#1,#2|<par del|>{% + \def\:temp{\:tempc{#1}#1.|<par del|>}% + \def\:tempb{#1}\ifx \:tempb\empty \let\:temp|=\relax \fi + \def\:tempa{html}\ifx \:tempa\:tempb \let\:temp|=\relax \fi + \def\:tempa{xhtml}\ifx\:tempa\:tempb \let\:temp|=\relax \fi + \def\:tempa{htm}\ifx \:tempa\:tempb \let\:temp|=\relax \fi + \def\:tempa{htm3}\ifx \:tempa\:tempb \let\:temp|=\relax \fi + \def\:tempa{htm4}\ifx \:tempa\:tempb \let\:temp|=\relax \fi + \def\:tempa{htm5}\ifx \:tempa\:tempb \let\:temp|=\relax \fi + |<extract tex4ht options|>% +} +>>> + + +\item{First Option for /Preamble} + +\<2nd option\><<< +\def\load:cfg{\let\config:opt|=\CurrentOption + |<options 3...|>}% +>>> + +\item{Non-First Option for /Preamble} + +\<options 3...\><<< +\def\load:cfg{\edef\config:opt{\config:opt,\CurrentOption}}% +>>> + +\EndList + + + +\def\gt:laopt#1,#2|<par del|>{\def\:temp{#1}\ifx \:temp\empty + \else \cfg:fl#1.|<par del|>\fi + \def\:temp{#2}\ifx \:temp\empty \else \let\config:opt|=\:temp \fi} + + + + +The following case arises for loading the +file with the \`'\input tex4ht.sty' command. + +\<requires /Preamble.../EndPreamble\><<< +\def\:temp{\ifx \HCode\:UnDef + \:warning{Missing \string\Preamble...\string\EndPreamble?}\fi} +\edef\:tempa{% + \noexpand\expandafter + \noexpand\expandafter + \noexpand\expandafter + \noexpand \def + \noexpand\expandafter + \noexpand\expandafter + \noexpand\expandafter + \expandafter\noexpand\csname enddocument\endcsname + \noexpand\expandafter + \noexpand\expandafter + \noexpand\expandafter + {\noexpand \expandafter + \noexpand \:temp + \expandafter\noexpand \csname enddocument\endcsname + }% +} \:tempa +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Utilities} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\<html utilities\><<< +\csname newskip\endcsname\tmp:dim +>>> + + +\<early utilities\><<< +|<def Configure|> +|<early Configure|> +>>> + + + + +\<utilities\><<< + |<general utilities|> +\ifHtml |<html utilities|> \fi +>>> + +There are files, like mathml.4ht, that need to be loaded piecewise +because the configuration commands might vary during the loading time. +For instance, the \`'\Configure{cases}' uses two parameters in plain +tex, and the go up into four parameters in amstex. + +\<first pass\><<< +\let\:Hincl|=\empty +\def\Hinclude[#1]#2{\xdef\:Hincl{\:Hincl{#1}{#2}}} +>>> + + + +The following extracts \''\Hinclude' frm preamble. For instance, +\''\Preamble{mathml.4ht,foo.4ht,...}' is the same as +\''\Hinclude[*]{mathml.4ht}\Hinclude{foo.4ht}\Preamble{...}'. The +file extensions must be \''.4ht'. + +\<extract Hinclude\><<< +\def\:temp####1.4ht####2|<par del|>{\def\:temp{####2}% + \ifx \:temp\empty + \def\:temp{th4}\ifx \:temp\Preamble \else + \ht:special{t4ht@[}% + \input tex4ht.4ht \ht:special{t4ht@]}% + \fi \fi}% +\expandafter\:temp\Preamble.4ht|<par del|>% +\expandafter\xtrct:hin\Preamble,,|<par del|>% +|<redefine Hinclud|>% +>>> + + + +\<define for /Preamble\><<< +\def\xtrct:hin#1,{\def\:temp{#1}\ifx \:temp\empty + \def\xtrct:hin##1|<par del|>{\let\xtrct:hin|=\:UnDef}\else + \def\:tempa##1.4ht##2|<par del|>{% + \def\:temp{\Hinclude[*]{##1.4ht}}\def\:tempa{##2}}% + \expandafter\:tempa\:temp .4ht|<par del|>% + \ifx \:tempa\empty \else \:temp \fi + \fi \xtrct:hin} +>>> + + +Until \''\Preamble' is encountered, \''\Hinclude' requrests +`vertiv=cal' 4ht files (html4,html0, mathml, unicode,...), during +\''\Preamble' if requests `horizontal' files (latex, plain,etc), and +after the \''\Preamble' it is undefined. + + + +\<redefine Hinclud\><<< +\:Hinclude +>>> + +\<define for /Preamble\><<< +\def\Use:N{0} +\let\:USE|=\empty +\def\:Use#1{\:USe #1,,\HAdvance\Use:N |by 1 } +\def\:USe#1,{\def\:temp{#1}\ifx\:temp\empty + \edef\:temp{\noexpand\append:def\noexpand\:USE{\let\expandafter + \noexpand\csname Use:\Use:N\endcsname\noexpand\:UnDef}}\:temp + \else + \edef\:temp{\noexpand\append:def\noexpand\:USE{\expandafter + \noexpand\csname Use:\Use:N\endcsname}}\:temp + \append:def\:USE{{#1}}% + \expandafter\:USe\fi} +\def\:Hinclude{% + \def\Hinclude{\afterassignment\:Use + \expandafter\def\csname Use:\Use:N\endcsname ####1}% + \def\:Hinclude{\ifx \:USE \empty + \let\Hinclude|=\:UnDef + \let\:Hinclude|=\:UnDef + \let\:Use|=\:UnDef + \let\:USe|=\:UnDef + \let\:USE|=\:UnDef + \else + \pend:def\:USE{\let\:USE|=\empty}% + \expand:after{\:USE \:Hinclude}\fi}% +} +>>> + + + + +Do we want the push/pop below? + + +\<Hinput Configs\><<< +\let\:Hin|=\empty +\def\Hinput#1{\PushStack\:Hinputs\:Hin \def\:Hin{#1}% + \expandafter\:Hinput\:Hincl{}{}\PopStack\:Hinputs\:Hin} +\def\:Hinput#1#2{\def\:temp{#2}\ifx \:temp\empty \else + \let\:temp|=\empty \def\:tempa{*}\def\:tempb{#1}% + \ifx \:tempa\:tempb \def\:temp{\input #2}% + \else \ifx \:Hin\:tempb \def\:temp{\input #2}% + \else \def\:tempb{#1.4ht}\ifx \:Hin\:tempb \def\:temp{\input #2}% + \fi\fi\fi + \expand:after{\:temp + |<system NewConfigure|>\:Hinput}\fi} +>>> + + + + + +\<html utilities\><<< +\def\exit:ifnot#1{% + \edef\:temp{\def\noexpand\:temp####1,\:Hin,####2..//{% + \noexpand\if !####2!\noexpand\else + \noexpand\expandafter\noexpand\:gobble\noexpand\fi + }\noexpand\:temp,#1,\:Hin,..//}\:temp\endinput } +>>> + +\<html utilities\><<< + \catcode`\@|=0 + \catcode`\\|=12 +@def@ConfigureHinput{% + @def@:temp##1{% + @def@:temp{##1}@ifx@:temp@:Hin @else @:tempb @fi }% + @def@:tempb{@fi@bgroup @no:catcodes0{255}{12}% + @no:catcodes{101}{101}{11}% + @no:catcodes{109}{109}{11}% + @no:catcodes{112}{112}{11}% + @no:catcodes{116}{116}{11}% + @no:catcodes{121}{121}{11}% + @:tempa} + @def@:tempa##1\empty\empty\empty\empty\empty\empty{@egroup}% + @:temp +} + @catcode`@\=0 + \catcode`\@=11 +>>> + + + + + +\<early utilities\><<< +\catcode`\#=12 \def\#{#} \catcode`\#=6 +>>> + +The starred command is for immediate expansion + +Can we avoid the following file? + +\<general utilities\><<< +\immediate\openout15=\jobname.tmp +\bgroup \escapechar=`\\ + \immediate\write15{\def\string\Jobname{\jobname}} +\egroup +\immediate\closeout15 +\input \jobname.tmp + +\def\get:input#1{% + \openin15=#1 + \ifeof15 \closein15 \:warning{No file #1}% + \else \closein15 \expand:after{\input #1 }% + \fi} +>>> + + +\<general utilities\><<< +\def\if:notempty#1#2{% + \def\:temp{#1}\ifx \:temp\empty \else \expand:after{#2}\fi } +>>> + + +\Chapter{Configurations} + + +\Section{Contributes} + + +\<early utilitiesNO\><<< +\long\def\Contribute#1#2{% + \expandafter\ifx \csname :#1:\endcsname\relax + \:warning{\string\Contribute{#1}?}\fi + \long\expandafter\def\csname :#1:\endcsname{#2}} +>>> + +\<utilitiesNO\><<< +\long\def\Contribute#1#2{% + \expandafter\ifx \csname :#1:\endcsname\relax + \:warning{\string\Contribute{#1}?}\else + \long\expandafter\def\csname :#1:\endcsname{#2}\fi } +>>> + + +\Section{Configurations} + + +\SubSection{Configure} + + + +The following assumes a definition \`'\Odef\c:#2:[#1]...' + +\<def Configure\><<< +\def\Configure#1{% + \expandafter\ifx \csname c:#1:\endcsname\relax + \:warning{\string\Configure{#1}?} + \fi + \csname c:#1:\endcsname} +\let\c:def|=\def +\let\d:def|=\def +>>> + + + + + + + + + + +\SubSection{NewConfigure} + + + + + + + +\<def Configure\><<< +\def\NewConfigure#1{\def\:tempa{#1}\futurelet\:temp\Nw:cnf} +\def\Nw:cnf{\ifx [\:temp \edef\:tempa{\noexpand\N:wCnfga{\:tempa}}\else + \edef\:tempa{\noexpand\N:wCnfgb{\:tempa}}\fi \:tempa} +\def\N:wCnfga#1[#2]{% + \edef\:temp{|</long/def/c:...:|>}\:temp } +\def\N:wCnfgb#1#2{% + \edef\:temp{|</long/def/c:...:|>{\New:Conf{\aNew:Conf#1}{####1}% + \ifnum #2>1 \New:Conf{\bNew:Conf#1}{####2}\fi + \ifnum #2>2 \New:Conf{\cNew:Conf#1}{####3}\fi + \ifnum #2>3 \New:Conf{\dNew:Conf#1}{####4}\fi + \ifnum #2>4 \New:Conf{\eNew:Conf#1}{####5}\fi + \ifnum #2>5 \New:Conf{\fNew:Conf#1}{####6}\fi + \ifnum #2>6 \New:Conf{\gNew:Conf#1}{####7}\fi + \ifnum #2>7 \New:Conf{\hNew:Conf#1}{####8}\fi + \ifnum #2>8 \New:Conf{\iNew:Conf#1}{####9}\fi + }}\:temp} +>>> + +\</long/def/c:...:\><<< +\long\def\expandafter + \noexpand\csname c:#1:\endcsname####1% + \ifnum #2>1 ####2\fi \ifnum #2>2 ####3\fi + \ifnum #2>3 ####4\fi \ifnum #2>4 ####5\fi + \ifnum #2>5 ####6\fi \ifnum #2>6 ####7\fi + \ifnum #2>7 ####8\fi \ifnum #2>8 ####9\fi +>>> + + + + + +\<def Configure\><<< +\def\New:Conf#1{\noexpand\c:def + \expandafter\noexpand\csname#1\endcsname}% +\def\c:NewConfigure:#1#2#3#4#5#6#7#8#9{% + \def\aNew:Conf{#1}\def\bNew:Conf{#2}\def\cNew:Conf{#3}% + \def\dNew:Conf{#4}\def\eNew:Conf{#5}\def\fNew:Conf{#6}% + \def\gNew:Conf{#7}\def\hNew:Conf{#8}\def\iNew:Conf{#9}} +|<system NewConfigure|> +>>> + + +After each loading of the vertical 4ht files, the coefficients +of newconfigure assume their initial definitions. + +\<system NewConfigure\><<< +\Configure{NewConfigure}{a:}{b:}{c:}{d:}{e:}{f:}{g:}{h:}{i:}% +>>> + + + +\Section{Tracing Configurations} + + + +See also LaTeX part + + +\<trace configurations\><<< +\:CheckOption{hooks++} \if:Option + |<trace+ comamnds|> + \def\edit:p#1#2{\let#2|=\empty \:gobble}% +\else \:CheckOption{hooks+} \if:Option + \def\trc:wrt{\writesixteen} + \else \:CheckOption{hooks} \if:Option + \let\trc:wrt|=\:gobble + \fi\fi + \if:Option + |<trace commands|> + \let\edit:p|=\empty +\fi \fi +\if:Option + |<trace and trace+|> + \NewConfigure{hooks}[4]{\def\a:trc{#1}\def\b:trc{#2}% + \def\c:trc{#3}\def\d:trc{#4}% + \ifx \a:trc\empty \def\a:trc##1\b:trc{\b:trc}\fi + \ifx \c:trc\empty \def\c:trc##1\d:trc{\d:trc}\fi + } + \def\d:def{\advance\tmp:cnt |by1\def} + \Configure{hooks}{}{}{}{} +\else + \let\c:hooks:|=\:gobbleIV + |<no trace and trace+|> +\fi +>>> + +\<trace+ comamnds\><<< + \pend:defI\Configure{\tmp:cnt|=0 + \long\def\c:def####1####2{\advance\tmp:cnt |by1 + |<tempb = number of parameters|> + \def####1{####2}% + \edef\:temp{\noexpand\pend:def\noexpand####1{\noexpand\ifx + \noexpand\EndPicture\noexpand\:UnDef \hbox{\noexpand\a:trc + ##1\the\tmp:cnt :\:tempb\noexpand\b:trc}\noexpand\fi}}\:temp + \edef\:temp{\noexpand\append:def\noexpand####1{\noexpand\ifx + \noexpand\EndPicture\noexpand\:UnDef\hbox{\noexpand\c:trc + ##1\the\tmp:cnt :\:tempb\noexpand\d:trc}\noexpand\fi}}\:temp + }} +>>> + + +\<trace commands\><<< +\pend:defI\Configure{\tmp:cnt|=0 + \long\def\c:def####1####2{\advance\tmp:cnt |by1 + |<tempb = number of parameters|> + \def####1{####2}% + \ifx ####1\empty + \edef\:temp{\noexpand\pend:def\noexpand####1{\hbox{\noexpand + \a:trc ##1\the\tmp:cnt :\:tempb\noexpand\b:trc}}}\:temp + \edef\:temp{\noexpand\append:def\noexpand####1{\hbox{\noexpand + \c:trc ##1\the\tmp:cnt :\:tempb\noexpand\d:trc}}}\:temp + \else + \trc:wrt{...##1\the\tmp:cnt....\meaning####1}% + \fi +}} +>>> + +\<trace and trace+\><<< +\edef\:tempb{\def\noexpand + \par:N##1\string :##2->##3////{\noexpand\par:NN?##2//}} +\:tempb +\def\par:NN#1#2//{\def\:tempb{#2}\ifx\:tempb\empty + \def\:tempb{#1}\else \def\:tempb{\par:NN#2//}\expandafter\:tempb\fi} +>>> + +\<tempb = number of parameters\><<< +\edef\:tempb{\expandafter \meaning\csname c:##1:\endcsname}% +\expandafter\par:N \:tempb////% +>>> + + + + + +\Section{Editing and Xml} + + + + + +Note that \`'edit' is not the option \`'tty'! + + + +\<trace configurations\><<< +\def\Tg<#1>{% + \expandafter\ifx + \csname\try:tagend <#1</|<par del|>\endcsname\is:empty + \:tagend#1|<par del|>\else + \expandafter\ifx + \csname\try:tagempty #1>/>|<par del|>\endcsname\is:empty + \:tag{#1}\else \:tagempty #1>\fi\fi} +\def\try:tagend#1</#2|<par del|>{#1is:empty} +\def\try:tagempty#1/>#2|<par del|>{#2is:empty} +\def\is:empty{\empty\empty} +\:CheckOption{edit} \if:Option + |<tg and TG|> + |<edit* option|> +\else + |<no-edit tg and TG|> + \:CheckOption{verify}\if:Option\else \:CheckOption{verify+}\fi + \if:Option + |<edit- code|> + \else + |<no-edit option|> + \fi +\fi +>>> + +The \''\tg' is also part of mex. + +\<tg and TG\><<< +% \def\tg<#1>{\c:edit#1\d:edit} +\def\TG<#1>{\a:edit#1\b:edit} +>>> + +\<no-edit tg and TG\><<< +% \def\tg<#1>{<#1>} +\def\TG<#1>{\HCode{<#1>}} +>>> + + + +The \`'edit+' is a pseudo-browser mode showing a possible +view of the code. + +\<no-edit option\><<< +\def\:tag#1{\hbox{\HCode{<#1>}}} +\def\:tagend#1#2|<par del|>{\hbox{\HCode{</#2>}}} +\def\:tagempty#1/>{\hbox{\HCode{<#1/>}}} +\expandafter\def\csname c:<:\endcsname#1>{\:gobbleII} +>>> + + +The \`'\hbox' above is to avoid creating extra paragraphs with +extra tags, which can also introduce extra paragraph ends. + +The definiions of \''\c:<...>:' are broken into two parts +to avoid the spaces after the closing angular bracket \''>'. + +\<edit+ option\><<< +\def\tag:of#1 #2|<par del|>{#1} +\def\pl:s{+} +\def\:tag#1{\VerifyOpen{#1}\expandafter\ifx + \csname A:\tag:of#1 |<par del|>\endcsname\pl:s\else + \hbox{\a:edit\HCode{#1}\b:edit}% + \fi \csname B:\tag:of#1 |<par del|>\endcsname + } +\def\:tagend#1#2|<par del|>{\VerifyClose{#2}\expandafter\ifx + \csname A:/\tag:of#2 |<par del|>\endcsname\pl:s\else + \hbox{\a:edit\HCode{/#2}\b:edit}% + \fi \csname B:/\tag:of#2 |<par del|>\endcsname + } +\def\:tagempty#1/>{\VerifyEmpty{#1}\expandafter\ifx + \csname A:\tag:of#1 |<par del|>/\endcsname\pl:s\else + \hbox{\a:edit\HCode{#1/}\b:edit}% + \fi \csname B:\tag:of#1 |<par del|>/\endcsname + } +\expandafter\def\csname c:<:\endcsname#1>{\edef\:temp{#1}\:gat} +\long\def\:gat#1#2{\expandafter + \def\csname A:\:temp\endcsname{#1}% + \expandafter\def\csname B:\:temp\endcsname{#2}} +\NewConfigure{edit}{4} +\Configure{edit}{\HCode{<strong class="edit"><}} + {\HCode{></strong>}} +>>> + + +\<edit option\><<< +\def\tag:of#1 #2|<par del|>{#1} +\def\:tag#1{\csname A:\tag:of#1 |<par del|>\endcsname + \VerifyOpen{#1}\a:edit\HCode{#1}\b:edit + \csname B:\tag:of#1 |<par del|>\endcsname + } +\def\:tagend#1#2|<par del|>{\csname A:/\tag:of#2 |<par del|>\endcsname + \VerifyClose{#2}\a:edit\HCode{/#2}\b:edit + \csname B:/\tag:of#2 |<par del|>\endcsname + } +\def\:tagempty#1/>{\csname A:\tag:of#1 |<par del|>/\endcsname + \VerifyEmpty{#1}\a:edit\HCode{#1/}\b:edit + \csname B:\tag:of#1 |<par del|>/\endcsname + } +\expandafter\def\csname c:<:\endcsname#1>{\edef\:temp{#1}\:gat} +\long\def\:gat#1#2{\expandafter + \def\csname A:\:temp\endcsname{#1}% + \expandafter\def\csname B:\:temp\endcsname{#2}} +\NewConfigure{edit}{4} +\Configure{edit}{\HCode{<strong><}}{\HCode{></strong>}} + {<strong><}{></strong>} +>>> + +\<edit- code\><<< +\def\:tag#1{\VerifyOpen{#1}\hbox{\HCode{<#1>}}} +\def\:tagend#1#2|<par del|>{\VerifyClose{#2}\hbox{\HCode{</#2>}}} +\def\:tagempty#1/>{\VerifyEmpty{#1}\hbox{\HCode{<#1/>}}} +\expandafter\def\csname c:<:\endcsname#1>{\:gobbleII} +>>> + + +The \`'\hbox' above is to avoid creating extra paragraphs with +extra tags, which can also introduce extra paragraph ends. + + + + +\<edit* option\><<< +\def\tag:of#1 #2|<par del|>{#1} +\def\mn:s{-} +\def\:tag#1{\VerifyOpen{#1}\expandafter\ifx + \csname A:\tag:of#1 |<par del|>\endcsname\mn:s\else + \csname A:\tag:of#1 |<par del|>\endcsname + \hbox{\a:edit\HCode{#1}\b:edit}% + \fi \csname B:\tag:of#1 |<par del|>\endcsname + } +\def\:tagend#1#2|<par del|>{\VerifyClose{#2}\expandafter\ifx + \csname A:/\tag:of#2 |<par del|>\endcsname\mn:s\else + \csname A:/\tag:of#2 |<par del|>\endcsname + \hbox{\a:edit\HCode{/#2}\b:edit}% + \fi \csname B:/\tag:of#2 |<par del|>\endcsname + } +\def\:tagempty#1/>{\VerifyEmpty{#1}\expandafter\ifx + \csname A:\tag:of#1 |<par del|>/\endcsname\mn:s\else + \csname A:\tag:of#1 |<par del|>/\endcsname + \hbox{\a:edit\HCode{#1/}\b:edit}% + \fi \csname B:\tag:of#1 |<par del|>/\endcsname + } +\expandafter\def\csname c:<:\endcsname#1>{\edef\:temp{#1}\:gat} +\long\def\:gat#1#2{\expandafter + \def\csname A:\:temp\endcsname{#1}% + \expandafter\def\csname B:\:temp\endcsname{#2}} +\NewConfigure{edit}{4} +>>> + + +\Section{Logical commands} + +\<html Configure's\><<< +\def\InsertTagStart#1#2{% + \edef\local:properties{\ifx\relax#2\relax\else\space#2\fi} + \HCode{<\get:tag{#1}\get:block:properties{#1}\local:properties>}% +} +\def\InsertTagEnd#1{\HCode{</\get:tag{#1}>}} + +\long\def\InlineElementStart#1#2{\InsertTagStart{#1}{#2}} +\long\def\InlineElementEnd#1{\InsertTagEnd{#1}} + +\long\def\BlockElementStart#1#2{\ifvmode\IgnorePar\fi\EndP\InsertTagStart{#1}{#2}} +\long\def\BlockElementEnd#1{\ifvmode\IgnorePar\fi\EndP\InsertTagEnd{#1}} + +% define default values for a new logical block +\def\NewLogicalBlock#1{% + \SetTag{#1}{span}% + \expandafter\def\csname #1:properties\endcsname{} +} + +\def\SetTag#1#2{\expandafter\xdef\csname #1:tagname\endcsname{#2}} +\def\get:tag#1{\expandafter\expandafter\csname #1:tagname\endcsname} + +\def\SetBlockProperty#1#2#3{% + \expandafter\ifcsname #1:property:#2\endcsname\else% + \expandafter\edef\csname #1:properties\endcsname{\csname #1:properties\endcsname\space\csname #1:property:#2\endcsname } + \fi% + \expandafter\def\csname #1:property:#2\endcsname{#2="#3"} +} + +\def\get:block:properties#1{% +\expandafter\csname #1:properties\endcsname% +} + +>>> + +\Section{Verify Elements} + +\<html Configure's\><<< +\:CheckOption{verify} \if:Option + |<chk no trace|> +\else \:CheckOption{verify+} \if:Option + |<chk trace|> +\fi \fi +\if:Option + |<check utilities|> +\else + \let\VerifyOpen|=\:gobble + \let\VerifyClose|=\:gobble + \let\VerifyEmpty|=\:gobble + \long\def\Verify#1\EndVerify{} + \def\trace:chk#1 #2|<par del|>{} +\fi +>>> + +\<chk no trace\><<< +\let\:chk:trc|=\:gobble +>>> + +\<chk trace\><<< +\def\:chk:trc#1{% + \writesixteen{\the\inputlineno\space(\:ChkLevel) #1}} +>>> + +The \`'\PushStack\:CHK\empty' is needed because whenever a pop occurs, +we temporarily take one more pop to check who was the old parent. + +\<check utilities\><<< +\HAssign\:ChkLevel|=0 +\let\:CurrentChk|=\empty +\PushStack\:CHK\empty +\def\VerifyOpen#1{\Protect\trace:chk#1 |<par del|>} +\def\trace:chk#1 #2|<par del|>{% + \gHAdvance\:ChkLevel |by 1 \:chk:trc{Open......#1}% + \expandafter\ifx \csname #1Level:\endcsname\relax + \expandafter\gHAssign\csname #1Level:\endcsname|=0 + \fi + \expandafter\gHAdvance\csname #1Level:\endcsname |by 1 + \PushStack\:CHK{#1}% + \expandafter\ifx \csname \:CurrentChk +#1\endcsname\relax + \expandafter\gdef \csname \:CurrentChk +#1\endcsname{}% + \writesixteen{\the\inputlineno. + --- warning --- \:CurrentChk\space --> #1 ?}% + \fi + \xdef\:CurrentChk{#1}% +} +\def\VerifyClose#1{\Protect\trace:endchk#1 |<par del|>} +\def\trace:endchk#1 #2|<par del|>{% + \:chk:trc{Close......#1}% + \expandafter\ifx \csname #1Level:\endcsname\relax + \writesixteen{\the\inputlineno. + --- warning --- </#1> witout <#1>}% + \expandafter\gHAssign\csname #1Level:\endcsname|=0 + \else + \expandafter\gHAdvance\csname #1Level:\endcsname |by -1 + \gHAdvance\:ChkLevel |by -1 + \PopStack\:CHK\:temp + \edef\:tempa{#1}% + \ifx \:temp\:tempa + \PopStack\:CHK\:CurrentChk + \PushStack\:CHK\:CurrentChk + \else + \writesixteen{\the\inputlineno. + --- warning --- </\:temp> instead of </#1>}% + \fi + \fi +} +\def\VerifyEmpty#1{\Protect\trace:emptychk#1 |<par del|>} +\def\trace:emptychk#1 #2|<par del|>{% + \:chk:trc{Empty......#1}% + \expandafter \ifx \csname \:CurrentChk +#1\endcsname\relax + \expandafter\gdef \csname \:CurrentChk +#1\endcsname{}% + \writesixteen{\the\inputlineno. + --- warning --- \:CurrentChk\space --> #1 ?}% + \fi +} +\begingroup + \catcode`\^|=7 + \gdef\Verify{\bgroup \catcode`\ |=9 \catcode`\^^M|=9 \:dtd} +\endgroup +\def\:dtd#1\EndVerify{\egroup\dtd:rule#1,-->,} +\def\dtd:rule#1-->#2,{\def\:temp{#1#2}\ifx \:temp\empty\else + \expandafter\gdef \csname #1+#2\endcsname{}% + \expandafter\dtd:rule + \fi} +>>> + + +\Chapter{Html Environment} + +\Section{Initiating} + + +The \`'\special{t4ht.\:html}' gives the extension to the root file. To +be recognized, Must appear before the openning of any file, and +outputing of any content. + +\<html option\><<< +\def\:tempa#1#2#3#4|<par del|>{#1#2#3} +\:CheckOption{htm} \if:Option + \edef\:html{\expandafter\:tempa\:html\empty\empty|<par del|>} + |<base 2 names for htm|> +\else \:CheckOption{htm5} \if:Option + \edef\:html{\expandafter\:tempa\:html\empty\empty|<par del|>} + |<base 5 names for htm|> +\else \:CheckOption{htm4} \if:Option + \edef\:html{\expandafter\:tempa\:html\empty\empty|<par del|>} + |<base 4 names for htm|> +\else \:CheckOption{htm3} \if:Option + \edef\:html{\expandafter\:tempa\:html\empty\empty|<par del|>} + |<base 3 names for htm|> +\else \:CheckOption{xhtml} \if:Option + \let\j:bname|=\jobname +\else \:CheckOption{html} + \if:Option \let\j:bname|=\jobname \fi +\fi \fi \fi \fi \fi +\if:Option + |% \ht:special{t4ht.\:html} |% + |<default html env|> + |<disregard html:par from protex|> + |<html TeX4ht protex|> +\fi +>>> + + + +\<first pass\><<< +\NewConfigure{ext}[1]{% + \def\:temp##1ext=##2,##3|<par del|>{% + \if !##2!\edef\:html{#1}% + \else \edef\:html{##2}\fi}% + \expandafter\:temp\Preamble ,ext=,|<par del|> +} +\Configure{ext}{html} +>>> + +\<base 2 names for htm\><<< +\def\:temp#1#2#3|<par del|>{\def\j:bname{#1\ifx ?#2\else #2\fi}} +\expandafter\:temp \jobname ?|<par del|> +>>> + +\<base 3 names for htm\><<< +\def\:temp#1#2#3#4|<par del|>{\def\j:bname{#1\ifx ?#2\else + #2\ifx ?#3\else #3\fi\fi}} +\expandafter\:temp \jobname ??|<par del|> +>>> + +\<base 4 names for htm\><<< +\def\:temp#1#2#3#4#5|<par del|>{\def\j:bname{#1\ifx ?#2\else + #2\ifx ?#3\else #3\ifx ?#4\else #4\fi\fi\fi}} +\expandafter\:temp \jobname ???|<par del|> +>>> + + +\<base 5 names for htm\><<< +\def\:temp#1#2#3#4#5#6|<par del|>{\def\j:bname{#1\ifx ?#2\else + #2\ifx ?#3\else #3\ifx ?#4\else #4\ifx ?#5\else #5\fi\fi\fi\fi}} +\expandafter\:temp \jobname ????|<par del|> +>>> + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{\TeX{} Parameters} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\`'\html:rightskip' is already defined in AlProTex, but we need it early here. + +\<def /HtmlEnv\><<< +\def\html:rightskip{\rightskip|=\z@ plus 0.5\hsize minus0.5\hsize } +\def\HtmlEnv{% + \html:rightskip |<html penalties|>% + \def\magnification{% + \def\:temp{\:warning{Insert \string\magnification + =\the\tmp:cnt\space before tex4ht}}% + \afterassignment\:temp\tmp:cnt}% + \ht:everypar{\HtmlPar}} +\let\HtmlPar|=\empty +>>> + + + +The \''\output' variable might hold a script +with +a \''\par', as is the case in LaTeX. + +\<def /HtmlEnv\><<< +\edef\:temp{% + \output={\noexpand\SaveEverypar \noexpand\ht:everypar{}\the\output + \noexpand\RecallEverypar}} +\:temp +>>>> + + + + +% \let\HtmlENV|=\:gobble + +Inhibit streching and shrinking of spaces between words to help tex4ht, +and let flexibility in line length to compensate for fixed spaces and +discouraged word breaks. + +\<html penalties\><<< +\frenchspacing |%no extra space after punctuation marks|% +\let\nonfrenchspacing|=\relax +\spaceskip|=\z@ |%override inter word glue|% +\xspaceskip|=\z@ |%same but for words ending with punctuation marks|% +\linepenalty|=0 |%charged on each line break|% +\adjdemerits|=0 |%charged on adj lines of diff length|% +\pretolerance|=10000 |%max penalty pts per line without hyphenation|% +\hyphenpenalty|=10000 |%for line break within word|% +\exhyphenpenalty|=10000|%for line break after hyphen|% +\clubpenalty|=0 |%for page break after first line of parag|% +\widowpenalty|=0 |%for page break before last line of parag|% +\interlinepenalty|=50 |%for page break within a paragraph|% +\displaywidowpenalty|=0 +\predisplaypenalty|=-10 +\postdisplaypenalty|=1000 +\abovedisplayskip|=30pt plus 10pt +\belowdisplayskip|=\abovedisplayskip +\abovedisplayshortskip|=\abovedisplayskip +\belowdisplayshortskip|=\abovedisplayskip +>>> + +We don't want a page break after a display, because the +\''\aftergroup' material for the equation may be detached from the +equation. A possible prolem for math into figures. + + +\<default html env\><<< +|<def /HtmlEnv|> +\edef\:temp{\meaning\everypar} +\edef\:tempa{\string\everypar} +\ifx \:temp\:tempa + \let\ht:everypar|=\everypar +\else + % LaTeX kernel will patch \everypar in future releases, + % so this test will always fail. We should define \ht:everypar + % anyway, paragraph handling would fail otherwise + \let\ht:everypar|=\everypar + \:warning{nonprimitive \string\everypar} +\fi +\edef\NoHtmlEnv{% + \sfcode `\noexpand\noexpand\noexpand\.3000 |%nonfrenchspacing|% + \sfcode `\noexpand\noexpand\noexpand\?3000 + \sfcode `\noexpand\noexpand\noexpand\!3000 + \sfcode `\noexpand\noexpand\noexpand\:2000 + \sfcode `\noexpand\noexpand\noexpand\;1500 + \sfcode `\noexpand\noexpand\noexpand\,1250 + \rightskip|=\the\rightskip + \spaceskip|=\the\spaceskip + \xspaceskip|=\the\xspaceskip + \linepenalty|=\the\linepenalty + \adjdemerits|=\the\adjdemerits + \pretolerance|=\the\pretolerance + \hyphenpenalty|=\the\hyphenpenalty + \exhyphenpenalty|=\the\exhyphenpenalty + \clubpenalty|=\the\clubpenalty + \widowpenalty|=\the\widowpenalty + \interlinepenalty|=\the\interlinepenalty + \displaywidowpenalty|=\the\displaywidowpenalty + \predisplaypenalty|=\the\predisplaypenalty + \postdisplaypenalty|=\the\postdisplaypenalty + \abovedisplayskip|=\the\abovedisplayskip + \belowdisplayskip|=\the\belowdisplayskip + \abovedisplayshortskip|=\the\abovedisplayshortskip + \belowdisplayshortskip|=\the\belowdisplayshortskip + \noexpand\ht:everypar{\noexpand\the\noexpand\ht:everypar}} +>>> + + +\<activate html env\><<< +\edef\NoHtmlEnv{\NoHtmlEnv}% +\append:def\NoHtmlEnv{\SUBOff \SUPOff}\HtmlEnv +>>> + +\<html utilities\><<< +\let\:noindent|=\noindent +\def\noindent{\ifx \EndPicture\:UnDef + \ifvmode \IgnoreIndent\leavevmode\fi + \else \:noindent \fi} +>>> + +\Section{Paragraphs} + +We want to push specials at start of lines, and merge the space before +and after specials. + +\<html utilities\><<< +\let\skip:Par|=\empty +>>> + + + + +\<html paragraph breaks at entry to file\><<< +\def\HtmlPar{\HtmlPar:Off{% + \if:nopar \ShowPar \ShowIndent + \ifx \skip:Par\empty\else \hskip -\parindent \skip:Par\fi + \else + \if:removeindent \ShowIndent \hskip -\parindent \a:Par + \else + \ifdim \parindent>\z@ \hskip -\parindent \fi + \html:par + \ifdim \parindent>\z@ \hskip \parindent \fi + \fi\fi \relax +}}% +>>> + + +\<general utilities\><<< +\def\IgnorePar{\ifx \EndPicture\:UnDef \Protect\gl:nopartrue \fi} +\def\ShowPar{\ifx \EndPicture\:UnDef \Protect\gl:noparfalse \fi} +\def\IgnoreIndent{\ifx \EndPicture\:UnDef + \Protect\gl:removeindenttrue \fi} +\def\ShowIndent{\ifx \EndPicture\:UnDef + \Protect\gl:removeindentfalse \fi} +\def\gl:nopartrue{\global\:nopartrue} +\def\gl:noparfalse{\global\:noparfalse} +\def\gl:removeindenttrue{\global\:removeindenttrue} +\def\gl:removeindentfalse{\global\:removeindentfalse} +\def\HtmlParOff{\global\let\HtmlPar:Off|=\:gobble} +\def\HtmlParOn{\gdef\HtmlPar:Off##1{##1}} +\HtmlParOn +>>> + + + + + +\<new ifs\><<< +\:tempa{if:removeindent} +\:tempa{if:nopar} +>>> + + + + +\<first pass\><<< +\def\c:HtmlPar:#1#2#3#4{% + \def\:temp{#3}\ifx \:temp\empty \c:def\a:Par{#1}\else + \c:def\a:Par{#1\Next:EndP{#3}}\fi + \def\:temp{#4}\ifx \:temp\empty \c:def\html:par{#2}\else + \c:def\html:par{#2\Next:EndP{#4}}\fi +} +\def\EndP{\Protect\par:end} +\let\par:end|=\empty +\def\Next:EndP{\Protect\next:endp} +\def\next:endp#1{\gdef\par:end{#1\global\let\par:end|=\empty}} +\def\SaveHtmlPar{\PushMacro\a:Par \PushMacro\html:par} +\def\RecallHtmlPar{\PopMacro\a:Par \PopMacro\html:par} +>>> + + +The following is neded for debugging, to detect skipped paragraps. +Delete it, or just make it active for debugging mode!!!!! + + +\<shared config\><<< +\NewConfigure{HtmlPar*}[2]{% + \def\:temp{#2}\ifx \:temp\empty \c:def\skip:Par{#1}\else + \c:def\skip:Par{#1\Next:EndP{#2}}\fi} +>>> + +\<first pass\><<< +\def\gl:let{\global\let} +\def\EndP:cnt{0} +\def\SaveEndP{% + \expandafter\gl:let\csname \EndP:cnt :sv\endcsname |=\par:end + \gl:let\par:end|=\empty + \gHAdvance \EndP:cnt |by 1 } +\def\RecallEndP{% + \ifnum \EndP:cnt>0 + \gHAdvance \EndP:cnt |by -1 + \expand:after{\gl:let\par:end|=}\csname\EndP:cnt :sv\endcsname + \else + \:warning{extra \string\RecallEndP} + \fi} +>>> + +\<disregard html:par from protex\><<< +\ifx \html:par\:UnDef \let\html:par|=\empty \fi +>>> + +User's input, and the following in case of no such input, +determine how files will initially treat paragraphs. + + + + + + +Display math formulas can be in-line or between paragraph. +The ``.nopar'' is for forced paragraph starts after the +end of in-line display paragraphs. HTML 4.0 requires opening +of such paragraphs. + + + +\<html paragraph breaks at entry to fileNO\><<< +\Configure{HtmlPar}{\sva:Par}{\svhtml:par} {}{} +>>> + + + + +\<empty html paragraph breaks\><<< +\Configure{HtmlPar}{}{}{}{}% +>>> + + + + + +\<general utilities\><<< +\def\SaveEverypar{% + \expandafter\ifx\csname ht:everypar\endcsname\relax + \expand:after{\expandafter\gdef\csname \n:list L\endcsname }% + \expandafter{\expandafter\everypar + \expandafter{\the\everypar}}% + \else + \expand:after{\expandafter\gdef\csname \n:list L\endcsname }% + \expandafter{\expandafter\ht:everypar + \expandafter{\the\ht:everypar}}% + \fi + \expandafter\xdef\csname \n:list X\endcsname{% + \if:removeindent \global\noexpand\:removeindenttrue + \else \global\noexpand\:removeindentfalse \fi + \if:nopar \global\noexpand\:nopartrue + \else \global\noexpand\:noparfalse \fi}% + \HtmlEnv \csname \n:list X\endcsname + \csname \n:list L\endcsname + \gHAdvance\n:list |by 1 +} +\def\RecallEverypar{\ifnum \n:list<1 + \:warning{\noexpand\RecallEverypar without \noexpand\SaveEverypar}% + \else + \HtmlEnv + \gHAdvance\n:list |by -1 + \csname \n:list X\endcsname + \csname \n:list L\endcsname + \fi +} +\def\n:list{0} +>>> + + + + + +\Chapter{Cross References} + + +Should be consistent with the corresponding features in ProTeX. + + +\<cross references\><<< +|<common cross references|> +\ifHtml |<html cross references|> +\fi +>>> + +\Section{The Commands} + +\SubSection{Ref} + +The implementations of \''\Ref' and \''\Tag' view the crosswords $\alpha$ as +pointers to macros that carry the names `\''\cw:'$\alpha$'. + +\<common cross references\><<< +\def\Ref#1{\expandafter\ifx + \csname |<tag of Tag|>#1\endcsname \relax \:NoTag{#1}% + \else \csname |<tag of Tag|>#1\endcsname \fi} +>>> + + +\<general utilities\><<< +\def\ifTag#1#2#3{\expandafter\ifx + \csname |<tag of Tag|>#1\endcsname \relax #3\else #2\fi} +>>> + + + + + + + +\SubSection{LikeRef} + +The \`'\:LikeRef' command is a stripped down version of +\`'\Ref'; it doesn't check whether the tag is defined. + +The space in \`'\space' is needed for carrying MAME tags +in (mosaic) html files. + +\<common cross references\><<< +\def\LikeRef#1{\expandafter\ifx + \csname |<tag of Tag|>#1\endcsname \relax \space% + \else \csname |<tag of Tag|>#1\endcsname \fi} +\def\:LikeRef#1{\csname |<tag of Tag|>#1\endcsname} +>>> + + +Read file from previous compilation. + + + + +\SubSection{Tag} + +A command \''\Tag{'$\alpha$\''}{'$\beta$\''}' introduces into the +reference file a record + of the form +\''\:CrossWord{'$\alpha$\''}{'$\hat\beta$\''}{'$i$\''}'. + + +\<common cross references\><<< +\let\:SUPOff|=\empty \let\:SUBOff|=\empty +\def\Tag#1#2{\begingroup \:SUPOff \:SUBOff \a:xref \escapechar=`\\% + \edef\:head{\string\:CrossWord{#1}{#2}}% + \expandafter \expandafter \expandafter + \:writeref\expandafter{\:head{\folio}\prcnt:ch}% +\endgroup} +\NewConfigure{xref}{1} +>>> + +The \''\:SUBSUPOff' will be redefined latter with subscripts and +superscripts. The current definition is sufficient for the +tags that in the meantime are created by the system. + + +\<common cross references\><<< +\def\:writeref{\write\:refout}% +>>> + +\<general utilities\><<< +\catcode`\%|=12 \def\prcnt:ch{%} \catcode`\%|=14 +>>> + +\<html utilities\><<< +\catcode`\%|=12 \def\%{%} \catcode`\%|=14 +>>> + +\Section{Internal References} + + + +\SubSection{Loading} + +\<common cross references\><<< +\def\load:ref#1{% + |<set catcodes for info in ref file|>% + \get:input{#1}% + \re:call \let\:CrossWord|=\sv:crs } +|<interpretation for entries in ref file|> +\ifx \:refout\:UnDef + |<check the existence of jobname.xref|> + \load:ref{\jobname.xref} + \csname newwrite\endcsname\:refout + |<if latex then latex/write sol|>\openout\:refout=\jobname.xref +\fi +>>> + +\<check the existence of jobname.xref\><<< +\openin15=\jobname.xref +\ifeof15 \def\:NoTag#1{\hbox{$???$}} +\else \def\:NoTag#1{\hbox{$???$} + \:warning{\string\Ref\string{\string#1\string}?}} + |<warnings for missing /Link|> +\fi +\closein15 +>>> + + + + + + +\<set catcodes for info in ref file\><<< +\edef\re:call{\catcode`\noexpand\:|=\the\catcode`\: }% +\catcode`\:|=11 +\let\sv:crs|=\:CrossWord +\def\:CrossWord{\bgroup + \no:catcodes{128}{255}{12}% + \catcode`\:|=12 \catcode`\@|=11 + \catcode`\^^M|=11 \:CrsWrd}% +\def\:CrsWrd##1##2##3{\egroup \sv:crs{##1}{##2}{##3}}% +>>> + +Aborted compilations tend to leave incimplete \`':CrossWord' commands +in the xref file, missing the last page-number parameter. The +\`'\catcode`\^^M=11' allows such commands to be loaded without +terminating the compilation. + +\Section{External References} + +References to information in other files can be achieved with +the following file-loading command +\`'\LoadRef-[prefix]+{filename.ext}{...}'. + + + +The \`'.ext', \`'+', \`'-', and \`'[...]' components are +optional. A missing \`'.ext' stands for \`'.xref'. When \`'-[prefix]+' +is empty the component \`'{...}' should also be omitted (and the +comamnd assume the form \`'\LoadRef{filename.ext}'). + +A \`'+' asks that \`'\Ref' and \`'LikeRef' commands will refer to +expanded tags of the form \`'filename::tag' instead of just \`'tag'. +A \`'[prefix]' asks that only tags which start with the given prefix +will be loaded. When \`'[prefix]' is omitted, an empty prefix is +assumed and all the tags are loaded. A \`'-' asks that \`'\Ref' and +\`'LikeRef' commands will refer to truncated tags in which the +specified prefixes are omitted. + +Intuitively, a tag can be viewed as a triplet \`'<from>:<to><tag>' +which encodes information together with source and destination +addresses. The \`'{...}' specifies how the information should be +included, where \`'#1' represents the information being loaded. + +\SubSection{Scanning the Preamble} + + + +\<common cross references\><<< +\def\LoadRef{\futurelet|<-?|>\:LoadRef} +\def\:LoadRef{{% + \if \bgroup|<-?|> + \aftergroup\loadr:ef + \else + \aftergroup\Load:Ref \if -|<-?|> \else + \aftergroup-\fi + \fi +}} +\def\Load:Ref#1{\futurelet|<[?|>\LoadRef:} +\def\LoadRef:{{% + \aftergroup\:loadref \ifx [|<[?|> \else + \aftergroup[\aftergroup]\fi}} +>>> + + +%%%%%%%%%%%%% WAS if[ + +\<common cross references\><<< +\def\:loadref[#1]{% + \let\sv:cros|=\:CrossWord + \edef|<prefix|>{#1}\ifx |<prefix|>\empty \let|<[?|>|= N\fi + \futurelet|<+?|>\l:oadref } +\def\l:oadref{% + {\aftergroup\lo:adref \if +|<+?|> \else \aftergroup+\fi }} +\def\lo:adref#1#2#3{% + \def\cw:format##1{#3}% + \edef\:temp{#2}\expandafter \get:ext\:temp .|<par del|>% + \ifx \:temp\empty + \set:CrossWord#2.|<par del|>{|<prefix|>}\load:ref{#2.xref}% + \else \set:CrossWord#2|<par del|>{|<prefix|>}\load:ref{#2}\fi + \let\:CrossWord|=\sv:cros } +\def\get:ext#1.#2|<par del|>{\def\:temp{#2}} +\def\loadr:ef#1{\let|<+?|>=x \let|<prefix|>|=\empty \lo:adref{}{#1}{##1}} +>>> + + + +\<cs?\><<< +\:tempa>>> + +\<-?\><<< +\:tempa>>> + +\<[?\><<< +\:tempb>>> + +\<+?\><<< +\:tempc>>> + +\<prefix\><<< +\:tempd>>> + +\SubSection{Incorporating the Preamble} + +\<common cross references\><<< +\def\set:CrossWord#1|<par del|>#2{% + \edef\:temp{\noexpand\:setCrossWord#1|<par del|>{#2}}\:temp} +\def\:setCrossWord|<ref filename par|>.#2|<par del|>|<substr par|>{% + \ifx [|<[?|> + \def\:CrossWord##1##2##3{% + \cond:CrossWord##1|<substr par|>|<par del|>{##1}{##2}{##3}}% + \def\:tail|<substr par|>##1|<substr par|>{##1}% + \if +|<+?|> |<:CrossWord := extend selected words|>% + \else |<:CrossWord := selected words|>\fi + \else + \if +|<+?|> |<:CrossWord := extend all words|>\fi + \fi |%else :CrossWord := all words|% +} +>>> + +%%%%%%%%%%%%% WAS if[ + + +\<:CrossWord := extend all words\><<< +\def\:CrossWord{\Cross:Word{|<ref filename par|>::}}% +>>> + +\<:CrossWord := extend selected words\><<< +\if -|<-?|> + \def\cond:CrossWord##1|<substr par|>##2|<par del|>##3##4##5{% + \def\:temp{##1}\ifx \:temp\empty + \Cross:Word{|<ref filename par|>::}% + {\:tail##3|<substr par|>}{##4}{##5}\fi }% +\else + \def\cond:CrossWord##1|<substr par|>##2|<par del|>##3##4##5{% + \def\:temp{##1}\ifx \:temp\empty + \Cross:Word{|<ref filename par|>::}{##3}{##4}{##5}\fi }% +\fi +>>> + +\<:CrossWord := selected words\><<< +\if -|<-?|> + \def\cond:CrossWord##1|<substr par|>##2|<par del|>##3##4##5{% + \def\:temp{##1}\ifx \:temp\empty + \Cross:Word{}{\:tail##3|<substr par|>}{##4}{##5}\fi }% +\else + \def\cond:CrossWord##1|<substr par|>##2|<par del|>##3##4##5{% + \def\:temp{##1}\ifx \:temp\empty + \Cross:Word{}{##3}{##4}{##5}\fi }% +\fi +>>> + + + + + +\Section{Interpretation for Entries} + + + +For each crossword $\alpha$ the imported file contains a record of the +form \''\:CrossWord{'$\alpha$\''}{'$\hat{\beta}$\''}{'$i$\''}'. +In such a record, $\hat\beta$ and $i$ stand for the expanded token +list and HPage number that correspond to $\alpha$, respectively. + +A command +\''\:CrossWord{'$\alpha$\''}{'$\hat{\beta}$\''}{'$i$\''}' +introduces the macro +\''\def\cw:'$\alpha$\''{'$\hat\beta$\''}', if the label is not empty. +Otherwise, it introduces the macro \''\def\cw:'$\alpha$\''{'$i$\''}' +that holds the page number. + + +\<interpretation for entries in ref file\><<< +\def\:CrossWord#1#2#3{\Cross:Word{}{#1}{#2}{#3}} +\def\Cross:Word#1#2#3#4{% + \def\:temp{#3}\tmp:toks{#3}% + \expandafter\edef\csname |<tag of Tag|>\cw:format{#1#2}\endcsname{% + \expandafter\ifx\csname |<tag of Tag|>\cw:format{#1#2}\endcsname\relax + \else \csname |<tag of Tag|>\cw:format{#1#2}\endcsname , \fi + \ifx \:temp\empty #4\else \the\tmp:toks\fi}} +\def\cw:format#1{#1}% +>>> + + + + +\<par del\><<< +!*?: >>> + +\<substr par\><<< +#3>>> + +\<ref filename par\><<< +#1>>> + +%%%%%%%%%%%%%%%%%%% +\Section{Link} +%%%%%%%%%%%%%%%%%% + +Good for \''\Link{...}{...}' across files when we have +\''\LoadRef+{...}{#1}'. + +\<html cross references\><<< +\catcode`\:=12 + +\def\get@hfile#1{\get@hfil@ #1:::://} + +\def\get@hfil@#1::#2::#3//{% + \expandafter\ifx \csname + |<tag of Tag|>#1::|<HTag tag|>#2\endcsname \relax \else + \expandafter\expandafter\expandafter\get@@hfile + \csname |<tag of Tag|>#1::|<HTag tag|>#2\endcsname,//{#1}% + \fi} +\def\get@@hfile#1,#2//#3{% + \expandafter\ifx + \csname |<tag of Tag|>#3::|<auto file tag|>#1% + |<Tag/Ref: file-id -> file-name|>\endcsname \relax + \else + \csname |<tag of Tag|>#3::|<auto file tag|>#1% + |<Tag/Ref: file-id -> file-name|>\endcsname + \expandafter \expandafter \expandafter \expandafter + \expandafter \expandafter \expandafter \remove@fn + \fi } + +\def\remove@fn#1#2::{#1} + +\catcode`\:=11 +>>> + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Utilities} +%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Empty Anchors} +%%%%%%%%%%%%%%%%%%%%%%%%%% + +Change the following to standard space character when microsoft +explorer will let it. Currently it wiil go only for ubreakable +space. The last null anchor is obviously the most desirable one. + +\<html utilities\><<< +\def\hidden:anchor{} +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Latex Anomalies} +%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<if latex then latex/write sol\><<< +\if:latex \expandafter\immediate\fi +>>> + + +Try to understand betetr what goes here, because I got +the following not workin in latex. It pushed the output +to the log file instead of the toc file. + +\Verbatim +\<latex/write sol\><<< +\immediate +>>> +\EndVerbatim + +Inserted for the differences in the output routines between TeX and +LaTeX. + +\Verbatim + -------ok----------------faulty------------------ok----------------- +| | | | +| | \documentstyle{book} | \documentstyle{book} | +| | \begin{document} | \begin{document} | +| \newwrite\y | \newwrite\y | \newwrite\y | +| \openout\y=f.xx | \openout\y=f.xx | \immediate\openout\y=f.xx | +| \write\y{....} | \write\y{....} | \immediate\write\y{....} | +| \closeout\y | \closeout\y | \immediate\closeout\y | +| \end | \end{document} | \end{document} | + -------------------------------------------------------------------- +\EndVerbatim + +La\TeX has a \''\clearpage' and \''\cleardoublepage'. + +\<latex /special sol\><<< +\ifx \clearpage\:UnDef \def\:clearpage{\vfil\penalty-20000} +\else + \let\real:par|=\par \def\eq:par{\par\real:par} + \def\:clearpage{\expandafter\ifx\eq:par\clearpage\fi} +\fi +>>> + +In LaTeX, \''\clearpage' embeds a \''\newpage', which in turns +embeds a \''\par'. The \''\EndPage', in turn, embeddes a +\''\:clearpage' which may cause a problem in places that +\''\par' might be a problem. Such is the case, for instance, +within \''\halign', where \''\par' has a different meaning +and may cause an infinite loop. The \''\footnote' produces +this bad situation. + + +\<general utilities\><<< +|<latex /special sol|> +>>> + +\Verbatim + ---------ok------------------faulty--------------------ok----------- +| | | | +| | \documentstyle{book} | \documentstyle{book} | +| | \begin{document} | \begin{document} | +| aaaaa | aaaaa | aaaaa | +| \special{t4ht>bbbbb} | \special{t4ht>bbbbb} | \special{t4ht>bbbbb} | +| ccccc | ccccc | ccccc | +| \vfil\penalty-20000 | \vfil\penalty-20000 | \vfil\penalty-10000 | +| ddddd | ddddd | ddddd | +| \end | \end{document} | \end{document} | +| | | | + -------------------------------------------------------------------- +\EndVerbatim + + + +\Verbatim + --------------------ok-------------------------------faulty------------------ +| |\documentstyle{book} | +| |\begin{document} | +|\leavevmode x\vfil \penalty-10000 |\leavevmode x\vfil \penalty-10000 | +|\leavevmode y\mark{\gdef\noexpand\z{}}|\leavevmode y\mark{\gdef\noexpand\z{}}| +|\end |\end{document} | + ----------------------------------------------------------------------------- + + -------------ok-----------------------faulty-------------- +| | \documentstyle{book} | +| | \begin{document} | +| y | y | +| \mark{\gdef\noexpand\zz{}} | \mark{\gdef\noexpand\zz{}} | +| \end | \end{document} | + ---------------------------------------------------------- +\EndVerbatim + +\SubSection{Other} + +\<general utilities\><<< +\ifx \folio\:UnDef + \def\folio{\ifx \pageno\:UnDef \z@ \else + \ifnum \pageno <0 \romannumeral -\pageno + \else \the \pageno \fi\fi} +\fi +>>> + + + +%%%%%%%%%%%%%%%%%%%%%%%%%% +\Chapter{Html Files} +%%%%%%%%%%%%%%%%%%%%%%%%%% + +\''\HP:file' was before \''\:tempa', and it got screwed when +\''\PauseHFont' and \''\EndPauseHFont' have been defined +and introdued to \''\Configure{HtmlPar}'. The name is probably misused +at some of its occurences. + + +\<files\><<< +|<elements for file|> +\ifHtml |<html file commands|> \fi +>>> + +\Section{Open Files} + +The first optional parameter of \`'\FileStream' goes to the title of +the html file. For a second parabeter, one should be careful +of not providing an undefined \`'\csname...\endcsname' file name. An +empty second parameter refers to the root file. + +\<elements for file\><<< +\ifx \FileStream\:UnDef \else + \errmessage{--- TeX4ht error --- + \noexpand\FileStream is defined outside of TeX4ht}\endinput +\fi +\def\FileStream{\IgnorePar + \let|<needs preamble|>|=-\futurelet\:temp\F:le} +\def\F:le{\if +\:temp \let|<needs preamble|>|=+\expandafter\Fl:e + \else \expand:after{\Fl:e-}\fi} +\def\Fl:e#1{\futurelet\:temp\::File} +\def\::File{\ifx [\:temp \expandafter\:File + \else \expand:after{\:File[]}\fi } +\def\:File[#1]#2{} +>>> + +%%%%%%%%%%%%% WAS if[ + +\<html file commands\><<< +\def\:File[#1]#2{% + \no:pic\edef\file:name{#2}\yes:pic + \expandafter\ifx\csname + |<csname: file name -> file id|>\file:name\endcsname\relax + |<open html file name|>% + \else |<reopen html file|>% + \fi} +\HAssign\bs:fileid |= 1 +>>> + +The definition \`'\edef\file:name{#2}' is needed just in case the +parameter \`'#2' depends on \`'\file:id', because the latter is being +changed within the course of the code. + + + + +\<reopen html file\><<< +\xdef\file:id{\csname + |<csname: file name -> file id|>\file:name\endcsname}% +\ht:special{t4ht>\ifnum \file:id>\bs:fileid\space \file:name\fi }% +>>> + + + + +\<open html file name\><<< +\ht:special{t4ht>\file:name}% +\immediate\write-1{--- file \file:name\space ---}% +|<round ids before file|>% +\gHAdvance\maxfile:id |by 1 +\global\let\file:id|=\maxfile:id +\Tag{|<auto file tag|>\file:id + |<Tag/Ref: file-id -> file-name|>}{\file:name}% +\expandafter\xdef\csname + |<csname: file name -> file id|>\file:name\endcsname{\file:id}% +|<HPage TITLE|>% +|<remove par skip space|>% +\a:PROLOG \a:HTML \a:HEAD +\ifx +|<needs preamble|>% + |<initiate frames|>% + \xdef:cs{|<live|>\file:id}{\noexpand\a:TITLE + |<noexpanded configured title|>% + \noexpand\b:TITLE\noexpand\a:@HEAD\noexpand\b:HEAD}% +\else + \xdef:cs{|<live|>\file:id}{}% + \a:TITLE|<configured title|>\b:TITLE \a:@HEAD\b:HEAD\B:DY +\fi +>>> + +\<configured title\><<< +\bgroup \:TITLE: \c:TITLE \egroup +>>> + + + +\<noexpanded configured title\><<< +\bgroup \noexpand\:TITLE: \noexpand\c:TITLE \egroup +>>> + + +\<remove par skip space\><<< +\ht:special{t4ht@[}{\ht:everypar{}\leavevmode}\ht:special{t4ht@]}% +>>> + + + + +Titles need to be evaluated immediately to capture meanings that come +from sectioning commands, where the latter may include macro names +taht can change in time. + + +The following should appear before \''\Preamble'. + +\<first pass\><<< +\NewConfigure{HTML}[2]{\c:def\a:HTML{#1}\c:def\b:HTML{#2}} +\NewConfigure{HEAD}[2]{\c:def\a:HEAD{#1}\c:def\b:HEAD{#2}} +\NewConfigure{BODY}[2]{\c:def\a:BODY{#1}% + \c:def\b:BODY{\csname a:@/BODY\endcsname#2}} +\NewConfigure{TITLE}[2]{\c:def\a:TITLE{#1}\c:def\b:TITLE{#2}} +\NewConfigure{TITLE+}[1]{\c:def\c:TITLE{#1}} +\NewConfigure{@TITLE}[1]{\concat:config\:TITLE:{#1}} +\NewConfigure{@HEAD}[1]{\concat:config\a:@HEAD{#1}} +\let\a:@HEAD|=\relax +>>> + +\<concat config\><<< +\long\def\concat:config#1#2{\def\:temp{#2}% + \ifx \:temp\empty \let#1|=\empty + \else \ifx #1\relax \let#1|=\empty\fi + \append:def#1{#2}\fi +} +>>> + +\''\Configure{@HEAD}{}' empties the content. +\''\Configure{@HEAD}{...}' appends the content. + +Same for the following + +\<first pass\><<< +\NewConfigure{@BODY}[1]{\concat:config\a:@BODY{#1}} +\let\a:@BODY\relax +\NewConfigure{@/BODY}[1]{\expandafter + \concat:config\csname a:@/BODY\endcsname{#1}} +\expandafter\let\csname a:@/BODY\endcsname\relax +>>> + +Why the \''\noexpand' above. Put a \`'\special' instead. + +\<utilities\><<< +\:CheckOption{hshow} \if:Option + \def\hshow#1{\writesixteen + {..#1.......\expandafter\meaning\csname #1\endcsname}} + |<Show Configure|> +\fi +>>> + +\<Show Configure\><<< +\def\ShowConfigure#1{% + \edef\:tempb{\expandafter \meaning\csname c:#1:\endcsname}% + \expandafter\par:N \:tempb////% + \writesixteen{\string\Configure{#1}}% + {\show:Arg{1}{a:#1}% + \show:Arg{2}{b:#1}% + \show:Arg{3}{c:#1}% + \show:Arg{4}{d:#1}% + \show:Arg{5}{e:#1}% + \show:Arg{6}{f:#1}% + \show:Arg{7}{g:#1}% + \show:Arg{8}{h:#1}% + \show:Arg{9}{i:#1}}% +} +\edef\:temp{\def\noexpand + \par:N##1\string :##2->##3////{\noexpand\par:NN?##2//}} +\:temp +\def\par:NN#1#2//{\def\:tempb{#2}\ifx\:tempb\empty + \def\:tempb{#1}\else \def\:tempb{\par:NN#2//}\expandafter\:tempb\fi} +\def\show:Arg#1#2{% + \ifnum \:tempb=#1 \let\show:Arg=\:gobbleII \fi + \expandafter\let\expandafter\:temp \csname #2\endcsname + \writesixteen{ {\ifx \:temp\relax ???\else + \expandafter\:gobbleM \meaning \:temp\fi}}} +\def\:gobbleM#1->{} +>>> + + + + + + +The following tag is for recording files that are still alive, and for +keeping a status location for HEAD/FRAMESET/BODY entity types. + +\<live\><<< +Lv >>> + + + +\Section{Close Files} + +\<html file commands\><<< +\def\EndFileStream#1{% + \expandafter\ifx + \csname |<csname: file name -> file id|>#1\endcsname\relax + \:warning{\string\EndFileStream{#1}?}% + \else + \ifnum\csname |<csname: file name -> file id|>#1\endcsname=\bs:fileid + \:warning{\string\EndFileStream{\jobname .\:html}?}% + \else \expandafter\ifnum |<file not overided by /ChildOf|>% + |<close html file name|>% + \fi\fi\fi } +>>> + +Note thta \`'\EndFileStream' might get fake calls due to end of HPages. Hence, +\`'\RecallEverypar' should be invoked only when real HPageas are closed. +Well, we can't put \''\SaveEverypar' and + \''\RecallEverypar' in \''\FileStream' and \''\EndFileStream' +because they are not structured. We can reopen and close files randomly. + + + An extra empty line at end of file (for some reason, some settings +of emacs prompt the user for such a line). + +\<close html file name\><<< +{\let\inputlineno|=\tmp:cnt \tmp:cnt|=1 \root:next }% +|<end body and frames|>% +\ht:special{t4ht<#1}% +\g:delete{\empty |<csname: file name -> file id|>#1}% +|<round ids after file|>% +>>> + +Why the \''\edef' above + + +Upon closing a file with \`\special{t4ht<#1}', the program +\`'tex4ht.c' moves to the youngest file that is still openned. + +\<close html file name\><<< +\expandafter\expandafter\expandafter\global \expandafter + \let\csname |<live|>\file:id\endcsname|=\:UnDef +\global\let\file:id|=\maxfile:id +\find:fileid +>>> + +\<html file commands\><<< +\def\find:fileid{% + \expandafter\ifx \csname |<live|>\file:id\endcsname \relax + \gHAdvance\file:id |by -1 \expandafter\find:fileid + \fi +} +>>> + + + +\Section{Cross References} + + + + +The commands referencing files are defined for use also within +restricted environments (\`'\edef', \`'\write'). + +\<html file commands\><<< +\def\TagFile#1{% + \expandafter\ifx \csname + |<tag of Tag|>|<file name for TagFile|>\endcsname \relax \else + \Tag{#1|<File tag|>}{\LikeRef{|<file name for TagFile|>}}% + \fi +} +\def\RefFile#1{\LikeRef{#1|<File tag|>}} +\def\FileName{\LikeRef + {|<auto file tag|>\file:id |<Tag/Ref: file-id -> file-name|>}} +>>> + + + + + +\<file name for TagFile\><<< +|<auto file tag|>\file:id |<Tag/Ref: file-id -> file-name|>% +>>> + + +\`'\def\RefFile#1{\Ref{#1|<File tag|>}} +\def\LikeRefFile#1{\LikeRef{#1|<File tag|>}}' + +\<html file commands\><<< +\def\RefFileNumber#1{% + \expandafter\ifx \csname + |<tag of Tag|>|<auto file tag|>#1% + |<Tag/Ref: file-id -> file-name|>\endcsname\relax + \else + \:LikeRef{|<auto file tag|>#1|<Tag/Ref: file-id -> file-name|>}% + \fi } +>>> + + +\Verbatim + + > Why is it that during the first run, \file:name returns the correct + > filename, but \FileName returns a blank? + +\file:name doesn't always return the correct + + \documentclass{article} + \begin{document} + + \writesixteen + {\csname file:name\endcsname...\csname FileName\endcsname} + + \end{document} + + > Is this a bug or a feature? + +\FileName gets its information through the xref file from the previous +compilation, in a similar manner that \ref gets its information from +\name in latex. The indirection is needed to allow communication +between different files that are to be compiled into a joint html +output. It was introduced at a time that I and others had no access to +large latex compilers, forcing the break up of large source (eg, +books) into smaller files. +\EndVerbatim + + + +\Section{Root File} + +\<html file commands\><<< +\xdef:cs{\empty |<csname: file name -> file id|>\jobname .\:html}{\file:id} +\xdef:cs{\empty |<csname: file name -> file id|>}{\file:id} +\Tag{|<auto file tag|>\file:id + |<Tag/Ref: file-id -> file-name|>}{\jobname .\:html} +\bgroup + |<protect from /special redef|>% + \xdef:cs{|<live|>\file:id}{\noexpand\a:TITLE + |<noexpanded configured title|>% + \noexpand\b:TITLE \noexpand\a:@HEAD\noexpand\b:HEAD}% +\egroup +>>> + + + + +\Section{Document Head} + +\<start html doc\><<< +\:startdoc +>>> + + + +\<at doc start\><<< +\def\at:startdoc{% + \let\:startdoc|=\:UnDef \let\at:startdoc|=\:UnDef + |<activate html env|>% + \a:Preamble + |<start html file|>} +\def\:startdoc{% + \at:startdoc + \edef\:temp{\pageno|=\the\pageno}% + {\let\HCode|=\:gobble \par\newpage}\:temp} +>>> + +The \''\let\HCode=\:gobble' is to prevent \`'<BR>' from +\''\line' activated by \'sty' and called upon from +a user-designed \''\output' routines taht have not been +adjusted yet for haeders and footers. + + + + +> The following is to ensure that no shipout of content is done before +> the header is out. + +Update 2020: patching of shipout is discouraged in LaTeX. I don't know what +use case the following code has, but it seems that TeX4ht can safelly work +without it. We can introduce it back in the case of problems. -- Michal + +\<start html doc\><<< +%\let\:shipout|=\shipout +%\def\shipout{\vfil\break\let\shipout|=\:shipout \shipout} +>>> + + + +\<start html file\><<< +\a:PROLOG \a:HTML \a:HEAD +|<initiate frames|>% +>>> + +The following empty line is to avoid lines that are too long +in the style file. + +The following is for the root file, and it can be overriden +by definitions before \''\EndPreamble'. + + + +\<concat config\><<< +\def\:prolog#1#2,#3|<par del|>{% + \if ,#2,\else + \edef\:tempc{\if*#2\fi}% + \ifx \:tempc\empty + \expandafter\append:def + \csname a:#1\endcsname{\csname a:#2\endcsname}% + \expandafter\ifx \csname c:#2:\endcsname\relax + \NewConfigure{#2}{1}% + \fi + \else + \expand:after{\pro:log{#1}}\expandafter{\:tempc}% + \fi\fi + \if ,#3,\else \expand:after{\:prolog{#1}#3|<par del|>}\fi +} +\def\pro:log#1#2{% + \expandafter\append:def + \csname a:#1\endcsname{\csname a:#2\endcsname}% + \expandafter\ifx \csname c:#2:\endcsname\relax + \NewConfigure{#2}[1]{\expandafter + \concat:config\csname a:#2\endcsname{##1}}% + \expandafter\let\csname a:#2\endcsname\relax + \fi +} +\def\seq:config#1#2{% + \expandafter\let\csname a:#1\endcsname=\empty + \:prolog {#1}#2,|<par del|>} +>>> + +The \''\seq:config' is for introducing a sequence of hooks, +where a star `*' before the hook name indicates it is to be +of accumulative kind. + +\<define /Preamble\><<< +\NewConfigure{PROLOG}[1]{\seq:config{PROLOG}{#1}} +>>> + + +\<html Configure's\><<< +\def\Goto:Configure{\long\def + \Goto:Configure##1\:Configure{\let\Goto:Configure + |=\:UnDef}\expandafter\Goto:Configure} +|<trace configurations|> +|<html config util|> +|<shared config|> +|<font config util|> +|<accents|> +|<math config util|> +>>> + + + + + + + + + + + +\Section{Document Tail} + + + +\<TeX4ht hook on end\><<< +\expand:after{\let\o:end|=}\csname end\endcsname +\expandafter\def\csname end\endcsname{% + \csname export:hook\endcsname \csname o:end\endcsname} +>>> + +This is not used, enddocument hook for LaTeX is defined in latex.4ht. + +\<latex hook on end\><<< +\let\o:enddocumenthook|=\@enddocumenthook +\def\@enddocumenthook{% + \o:enddocumenthook \csname export:hook\endcsname } +>>> + + + + + +\<hook on end\><<< +\def\at:docend{|<close html doc|>\global\let\at:docend=\empty} +\expand:after{\let\o:end|=}\csname end\endcsname +\expandafter\def\csname end\endcsname{\HtmlEnv + \at:docend + \csname export:hook\endcsname \csname o:end\endcsname} +>>> + + +\<close html doc\><<< +|<close HPages in @end|>% +\HAssign\op:fl|=\maxfile:id\space \close:files +|<buttons at end of child|>% +|<end body and frames|>% +>>> + + + +\<end body and frames\><<< +{\b:BODY \b:HTML}% +>>> + + +\<html file commands\><<< +\def\close:files{% + \ifnum \op:fl<\bs:fileid \else + \def\:warning##1{}% + \EndFileStream{\RefFileNumber\op:fl}% + \Advance:\op:fl |by -1 + \expandafter\close:files + \fi} +>>> + + +\Chapter{HPages and Cut Points} + + + +\<cut points\><<< +|<elements for cut points|> +\ifHtml |<html cut points|> + |<tex html cut points|> +\fi +>>> + +\Section{HPages} + + +\`'\HPage<block name>[tag]{title} ... \EndHPage{block name}' + +\List{$\button$} + +\item The \`'block name' is optional in \''\EndHPage', and it serves +for balancing delimiters of blocks. + +If included, it is compared against \`'block name' and \`'tag' +in the given order until a non-empty entity is encountered. +All the compared entities must be fully-expandable (i.e., edef). +(Note that for \`'[]', title is the tag.) + +\item The \`'[tag]' is used for \`'\RefFile', and it is optional. +An empty tag asks that the title will serve as a tag. + +\item The \`'{title}' is used for a HPage. If empty, the HPage is omitted. + +\EndList + +\`'\HPage<block name>-[tag]title\ContHPage ... \EndHPage{block +name}' + +A variant of the above in which tag must be non-empty if \`'[tag]' is +present, and \`'title' need not be expandable. Also, either \`'block +name' or \`'tag' must be present, if \`'\EndHPage{...}' has a +non-empty parameter. + + +\<html cut points\><<< +\def\HPage{\strt:bt\ch:HPage} +\def\ch:HPage{% + \ifx -\:temp \expandafter\m:HPage + \else \expand:after{\ifx [\:temp \expandafter\op:HPage + \else \expandafter\:HPage \fi}% + \fi} +>>> + +\<html cut points\><<< +\def\strt:bt#1{% + \def\:bgtr<##1>{|<page-name is a file name?|>% + |<push name if not HPageButton|>% + \futurelet\:temp#1}% + \futurelet\:temp\ch:btgr} +\def\ch:btgr{\ifx <\:temp \expandafter\:bgtr + \else \expand:after{\:bgtr<>}\fi}% +>>> + + +\<push name if not HPageButton\><<< +\ifx #1\ch:bbtf \else \PushStack\:btid{##1}\fi +>>> + +\<html cut points\><<< +\def\HP:Link{\Link[\HP:file + \a:LinkHPage]{}{\HP:file}\global\let\a:LinkHPage|=\empty} +\NewConfigure{LinkHPage}[1]{\def\a:LinkHPage{ #1}} +\let\a:LinkHPage=\empty +\def\op:HPage[#1]#2{% + |<entring file of hpage|>% + \:hookI{BeforeHPageButton}{}{#2}% + \hpg:wrn{#1}{#2}\HPage \TagFile{|<fr bt fl|>\:temp}% + \Save:HPageTag\:temp + \Save:HPage{#2}% + \NewFileName\HP:file \Save:Link\HP:file + \if:notempty{#2}{\HP:Link#2\EndLink}% + \:hookI{AfterHPageButton}{}{#2}% + \:btfile{#2}% + \:buttrc\HPage{[#1]{#2}}% + \PushStack\:afterbt{x}% + |<:temp = but name|>% + \TagFile{\:temp}} +\def\:HPage#1{% + |<entring file of hpage|>% + \:hookI{BeforeHPageButton}{}{#1}% + \NewFileName\HP:file \Save:Link\HP:file \Save:Temp\HP:file + \TagFile{|<fr bt fl|>\HP:file}% + \Save:HPageTag\HP:file + \Save:HPage{#1}% + \def\:temp{#1}\ifx \:temp\empty + \else \HP:Link#1\EndLink + \fi + \:hookI{AfterHPageButton}{}{#1}% + \:btfile{#1}% + \:buttrc\HPage{{#1}}% + \PushStack\:afterbt{x}% + \Recall:Temp\:tempa \TagFile{\:tempa}} +>>> + + +\<html cut points\><<< +\def\hpg:wrn#1#2#3{% + |<:temp = but name|>% + \ifx \:temp\empty \:warning{\string#3[]{}?}\fi} +>>> + + +\<:temp = but name\><<< +\edef\:temp{#1}\ifx \:temp\empty \no:pic + \edef\:temp{\noexpand\yes:pic + \def\noexpand\:temp{#2}}\:temp \fi +>>> + + +\<html cut points\><<< +\def\Save:Temp{\PushStack\sv:Temp} +\def\Recall:Temp{\PopStack\sv:Temp} +>>> + +Can't go for \`' \def\:temp{#1}' because \`'#1' is just a title and +not a tag. + + +\<html cut points\><<< +\def\m:HPage#1{\futurelet\:temp\ch:mbut} +\def\ch:mbut{\ifx [\:temp \expandafter\op:mbut + \else \expandafter\:mbut \fi} +\def\op:mbut[#1]{% + |<entring file of hpage|>% + \:hookI{BeforeHPageButton}{}{}% + \edef\:temp{#1}% + \ifx \:temp\empty \:warning{\string\HPage-[]?}\fi + \TagFile{|<fr bt fl|>\:temp}% + \Save:HPageTag\:temp + \Save:HPage{}% + \NewFileName\HP:file \Save:Link\HP:file + \HP:Link% + \def\ContHPage{\:ContHPage{x}{#1}}} +\def\:mbut{% + |<entring file of hpage|>% + \:hookI{BeforeHPageButton}{}{}% + \NewFileName\HP:file \Save:Link\HP:file + \TagFile{|<fr bt fl|>\HP:file}% + \Save:HPageTag\HP:file + \Save:HPage{}% + \HP:Link% + \def\ContHPage{\:ContHPage{x}{\HP:file}}} +\def\:ContHPage#1#2{\EndLink + \Recall:Link\HP:file \Save:Link\HP:file + \:hookI{AfterHPageButton}{}{}% + \:btfile{}% + \:buttrc\HPage{...\string\ContHPage}% + \PushStack\:afterbt{#1}% + \TagFile{#2}} +>>> + + +\<html cut points\><<< +\def\:hookI#1#2#3{% + \expandafter\ifx \csname #1\endcsname\relax #2\else + \csname #1\endcsname{#3}\fi +} +>>> + +\<html cut points\><<< +\def\NewFileName#1{% + \HAssign#1|=\maxfile:id + \Advance:#1 |by 1 + \ifx \:NxtNwFN\:Undef + \edef#1{\j:bname \ifx \big:fn\:UnDef|<tail for file name|>#1% + \else \big:fn\fi .\:html}% + \else \let#1|=\:NxtNwFN \global\let\:NxtNwFN|=\:UnDef \fi + \global\let\big:fn|=\:UnDef +} +\def\NextFile#1{\xdef\:NxtNwFN{#1}} +>>> + + + + +\<html cut points\><<< +\def\:btfile#1{% + \SaveEverypar \FileStream[#1]{\HP:file} \IgnorePar + \gHAdvance\HPageDepth |by 1 + \AtEndHPage{\csname HPageFooter\endcsname}% + \:hookI{HPageHeader}{}{#1}% +} +>>> + + + + + +\SubSection{Specification Separated from Realization} + +Split HPages must appear with reference keys (brackets). + + + + +\<html cut points\><<< +\def\HPageButton{\strt:bt\ch:bbtf} +\def\ch:bbtf{\ifx -\:temp \expandafter\op:bbft + \else \expandafter\:bbtf \fi} +\def\:bbtf[#1]#2{% + \:hookI{BeforeHPageButton}{}{#2}% + \hpg:wrn{#1}{#2}\HPageButton + \TagFile{|<fr bt fl|>\:temp}% + \edef\HP:file{\RefFile\:temp}% + \def\:temp{#2}\ifx \:temp\empty + \else \HP:Link#2\EndLink \fi + \:hookI{AfterHPageButton}{}{#2}% + \csname AfterHPage\endcsname } + +\def\op:bbft#1[#2]{% + \:hookI{BeforeHPageButton}{}{}% + \edef\:temp{#2}% + \ifx \:temp\empty \:warning{\string\HPageButton-[]?}\fi + \TagFile{|<fr bt fl|>\:temp}% + \edef\HP:file{\RefFile\:temp}% + \HP:Link% + \def\ContHPage{\EndLink + \:hookI{AfterHPageButton}{}{}% + \csname AfterHPage\endcsname }} +>>> + + +\<html cut points\><<< +\def\BeginHPage{\futurelet\:temp\ch:bbbt} +\def\ch:bbbt{% + |<entring file of hpage|>% + \NewFileName\HP:file \Save:Link\HP:file + \ifx -\:temp \expandafter\op:bbbt + \else \expandafter\:bbbt \fi} +\def\:bbbt[#1]#2{% + \PushStack\:btid{#1}% |%aug 2003|% + \:btfile{#2}% + \:buttrc\BeginHPage{[#1]{#2}}% + \PushStack\:afterbt\empty + \hpg:wrn{#1}{#2}\BeginHPage \Save:HPageTag\:temp + \Save:HPage{#2}% + \TagFile{\:temp}} +\def\op:bbbt#1[#2]{% + \PushStack\:btid{#2}% |%aug 2003|% + \:hookI{AfterHPageButton}{}{}% + \:btfile{}% + \:buttrc\BeginHPage{[#2]}% + \PushStack\:afterbt\empty \edef\:temp{#2}% + \ifx \:temp\empty \:warning{\string\BeginHPage-[]?}\fi + \Save:HPageTag\:temp \Save:HPage{}% + \TagFile{\:temp}} +>>> + + + + + +\SubSection{End HPage} + +\`'\EndHPage[level]{bloc name}' + +\List{$\bullet$} + +\item \`'[level]' is optional. If present, all HPages, up to the +specified level, are closed. + +\item \`'block name'. If empty, a single HPage is closed. If +non-empty, all HPages up-and-including the one with the given name +are closed. + +\EndList + +\<html cut points\><<< +\def\EndHPage{\futurelet\:temp\chEnd:HPage} +\def\chEnd:HPage{\ifx [\:temp \expandafter\opEnd:HPage + \else \expandafter\End:HPage \fi} +\def\opEnd:HPage[#1]{% + \ifnum #1>\HPageDepth\space + \:warning{\string\EndHPage[#1]?}% + \let\:temp|=\:gobble + \else \ifnum #1<\HPageDepth\space + \def\:temp{\:EndHPage\EndHPage[#1]{}}% + \else \let\:temp|=\End:HPage \fi \fi + \:temp } + +\def\End:HPage#1{% + \ifnum \HPageDepth<1 \:warning{\string\EndHPage{#1}?}\let\:temp|=\:gobble + \else \ifinner\else\:clearpage\fi \PopStack\:btid\:tempa + \def\:tempb{#1}\ifx \:tempb\empty\let\:temp|=\:EndHPage + \else \ifx \:tempb\:tempa \let\:temp|=\:EndHPage + \else \Recall:HPageTag\:tempa + \Save:HPageTag\:tempa + \ifx \:tempb\:tempa \let\:temp|=\:EndHPage + \else \def\:temp{\:EndHPage\End:HPage{#1}}% + \fi\fi\fi\fi + \:temp } + +\def\:EndHPage{% + \csname EndHPage\HPageDepth \endcsname + \global\expandafter\let\csname EndHPage\HPageDepth\endcsname|=\:UnDef + \Recall:Link\HP:file \Recall:Link\:tempd \Save:Link\:tempd + \Recall:HPage\:tempb + \Recall:HPageTag\:tempc + \:buttrc\EndHPage{{\:tempb}}% + \EndFileStream{\HP:file}% + |<leaving actual file of hpage|>% + \FileStream{\:tempd}% + \RecallEverypar \gHAdvance\HPageDepth |by -1 + \PopStack\:afterbt\:temp + \ifx \:temp\empty \else \csname AfterHPage\endcsname \fi } +>>> + + +Overrides earlier defs, including the default. + + +\<html cut points\><<< +\def\AtEndHPage{% + \expandafter\gdef\csname EndHPage\HPageDepth\endcsname} +>>> + + +\<html cut points\><<< +\HAssign\HPageDepth|=0 +\PushStack\:btid{} +>>> + +%\NewStack\:btid + +\<close HPages in @end\><<< +\ifnum \HPageDepth> 0 \EndHPage[1]{}\fi +|<document end for non-cut logical units|>% +>>> + + +\SubSection{Debugging} + +\<html cut points\><<< +\def\Save:FileHPg{\PushStack\HPage:FlHg} +\def\Recall:FileHPg{\PopStack\HPage:FlHg} +>>> + +The \''\Recall:FileHPg' and \''Recall:Link' should give the +same file if HPages are not stored in files, and when the files are +not remote. CHECK!!! + + +The following works with the actual files containing the +hpages, instead of assuming that the files are of their parent +hpages. + + +\<leaving actual file of hpage\><<< +%\Recall:FileHPg\:tempd +>>> + +\''HPage''s are not natural children of \''\FileStream': +\''\EndHPage' don't touches pages, \''\FileStream' +has no button name, \''\ExitHPage' might not work, etc (Recall that +HPages must be consistent in seperated form of \''\HPageButton' with +\''\beginHPage' and unified form of \''\HPage'.) + + +\<entring file of hpage\><<< +%\chk:hpfl +>>> + +\<html cut points\><<< +\def\chk:hpfl{\Save:FileHPg\FileName \:FlHpg} +\def\No:FlHpg{{\Recall:Link\HP:file \Save:Link\HP:file + \edef\HP:file{\HP:file}\edef\FileName{\FileName}% + \edef\HP:file{\expandafter\string\csname \HP:file\endcsname}% + \edef\FileName{\expandafter\string\csname \FileName\endcsname}% + \ifx \HP:file\FileName \else + \:warning{HPage in a non-HPage file + `\expandafter\:gobble\FileName'}% + \fi}} +\def\HPageInFile{\global\let\:FlHpg|=\empty} +\def\NoHPageInFile{\global\let\:FlHpg|=\No:FlHpg} +\NoHPageInFile +>>> + + + +Had \`'\yes:trc' and changed to \`'\yes:pic' without checking what I'm doing. + +\<html debug\><<< +\def\HTraceHPageOn{% + \def\:buttrc##1##2{\no:pic \writesixteen{% + l.\the\inputlineno -[\HPageDepth]- \string##1##2}\yes:pic + }} +\def\HTraceHPageOff{\def\:buttrc##1##2{}} +\HTraceHPageOn +>>> + + + +\<no debug\><<< +\def\:buttrc#1#2{} +\let\HTraceHPageOn|=\empty +\let\HTraceHPageOff|=\empty +>>> + +\SubSection{Utilities} + + + +\<page-name is a file name?\><<< +\expand:after{\bt:fn##1.}\:html|<par del|>% +>>> + +\<html cut points\><<< +\expand:after{\def\bt:fn##1.}\:html#2|<par del|>{% + \def\:temp{#2}\ifx \:temp\empty + \else \NextFile{#1.\:html}\fi } +>>> + + +\`'\ExitHPage[mark]{title}'. The bracket mark is optional and +it is introduced for marking the HPage with an NAME. If +\`'\HPageButton'-\`'\BeginHPage' combination wouldn't have existed we +could have used simpler code of the form \`'\Recall:Link\HP:file + \Recall:Link\:tempb \Save:Link\:tempb \Save:Link\HP:file + \Link[\:tempb]{\HP:file}{#1}#2\EndLink'. +An empty title creates a default \`'exit <file title>'. + + + Whenever we have cross-references in a html file (might be +also indirect through a child) we want an exit HPage to save an +annoying backtract through the visited path. + +\<html cut points\><<< +\Odef\ExitHPage[#1]#2{% + \Recall:HPageTag\HP:file \Save:HPageTag\HP:file + \Link[\RefFile{|<fr bt fl|>\HP:file}]{\RefFile{\HP:file}}{#1}% + \def\:temp{#2}\ifx \:temp\empty + \Recall:HPage\:temp \Save:HPage\:temp + \ifx \:temp\empty \a:ExitHPage + \else \b:ExitHPage \:temp \c:ExitHPage \fi + \else #2\fi + \EndLink +} +>>> + +\<shared config\><<< +\NewConfigure{ExitHPage}{3} +>>> + + + + +\<fr bt fl\><<< +)B>>> + + +\`'\RefHPage' can be used for the filename and HPage location. + +\<html cut points\><<< +\def\RefHPage{\RefFile} +>>> + +\<html cut points\><<< +\def\Save:Link{\PushStack\HPageFiles} +\def\Recall:Link{\PopStack\HPageFiles} +\Save:Link{\jobname.\:html} +\def\Save:HPage{\PushStack\HPageAnchors} +\def\Recall:HPage{\PopStack\HPageAnchors} +\def\Save:HPageTag{\PushStack\HPage:Tags} +\def\Recall:HPageTag{\PopStack\HPage:Tags} +>>> + +%\NewStack\HPageFiles +%\NewStack\HPageAnchors +%\NewStack\HPage:Tags + +%\NewStack\:afterbt + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Requests for Cutpoints} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Requests are made with commands of the form +\`'\CutAt{division,terminators,...}'. A \`'division' that precedes +with a \`'+' asks that the HPage will be visible. + +\<html cut points\><<< +\def\CutAt#1{% + \if +\:firstch#1 //\:CutAt#1,//\else + \if |<- TITLE|>\:firstch#1 //\:CutAt#1,//\else + \:CutAt=#1,//\fi\fi +} +>>> + + +\<html cut points\><<< +\def\PauseCutAt#1{% + \expandafter\ifx\csname Cut:#1\endcsname\relax\else + \expandafter\ifx \csname NoCut:#1\endcsname\relax + \expand:after{\expandafter\let\csname NoCut:#1\endcsname=}% + \csname Cut:#1\endcsname + \fi + |<paused cut at|>% + \fi } +\def\ContCutAt#1{% + \expandafter\ifx \csname NoCut:#1\endcsname\relax\else + \expand:after{\expandafter\let\csname Cut:#1\endcsname=}% + \csname NoCut:#1\endcsname + \fi} +>>> + +e.g., \''PauseCutAt{section}' + +\<paused cut at\><<< +\expandafter\let\csname Cut:#1\endcsname=\null +\expandafter\def\csname Cut:#1\endcsname{% + \gHAdvance \TitleCount 1 + \null \:gobble +}% +>>> + + +% \expandafter\global \expandafter +% \let\csname #1:Count\endcsname\TitleCount + + + + +Intuitively, a conditional command \`'\UnCut:division' is prepended to +\`'\division' and \`'\terminator'. When defined, it has the meaning +of a EndHPage. Hence, implicity we have also a terminator at the end +of the document. + +The new commands are executed only if they are defined. The +\`'\Cut:division' is defined by \`'\CutAt', +the \`'\UnCut:division' is defined by \`'\Cut:division', and +\`'\UnCut:division' undefines \`'\UnCut:division'. The hook for +\`'Cut:division' is introduced in +\LinkPort\<button for cut at sect\>{\tt<button for cut at sect>}\EndLink. + + +\<html cut points\><<< +\def\:CutAt#1#2,#3//{% + \csname ltx:like\endcsname + \expandafter\ifx \csname #2\endcsname \relax + \:warning{\string\CutAt\space at undefined + `\expandafter\string\csname#2\endcsname'}% + \fi + \csname ltx:nolike\endcsname + |<modify current command|>% + |<notify current division to higher ones in the hierarchy|>% + |<overide default: open new file for current division|>% +} +>>> + +\<shared config\><<< +\NewConfigure{UndefinedSec}[1]{% + \ifx \ltx:like\:UnDef \let\ltx:like|=\empty \let\ltx:nolike|=\empty \fi + \append:def\ltx:like{\expandafter\let\csname #1\endcsname|=\empty}% + \append:def\ltx:nolike{\expandafter\let\csname #1\endcsname|=\:UnDef}% +} +>>> + +\<modify current command\><<< +\expandafter\ifx \csname #2:\endcsname\relax + \expand:after{\expandafter\let \csname #2:\endcsname |=}% + \csname #2\endcsname +\else \:warning{Again \string\CutAt{#2}?}% +\fi +\expandafter\def \csname #2\endcsname{% + \csname UnCut:#2\endcsname + \csname #2:\endcsname}% +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Connection to Super Divisions} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<notify current division to higher ones in the hierarchy\><<< +\:UnCutAt#2,#3,//% +>>> + +\<html cut points\><<< +\def\:UnCutAt#1,#2,#3//{% + \def\:temp{#2}\ifx \:temp\empty \else + \def\:tempa{#1}\ifx \:tempa\:temp \else + \expandafter\ifx \csname#2:#1\endcsname\relax + |<uncut @1 at @2|>% + \else \:warning{#2 already assumed in \string\CutAt{#1,...}}\fi + \fi + \def\:temp{\:UnCutAt#1,#3//}% + \expandafter\:temp + \fi +} +>>> + + +\<uncut @1 at @2\><<< +\expand:after{\expandafter\let \csname #2:#1\endcsname |=}% + \csname #2\endcsname +\expandafter\def \csname #2\endcsname{% + \csname UnCut:#1\endcsname + \csname #2:#1\endcsname}% +>>> + +%%%%%%%%%%%%%%%%%%%% +\SubSection{HPages} +%%%%%%%%%%%%%%%%%%%% + +\<overide default: open new file for current division\><<< +\expandafter\edef \csname Cut:#2\endcsname##1{% + \noexpand\cut:at{#2}{##1}#1}% +>>> + +\<html cut points\><<< +\def\cut:at#1#2#3{{% + |<HPages for sec|>% + |<large file name for @2|>% + \if #3+\HPage<#1>{#2}% + \else + |<CutAt TITLE|>% + \HPage<#1>{}\fi + \ifx \prevCutAt\empty \else \TagFile{|<nxt but file|>\lastsec:id}\fi + \AtEndHPage{|<prev/next at end of hpage|>\UnCut:{#1}}% + \expandafter\xdef\csname UnCut:#1\endcsname{% + \noexpand\EndHPage[\HPageDepth]{}}% +}} +\HAssign\lastsec:id|=0 +\def\cut:TTL#1{#1} +>>> + + + + +The following is for cut pages (typically, from sectioning commands). + +\<CutAt TITLE\><<< +\if #3|<- TITLE|>\else + \let\cut:TTL|=\:gobble + \begingroup + \csname no:fonts\endcsname|<TITLE env|>\:CutAtTITLE: + \xdef\:temp{\noexpand\Configure{TITLE+}{\a:CutAtTITLE{#2}}}% + \endgroup \:temp +\fi +>>> + +\<HPage TITLE\><<< +\no:pic +\edef\:temp{\noexpand\yes:pic \def\noexpand\:temp{#1}}\:temp +\begingroup + |<TITLE env|>\:HPageTITLE: + \no:pic + \edef\:tempa{\noexpand\yes:pic \def\noexpand\:tempa{#1}}\:tempa + \xdef\:temp{\cut:TTL{\noexpand\Configure{TITLE+}{\a:HPageTITLE{\ifx + \:temp\empty \file:name\else \:tempa\fi}}}}% +\endgroup \:temp +>>> + +\<- TITLE\><<< +->>> + +\<TITLE env\><<< +\def\gobble:font##1##2{##2}% +\:TITLE: +>>> + +The \''\gobble:font' is to remove the primitive font definitions of latex. + +\<html cut points\><<< +\let\:TITLE:|=\empty +\let\:CutAtTITLE:|=\empty +\let\:HPageTITLE:|=\empty +>>> + +\<html config util\><<< +\NewConfigure{CutAtTITLE+}[1]{\def\a:CutAtTITLE{#1}} +\NewConfigure{HPageTITLE+}[1]{\def\a:HPageTITLE{#1}} +>>> + + + +%%\NewStack\:head + +\<nxt but file\><<< +)N >>> + + +\<html cut points\><<< +\def\UnCut:#1{% + |<disable empty delayed toc|>% + \global\expandafter\let\csname UnCut:#1\endcsname|=\:UnDef + \xdef\lastsec:id{\file:id}% + \PopStack\prv:fl\:temp + \bgroup + \ifx\b:crsbt\empty + \ifx\bb:crsbt\empty\else + \:hookI{Back#1}{\default:bts{|<tail|>}{|<front|>}}{}% + \fi + \else + \:hookI{Back#1}{\default:bts{|<tail|>}{|<front|>}}{}% + \fi + \csname b:CutAt#1\endcsname \let\after:endfl|=\EndFileStream + \def\EndFileStream##1{\after:endfl{##1}\egroup + |<AfterHPage for CutAt|>% + |<pop btons|>% + }} +>>> + + +We have here \`'\Configure{CutAt#1}{..}{..}' for any sectioning +part. The sectioning commands of LaTeX have a +\`'\Configure{section-type} {before-section} {after-section} +{before-title}{after-title}' command that calls +\`'\Configure{CutAt section-type} {before-section} {after-section}' +to insert code at the start and end of the hypertext pages. + +On the other hand \`'\Configure{+CutAt}{section-type}{before}{after}' +offers delimiters for the buttons. The +\`'\NewConfigure{CutAt}[1]{\Configure{CutAt#1}}' can be offered for +consistency. DO WE NEED IT? + +\<tail\><<< +tail>>> + + +\<disable empty delayed toc\><<< +\global\expandafter\let\csname TocAt*\endcsname|=\empty +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Prev/Next Cut Buttons} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<AfterHPage for CutAt\><<< +\PopStack\:afterbt\:temp +\ifx\:temp\empty\else\:hookI{After#1}{}{}\fi +\PushStack\:afterbt{}% +>>> + +\<HPages for sec\><<< +\def\BeforeHPageButton{\if #3+% + \def\:temp{\:hookI{Before#1Button}{\csname a:+CutAt#1\endcsname}}% + \expandafter\:temp\fi}% +\edef\prev:File{\ifnum \sec:lvl>\HPageDepth\space + \RefFileNumber\lastsec:id \fi}% +\def\AfterHPageButton{\if #3+% + \def\:temp{\:hookI{After#1Button}{\csname b:+CutAt#1\endcsname}}% + \expandafter\:temp\fi}% +\def\HPageHeader##1{% + |<prev/next at start of hpage|>% + \xdef\nextCutAt{\RefFile{|<nxt but file|>\file:id}}% + \global\let\prevCutAt|=\prev:File + |<push HPages|>% + \PushStack\prv:fl{#3}\csname a:CutAt#1\endcsname + \ifx\a:crsbt\empty + \ifx\aa:crsbt\empty\else + \:hookI{Front#1}{\default:bts{|<front|>}{|<tail|>}}{##1}% + \fi + \else + \:hookI{Front#1}{\default:bts{|<front|>}{|<tail|>}}{##1}% + \fi +}% +>>> + + +\<shared config\><<< +\NewConfigure{+CutAt}[3]{% + \expandafter\def\csname Before#1Button\endcsname##1{#2}% + \expandafter\def\csname After#1Button\endcsname##1{#3}} +>>> + + +\<push HPages\><<< +\sv:btns\nextCutAt +\sv:btns\prevCutAt +>>> + + +\<html utilities\><<< +\def\sv:btns#1{\ifx #1\space\global\let#1|=\empty \fi \PushStack\prv:fl#1} +>>> + +\<pop btons\><<< +\PopStack\prv:fl\prevCutAt +\PopStack\prv:fl\nextCutAt +\ifx \prv:fl\empty + \let\prevCutAt|=\:UndDef + \let\nextCutAt|=\:UndDef +\else + \PopStack\prv:fl\:tempb + \PopStack\prv:fl\prevCutAt + \PopStack\prv:fl\nextCutAt + \PushStack\prv:fl\nextCutAt + \PushStack\prv:fl\prevCutAt + \PushStack\prv:fl\:tempb +\fi +>>> + + +\<html config util\><<< +\NewConfigure{crosslinks}[8]{% + \def\default:bts##1##2{% + |<record cond buttons|>% + \def\:temp{##1}\ifx \:temp\empty + \ifx\a:crsbt\empty\ifx \aa:crsbt\empty |<remove buttons|>\fi\fi + \a:crsbt + \else + \ifx\b:crsbt\empty\ifx \bb:crsbt\empty |<remove buttons|>\fi\fi + \b:crsbt + \fi + \def\CLB:next{\expandafter\cond:bt\next:bt{}{#3}}% + |<prev for leading node in option `next'|>% + \def\CLB:prev{\expandafter\cond:bt\prev:bt{}{#4}}% + \def\CLB:prevtail{\expandafter\cond:bt\prev:bt{|<tail|>\prev:bt}{#5}}% + |<front/tail button|>% + \def\:temp{#8}\ifx \:temp\empty \else + \ifx \cond:bt\:gobbleIII + \else \def\CLB:up{\def\:temp{#8}#1\ExitHPage{#8}#2}\fi\fi + |<insert cross link buttons|>% + |<restore cond buttons|>% + \def\:temp{##1}\ifx \:temp\empty \aa:crsbt\else \bb:crsbt\fi + |<tail target|>}% + |<set linkless buttons|>% +} +\NewConfigure{crosslinks+}[4]{% + \def\a:crsbt{#1}\def\aa:crsbt{#2}\def\b:crsbt{#3}\def\bb:crsbt{#4}} +\NewConfigure{crosslinks-}[2]{% + \def\a:cond:bt{#1}\def\b:cond:bt{#2}} +>>> + + +\<set linkless buttons\><<< +\def\cond:bt##1##2##3{% + \expandafter\ifx\csname a:cond:bt\endcsname \relax + \ifx ##1\empty \else + \def\:temp{##3}\ifx \:temp\empty \else + #1\Link[##1]{##2}{}##3\EndLink #2% + \fi \fi + \else + \ifx ##1\empty + |<set a linkless button|>% + \else + \def\:temp{##3}\ifx \:temp\empty \else + #1\Link[##1]{##2}{}##3\EndLink #2% + \fi \fi + \fi +}% +>>> + + +\<set a linkless button\><<< +\def\:temp{next}\ifx \:temp\cur:bt \else + \ifx \c:next:\:gobbleII \else \let\:temp=\empty \fi +\fi +\ifx \:temp\empty \else + \ifx \a:cond:bt\empty \ifx \b:cond:bt\empty #1\else + \a:cond:bt\fi + \else \a:cond:bt\fi + ##3% + \ifx \a:cond:bt\empty \ifx \b:cond:bt\empty #2\else + \b:cond:bt\fi + \else \b:cond:bt\fi +\fi +>>> + + + +\<insert cross link buttons\><<< +\CLB:menu +>>> + +\<\><<< +\csname CLB:next\endcsname %1 +% +\csname CLB:prevup\endcsname %2 +\csname CLB:prev\endcsname %5 +% +\csname CLB:prevtailup\endcsname %3 +\csname CLB:prevtail\endcsname %6 +% +\csname CLB:tail\endcsname %7 +% +\csname CLB:front\endcsname %8 +% +\csname CLB:up\endcsname %9 +>>> + + +\<html config util\><<< +\expandafter\def\csname c:crosslinks*:\endcsname{% + \let\CLB:menu\empty \CLB:menuitem } +\def\CLB:menuitem#1{% + \def\:tempa{#1}\ifx \:tempa\empty \else + \append:def\CLB:menu{\csname a:crosslinks:#1\endcsname + \def\cur:bt{#1}\csname CLB:#1\endcsname + }% + \def\:temp{prev}\ifx \:temp\:tempa + \append:def\CLB:menu{\csname a:crosslinks:prev\endcsname + \csname CLB:prevup\endcsname + }% + \else + \def\:temp{prevtail}\ifx \:temp\:tempa + \append:def\CLB:menu{% + \csname a:crosslinks:prev\endcsname + |<prevtail hook|>% + \csname CLB:prevtailup\endcsname + }% + \fi \fi + \expandafter\CLB:menuitem + \fi +} +\Configure{crosslinks*} + {next} + {prev} + {prevtail} + {tail} {front} + {up} + {} +\NewConfigure{crosslinks:next}{1} +\NewConfigure{crosslinks:prev}{1} +\NewConfigure{crosslinks:prevtail}{1} +\NewConfigure{crosslinks:tail}{1} +\NewConfigure{crosslinks:front}{1} +\NewConfigure{crosslinks:up}{1} +>>> + + + +\<record cond buttons\><<< +\let\sv:cond:bt|=\cond:bt +>>> + +\<restore cond buttons\><<< +\let\cond:bt|=\sv:cond:bt +>>> + +\<remove buttons\><<< +\let\cond:bt|=\:gobbleIII +>>> + + + + +\`'\Configure{crosslinks+} + {before-front-links}{after-front-link} + {before-back-link}{after-back-link}' + + +\<front/tail button\><<< +\def\:temp{##2}% +\ifx \:temp\empty + \def\:temp{#6}% + \ifx \:temp\empty \else + \def\CLB:tail{\def\:temp{#6}#1\Link[\RefFileNumber\file:id]{}{}#6\EndLink #2}\fi +\else + \def\:temp{#7}% + \ifx \:temp\empty \else + \def\CLB:front{\def\:temp{#7}#1\Link{##2\RefFileNumber\file:id}{}#7\EndLink #2}\fi +\fi +>>> + +Neds the \''\expandafter' above because \''\Link' modifies \''\:te:mp'. + +\<tail target\><<< +\def\:temp{##1}\ifx \:temp\empty \else + \ifx\yes:tail\def + \Link{}{##1\RefFileNumber\file:id}\EndLink +\fi \fi +>>> + +\<prevtail hook\><<< +\ifx\a:crsbt\empty\else \let\yes:tail\def\fi +\ifx\aa:crsbt\empty\else \let\yes:tail\def\fi +\ifx\b:crsbt\empty\else \let\yes:tail\def\fi +\ifx\bb:crsbt\empty\else \let\yes:tail\def\fi +>>> + +%\NewStack\prv:fl + +\<html cut points\><<< +\let\prevCutAt|=\empty +>>> + + +\''french.sty' chages the definition of \''\special' and that creates +problems for tex4ht. Hence, the following redefdinition. When +\''french.sty' and the likes are not around we can't just go for +\''\let\ht:special=\special' because when the special is written out +we don't \''\ht:special' there. Hence the configure. + +\<early utilities\><<< +\NewConfigure{special}[1]{\def\ht:special{#1}} +\Configure{special}{|<default special|>} +>>> + +\<default special\><<< +\special +>>> + +%\let\real:special|=\special +%\NewConfigure{special}[1]{\def\ht:special{#1}} +%\Configure{special} +% {\ifx \real:special\special \expandafter\special +% \else \expandafter\real:special\fi} + + +\<html Configure's\><<< +\edef\:temp{\string\special} +\edef\:tempa{\meaning\special} +\ifx \:temp\:tempa \else + \def\:temp{|<default special|>} + \ifx \:temp\ht:special + \:warning{Redefined \string\special. Might + need \string\Configure{special}{<system-special>}} +\fi\fi +>>> + +\<protect from /special redef\><<< +\let\special|=\relax +>>> + + +\<early utilities\><<< +\long\def\expand:after#1{\def\e:tmp{#1}\expandafter\e:tmp} +>>> + + + +\<tempa := new file; tempb := old file\><<< +\tmp:cnt|=\maxfile:id \advance\tmp:cnt |by 1 +\edef\HP:file{\j:bname |<tail for file name|>\tmp:cnt }% +\xdef:cs{in:fid:#1}{\file:id}% +\edef\:tempb{\RefFileNumber{\file:id}}% +>>> + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{The `next' Option} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + +\<html cut points\><<< +\:CheckOption{next} \if:Option + \def\next:bt{\nextCut} + \def\prev:bt{\prevCut} +\else + \Log:Note{for linear crosslinks of pages, + use the command line option `next'}% + \def\next:bt{\nextCutAt} + \def\prev:bt{\prevCutAt} +\fi +>>> + +\<early utilities\><<< +\def\Log:Note#1{% + \immediate\write-1{--------------------------------------}% + \immediate\write-1{--- Note --- #1}% + \immediate\write-1{--------------------------------------}% +} +>>> + +\<prev/next at end of hpage\><<< +\ct:btn +>>> + +\<prev/next at start of hpage\><<< +\ct:btn +\gHAdvance\C:tAtN |by 1 +\Tag{fileidcut \file:id}{\C:tAtN}% +\TagFile{cutfile \C:tAtN}% +>>> + +\<html cut points\><<< +\HAssign\C:tAtN |= 0 +\def\ct:btn{{% + \HAssign\C:tAtN |= 0\LikeRef{fileidcut \file:id}% + \Advance:\C:tAtN |by -1 + \xdef\prevCut{\RefFile{cutfile \C:tAtN}}% + \ifx \prevCut\space \global\let\prevCut|=\empty \fi + \Advance:\C:tAtN |by 2 + \xdef\nextCut{\RefFile{cutfile \C:tAtN}}% + \ifx \nextCut\space \global\let\nextCut|=\empty \fi +}} +>>> + +\<prev for leading node in option `next'\><<< +\ifx \prevCut\empty + \def\:temp{\prevCut}\ifx \:temp\prev:bt + \Recall:HPageTag\HP:file \Save:HPageTag\HP:file + \def\:temp{#4}\ifx \:temp\empty \else + \def\CLB:prevup{% + \def\:temp{#4}#1\Link[\RefFile{|<fr bt fl|>\HP:file}]{}{}#4\EndLink #2}% + \fi + \def\:temp{#5}\ifx \:temp\empty \else + \def\CLB:prevtailup{% + \def\:temp{#5}#1\Link[\RefFile{|<fr bt fl|>\HP:file}]{tail\Jobname + }{}#5\EndLink #2}% + \fi + |<next button in root of `next' option|>% +\fi \fi +>>> + +% \expandafter\cond:bt\prev:bt{}{%... add march 25, 2005 + +\<next button in root of `next' option\><<< +\long\def\:tempb####1####2{\gdef\root:next{% + \def\:temp{####2}\edef\HP:file{\RefFileNumber\file:id}% + \ifx \:temp\HP:file + \global\let\root:next|=\empty + \def\:temp{#3}\ifx \:temp\empty + \Link{}{tail\Jobname}\EndLink + \else + \expandafter\ifx \csname a:next+\endcsname\relax #1\else + \csname a:next+\endcsname \fi + \expandafter\ifx \csname a:next\endcsname\relax + \def\:next{#3}% + \else \let\:next\a:next \fi + \ifx \:next\empty + \Link{}{tail\Jobname}\EndLink + \else + \Link[####1]{}{tail\Jobname}\:next\EndLink + \fi + \expandafter\ifx \csname b:next+\endcsname\relax #2\else + \csname b:next+\endcsname \fi + \fi \fi}}% +\edef\:temp{\noexpand\:tempb + {\RefFileNumber\file:id}{\RefFile{|<fr bt fl|>\HP:file}}}% +\:temp +>>> + +\<html cut points\><<< +\let\root:next|=\empty +>>> + + +\<html config util\><<< +\NewConfigure{next}[1]{\def\a:next{#1}} +\NewConfigure{next+}[2]{% + \expandafter\def\csname a:next+\endcsname{#1}% + \expandafter\def\csname b:next+\endcsname{#2}} +>>> + + + + + + + +\<elements for cut points\><<< +\:CheckOption{next} \if:Option \else + \let\c:next:|=\:gobbleII +\fi +>>> + + +%%%%%%%%%%%%% +\SubSection{File Naming} +%%%%%%%%%%%%% + + + +\<HPages for sec\><<< +\csname a:CutAt-filename\endcsname{#1}{#2}% +>>> + +\<early utilities\><<< +\NewConfigure{CutAt-filename}[1]{% + \expandafter\def\csname a:CutAt-filename\endcsname##1##2{#1}} +\Configure{CutAt-filename}{} +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Grouping Mecahanism for CutAt} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +A \`'\CutGroup{ChGroup,Chapter,LikeChapter,Appendix}' allows unified +requests of the form \`'\CutAt{ChGroup,Part}'. + +\<html cut points\><<< +\def\CutGroup#1{\Cut:Group#1,,|<par del|>} +\def\Cut:Group#1,{% + \expandafter\ifx \csname #1\endcsname\relax + \expandafter\let\csname #1\endcsname|=\:gobble\fi + \def\HP:file{#1}% + \do:list \cut:gr,} +>>> + + + + +The \`'\CutGroup{group,division}' replaces \`'\division{#1}' +with \`'\group{#1}\division{#1}', and \`'\Cut:division{#1}' +with \`'\Cut:group{#1}\Cut:division{#1}'. + +\<tex html cut points\><<< +\def\cut:gr#1{% + \edef\:temp{% + \let\:csname \HP:file :#1\endcsname |=\:csname #1\endcsname + \let\:csname \HP:file :Cut:#1\endcsname |=\:csname Cut:#1\endcsname + \def\:csname #1\endcsname####1{% + \noexpand\cond:cs{\HP:file}{####1}% + \:csname \HP:file :#1\endcsname{####1}}% + \def\:csname Cut:#1\endcsname####1{% + \noexpand\cond:cs{Cut:\HP:file}{####1}% + \noexpand\cond:cs{\HP:file :Cut:#1}{####1}}% + }\:temp } +>>> + + +\SubSection{Utilities} + + +\<general utilities\><<< +\def\cond:cs#1#2{% + \expandafter\ifx \csname #1\endcsname\relax \else + \csname #1\endcsname{#2}% + \fi +} +\def\do:list#1,#2,{% + \def\:temp{#2}\ifx \:temp\empty \expandafter\stop:do + \else #1{#2}\fi + \do:list#1,} +\def\stop:do#1|<par del|>{} +>>> + + + + + + + + + + + + + + + +\Chapter{Coauthoring} + + + +\<imports\><<< +|<import-export interface|> +\:CheckOption{family} \if:Option + |<import-export commands|> + |<imports utilities|> +\else + |<no import-export|> +\fi +>>> + + + + + + + +\<general utilities\><<< +\def\BI:gbl{\ifx [\:temp \expandafter\bi:gbl\else + \expand:after{\bi:gbl[]}\fi} +\def\bi:gbl[#1]#2{} +>>> + + +\<html utilities\><<< +\def\ro:nd#1#2{% + \gHAdvance#1 |by #2 + \gHDivide#1 |by #2 + \gHMultiply#1 |by #2 } +>>> + +\Section{The Commands} + +The extension for the name should refer to the \`'xref' file, +and if omitted an \`'.xref' is aasumed. + +\<import-export interface\><<< +\def\ParentOf{\gHAdvance\TitleCount 1 + \global\let\mu:span|=\TitleCount \futurelet\:temp\:mprt} +>>> + +\<no import-export\><<< +\let\:mprt|=\BI:gbl +>>> + + +\<import-export commands\><<< +\def\:mprt{\fm:call\:Imprt} + +\def\:Imprt[#1]#2#3{% + \def\:temp{#2}\ifx \:temp\Jobname + \:warning{#2 \string\ParentOf\space#2?}\fi + \Needs-{child `#2'}% + \LoadRef[|<screen ref from child @2|>]{#3}{##1}% + \imp:var{#2}fstf:id,#1|<par del|>% + |<send links from parent to child|>% + \the\:tokwrite{\string\doTocEntry + \string\tocParentOf{#2}{}{}\relax}} + +\HAssign\fstf:id|=0 +>>> + + + + +\<import-export interface\><<< +\def\ChildOf{\futurelet\:temp\:xprt} +>>> + +\<no import-export\><<< +\Odef\ChildOf[#1]#2{\:warning{\string\ChildOf{#2} + without \string\Preamble{...,family,...}}} +\let\:xprt|=\BI:gbl +>>> + + + + +\<import-export commands\><<< +\def\:xprt{\fm:call\:Exprt} + +\def\:Exprt[#1]#2#3{% + \ifnum \maxfile:id>1 + \:warning{\string\ChildOf{#2} not at root file}\fi + \Needs-{parent `#2'}% + \ld:flxrf{#3}{|<toc tag|>}% + \LoadRef[|<screen ref from parent @2|>]{#3}{##1}% + \xp:var{#2}fstf:id,#1|<par del|>% + |<adjust file ids info up|>% + \def\export:hook{\exprt:tag{#2}fstf:id,#1|<par del|>}% + |<send links from child to parent|>% + \gdef\:Export[##1]##2{\:warning{\string\ChildOf + \string{##2\string}\space ignored (not 1st)}}% +} +>>> + + + + + +\<import-export commands\><<< +\def\rmv:ext#1.#2|<par del|>{#1} + +\def\fm:call#1{\ifx [\:temp \expand:after{\fm:cll#1}\else + \expand:after{\fm:cll#1[]}\fi} +\def\fm:cll#1[#2]#3{\edef\:temp{\noexpand\noexpand\noexpand + #1[#2]{\noexpand\rmv:ext#3.|<par del|>}{#3}}% + \edef\:temp{\:temp}\:temp} +>>> + + + +\SubSection{Links} + + +\<send links from parent to child\><<< +\Tag{|<screen tag to child @2|>-up}{\RefFileNumber\FileNumber}% +\Tag{|<screen tag to child @2|>-prev}{\childFile}% +\xdef\childFile{\LikeRef{|<screen ref from child @2|>-down}}% +\ifx \cld:n\:UnDef \else \Tag{\cld:n}{\childFile}\fi +\xdef\cld:n{|<screen tag to child @2|>-next}% +>>> + + + +\<send links from child to parent\><<< +\Tag{|<screen tag to parent @2|>-down}{\RefFileNumber\FileNumber}% +\ch:lnk\parentFile{#2}{up}% +\ch:lnk\prevChildFile{#2}{prev}% +\ch:lnk\nextChildFile{#2}{next}% +\global\let\nsrt:chlnks|=\nsrt:cldnks +\nsrt:chlnks{|<front|>}{|<tail|>}{FrontChild}% +>>> + +We need in \`'\childFile' initially a space and not empty, because +otherwise Ref will produce the page number. + + +\<import-export commands\><<< +\let\childFile|=\space +\def\ch:lnk#1#2#3{% + \xdef#1{\LikeRef{|<screen ref from parent @2|>-#3}}% + \ifx #1\space \let#1|=\empty\fi} +>>> + +Note that the following might be a problem for when HPage +is nested in regular file. + +\<import-export commands\><<< +\def\nsrt:cldnks#1#2#3{{% + \let\prevCutAt|=\prevChildFile + \let\nextCutAt|=\nextChildFile + \def\ExitHPage##1{\Link[\parentFile]{}{}##1\EndLink} + \:hookI{#3}{\default:bts{#1}{#2}}{}}} +>>> + +\<buttons at end of child\><<< +\root:next +\ifx \nsrt:chlnks\:UnDef +\else \nsrt:chlnks{|<tail|>}{|<front|>}{BackChild}\fi +>>> + +\Section{Values in Variables} + +\<import-export commands\><<< +\def\imp:var#1#2,#3|<par del|>{% + \gt:ops{#2}% + \Tag{|<screen tag to child @1|>-#2}{|<the|>\csname #2\endcsname}% + \edef|<temp|>{0\LikeRef{|<screen ref from child @1|>-#2}}% + \expand:after{\expandafter|<advance|>\csname + #2\endcsname |by }|<temp|>% + \if:notempty{#3}{\imp:var{#1}#3,|<par del|>}} +>>> + +A child transfers up the changes made to a counter, not an absolute +value. The entry value is recorded in \`'\csname :#2:\endcsname'. + +\<import-export commands\><<< +\def\xp:var#1#2,#3|<par del|>{% + \gt:ops{#2}% + \edef|<temp|>{0\LikeRef{|<screen ref from parent @1|>-#2}}% + \expandafter|<assign|>\csname #2\endcsname|=|<temp|> + \expandafter\HAssign\csname :#2:\endcsname|=|<temp|> + \if:notempty{#3}{\xp:var{#1}#3,|<par del|>}} +>>> + +\<import-export commands\><<< +\def\exprt:tag#1#2,#3|<par del|>{% + \tmp:cnt |= \csname #2\endcsname + \advance\tmp:cnt |by -\csname :#2:\endcsname + \Tag{|<screen tag to parent @1|>-#2}{\the\tmp:cnt}% + \if:notempty{#3}{\exprt:tag{#1}#3,|<par del|>}} +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Overide Previous Files} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +The \''\:clearpage' is needed below to clear the old tags and xref +files, before new ones start to come. The \''\Tag' few lines below can be lost. + +\<adjust file ids info up\><<< +\closeout\:refout +\openout\:refout|=\jobname.xref \:clearpage +|<fix point for file ids at child|>% +\gHAssign\maxfile:id |= \fstf:id +\gHAssign\bs:fileid |= \maxfile:id +\global\let\file:id|=\maxfile:id +\Tag{|<auto file tag|>\file:id |<Tag/Ref: file-id -> file-name|>}% + {\jobname.\:html}% +\expandafter\xdef\csname + |<csname: file name -> file id|>\jobname.\:html\endcsname{\file:id}% +\xdef:cs{|<live|>\file:id}{}% +>>> + + +\<file not overided by /ChildOf\><<< +\csname FN #1\endcsname > \bs:fileid +>>> + + +\SubSection{Contain Changes} + + +We want to reduce the number of compilations due to changes. We can't do +much with sectioning numbers, but we can do quite a lot with labels of +links. Note that the addresses are made up of file numbers + label numbers. + +We make the children `fix-points' with respect to file numbers, by +allocating them addresses that are equal to `child-id * 10000'. We +make here an assumption that a compilation will not generate more than +9999 files. + + +\<fix point for file ids at child\><<< +\gHAdvance\fstf:id |by 10000 +>>> + +It would be nice to have also fix-points for file ids within children, +but this will cause holes. The holes will result in fake names +\`'\csname filei-d\endcsname' which unneccesariliy consume ids and can +overflow the memory quite quickly. This names are inspected at points +that files are closed, and checking is performed for opened subfiles. + + +We can also ask that large files will provide fixed-points. We do so +with the following command, which so far is used only at cut +points. It requests distinguished automatically generated file names +for the class that is identified by the two leading characters of the +given parameter (i.e., sectioning type in case of the cut points). +These are really not fixed point, because they don't fix unique file +names (e.g., by rounding up file ids). + +\<large file name for @2\><<< +\fx:pt #1xxx|<par del|>% +>>> + +Do we want \`' \ro:nd\html:lbl{100000}%' below? + +\<html utilities\><<< +\def\fx:pt#1#2#3|<par del|>{% + \expandafter\ifx \csname big:#1:#2\endcsname\relax + \expandafter\gHAssign\csname big:#1:#2\endcsname |= 0 \fi + \expandafter\gHAdvance\csname big:#1:#2\endcsname |by 1 + \edef\big:fn{#1#2\csname big:#1:#2\endcsname}} +>>> + + + +On the other hands, we try to make sectioning commands fixed points +for labels. Hence, we try to reduce sensitivity of tocs to changes. +See \`'\<round ids between sections\>' + + + + +The validity of the above fixed points carries on as far as the +specified points are really fixed. If they become fluid, then +everything becomes fluid. + + + + + + + + +To get evrything working, we need 4 compilations (in modifications +less might be sufficient). + +\List{ord} + +\item A compilation to create the starting file number for each node +(child/ parent). That is, fix file numbers for children. + +\item A compilation for using the right file numbers, and to create +the correct tags within the tocs. +That is, to collect moveable information like tables of +contents and relationships between files. + +\item A compilation to use the right tags, and to create the right +xref for the tags in the tocs +That is, to collect cross-references from moveable info. + +\item A compilation to incorporate the cross refs + +\EndList + + + +\SubSection{Cross-Reference Screening} + +\''\Jobname' has been introduced for \''\LoadRef[..]' + +\<screen ref from child @2\><<< +#2-\Jobname>>> + +\<screen ref from child @1\><<< +#1-\Jobname>>> + +\<screen ref from parent @2\><<< +#2-\Jobname>>> + +\<screen ref from parent @1\><<< +#1-\Jobname>>> + +\<screen tag to child @1\><<< +\Jobname-#1>>> + +\<screen tag to child @2\><<< +\Jobname-#2>>> + +\<screen tag to parent @1\><<< +\Jobname-#1>>> + +\<screen tag to parent @2\><<< +\Jobname-#2>>> + + + + +\Section{Tables of Content} + + + + +The are needed because some variables are of TeX and others +are of TeX4ht. + + + +\<imports\><<< +\def\tocParentOf#1{{% + \def\:temp{#1}\ifx \:temp\Jobname + \:warning{#1 \string\ParentOf\space#1?} + \else \expand:after{\ld:flxrf{#1}{|<toc tag|>}\get:input{#1.4tc}}\fi}} +>>> + + +\Section{Load File and Link Xref of Relative} + + +\<imports\><<< +\def\ld:flxrf#1#2{% + \let\:CrsWd|=\Cross:Word + \def\Cross:Word##1##2{% + \expandafter\let\csname |<tag of Tag|>##2\endcsname|=\:UnDef + \:CrsWd{##1}{##2}}% + \LoadRef[|<auto file tag|>]{#1}{##1}% + \LoadRef[|<HTag tag|>#2]{#1}{##1}% + \let\Cross:Word|=\:CrsWd +} +>>> + + + + + + + +\SubSection{Local Utilities} + + + + + + + + + + + + + + + + + +The following are needed because some variables are of TeX and others +are of TeX4ht. + +\<imports utilities\><<< +\def\gt:vi#1#2#3#4#5#6#7|<par del|>{#1#2#3#4#5#6} +\def\gt:vr#1#2{\edef#1{\expandafter + \gt:vi\meaning#2 .......|<par del|>}} +\gt:vr\c:unt\tmp:cnt +\def\chk:vr#1#2{\expand:after{\gt:vr\:temp#2 #1\:temp\c:unt}} + +\def\gt:ops#1{% + \expand:after{\chk:vr\ifx}\csname#1\endcsname \let|<the|>|=\the + \let|<assign|>|=\empty \let|<advance|>|=\advance + \else \let|<the|>|=\empty + \let|<assign|>|=\HAssign \let|<advance|>|=\Advance: + \fi } +>>> + +\<assign\><<< +\:tempa>>> + +\<advance\><<< +\:tempb>>> + +\<temp\><<< +\:tempc>>> + +\<the\><<< +\:tempd>>> + + + + + + +\Chapter{Subdivisions} + + +\<divisions\><<< +|<elements for divs|> +|<no trace sec config|> +\ifHtml |<html divs|> + \:CheckOption{hooks+} \if:Option + \else \:CheckOption{hooks} \fi + \if:Option |<trace sec config|>\fi +\fi +|<tex divisions|> +>>> + + + +\Section{Interface} + +The first parameter of \`'\Def:Section' provides the command name, the +second gives a non-parametric code that produces the title number, and +the third gives a single-parameter code for producing the title +itself. + + + +\<elements for divs\><<< +\long\def\NewSection#1#2{% + \Def:Section#1{#2}{##1}% + \edef\:temp{\expandafter\:gobble\string#1}% + \Configure:Sec\:temp{}{}{}{}% + \ConfigureToc{\expandafter\:gobble\string#1}{\empty}{\empty}{}{}} +>>> + + +\`'\NewSection\DocChapter {counter}' + +The parameter \`'##1' holds the title head. + + +\<endsection config\><<< +\NewConfigure{end#1}[1]{\expandafter + \def\csname a:end#1\endcsname{##1}}% +\Configure{end#1}{} +>>> + + +\<elements for divs\><<< +\def\Def:Section#1{% + \edef\:tempc{{\expandafter\:gobble \string#1}}% + |<Configure for sectioning command|>% + \futurelet\:temp\ch:NewSec} +\def\ch:NewSec{\if *\:temp\let\if:toc|=\:gobble\expandafter\op:NewSec + \else \let\if:toc|=\empty \expand:after{\op:NewSec+}\fi} +\def\op:NewSec#1{\expandafter\:NewSec\:tempc} +|<def /:Every|>% +\def\:NewSec#1#2{% + |<endsection config|>% + \expandafter\def\csname #1\endcsname{% + \expand:after{\let\if:toc|=}\csname if:#1toc\endcsname + \:StartSec{#1}{#2}}% + |<c:TITLE: for Sec|>% + \expandafter\let\csname if:#1toc\endcsname|=\if:toc + |<initiate BeforeEvery/Every div|>% + \expandafter\def\csname #1:ttl\endcsname##1} +>>> + +\''\Def:Section' + \''\Configure' = \''\NewSection' + + +\SubSection{/Configure} + + +\<no trace sec config\><<< +\long\def\Configure:Sec#1#2#3#4#5{% + \expandafter\ifx\csname c:#1\endcsname\relax \let\:tempa|=\relax \else + \def\:tempa{#4#5}\fi \ifx\:tempa\empty \else + |<conf for sec boundaries|>\fi + \expandafter\ifx\csname a:#1\endcsname\relax \let\:tempa|=\relax \else + \def\:tempa{#2#3}\fi \ifx\:tempa\empty \else + \expandafter\def\csname a:#1\endcsname##1{#2}% + \expandafter\def\csname b:#1\endcsname##1{#3}% + \fi +} +>>> + +Note that in \`'\Configure{Section}{before}{after}{before head}{after +head}' a change occures only when before-after pair is not empty. + + +\<trace sec config\><<< +\long\def\Configure:Sec#1#2#3#4#5{% + \expandafter\ifx\csname c:#1\endcsname\relax \let\:tempa|=\relax \else + \def\:tempa{#4#5}\fi \ifx\:tempa\empty \else + |<conf for sec boundaries|>\fi + \expandafter\ifx\csname a:#1\endcsname\relax \let\:tempa|=\relax \else + \def\:tempa{#2#3}\fi \ifx\:tempa\empty \else + |<conf for sec heads|>\fi +} +>>> + + +\<conf for sec heads\><<< + \def\:tempa{#2}\ifx \:tempa\empty + \expandafter\def\csname a:#1\endcsname + ##1{\hbox{\a:trc #13:4\b:trc}#2\hbox{\c:trc #14:4\d:trc}}% + \else + \expandafter\def\csname a:#1\endcsname##1{#2}% + \fi + \def\:tempa{#3}\ifx \:tempa\empty + \expandafter\def\csname b:#1\endcsname + ##1{\hbox{\a:trc #13:4\b:trc}#3\hbox{\c:trc #14:4\d:trc}}% + \else + \expandafter\def\csname b:#1\endcsname##1{#3}% +\fi +>>> + +\<conf for sec boundaries\><<< +\expandafter\c:def\csname c:#1\endcsname{#4}% +\expandafter\c:def\csname d:#1\endcsname{#5}% +>>> + + +\<Configure for sectioning command\><<< +\edef\:temp{\long\def\expandafter\noexpand \csname + c:\expandafter\:gobble \string#1:\endcsname + ####1####2####3####4{\noexpand + \Configure:Sec\:tempc{####3}{####4}{####1}{####2}}% + \noexpand\NewConfigure{CutAt\expandafter\:gobble \string#1}2% + \noexpand\NewConfigure{+CutAt\expandafter\:gobble \string#1}2% + }\:temp \expandafter\Configure\:tempc{\empty}{}{\empty}{}% +>>> + + + +\Section{Insertions at Boundaries of Logical Units} + +\SubSection{Non Cut Ends} + +\<boundaries of non-cut sections\><<< +\def\:tempa{#1}\noct:Close:Until +\ifx \:tempb \empty \else + \csname d:\ifx \found:\empty #1\else \found:\fi\endcsname \fi +|<advance TitleCount|>\csname c:#1\endcsname +>>> + + +Any need +for \`'\def\:tempa{#1}'? + + + +\<document end for non-cut logical units\><<< +\Close:UntilEnd +>>> + +The following \''\Do:Close''s deal with sectioning unit +at levels deeper than one we are openning. The sectioning +unit at the latter level is closed with the code +\`'\csname d:\ifx \found:\empty #1\else \found:\fi\endcsname' +we just proccessed. + +\<html divs\><<< +\def\noct:Close:Until{% + \let\:tempA|=\sec:typ \let\found:|=\empty + \let\:tempd|=\:Sections \noct:Check:Until + \ifx \:tempb\sec:typ \expandafter\Do:Close \fi + \let\sec:typ|=\:tempA +} +\def\noct:Check:Until{% + \ifx \:tempd\empty |<exit non-cut check-until|>\else + \PopStack\:tempd\:tempb + |<search non-cut end|>% + \ifx \:tempb\sec:typ \else + \expandafter\expandafter\expandafter\noct:Check:Until + \fi\fi } +>>> + +We are about to open a new section unit, and we go as down as possible +in the stack of already openned section units searching for the lowest +unit in the stack that should be closed. The \''\found:' variable +holds the lowest oppened unit to be closed. + + +\<exit non-cut check-until\><<< +\ifx \found:\empty \let\:tempb\empty +\else \let\:tempb|=\found: \let\sec:typ|=\found:\fi +>>> + + +\<search non-cut end\><<< +\edef\:tempe{\:tempb,% + \expandafter\ifx \csname a:end\:tempb\endcsname\relax \else + \csname a:end\:tempb\endcsname \fi,,}% +\expandafter\mod:typ\:tempe|<par del|>% +>>> + + +\<html divs\><<< +\def\mod:typ#1,#2|<par del|>{% + \def\:temp{#1}\ifx \:temp\empty\else + \edef\:temp{\expandafter\expandafter\expandafter + \:gobble\expandafter\string \csname #1\endcsname}% + \ifx \sec:typ\:temp + \let\found:|=\:tempb \let\:temp|=\empty + \else \def\:temp{\mod:typ#2|<par del|>}\fi + \fi \:temp +} +>>> + + +\SubSection{Cut Ends} + +\<boundaries of cut sections\><<< +\Configure{CutAt#1}{|<advance TitleCount|>\csname c:#1\endcsname + }{\def\sec:typ{#1}\Close:Until \csname d:#1\endcsname}% +>>> + +\<html divs\><<< +\def\Close:Until{% + \let\:tempd|=\:Sections \Check:Until + \ifx \:tempb\sec:typ \expandafter\Do:Close \fi +} +\def\Check:Until{ + \ifx \:tempd\empty \let\:tempb|=\empty \else + \PopStack\:tempd\:tempb + \ifx \:tempb\sec:typ \else + \expandafter\expandafter\expandafter\Check:Until + \fi\fi } +>>> + + +\SubSection{Common Utilities} + +\<record sections hierarchy\><<< +\PushStack\:Sections{#1}% +>>> + + +\<html divs\><<< +\PushStack\:Sections{}% +\PopStack\:Sections\:temp +\def\Do:Close{% + \PopStack\:Sections\:tempb + \ifx \sec:typ\:tempb \else + \csname d:\:tempb\endcsname + \expandafter\Do:Close + \fi +} +>>> + +The following is for closing logical units at the end of the file, +when they don't have hypertext pages of their own. + +\<html divs\><<< +\def\Close:UntilEnd{% + \ifx \:Sections\empty \let\:tempb|=\empty + \else \PopStack\:Sections\:tempb \fi + \ifx \:tempb\empty \else + \csname d:\:tempb\endcsname + \expandafter\Close:UntilEnd + \fi +} +>>> + + + +\Section{Building Blocks} + +The \''\ref', \''\Tag', \''\@currentlabel', and \''\cur:th' are for +latex. Also note that \''label' and \''\ref' can appear within +titles, and there we nullify them except within the titles themselves +and tocs. +One problem with the \''\ref' is that +they may cause nested links. + + +\<html divs\><<< +\def\:StartSec#1#2#3{% + \def\title:chs##1##2{##2}% + \def\sec:typ{#1}% + |<delayed TocAt|>% + \a:NoSection + |<round ids between sections|>% + |<button for cut at sect|>% + |<BeforeEvery hook|>% + \expandafter\ifx \csname a:#1\endcsname\relax \else + \csname a:#1\endcsname{#3}% + \fi + \b:NoSection \:Ttle{#1}{#2}{\csname #1:ttl\endcsname{#3}}% + \a:NoSection + \expandafter\ifx \csname b:#1\endcsname\relax \else + \csname b:#1\endcsname{#3}% + \fi + |<Every hook|>% + \csname a:AfterTitle\endcsname \b:NoSection + \def\title:chs##1##2{##1}% +} +\def\title:chs#1#2{#1} +>>> + +\<shared config\><<< +\NewConfigure{NoSection}{2} +>>> + + + + + +The \''\par' before \''|<Every hook|>' is to ensure the use of +\''\ShowPar'. Well, the \''\par' turned out to be a pain in cases we +want no space at all. Hence, we took it out. + + + + + + +On the other hands, we try to make sectioning commands fixed points +for labels. Hence, we try to reduce sensitivity of tocs to changes. + +\<round ids between sections\><<< +\ro:nd\html:lbl{1000}% +>>> + + + + + + + + + + + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Title} +%%%%%%%%%%%%%%%%%%%%%%%%% + +\<elements for divs\><<< +\def\:Ttle#1#2#3{% + \html:addr + |<hook for ref/label|>% + {|<introduce `doTocEntry toc@1 (@2) (@3) (page no)' to toc|>}% + {|<typeset @3 and link to toc entry|>}% +} +\gHAssign\TitleCount|=0 \global\let\mu:span|=\TitleCount +>>> + +\<advance TitleCount\><<< +\gHAdvance + \TitleCount |by 1 \global\let\mu:span|=\TitleCount +\expandafter\expandafter\expandafter\global \expandafter + \let\csname #1:Count\endcsname|=\TitleCount +>>> + + +For some reason (what it is?) we can't put the set TitleMark +together with the TitleConunt within CutAt--e.g., tex4ht-html32 screams at +subsection about undefined TitleMark. + +\<set TitleMark\><<< +\expandafter + \let\expandafter\TitleMark\csname #1HMark\endcsname +>>> + +\<tex divisions\><<< +\def\ConfigureMark#1#2{\long\expandafter + \def\csname #1HMark\endcsname{#2}} +>>> + + + +We nulify \''\Link', but this causes no problem because we are +within a group. + +well, \`' \let\Link|=\no:lnk ' is a problem for \`'\Configure{ref}', +so we introduced the latter comamnd. + +\<typeset the html sec title\><<< +\csname a:InsertTitle\endcsname +\csname InsertTitle\endcsname{#1}% +>>> + + +Can't use \''\Title'. Already in maple2e.tex. + + + + + +\<typeset @3 and link to toc entry\><<< +|<href on sec head?|>% +\no:lbl:idx \csname Modify#1Title\endcsname +\html:sectoc{#3}% +>>> + + + +\<tex divisions\><<< +\let\no:lbl:idx|=\empty +\let\toc:lbl:idx|=\empty +>>> + +\Section{Table of Contents} + +The \''\:writetoc' command outputs the expansion of its parameter, and +the page number, into the file. The expanded definition \`'\edef' +provides records the parameter according to the conditions that exist +when the command is encountered. + +\<introduce `doTocEntry toc@1 (@2) (@3) (page no)' to toc\><<< +\escapechar=`\\% +\protect:wrtoc +\csname Modify#1ToToc\endcsname +\edef\:writetoc{\csname if:toc\endcsname{\the\:tokwrite + {\string\doTocEntry + \string\toc \expandafter\ifx\csname toToc:#1\endcsname\relax #1\else + \csname toToc:#1\endcsname\fi + {#2}{\html:tocsec{\ifx \TocTitle\:UnDef #3\else + \TocTitle\fi}}{\the\:tokpage}\relax}}}% +\:writetoc \global\let\TocTitle|=\:UnDef +>>> + +\<elements for divs\><<< +\NewConfigure{toToc}[2]{% + \if !#2!\expandafter\let\csname toToc:#1\endcsname\:UnDef + \else \if !#1!% + \expandafter\let\csname IF:#2toc\expandafter\endcsname + \csname if:#2toc\endcsname + \expandafter\let\csname if:#2toc\endcsname\:gobble + \else \edef\:temp{\string @}\edef\:tempa{\string#1}% + \ifx \:temp\:tempa + \expandafter\let\csname if:#2toc\endcsname\empty + \else \edef\:temp{\string ?}% + \ifx \:temp\:tempa + \expandafter\let\csname if:#2toc\expandafter\endcsname + \csname IF:#2toc\endcsname + \else + \expandafter\def\csname toToc:#1\endcsname{#2}% + \fi\fi\fi\fi} +>>> + +\<elements for divs\><<< +\ifx \:tokwrite\:UnDef + \csname newtoks\endcsname\:tokwrite +\fi +\ifx \:tokpage\:UnDef + \csname newtoks\endcsname\:tokpage +\fi +\:tokpage={\folio} +>>> + +\<html latex divs\><<< + +>>> + +\<elements for divs\><<< +\:tokwrite|={\write\:tocout} +>>> + + +\<html divs\><<< +\def\protect:wrtoc{% + |<no Hnewline|>\PictureOff + \def\%{\string\%}\a:writetoc} +>>> + + + +\<html config util\><<< +\NewConfigure{writetoc}[1]{\concat:config\a:writetoc{#1}} +\let\a:writetoc|=\empty +>>> + + +The following might be solved with protect(?). + + +\`' \let\Link|=\no:lnk ' is a problem for \`'\Configure{ref}'. + + + + +\Section{Links} + + +\<html divs\><<< +\def\html:sectoc#1{\csname if:toc\endcsname{% + \xdef\CurSecHaddr{|<section html addr|>}% + \edef\:attr{\noexpand\scp:Link{% + \ifTag{|<HTag tag|>|<toc-section html addr|>}% + {|<toc-section html addr|>}% + {|<section html addr|>}% + }}% + \:attr{|<section html addr|>}}% + \ifx \EndTitle:Link\:gobble \if:toc{\scp:EndLink}\fi + |<typeset the html sec title|>\EndTitle:Link{\if:toc{\scp:EndLink}}} +\def\html:tocsec#1{\string\csname\space a:TocLink\string\endcsname + {\FileNumber + }{|<section html addr|>}{|<toc-section html addr|>}{#1}} +\let\CurSecHaddr|=\empty +>>> + +If option \`'sections+' is active, the full title is an anchor. +Might be a problem, in particular when the title contains +a footnote. If the option is not active, the anchor for access from +the tocs is empty. + +% [ CLASS="\sec:typ Head"] +% [ CLASS="\sec:typ Toc"] + + + +The command \''\uppercase' is put outside the command \''\:toc' to +convert the lower case character tokens to uppercase characters before +they are inserted into the file. Within \''\:toc' the command \''\uppercase' +is written as is into the auxiliary file, and takes effect only when +the auxiliary file is imported. + + + + +\''\Get:SecAnchor' should provide an anchor in \''\:SecAnchor' for the +cross references. If none is provided, tex4ht will offer one. tex4ht +doesn't really need the address; the idea is to save on duplicated anchors. + +\<section html addr\><<< +\ifx \:SecAnchor\:UnDef + |<toc tag|>1-\file:id-\TitleCount +\else \:SecAnchor \fi >>> + + + +\<toc-section html addr\><<< +|<toc tag|>2-\file:id-\TitleCount >>> + + +\<toc tag\><<< +Q>>> + + +\<hook for ref/label\><<< +\Get:SecAnchor{#1}{#2}{#3}% +>>> + + +\<elements for divs\><<< +\def\Get:SecAnchor#1#2#3{} +>>> + + + + + + + +\Section{Control Links on Section Heads} + + + +Option for univerally no links from titles of sections. + +\<html divs\><<< +\:CheckOption{sections+}\if:Option + \def\Title:Link{\Link} + \def\EndTitle:Link#1{#1} +\else + \def\Title:Link#1{\Link{}} + \let\EndTitle:Link|=\:gobble + \Log:Note{for back links to toc, + use the command line option `sections+'}% +\fi +>>> + +\<shared config\><<< +\NewConfigure{toTocLink}[2]{\def\scp:Link{#1}\def\scp:EndLink{#2}} +\Configure{toTocLink}{\Title:Link}{\EndLink} +>>> + + +The above gives global control. The following local one. +E.g., \`'\NoLink{section}' asks that sections of type `section' +will not act as hot buttons. + +\<html divs\><<< +\def\NoLink#1{\expandafter + \gdef\csname #1:Href-\endcsname{\let\EndTitle:Link|=\:gobble}}% +>>> + + +\<href on sec head?\><<< +\csname #1:Href-\endcsname +>>> + + +\Section{Cut-Offs} + +The following makes a call to, e.g., \`'\cut:at{section}{title}-' + + + +\<button for cut at sect\><<< +|<set TitleMark|>% +\expandafter\ifx \csname Cut:#1\endcsname\relax + |<boundaries of non-cut sections|>% +\else + |<boundaries of cut sections|>% + |<TITLE for Sec|>% + \csname Cut:#1\endcsname{#3}% +\fi +\global\let\sec:lvl|=\HPageDepth +|<record sections hierarchy|>% +>>> + + +% \Configure{CutAtTITLE+} {|<TITLE for Sec|>}% + + +The \`'\let\sec:lvl|=\HPageDepth' is used to determine whether we have +prev-next links with next HPage. As we out from hypertext pages, +the value of \''\HPageDepth' decreases, and the values of +\''\sec:lvl' are kept one value behind. If just before entering +a hypertext page we have \`'\sec:lvl>\HPageDepth', it means +that the last HPage and the next one are at the same depth. Hence, +we allow for prev-next links. We want the \''\global' because +section titles can be within groups as is the case, for instance, +for tables of contents of tables or figures in LaTeX. Without +the global, will need to fix locally the values of \''\sec:lvl' for titles +that are nested in groups. + + +\<TITLE for Sec\><<< +\expandafter\ifx \csname a:\sec:typ TITLE\endcsname\relax\else + \expandafter\let\expandafter\a:CutAtTITLE + \csname a:\sec:typ TITLE\endcsname\fi +>>> + +\<TITLE for SecNO\><<< +\expandafter\ifx \csname a:\sec:typ TITLE\endcsname\relax + \expandafter\HCode \else +\expandafter\expandafter\csname a:\sec:typ TITLE\endcsname\fi +>>> + + + + +\<c:TITLE: for Sec\><<< +\expandafter\def\csname c:#1TITLE+:\endcsname{% + \expandafter\def\csname a:#1TITLE\endcsname####1}% +>>> + +\<html divs\><<< +\HAssign\sec:lvl|=0 +>>> + +\Section{Hooks} + +BeforEvery and Every are single-parameter macros. + +\<def /:Every\><<< +\def\:Every#1{% + \expandafter\edef\csname Every#1\endcsname{% + \def\expandafter\noexpand \csname :Every#1\endcsname####1}% + \expandafter\edef\csname BeforeEvery#1\endcsname{% + \def\expandafter\noexpand\csname :BeforeEvery#1\endcsname####1}% +} +>>> + +\''\Every...' and not \''\AfterEvery...', because we are not yet after the section, we are only after the title. + + +Default hooks are set to tables of contents. + +\<initiate BeforeEvery/Every div\><<< +\:Every{#1}% +\csname Every#1\endcsname{% + \expandafter\ifx\csname Toc:#1\endcsname \relax\else + \a:TocAt \csname Toc:#1\endcsname \b:TocAt + \fi + \ignorespaces}% +>>> + +\<delayed TocAt\><<< +\a:dTocAt \csname TocAt*\endcsname \b:dTocAt +\expand:after{\global\let}\csname TocAt*\endcsname|=\empty +>>> + + +\<html config util\><<< +\NewConfigure{TocAt*}[2]{% + \c:def\a:dTocAt{#1}\c:def\b:dTocAt{#2}} +\NewConfigure{TocAt}[2]{% + \c:def\a:TocAt{#1}\c:def\b:TocAt{#2}} +\Configure{TocAt*}{}{} +\Configure{TocAt}{}{} +>>> + + + + + + +The following occurs for sectioning commands without +subdivisions. + + +\<BeforeEvery hook\><<< +\expandafter\ifx \csname :BeforeEvery#1\endcsname\relax \else + \csname :BeforeEvery#1\endcsname{#3}% +\fi +>>> + + +\<Every hook\><<< +\expandafter\ifx \csname :Every#1\endcsname\relax \else + \csname :Every#1\endcsname{#3}% +\fi +>>> + + +\Section{Utilities} + + +Normally, the leading paragraphs in chapters and sections start with +no indentation, whereas the other paragraphs start with indentations. +To achieve this effect, we can allow a contribution of an indentation to +all the paragraphs, with provisions for removing the indentations from +selected paragraphs. + + + +Without the \''\immediate' we can get problems on boundary between pages. + + + +\Section{Configurations for CutAt} + + + + +The \`'\par\ShowPar' is to ensure that buttons at +end of a page will not get into the last entry of the table in case +of a cut-off situation. + + + + + + + + +\Chapter{Tables of Contents} + + + + + + + + + + +\Section{Archiving the Table} + +For a source document that is stored in file named \''abc.xyz' the +table is assumed to be stored in a file that carries the name +\''abc.4tc'. It is archived into \''abc.4ct'. + +\<blocs for tocs\><<< +\openin15=\jobname.4tc +\ifeof15 \closein15 + \def\:TableOfContents[#1]{\writesixteen{No file \jobname.4tc}} + |<undef /TableOfContents|> +\else + \ifHtml |<def html /TableOfContents|> + \fi + |<copy toc|> +\fi +>>> + + +\<copy toc\><<< +\begingroup + \catcode`^|=7 + |<define /:copytoc|> \ifHtml \catcode`\#|=12\relax \fi + \def\:next{\catcode\tmp:cnt|=12 + \ifnum \tmp:cnt=0 + \def\:next{% + \catcode`\^^M|=5 + \immediate\openout15=\jobname.4ct \:copytoc + \immediate\closeout15 + \endgroup \closein15 + }% + \fi + \advance\tmp:cnt |by -1 \:next + } + \tmp:cnt|=255 \:next +>>> + + +\<define /:copytoc\><<< +\def\:copytoc{% + \ifeof15 \else + \read15 to \:temp + {\escapechar=`\\\immediate\write15{\:temp}}% + \expandafter\:copytoc + \fi} +>>> + +\Section{Invoked Tables of Contents} + + +\SubSection{Listing the Entries} + + + + +The following pair of definitions are a degenerated case of the `sty' option +in which the parameters are required for a table to appear. + +\<undef /TableOfContents\><<< +\ifx \TableOfContents\:UnDef + \def\TableOfContents{\futurelet\:temp\:TOC} + \def\:TOC{\ifx [\:temp \expandafter\:TableOfContents\fi} +\fi +>>> + + + +\<def html /TableOfContents\><<< +|<undef /TableOfContents|> +\def\:TableOfContents[#1]{\SaveEverypar{% + \def\TocCount{0}% + |<interpretation for entries|>% + \def\InsertTitle##1##2##3{}% + \hsize|=4.5in \rightskip |= \z@ minus 1in \linepenalty|=1000 + \catcode`\#|=12 \catcode`\@|=11 \catcode`\:|=11 + |<Configure HtmlPar for TOC|>\everypar{\HtmlPar}% + |<before toc|>\input \jobname.4ct + {\ht:everypar{}\leavevmode}|<bottom toc|>% + \par }\RecallEverypar |<after toc|>} +>>> + +\<after toc\><<< +\ifx \c:tableofcontents\:UnDef + \csname c:TableOfContents\endcsname +\else \c:tableofcontents \fi +>>> + +\<before toc\><<< +\ifx \a:tableofcontents\:UnDef \csname a:TableOfContents\endcsname +\else \a:tableofcontents \fi +>>> + + + +\<bottom toc\><<< +\ifx \b:tableofcontents\:UnDef + \csname b:TableOfContents\endcsname +\else \b:tableofcontents \fi +>>> + + + + +\<par toc\><<< +\ifx \d:tableofcontents\:UnDef \csname d:TableOfContents\endcsname +\else \d:tableofcontents \fi +>>> + +\<noindent toc par\><<< +\ifx \e:tableofcontents\:UnDef + \csname e:TableOfContents\endcsname +\else \e:tableofcontents \fi +>>> + + + + + + + + + + +The following might be a problem LaTeX, in particular +with \''\IgnoreIndent/\ShowIndent' cases. A partial solution +to the problem used the code +\`'\if:latex \if:nopar \else + \Configure{HtmlPar}{}{\Configure + {HtmlPar}{|<noindent toc par|>}{|<par toc|>}{}{}}{}{}% +\fi\fi', but then we got problems elsewhere. + +\<Configure HtmlPar for TOC\><<< +\Configure{HtmlPar}{|<noindent toc par|>}{|<par toc|>}{}{}% +>>> + + + + + +\SubSection{Loading the Entries} + + +\<interpretation for entries\><<< +\:tocPreamble#1,,% +\let\doTocEntry|=\:doTocEntry +\def\contentsline##1##2##3{##2}% +\no:lbl:idx +>>> + + + + +\<blocs for tocs\><<< +\def\:doTocEntry#1#2#3#4{% + \Advance:\TocCount |by 1 + \expandafter\ifx \csname \string#1 \endcsname \relax \else + #1{#2}{#3}{#4}\fi +} +>>> + +\<shared config\><<< +\NewConfigure{TocLink}[1]{\def\a:TocLink##1##2##3##4{#1}} +>>> + +A field \`'[\ifnum \FileNumber=#1 + \else \RefFileNumber{#1}\fi]' buys nothing as far as memory +is concerned. + +\<def Configure\><<< +\long\def\ConfigureToc#1#2#3#4#5{% + \expandafter\def\csname toc#1\endcsname##1##2##3{#5}% + |<cond toc config|>% +} +>>> + + +\<trace commands\><<< +\long\def\ConfigureToc#1#2#3#4#5{% + \expandafter\def\csname toc#1\endcsname##1##2##3{#5}% + \edit:p\def\:temp{#2#3#4#5}\ifx \:temp\empty + \expandafter\pend:defIII\csname toc#1\endcsname{\hbox + {\a:trc Toc(#1)1\b:trc}####1\hbox{\a:trc Toc(#1)2\b:trc}####2\hbox + {\a:trc Toc(#1)3\b:trc}####3\hbox{\a:trc Toc(#1)4\b:trc}}% + \else + |<cond toc config|>% + \fi +} +>>> + + + +\<cond toc config\><<< +\def\:temp{#4}\ifx \:temp\empty \else + \expandafter\pend:defIII\csname toc#1\endcsname{#4####3}% +\fi +\def\:temp{#3}\ifx \:temp\empty \else + \expandafter\pend:defIII\csname toc#1\endcsname{#3####2}% +\fi +\def\:temp{#2}\ifx \:temp\empty \else + \expandafter\pend:defIII\csname toc#1\endcsname{#2####1}% +\fi +>>> + +\<blocs for tocs\><<< +\def\:tocPreamble#1,{% + \def\:temp{#1}\ifx \:temp\empty \else + \edef\:temp{\expandafter\string\csname toc#1 \endcsname}% + \expandafter\expandafter\expandafter\let + \expandafter\csname\:temp\endcsname|=\empty + \expandafter\:tocPreamble\fi} +>>> + + + + + + + + + + + + + + +\SubSection{Collecting the Entries} + +After producing the table of contents from the previous compilation, +a file is opened for collecting the entries of the table from the +current compilation. + +\<blocs for tocs\><<< +\ifx \:tocout\:UnDef + \csname newwrite\endcsname\:tocout +\fi +\def\:temp{% +|<if latex then latex/write sol|>\openout\:tocout|=\jobname.4tc + |<doTocEntry for dvi|>} +\:temp +>>> + +In case we switch from html to dvi mode, without the presence of +TeX4ht, we want to hide the \''\doTocEntry'.. +The \`'\escapechar' decides what is written out for escape character, +no matter what the actual symbol is. texinfo changes that symbol to +{\tt \string\escapechar=`\string\@}. + +\<doTocEntry for dvi\><<< +{\escapechar=`\\|<if latex then latex/write sol|>\write + \:tocout{\string\expandafter\string\ifx + \noexpand\csname doTocEntry\string\endcsname\relax + \string\expandafter\string\endinput + \string\fi}% +}% +>>> + + + + +\Section{Triggered Tables of Contents} + +The \`'\TocAt-{...}' command asks for no TOC, the \`'TocAt*{...}' +command asks for a TOC delayed until the next section, \`'\TocAt{...}' +asks for TOC in place, and a list of size one asks for no more local +TOC's for the given logical unit. + +\<blocs for tocs\><<< +\def\TocAt#1{% + \def\:next##1{\:TocAt##1,//}% + \def\:tempa{#1}\def\:temp{-}\ifx \:tempa\:temp \let\:temp|=-% + \else \def\:temp{*}\ifx \:tempa\:temp \let\:temp|=*% + \else \def\:next{\:TocAt#1,//}% + \fi \fi \:next } +>>> + + + + + +\<Toc:At>\><<< +\expandafter\edef\csname Toc:#1\endcsname{% + \gdef\expandafter\noexpand\csname TocAt*\endcsname{% + \noexpand \csname Toc#1\noexpand\endcsname }}% +>>> + +\<Toc:At\><<< +\expandafter\edef\csname Toc:#1\endcsname{% + \noexpand\csname Toc#1\noexpand\endcsname }% +>>> + +\<blocs for tocs\><<< +\def\:TocAt#1,#2//{% + \ifx -\:temp \else \ifx *\:temp + |<Toc:At>|>% + \else |<Toc:At|>\fi \fi + \def\:temp{#2}\ifx \:temp\empty + \expandafter\let\csname Toc#1\endcsname|=\:UnDef + \else |<extract the entries|>\fi } +>>> + +\SubSection{Process the Request} + +For \`'\TocAt{X,...,Y,...}' we define a \''\TocX' that includes the +interpretations for the different \''\tocY' w of Xithin commands of +the form \`'X::tocY'. + + + +\<extract the entries\><<< +\let\:include|=\empty +\::TocAt#1,/#1,#2,,//% +\edef\:include{\expandafter\:removecomma\:include}% +\expandafter\edef\csname Toc#1\endcsname{{% + \let\noexpand\TitleCount|=\expandafter\noexpand + \csname #1:Count\endcsname + \noexpand\:assgtoc\:include,//{#1}% + \:tocs[\:include]}}% +>>> + + + +\SubSection{Process the Request} + +\<blocs for tocs\><<< +\def\:tocs{\noexpand\TableOfContents} +>>> + + + + +\<blocs for tocs\><<< +\def\:removecomma#1{} +\def\:assgtoc#1,#2//#3{% + \expand:after{\expandafter\let\csname toc#1\endcsname |=}% + \csname #3::toc#1\endcsname + \if:notempty{#2}{\:assgtoc#2//{#3}}} +>>> + +\<blocs for tocs\><<< +\def\::TocAt#1,#2,#3//{\def\:temp{#2}% + \ifx \:temp\empty \else + \if /\:firstch#2 //% + |<stop toc for @1 at @2|>% + \else |<include @2 in toc for @1|>\fi + \expand:after{\::TocAt#1,#3//}% + \fi +} +>>> + +\SubSection{Interpretation for Included Entry} + +Also for \`'\TocAt{X,....,Y,...}' the interpretation is +defined in \`'X::tocY'. + + +\<include @2 in toc for @1\><<< +\edef\:include{\:include,#2}% +\expand:after{\expandafter\let\csname svtoc::#2\endcsname|=}% + \csname toc#2\endcsname +\expandafter\edef\csname #1::toc#2\endcsname##1##2##3{% + \noexpand\ifnum \noexpand\TitleCount<\noexpand\TocCount + \noexpand\space + \expandafter\noexpand \csname svtoc::#2\endcsname{##1}{##2}{##3}% + \noexpand\fi}% +>>> + + +Tex4ht relies on two counters \`'\TitleCount' and \`'\TocCount' to +decide which entries of the global TOC should go to the local TOC. +The first counter is increased when sectioning commands are +encountered. The second counter is increased when the global TOC is +traversed. + +A discrepancy will occur when the contributions of the sectioning +commands to the global TOC are not synchronized with the increments of +the first counter. That will normally be the case when sectioning +commands are introduced without tex4h being informed about their +designation as sectioning commands. + + +\SubSection{End Points} + + +Also for \`'\TocAt{X,....,/Y,...}' the termination point that we get is +defined in \`'X::tocY'. + +\<blocs for tocs\><<< +\def\:firstch#1#2 //{#1\def\:temp{#2}} +>>> + + +\<stop toc for @1 at @2\><<< +\edef\:include{\:include,\:temp}% +\expandafter\def\csname #1::toc\:temp\endcsname##1##2##3{% + \ifnum \TitleCount<\TocCount + \Advance:\TocCount |by -100000 \endinput + \fi}% +>>> + +The \''\endinput' is not required but it desired because it cuts off +the reading of the toc file. The \''-100000' is needed +forhierarchical toc's due to parent-child relashions. + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Chapter{halign-based tables} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<halign-based tables\><<< +|<all halign-based tables|> +|<html blocks for halign tables|> +|<html halign|> +\def\:temp{\let\:shrp|=##} \:temp +>>> + +The \''\:shrp' should be defined at the end so as not +to bother other definitions that will regard it as improper +\`'#' parameter. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Taming of halign} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The \''\halign' comamnds not defined within TeX4ht environment +can be problematic, and the same may be true to some within such +environnt. Specifically, comamnds of the form \`'\halign...{...}' +are translated well in TeX4ht, but cause a problem if defined +before TeX4ht was activated. Commands of the form +\`'\halign...\bgroup...' cause no problem in either mode, but they +also introduce no html code. Commands of the form +\''\halign...{...\egroup' cause problems in either way. + +TeX4ht takes care of the \''\halign' commands in TeX and LaTeX, +but not of those that are loaded earlier from other libraries. + + +The following tree shows the direct and indirect use of \''\halign' in +TeX and LaTeX. + +\Draw +\TreeAlign(H,1,0)(0,0,0) +\TreeSpace(D,10,10) +\Tree()( +5,halign// +12,ialign{(T,L)} & 0,displaylines{(T,L)} & + 0,eqalignno{(T)} & 0,leqalignno{(T)} & + 0,eqnarray{(L)}// +0,m@ketabbox{(T)} & 0,oalign{(T,L)} & 0,angle{(T,L)} & + 0,overrightarrow{(T,L)}~~\hfill overleftarrow{(T,L)}~~ + \hfill overbrace{(T,L)}~~\hfill underbrace{(T,L)} & + 0,@vereq{(T,L)} & 0,cases{(T,L)} & 0,matrix{(T)} & 0,bordermatrix{(T,L)} & + 0,eqalign{(T)} & 0,@array{(L)} & 0,@ishortstack{(L)} & + 0,table{(L)}// +) + +\EndDraw + + +The \`'\iffalse{\fi...\iffalse}\fi' is to hide the \`'\cr' from +\''\halign' when it scans for that command. + + +\<all halign-based tables\><<< +\let\TeXhalign|=\halign +\def\RecallTeXcr{\iffalse{\fi + \expand:after{\let\cr|=}\csname 0cr\endcsname + \expand:after{\let\crcr|=}\csname 0crcr\endcsname + \iffalse}\fi} +\expandafter\let\csname 0cr\endcsname|=\cr +\expandafter\let\csname 0crcr\endcsname|=\crcr +\def\TeXhalign:cr{% + \ifx \EndPicture\:UnDef \else \iffalse{\fi + \expandafter\let\expandafter\cr\csname \MkHalign:d cr\endcsname + \expandafter\let\expandafter\crcr\csname \MkHalign:d crcr\endcsname + \iffalse}\fi \fi \TeXhalign} +>>> + + + Save/recover \''\crcr' and \''\cr' causes problems, e.g., in nested arrays. +It seems also we don't really need such a feature. + + + + +\<tex4ht halign and cr/crcr\><<< +\let\halign|=\sv:halign +>>> + + + + +%\edef\TeXhalign:cr{% +% \noexpand\ifx \noexpand\EndPicture\noexpand\:UnDef \noexpand\else +% \let\cr|=\expandafter\noexpand\csname 0cr\endcsname +% \let\crcr|=\expandafter\noexpand\csname 0crcr\endcsname +% \noexpand\fi \noexpand\TeXhalign} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Building Blocks for Accessing Halign Tables} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +The next comamnd can be in use when the parameters \`'#' (i.e., +the first parameter \''#1') are in cat code 13. + + +We hade \''\:relax' instead of \''\relax' below. Where did it come +from? + + +The \''\MkHalign' takes the form +\`'\MkHalign#{...pattern...}...body...\EndHalign' and seeds the end +tags \''\a:halign' and \''\b:halign' around the construct, and +\''\c:halign' and \`'d:halign' in the pattern. The outcome is a seeded +\`'\halign{...}'. The \`'\Configure{MkHalign}...' places +\''a:MkHalign', \''b:MkHalign', \''c:MkHalign', \''d:MkHalign', +\''e:MkHalign', and \''\f:MkHalign' within \''\a:halign', +\''\b:halign', \''\c:halign', and \`'d:halign'. The \`'#' in the +pattern can be any character of category code 13. The \`'&' charaters +shouldn't be within braces. The \''\RecallTeXcr' should appear +before \''\MkHalign'; if it appears within the pattern, we loose +the row breaks. + + + +\<html blocks for halign tables\><<< +\def\MkHalign#1#2{% + \iffalse{\fi \let\sv:new:row|=\new:row + \def\relax:shrp{\let#1|=\relax}% + \def\new:halign{\TeXhalign \bgroup}% + \add:halign#2&|<par del|>\cr + \let#1|=\:shrp |<before TeXhalign|>% + \iffalse}\fi |<protection for $$|>% + \a:PauseMkHalign \new:halign\ext:cr} +\def\EndMkHalign{\egroup + \d:PauseMkHalign |<end protection for $$|>% + \iffalse{\fi |<after TeXhalign|>\relax:shrp \iffalse}\fi } +\def\PauseMkHalign#1{\cr\egroup + \hbox{\r:halign \global\let\new:row|=\R:halign}\b:PauseMkHalign + #1\c:PauseMkHalign\new:halign\ext:cr} +>>> + +\<shared config\><<< +\NewConfigure{PauseMkHalign}{4} +>>> + + +The PauseMkHalign provides a vehicle to decompose a +\''\halign\bgroup...0......1...\egroup' and recompose it in arbitrary order and +choise of components, as is the case in longtable: +\`'\setbox0=\hbox{\halign\bgroup...0...\egroup} +\setbox1=\hbox{\halign\bgroup...1...\egroup}\box0\box1'. In some +occasions, and may be all, the parameter of \''\PauseMkHalign' must be +just boxes. + +The \`'\iffalse ...\fi' above are for hiding \''\cr' in +nested cases (e.g., of \''\tabular' in LaTeX). + +Spans over N columns require many compilations to +realize them. + +The following is an application of \''\MkHalign'. +it allows for tables of the form \`'\MiniHalign...\EndMiniHalign' +instead of \`'\halign{...}'. + +\<html blocks for halign tables\><<< + \catcode`\#|=13 \catcode`\@|=6 +\def\MiniHalign{\begingroup \catcode`\#|=13 \let#|=\relax + \:MHalign} +\def\:MHalign@1\cr{\endgroup \SaveMkHalignConfig + \Configure{MkHalign}{\a:MiniHalign}{\b:MiniHalign}\c:MiniHalign + \d:MiniHalign{\e:MiniHalign\RecallMkHalignConfig}\f:MiniHalign + \MkHalign#{@1}} + \catcode`\#|=6 \catcode`\@|=11 +\def\EndMiniHalign{\EndMkHalign \RecallMkHalignConfig } +>>> + +\<shared config\><<< +\NewConfigure{MiniHalign}{6} +>>> + + + +\ifHtml[\HPage{test data}\Verbatim + + \documentclass{article} + + \input tex4ht.sty \Preamble{html} + \begin{document} + \EndPreamble + +\begin{tabular}{c|} +before + \begin{tabular}{c|} center \end{tabular} +after +\end{tabular} + +\end{document} +\EndVerbatim\EndHPage{}]\fi + + +\<protection for $$\><<< +\begingroup +\ifmmode \def\end:m{$$\egroup}\vtop\bgroup$$\else +\let \end:m|=\empty\fi +>>> + + +\<end protection for $$\><<< +\end:m\endgroup +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Build Expanded Pattern} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Break the pattern at \`'&'s and enclose with calls for html +code. + +\<html blocks for halign tables\><<< +\def\add:halign#1\cr{% + \def\:temp{#2}\def\:tempb{|<par del|>}% + \ifx \:temp\:tempb + \append:def\new:halign{\b:halign#1\c:halign}% + \else + \def\:temp{#1}\ifx\:temp\empty \append:def\new:halign{&}% + \else \append:def\new:halign{\b:halign#1\c:halign&}\fi + \add:halign#2\cr + \fi} +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Html Insertions} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\<before TeXhalign\><<< +\global\let\new:row|=\R:halign +\Advance:\MkHalign:d |by 1 +\expandafter\let\csname \MkHalign:d cr\endcsname|=\cr +\expandafter\let\csname \MkHalign:d crcr\endcsname|=\crcr +\edef\cr{\noexpand\rR:halign + \expandafter\noexpand \csname \MkHalign:d cr\endcsname}% +\edef\crcr{\noexpand\rR:halign + \expandafter\noexpand \csname \MkHalign:d crcr\endcsname}% +\let\omit|=\om:t \def\TT:halign{\T:halign \global\let\TT:halign|=\empty}% +>>> + +Inserting \''\T:halign' here causes infinite loop in \''\@array' +of latex. Hence, we delay it to the stat of the first element. + +\<after TeXhalign\><<< +\expand:after{\let\cr|=}\csname \MkHalign:d cr\endcsname +\expand:after{\let\crcr|=}\csname \MkHalign:d crcr\endcsname +\let\omit|=\:omit +{\ht:everypar{}\r:halign}\t:halign +\Advance:\MkHalign:d |by -1 +>>> + +\<html blocks for halign tables\><<< +\def\rR:halign{\gdef\new:row{\r:halign \R:halign}} +\HAssign\MkHalign:d |= 0 +>>> + + + + + +\<html blocks for halign tables\><<< +\def\b:halign{\BB:halign \bgroup} +\def\c:halign{\egroup\d:halign} +\def\BB:halign{\expand:after{\global\let\new:row|=\empty }\new:row + \D:halign} +>>> + +The \''\Configure' may use the values of \''\:MULTISPAN', \''\halignTD', +\''\HRow'' and \''\HCol'. The \''\halignTD' gets its value from +\''\Configure{TD}{...}'. + + +\<html config util\><<< +\def\halignTD{\ifx \:mALIGN\empty \hT:D \else \:mALIGN \fi} +\def\halignTB#1{ + \expandafter\ifx \csname :#1:\endcsname\relax + \:warning{Missing \string\Configure{halignTB<>}{#1}}% + \else + \global\expandafter\let\expandafter\:MkHalign: + \csname :#1:\endcsname \a:halignTB \expandafter\expandafter + \expandafter\halign:TB \csname :#1:\endcsname|<par del|>\b:halignTB + \fi } +\NewConfigure{halignTB}{2} +\NewConfigure{halignTB<>}[2]{% + \expandafter\def\csname :#1:\endcsname{#2}} +|<init :MkHalign:|> +>>> + +\<html config util\><<< +\NewConfigure{MkHalign}[6]{% + \def\T:halign{\PushMacro\:MkHalign:|<init :MkHalign:|>#1}% + \def\t:halign{#2\PopMacro\:MkHalign: + \global\let\:MkHalign:|=\:MkHalign:}% + \def\R:halign{\TT:halign \gHAdvance\HRow |by 1 \gHAssign\HCol|=1 + #3}% + \def\r:halign{\end:omit#4}% + \def\D:halign{\:nopartrue + |<save dH|>% + |<cond TD for multispan|>% + \ifnum\MS:count=\ifx \:MULTISPAN\:UnDef \MS:count + \else \:MULTISPAN\fi + \expandafter\gdef\csname dH\MkHalign:d\endcsname + {|<cond /TD for multispan|>}\fi}% + \def\d:halign{\csname dH\ifnum \MkHalign:d<1 1\else \MkHalign:d\fi + \endcsname |<recall dH|>}} +\Configure{MkHalign}{}{}{}{}{}{} +\HAssign\dH:cnt|=0 +>>> + +\<save dH\><<< +\gHAdvance\dH:cnt by 1 +\edef\:tempa{\global\let\expandafter\noexpand\csname xc\dH:cnt\endcsname + \expandafter\noexpand\csname dH\MkHalign:d\endcsname}% +\:tempa +\expandafter\xdef\csname \dH:cnt :tempa\endcsname{% + \global\let \expandafter\noexpand\csname dH\MkHalign:d\endcsname + \expandafter\noexpand\csname xc\dH:cnt\endcsname}% +>>> + +\<recall dH\><<< +\csname \dH:cnt :tempa\endcsname +\gHAdvance\dH:cnt by -1 +>>> + +Nonleading \`'\csname dH\MkHalign:d\endcsname' produce improper closing +delimiters in \`'\multispan' of index $>$ 1. In such cases, only the +outcome of the first \`'\D:halign' contribute for the openning +delimiter---occuring in the iteration in which +\`'\MS:count=\:MULTISPAN'. + +The \`'\ifnum \MkHalign:d<1 1\else \MkHalign:d\fi' is needed because we +can get down to 0 if the last entry is a \''\multispan'. + + + + +\<math config util\><<< + +>>> + +\<init :MkHalign:\><<< +\Configure{halignTB<>}{MkHalign}{<>}% +>>> + + + +The saving \`'\csname dH\MkHalign:d\endcsname' and loading is to +protect from changes that may occur inside the entity in the meaning +of \''\d:halign'. Don't we need the same for \''\r:halign'? + +The following is for tracing users definitions to be used in extensions +that need to do reverse eng of the users input. + + +\<shared configNO\><<< +\NewConfigure{TraceTables}[8]{\def\trc:T{#1}\def\trc:eT{#2}% + \def\trc:t{#3}\def\trc:et{#4}\def\trc:R{#5}\def\trc:eR{#6}% + \def\trc:r{#7}\def\trc:er{#8}\d:TrcHlgn} +\def\d:TrcHlgn#1#2#3#4{\def\trc:D{#1}\def\trc:eD{#2}% + \def\trc:d{#3}\def\trc:ed{#4}} +>>> + + +The \''\:removeindenttrue' is important, for instance, in case of +a \''\noalign{...}'. + +When we meet \`'&&', which signals a loop. + + +We place \''#' under catcode 13. \''\noalign' is ignored. + + + +\<html blocks for halign tables\><<< +\def\SaveMkHalignConfig{\let\sT:halign|=\T:halign + \let\st:halign|=\t:halign + \let\sR:halign|=\R:halign + \let\sr:halign|=\r:halign + \let\sD:halign|=\D:halign + \let\sd:halign|=\d:halign} +\def\RecallMkHalignConfig{\let\T:halign|=\sT:halign + \let\t:halign|=\st:halign + \let\R:halign|=\sR:halign + \let\r:halign|=\sr:halign + \let\D:halign|=\sD:halign + \let\d:halign|=\sd:halign} +>>> + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{/omit and /span} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<html blocks for halign tables\><<< +\let\:omit|=\omit +\def\om:t{\:omit \BB:halign + \gdef\end:omit{\gdef\end:omit{}\d:halign}} +\let\end:omit|=\empty +>>> + + +A \''\multispa' is a sequence of \''\span''s. Each \''\span' +puts \`'\HRow.\HCol;' in \''\new:span;'. Next compilation +retrieves this info to compute \''\:MULTISPAN'. + + +\<cond TD for multispan\><<< +\gHAdvance\MS:count |by -1 +\ifnum \MS:count > 0 \else + \end:omit \relax:shrp \derive:TD + \HAssign\:MULTISPAN|=1 \let\:mALIGN|=\empty + \expandafter\add:span\old:span \gHAssign\MS:count|=\:MULTISPAN + \relax #5% +\fi +\xdef\Step:Col{\ifx \HMultispan\:UnDef 1 \else \HMultispan\fi}% +>>> + +\<cond /TD for multispan\><<< +\ifnum \MS:count<2 #6\relax + \gHAdvance\HCol \Step:Col\relax \fi +>>> + + + + + + +% \ifnum \MS:count<2 #6 \gHAdvance\HCol |by 1 \fi + + +For some reason \`'\if:latex\@multicnt\else\mscount\fi' +didn't work for \''\MS:count>0' on + +\Verbatim +\halign{#\qquad& \$# each\cr +\omit\span\omit\hfil + Shipping Charges\hfil\cr +1--10&1.30\cr11--100&1.00\cr +111--&0.70\cr} +\EndVerbatim + + +Tried to put \`'\iffalse{\fi \let\cr|=\ext:cr \let\crcr|=\ext:crcr + \iffalse}\fi ' at start of cell. It didn't work, because I couldn't + restore the \''\cr' and \''\crcr' before the \''\cr' is read at end + of line. This doesn't look like an important because + the redefined version just has a \''\gdef' in it and produces no code + of itself. However, it is important because problems sometimes +arise if a nonnative instance is present, for instance, in +\`'\openup10pt \halign{ + $2^{#}$\quad& + $\overbrace{2\cdots 2}^{# + \rm times}$\quad& #\cr + 2&2&4\cr 3&3&8\cr } +'. + + +See Knuth 386 for the + hiding +\`'\iffalse{\fi\let\cr|=\ext:cr\iffalse}\fi ' of \''\cr'. + +\<html blocks for halign tables\><<< +\let\ext:cr|=\cr \let\ext:crcr|=\crcr +>>> + +\<html blocks for halign tables\><<< +\let\:span|=\span +\def\add:span#1;{\def\:tempa{#1}\edef\:temp{\HRow .\HCol}% + \ifx \:temp\:tempa \Advance:\:MULTISPAN |by 1 \fi + \ifx \:tempa\empty \let\HMultispan|=\:MULTISPAN + \else + |<align for multispan in latex|>% + \expandafter\add:span + \fi } +>>> + + + + + + + +\<align for multispan in latex\><<< +\let\:temp|=\relax +\def\:temp##1.{\def\:temp####1|<par del|>{\def\:temp{####1}}% + \afterassignment\:temp\tmp:cnt}% +\expandafter\expandafter\expandafter\:temp\expandafter\:tempa|<par del|>% +\edef\:tempb{\HRow.\HCol\:temp}\ifx\:tempa\:tempb + \expandafter\ifx \csname \expandafter\string\:temp :T:D\endcsname\relax + \else \edef\:mALIGN{\expandafter\noexpand + \csname \expandafter\string\:temp :T:D\endcsname}% +\fi\fi +>>> + +\<NO\><<< +\edef\:temp{\HRow .\HCol<}% +\ifx \:temp\:tempa \def\:mALIGN{\l:TD}\fi +\edef\:temp{\HRow .\HCol-}% +\ifx \:temp\:tempa \def\:mALIGN{\c:TD}\fi +\edef\:temp{\HRow .\HCol>}% +\ifx \:temp\:tempa \def\:mALIGN{\r:TD}\fi +>>> + + + +\<before TeXhalign\><<< +\let\sv:end:omit|=\end:omit \let\end:omit|=\empty +\let\ms:count|=\MS:count \HAssign\MS:count|=0 +\let\lgn:r|=\HRow \let\lgn:c|=\HCol \HAssign\HRow|=0 +\def\span{\xdef\new:span{\new:span\HRow.\HCol;}\:span}% +\let\sv:new:span|=\new:span \let\new:span|=\empty +\gHAdvance\Halgn:cnt |by 1 \edef\halign:id{\Halgn:cnt}% +\edef\old:span{\LikeRef{|<halign tag|>}}% +\ifx \old:span\space \def\old:span{;}\fi +>>> + +The \`'\ifx \old:span\space \def\old:span{;}\fi' is needed for first +runs when no info is yet available. + +\<after TeXhalign\><<< +\Tag{|<halign tag|>}{\new:span;}% +\global\let\new:span|=\sv:new:span +\iffalse{\fi \let\span|=\:span \iffalse}\fi +\global\let\HRow|=\lgn:r \global\let\HCol|=\lgn:c +\global\let\MS:count|=\ms:count +\global\let\new:row|=\sv:new:row +\global\let\end:omit|=\sv:end:omit +>>> + +\<html blocks for halign tables\><<< +\HAssign\Halgn:cnt|=0 +>>> + + + + +The \''\mu:span' Provides a little movement to +avoid oscilation of multi spans around incorrect values. +It is attached to \''\TitleCount' ingeneral, but not +within \`'\begin{longtable}...\end{longtable}'. +In that environment, \''\caption' may appear, and so change +the value of \''\TitleCount' in the middle of a table, within +a \''\multispan'. + + + + +\<halign tag\><<< +|<auto tag|>M\halign:id x\mu:span>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{TD Script} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Through \''\Configure{MkHalign}{....}' with entries of the form +\`'row col insertion ' (space at end: + \`'\Contribute{halignTD}{1 1 - }' is fine but +not \`'\Contribute{halignTD}{1 1 -}'. The first character may be a +code +\''<', \''-', \''>', \''^', \''=', \''-', or \''_'. A row of +value 0 applies for a full column, a column of 0 stands for a full +row, and row and col of 0 stand for a full table. + + + + +\<html blocks for halign tables\><<< +\def\derive:TD{% + \bgroup \no:actv + \xdef\:temp{\noexpand\expandafter\noexpand\:temp + \noexpand\halign:TD\:MkHalign: -0 0 1 |<par del|>}% + \egroup + \let\hT:D|=\:temp + \def\:temp##1 ##2 ##3 {\ifnum -1=##1##2##3 \else + |<process TD op|> \expandafter\:temp \fi}% + \def\:tempa##1\empty{}% + \edef\hT:D{\hT:D}} +>>> + + + + + +\<process TD op\><<< +\ifnum \HRow=##1 \ifnum \HCol=##2 \:TDcode ##3\fi\fi +\ifnum \HRow=##1 \ifnum 0=##2 \:TDcode ##3\fi\fi +\ifnum 0=##1 \ifnum \HCol=##2 \:TDcode ##3\fi\fi +\ifnum 0=##1 \ifnum 0=##2 \:TDcode ##3\fi\fi +>>> + +\<html blocks for halign tables\><<< +\def\:TDcode#1{|<process TD code|>\EndTD:CLASS} + \catcode`\_=13 \catcode`\^=13 +\pend:defI\:TDcode{\TD:CLASS}% +\let\:temp|=\relax \let\:tempa|=\relax +\edef\no:actv{\let\noexpand\noexpand\noexpand^|=\:temp + \let\noexpand\noexpand\noexpand_|=\:tempa} + \catcode`\_=8 \catcode`\^=7 +\def\:temp{^} \def\:tempa{_} +\edef\no:actv{\no:actv} +>>> + + +\<html blocks for halign tablesNOOO\><<< +\def\:TDcode#1{|<process TD code|>\EndTD:CLASS} + \catcode`\_=13 \catcode`\^=13 +\pend:defI\:TDcode{\TD:CLASS + \ifx _##1 \o:TD \expandafter\:tempa \fi + \ifx ^##1 \t:TD \expandafter\:tempa\fi}% +\let\:temp|=\relax \let\:tempa|=\relax +\edef\no:actv{\let\noexpand\noexpand\noexpand^|=\:temp + \let\noexpand\noexpand\noexpand_|=\:tempa} + \catcode`\_=8 \catcode`\^=7 +\def\:temp{^} \def\:tempa{_} +\edef\no:actv{\no:actv} +>>> + + + + + +\<process TD codeOLDTD\><<< +\ifx <#1 \l:TD \expandafter\:tempa \fi +\ifx -#1 \c:TD \expandafter\:tempa \fi +\ifx >#1 \r:TD \expandafter\:tempa \fi +\ifx ^#1 \t:TD \expandafter\:tempa \fi +\ifx =#1 \b:TD \expandafter\:tempa \fi +\ifx ||#1 \m:TD \expandafter\:tempa \fi +\ifx _#1 \o:TD \expandafter\:tempa \fi +\ifx p#1 \p:TD \expandafter\:tempa \fi +\expandafter#1\empty +>>> + + + +\<process TD code\><<< +\expandafter + \ifx \csname \string#1:T:D\endcsname\relax \else + \csname \string#1:T:D\endcsname \expandafter\:tempa \fi +\expandafter#1\empty +>>> + + +\<html config util\><<< +\NewConfigure{halignTD}[2]{\c:def\TD:CLASS{#1}% + \c:def\EndTD:CLASS{#2}\scan:halignTD} +\def\scan:halignTD#1{\def\:temp{#1}\ifx \:temp\empty\else + \expandafter \sc:halignTD\fi{#1}} +\def\sc:halignTD#1#2{\expandafter\def\csname + \string#1:T:D\endcsname{#2}\scan:halignTD} +>>> + + +We could also have used \`'\Configure{halignTD} {CLASS="NOWRAP}{"} + { LEFT}{ CENTER}{ RIGHT} + { TOP}{ BASELINE}{ MIDDLE}{ BOTTOM}' fot DTD4.0s. + + +\<html config util\><<< +\NewConfigure{halignTR}[1]{\def\halignTR{#1}} +\Configure{halignTR}{} +>>> + +\<html config util\><<< +\def\halignTBL{\expandafter\ifx \csname v:TBL\endcsname\relax + \else \expandafter\ifx \csname \v:TBL :T:BL\endcsname\relax\else + \csname \v:TBL :T:BL\endcsname + \fi\fi} +\NewConfigure{halignTBL}[1]{\scan:halignTBL{#1}} +\def\scan:halignTBL#1{\def\:temp{#1}\ifx \:temp\empty\else + \expandafter \sc:halignTBL\fi{#1}} +\def\sc:halignTBL#1#2{\expandafter\def\csname + \string#1:T:BL\endcsname{#2}\scan:halignTBL} +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Utilities} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + + +The global is because the table starts within the first entry. + +\<html blocks for halign tables\><<< +\def\halign:TB#1<>#2|<par del|>{#1} +\def\halign:TD#1<>#2|<par del|>{#2} +>>> + + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{A Realization for halign} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<html halign\><<< +\:CheckOption{no-halign} \if:Option \else + |<halign tables from TeX|> +\fi +>>> + + + +This is the corner stone for deciding the case. + + +\HTable{ +[C10]Witin Picture Environment?\cr +Y&[C10]tex:align\cr +N&[10]within edef (:halign)?\cr + &Y&tex halign\cr + &N&[C10]remove `to dim' (:hlgn: + hl:gn)\cr + &&[C10]change catcode of {\tt \char`\#} (hlg:n)\cr + &&[C10]within a parameter or a def? (hal:gn)\cr + &&Y&[C10]tex:align + PRE\cr + &&N&[C10]open delimiter? (:Hlign)\cr + &&&{\tt\string\bgroup}&[C10]tex:align + PRE\cr + &&{\tt\char`\{}&[C10]go for hypertext table\cr +} + + + + + + +Check whether we are in \''\Picture' environment. This can happen +implicitly through environment \`'\[...\]' or through nesting in a +construct that explicitly activates the picture mode. + +\<halign tables from TeX\><<< +\def\h:halign{\ifx \EndPicture\:Undef + \let\to:dim|=\empty \expandafter\:halign + \else \expandafter\TeXhalign:cr\fi} +\:CheckOption{base} \if:Option \else + \def\:temp{\Protect\h:halign} + \HLet\halign|=\:temp +\fi +>>> + +\SubSection{Check for /edef Environment} + +ENSURE that for cases that reduce to \`'\TeXhalign:cr' the +macro get into edef. + + + + + + +\<halign tables from TeX\><<< +\let\r:lax|=\relax +\def\r:relax{\r:lax} +\let\rl:x|=\relax +\def\:halign{% + \let\rl:x|=\r:relax + \ifx \rl:x\r:relax \expandafter\nodim:hlgn: |%halign not in edef|% + \else \expandafter\TeXhalign:cr |%halign in edef|% + \fi +} +>>> + +\SubSection{Remove Dimension} + +Remove the dimension in case of \`'\halign to dim{...}' +or \`'\halign spread dim{...}' and store in \''\to:dim'. +The dimension can be nested within another macro + +\<halign tables from TeX\><<< +\def\nodim:hlgn:{\futurelet\:temp\hl:gn} +\def\hl:gn{\ifx \:temp\bgroup \let\:tempa|=\hlg:n + \else \def\:tempa##1{\append:def\to:dim{##1}\nodim:hlgn:}\fi + \:tempa} +>>> + + +Without recording, and using the dimension, +some pictures can get corrupted. For instance, +an overlap of index with the picture may +%% +\ifHtml[\HPage{occur}\Verbatim + \input tex4ht.sty \Preamble{html} + \EndPreamble + +\catcode`\@=11 + +\def\eqalignno#1{\displ@y \tabskip\centering + \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering + &\llap{$\@lign##$}\tabskip\z@skip\ crcr #1\ crcr}} + +\eqalignno{ +li&= 1\ cr +&> line 2& (7)} + +\ bye +\EndVerbatim\EndHPage{}]\fi + +\SubSection{Check for Embedded Def} + +Within macros and parameters, and definitions, the catcode of +characters in general, and \`'#' in particular, can't change. Hence, +in such cases \`'@2' is empty. + +\<halign tables from TeX\><<< + \catcode`\#|=13 \catcode`\~|=6 +\def\hlg:n{\begingroup \catcode`\#|=13 \let#|=\relax \hal:gn}% +|<process pattern of halign tbl|> +|<halign defs in catcode 13|> + \catcode`\#|=6 \catcode`\~|=13 +>>> + + +If catcodes don't change, we can't get +the catcode 13 for processing the parameters, and the empty flag +comes up. + +\<halign defs in catcode 13\><<< +\long\def\hal:gn~1{\p:lgn~1#|<par del|>% + \ifx \:temp\empty + |<embedded halign|>% + \else \def\:temp{\endgroup\:hlign{~1}}\fi \:temp} +\long\def\p:lgn~1#~2|<par del|>{\def\:temp{~2}} +>>> + +\SubSection{/halign Not Within Parameters} + +By now we know that we are not within a picture or embeded in other +macro or a parameter, and that we have \`'\halign\bgroup...\egroup' or +\`'\halign{...}'. We are going to scan \''\bgroup' or +\`'{...}'. + +\<halign tables from TeX\><<< +\long\def\:hlign#1{% + \def\:temp{#1}\def\:tempa{\bgroup}\ifx \:temp\:tempa + \endgroup |<halign into pre|>% + \expand:after{\HRestore\noalign \TeXhalign:cr\bgroup}% + \else |<halign into MkHalign|>% + \fi} +>>> + + + +\<halign into pre\><<< +\:warning{\noexpand\halign translated into linear text}% +>>> + + +In the above if statement, \''\expandafter' does not work for nested +halign in the true part. + +If we scan \''\bgroup' we are going after all to use the original +definition of \''\halign'. Otherwise, we are going for \''\HTable', +and for such a case we want the following environment. The variable +\`'#' controls where patterns should be included in entries and it is +used for spliting the patterns into the two parameters of +\`'\HTableScript'. + + + + + +\SubSection{Embedded /halign} + +The \''\halign' are transformed into pictures +or \''\TeXhalign:cr'. + +We now have a command of the form \`'\halign\bgroup...' or +a break up on a case of the form \`'\halign{...body...'. +The parameter \`'~1' is either \''\bgroup' or \`'...body...'. +If we are lucky, the body doesn't start with a \`'#' or \''\bgroup'. + +\<embedded halign\><<< +\expandafter\chs:halgn\string ~1|<par del|>% +\:tempb{% + \csname a:embedded-halign\endcsname + \ifmmode + \vbox{|<recall sharp|>$$\TeXhalign:cr \to:dim{~1}$$}% + \else \vbox{|<recall sharp|>\TeXhalign:cr \to:dim{~1}}\fi + \:nopartrue + \csname b:embedded-halign\endcsname + }% +\let\:temp|=\endgroup +\:tempb|<par del|>% +\:tempb\:temp{\endgroup + |<halign into pre|>% + \HRestore\noalign \TeXhalign:cr~1}\:tempa|<par del|>% +>>> + +\<halign tables from TeX\><<< +\NewConfigure{embedded-halign}{2} +\Configure{embedded-halign} + {\expand:after{\Picture+}\pic:hlng{ \a:@Picture{pic-halign}}} + {\EndPicture} +>>> + +The \`'\vbox{|<recall sharp|>\TeXhalign:cr \to:dim{@1}}' is needed to +keep the picture in one page. Without this we get from tex4ht.c +\ifHtml\HPage{complaints}\Verbatim +\documentclass{book} + +\input tex4ht.sty + \Preamble{html} +\begin{document} + +\EndPreamble + +\halign{\empty{#}&&{#}\cr phi&varphi\cr} +\end{document} + +\EndVerbatim \EndHPage{}\fi{} of mismatches \`'\specals{+}' (due to split +over pages?). + +An \''\halign{...}' can be in math mode \`'$$....$$', but +not within inline math mode. If it is there, there are quite +a few restctions (not clear of which kind) on what can appear in the math +code outside the \`'\halign'. Hence, we put everything into math mode +in a sepearte box just for an extra precaution. + +% \:warning{\noexpand\halign translated into a picture} + + +\''\TeXhalign:cr' reestablishes the meaning of \''\cr' and \''\crcr' +for picture-mode, but not for the second one. The later case +may cause problems. + + +Pictures might be called for also with \`'#' having catcode 13, +as is the case with \`'\halign{\empty{#}&&{#}\cr phi&varphi\cr}' +(but not with +\`'\halign{\empty #&& #\cr phi&varphi\cr}'). +In this case, the scanning in \`'\p:lgn@1#|<par del|>%' can't detect +the sharp characters that are embedded in braces. That is, a neccesary +condition for getting tabular representation is at least one \`'#' out +of braces, to ensure that such characters can get catcode 13. + + + +\<recall sharp\><<< +\Rc:sharp +>>> + +\<halign tables from TeX\><<< +\catcode`\#=13 +\def\Rc:sharp{\let#=\sv:sharp} +\catcode`\#=6 +\def\:temp{\let\sv:sharp=##}\:temp +>>> + +\SubSection{Utilities fo Embedded /halign} + +\<halign tables from TeX\><<< +\def\chs:halgn#1{\def\:temp{#1}% + \def\:tempa##1##2##3##4##5{\def\:tempa{##1}\def\:tempb{##2}% + \def\:tempc{##3}\def\:tempd{##4}\def\:tempe{##5}}% + \expandafter\:tempa\string\bgro + \ifx \:temp\:tempa \expand:after{\expandafter\try:b\string}% + \else \expandafter\brc:halign \fi} +\def\try:b{\try:ch\:tempb\try:g} +\def\try:g{\try:ch\:tempc\try:r} +\def\try:r{\try:ch\:tempd\try:o} +\def\try:o#1{\def\:temp{#1}% + \ifx \:temp\:tempe \def\:tempb{|<bgroup halign|>}% + \else \let\:temp|=\empty + \def\:tempb{|<braced halign|>}\fi + |<tempa = consume the rest of @1|>\:tempa} +\def\try:ch#1#2#3{\def\:temp{#3}% + \ifx \:temp#1 \expand:after{\expandafter#2\string}% + \else \expandafter\brc:halign \fi} +>>> + +\<halign tables from TeX\><<< +\def\brc:halign{% + \let\:temp|=\empty \def\:tempb{|<braced halign|>}% + |<tempa = consume the rest of @1|>\:tempa} +>>> + +\<tempa = consume the rest of @1\><<< +\long\def\:tempa##1|<par del|>{}% +>>> + +\<bgroup halign\><<< +\let\:tempb|=\def\:tempa +>>> + +\<braced halign\><<< +\let\:tempb|=\:tempa +>>> + + +\SubSection{/halign into {\tt <PRE>}} + + + + + We temporariliy get out from display mode, because we want the + \`'<PRE>' before \''\halign' and nothing is allowed before + \''\halign' in display mode. The enclosure within table is +to group the content for protection from embedding \''<CENTER>' commands and +the like. + + +\SubSection{/halign into /MkHalign} + + +We now have a command of the form \`'\halign{....}' or +a break up on a case of the form \`'\halign{....\egroup'. + + + +\<halign into MkHalign\><<< +\let\tabskip|=\tmp:dim \let\hrulefill|=\empty +\let\hidewidth|=\empty +\expand:after{\h:align#1\cr|<par del|>#1|<par del|>}% +>>> + + + +The pattern of \''\halign' can end with a \''\cr' or a \''\crcr'. We +first check whether \''\cr' present, and if so whether or not it is +preceded by a \''\crcr'. + +\<halign tables from TeX\><<< +\catcode`\#|=13 \catcode`\@|=6 +\long\def\h:align@1\cr@2|<par del|>{\def\:temp{@2}\ifx \:temp\empty + \expandafter\h:alignII \else \crcr:align@1\crcr|<par del|>\fi} +\def\crcr:align@1\crcr@2|<par del|>{\def\:temp{@2}\ifx \:temp\empty + \expandafter\expandafter\expandafter\h:alignI \else + \expandafter\expandafter\expandafter\h:alignII \fi} +\long\def\h:alignI@1\cr@2|<par del|>{% + \SaveMkHalignConfig |<halign configuration for halign|>% + \MkHalign#{@1}@2\EndMkHalign \RecallMkHalignConfig} +\def\h:alignII@1\crcr{\h:alignI@1\cr} +\catcode`\#|=6 \catcode`\@|=11 +>>> + + + + + +\<halign configuration for halign\><<< +\Configure{MkHalign}{\hlg:a}{\hlg:b} + \hlg:c\hlg:d{\hlg:e\RecallMkHalignConfig}\hlg:f +>>> + + + +\<html config util\><<< +\NewConfigure{halign}[6]{\c:def\hlg:a{#1}% + \c:def\hlg:b{#2}\c:def\hlg:c{#3}\c:def\hlg:d{#4}% + \c:def\hlg:e{#5}\c:def\hlg:f{#6}} +\NewConfigure{pic-halign}[1]{\def\pic:hlng{#1}} +>>> + + +\<math config util\><<< +\def\:halign:{<>} +>>> + + + + + +We must put in at least the \`'<>'. + + +% [[gif\r:brk] + +%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{noalign} +%%%%%%%%%%%%%%%%%%%%%%%%% + +In TeX4ht \`'\everycr\noalign' causes a loop because the definition of +\''\halign' includes \''\cr'. We declare a loop when 100 cycles are +encountered. Another possible problem is due to \''\hline' +which contains \''noalign' at its start.\ifHtml[\HPage{more}\Verbatim +\begin{tabular}{||l|c|c|c||} \hline +\multicolumn{4}{|c|}{\LaTeX\ size changing commands}\\ \hline +Style option & 10pt (default) & \tt 11pt & \tt 12pt\\ \hline +\end{tabular} +\EndVerbatim\EndHPage{}]\fi + +If we want to go for optional \''\noalign' with response to a parameter +in \''\Preamble', we need to take care of places that needs it html interpretation +(in tables?). + + + +\<halign tables from TeX\><<< +|<noalign|> +>>> + + + + +\<noalign\><<< +\HAssign\noalign:N|=0 +\def\:tempc#1{|<cycle protection fo noalign|>% + \vtop{\IgnorePar\a:noalign\vtop{\IgnorePar#1}\b:noalign}\cr + \global\tmp:toks|=\everycr \global\everycr{}\cr + \o:noalign:{\global\everycr|=\tmp:toks \gHAssign\noalign:N|=0 }% + } +\HLet\noalign|=\:tempc +|<another alternative for noalign|> +>>> + +We probbaly can remove the cycle protection. + +The internal \''\top' is to ensure vertical mode for material which +assumes it. In the extreem, that also prevents infinite loops. + +% \h:noalign + +\<shared config\><<< +\NewConfigure{noalign-}[2]{\c:def\a:noalign{#1}\c:def\b:noalign{#1}} +>>> + +Any reason left for keeping both cases? + +\<shared config\><<< +\:CheckOption{no-halign} \if:Option \else + \NewConfigure{noalign}{2} +\fi +>>> + + + + + + + + + + + +The \''\Protect' is needed, for instance, in \''\endalignat' +of amstex.tex during a pre-edef stage. + +The looping can happen in +\''\displaylines', \''\eqalignno', and \''\leqalignno' +due to the first command below (\''\@align'?.). + + +\<cycle protection fo noalign\><<< +\gHAdvance\noalign:N by 1 + \ifnum \noalign:N>100 + \global\let\noalign|=\o:noalign: + \:warning{TeX4ht can't handle + \string\everycr{...\string\noalign...}}% + \fi +>>> + + +Removed \`'\let\dotfill|=\empty'. Did I have any reason +to put it there in first place? + + + +\Chapter{Verbatim Enviroments} + + +\<local env\><<< +|<blocs for local env|> +\ifHtml |<html local env|> +\fi +|<verbatim|> +>>> + + + +\Section{Verbatim Text} + + + + +NOTE: VERBATIM WAS THERE for javascript and the like???? + + + + + + + + + + +\SubSection{Between Paragraphs} + +For the option \`'\Verbatim-', it should be noted the requested +special character should not come from the word \`'EndVerbatim'. +Letters within the environment carry categoty code 11, space, tab and +end-of-line characters carry category code 13, and the other +characters have category code 12. {CHECK TABS} + +\<verbatim\><<< +\def\V:rbatim{\begingroup \begin:Verb \Verb:env } +\def\:EndVerbatim{\end:Verb \endgroup } +>>> + +\<the /EndVerbatim delimiter\><<< +{ +\xdef\Verb:atim#1\EndVerbatim{\noexpand\vrb:tt + \leavevmode#1\noexpand\:EndVerbatim} +\catcode`\/|=0 /catcode`/\|=12 +/xdef/Ver:batim#1\EndVerbatim{/noexpand/vrb:tt + /leavevmode#1/noexpand/:EndVerbatim} +} +>>> + +Without the \''/leavevmode' the header is lost when +\''\Verbatim' is followed by empty line. +\ifHtml[\HPage{test}\Verbatim +\Verbatim + +x + +y + +\ EndVerbatim + + +\Verbatim +x + +y + +\ EndVerbatim + +\EndVerbatim\EndHPage{}]\fi + + + +\Verbatim + +> > 5. Also, why did you go in the first place to `alltt' and +> > not `verbatim'? +> +> Verbatim is an ugly beast. It can't be placed in the argument of +> another environment - e.g., I can't create a new environment like this: +> +> \newenvironment{\test} +> {\fontsize{11}{12}\selectfont\begin{verbatim}} +> {\end{verbatim}} + +\EndVerbatim + + + + + + + + +\<html config util\><<< +\NewConfigure{tt}[1]{\let\vrb:tt|=#1} +\let\vrb:tt|=\tt +>>> + +\<verbatim\><<< +\def\Verb:env{\no:catcodes0{64}{12}\no:catcodes{65}{90}{11}% + \no:catcodes{91}{96}{12}\no:catcodes{97}{122}{11}% + \no:catcodes{123}{255}{12}% + \catcode`\^^M|=13 \catcode`\ |=13 \catcode`\^^I|=13 + \:Verbatim \::Verbatim }% +\def\::Verbatim{\futurelet\:temp\V:erbatim} +\def\V:erbatim{% + \ifx -\:temp \expandafter\Ve:rbatim + \else \let\start:verb|=\Ver:batim \expandafter\Ver:sp \fi } +\def\Ver:sp{% + \ifx \ver:sp\:temp \expandafter\Ver:assg + \else \expandafter\Ver:ln \fi } +\def\Ver:ln{% + \ifx \ver:ln\:temp \expandafter\Ver:assg + \else \expandafter\start:verb \fi } +\def\Ver:assg{\afterassignment\start:verb\let\:temp|=} +|<optional control char in /Verbatim|> +|<space and eoln chars in /Verbatim|> +|<the /EndVerbatim delimiter|> +>>> + + +\<optional control char in /Verbatim\><<< +{ +\catcode`\/|=0 +/catcode`/\|=12 +/gdef/Ve:rbatim#1#2{/catcode`#2|=0 + /ifx #2\/let/start:verb|=/Verb:atim + /else /let/start:verb|=/Ver:batim /fi + /futurelet/:temp/Ver:sp} +} +>>> + + +\<space and eoln chars in /Verbatim\><<< +{ +\catcode`\^^I|=13 \catcode`\/|=0 \catcode`\\|=12 +/catcode`/.|=10 /catcode`/^^M|=13 /catcode`/ |=13% +/gdef/:Verbatim{% +.../def^^M{/ht:everypar{/Verb:eoln}/Verb:boln/par/leavevmode}% +.../def {/Verb:sp}% +.../let/ver:sp|= % +.../let/ver:ln|=^^M% +.../def^^I{/leavevmode }}} +>>> + +The following establishes a configurartion according to +what should appear at the start, end, and each end-of-ln. + + + + +% \def\Verb:eoln{\hfil\break\null} + +\<verbatim\><<< +\NewConfigure{VerbatimEnv}[2]{\def\begin:Verb{#1}\def\end:Verb{#2}} +\Configure{VerbatimEnv} + {\par \edef\leftsk:p{\hskip\Verb:Left}% + \leftskip|=\z@ \parindent|=\z@ \ht:everypar{\verb:config}} + {\aft:Verb\par} +\def\verb:config{\bef:Verb\csname leftsk:p\endcsname + \def\verb:config{\Verb:boln \def\Verb:eoln{\leavevmode\par}\leftsk:p}} +>>> + +% \def\Verb:eoln{\par \everypar{\verb:config}% +% \def\Verb:eoln{\par}} +% + + +The following uses the above vehicle to establish a configuration +in accordance to what should appear at the start, end, and +before each of the non-leading lines. + + + + + +\<html config util\><<< +\NewConfigure{HVerbatim}[4]{\c:def\bef:Verb{#1\Verb:eoln}% + \c:def\aft:Verb{\ht:everypar{}#2}% + \c:def\Verb:eoln{#3}\c:def\Verb:boln{#4}} +\NewConfigure{HVerbatim+}[2]{\d:def\Verb:Left{#1}% + \def\Verb:sp{#2}} +>>> + + + + + + + +The above has left margin of \''\Verb:Left' and typically has +inappropriate space above and below the code. The following takes the +left margin of the html code. + +\Verbatim + \Configure{HVerbatim} + {\HtmlPar\HCode{<NOBR><CODE>}} + {\HChar{160}\HCode{</CODE></NOBR>}} + {\HChar{160}\HCode{</CODE></NOBR><BR><NOBR><CODE>}} +\EndVerbatim + + + +% +%\Configure{HVerbatim} +% {\IgnoreIndent \HObey \par \leavevmode} +% {\EndHObey\IgnoreIndent \par} +% {\hfil\break\null \HCode{\html:invisible}\nobreak \hskip +% \ifdim \leftskip>0pt \leftskip \else 2em \fi} + + +The \`'\leavevmode' is needed for the case that the commands start +paragrphs, to ensure that \`'\everypar' operations would be performed +outside the groups of the commands. + + + + + + + + + +\Section{JavaScript} +Note that the first parameter of \''\ScriptCommand' must be in +braces, without surrounding spaces. + +\<scripting commands\><<< +\def\ScriptCommand{\begingroup \catcode`\\|=12 + \:DefScript} +\def\:DefScript#1{\endgroup \Def:Script#1|<par del|>} +\def\Def:Script#1#2|<par del|>{% + \expandafter\let\csname :#2:\endcsname|=\empty + \edef\:temp{\long\def\expandafter\noexpand\csname a:#2\endcsname + ####1\expandafter\noexpand\csname End#2\endcsname + {####1\noexpand\:EndVerbatim}}\:temp + \long\expandafter\def\csname + b:#2\endcsname##1#1End#2{##1\:EndVerbatim}% + \edef\:temp{\noexpand\DefScript: + \expandafter\noexpand\csname #2\endcsname + {\expandafter\noexpand\csname a:#2\endcsname}% + {\expandafter\noexpand\csname b:#2\endcsname}}\:temp +} +>>> + +The \''\long' above is for cases that the new command is embeded +in other commands as is the case, for instance, in \''\CssFile'. + + + +\`'\begin{keep}-\ +AAAAAAAAAAAAAAAAA +BBBBB +\end{keep}' +or +\`'\begin{keep} +AAAAAAAAAAAAAAAAA +BBBBB +\end{keep}' + + + +\<scripting commands\><<< +\def\DefScript:#1#2#3#4#5{\def#1{\call:script{#2}{#3}{#4}{#5}}} +\def\call:script#1#2#3#4{\begingroup \vrb:tt + \leftskip|=\z@ \parindent|=\z@ + \Configure{HVerbatim}{\empty}{\empty}% + {\special{t4ht=}\empty}{\empty}% + \Configure{HVerbatim+}{\z@}{\hbox{ }}% + #3\ht:special{t4ht@@}% + \let\Verb:atim|=#1\let\Ver:batim|=#2% + \def\:EndVerbatim{\ht:special{t4ht@@}% + #4\endgroup\ignorespaces}\Verb:env} +>>> + +% \let\html:invisible|=\empty + + + + +A \`'\Configure{HVerbatim}{}{}{}{}' above will be problematic for +the \`'hooks' option. The \`'\special{t4ht=}'is to ensure +pseudo code at empty lines. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Cascade Style Sheets} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\<scripting commands\><<< +\def\a:rootfont:{-} +\:CheckOption{fonts+} \if:Option \def\a:rootfont:{+} +\else + \Log:Note{for marking of the base font, + use the command line option `fonts+'}% +\fi +>>> + +The above option requests css font information for the root font of +the file. + + + + + + + + + + + + + + + +\''\xml:empty' is for inserting the \''/' at end of tags by demand. + +The \''\edef\Preamble{\Preamble}' is needed for context where the +command line arguments come indirectly through an \''\env' macro. + +\<utilities\><<< +\ifx \xml:empty\:UnDef + \edef\Preamble{\Preamble} + \:CheckOption{xhtml} + \if:Option \else \:CheckOption{xml}\fi + \if:Option + \def\xml:empty{ /} + \long\def\:xhtml#1{#1} + \else + \Log:Note{for XML code, use the command line option + `xml' or `xhtml'}% + + \let\:xhtml|=\:gobble + \let\xml:empty|=\empty +\fi \fi +>>> + + + + + +Default font (the extra code is neded in order to activate it +within the dvi file before a change in font, e.g., for a title): + +\<start html file\><<< +\ht:special{t4ht>\jobname.tmp}{\everyhbox{}\hbox + {x\ht:special{t4ht;\a:rootfont:}x}}% +\ht:special{t4ht<\jobname.tmp}% +>>> + + + + + + + + + + + + + + + + + + +\<early Configure\><<< +\NewConfigure{Css}[1]{\def\aa:Css{#1}} +>>> + + + +\<html utilitiesNO\><<< +\tmp:cnt|=\time \divide\tmp:cnt |by 60 +\edef\:temp{\the\tmp:cnt} +\multiply\tmp:cnt |by -60 \advance\tmp:cnt |by \time +\edef\:today{\the\year-\ifnum \month<10 0\fi + \the\month-\ifnum \day<10 0\fi\the\day + \space\ifnum \:temp<10 0\fi \:temp + :\ifnum \tmp:cnt<10 0\fi\the\tmp:cnt :00} +>>> + + + +\Chapter{Ditto: Positioned Elements and Gifs} + +\<gif\><<< +\ifHtml |<html gif|> +\fi +>>> + + +\Section{Positioned Elements} + +\<shared config\><<< +\NewConfigure{Canvas}[3]{} +>>> + + + + +\Verbatim +% * can be replaced by any distinguished character +% \special{ +% * before-all +% * after-all %right %left %height %depth +% * before-char %x %y +% * after-char +% * line %x %y %thickness %length +% * x-coefficients %A(x) + %B +% * y-coefficients %C(y) + %D +% } +\EndVerbatim + +\<html gif\><<< +\def\Canvas{\ht:special{t4ht"}} +\let\EndCanvas|=\Canvas +>>> + + + + + + + + + + + +The attached source tries three renderings for `A<sub>x</sub>'. My +understanding of the positioning mechanism is that, in all three cases, +the reference point for `x' should be 0.7ex under the right leg of A. +Moreover, the measurement 0.7ex should be with respect to the +dimension of the font of A. + +\Verbatim + + /\ + /--\ + / \........... + \/ } 0.7ex within font of A + ./\.......} + + + A<SPAN +STYLE="position:relative"><SPAN +STYLE="position:absolute; top:0.7ex"><SPAN +STYLE="font-size: 70% ;">x</SPAN></SPAN></SPAN> +\EndVerbatim + + + + + + + + + + +\Section{/Picture Comamnd} + + + + + +\<html gif\><<< +\def\:img{% + \ifx *\:temp \let\:temp|=\i:mgif \let\:next|=\:GIf + \else \ifx +\:temp \let\:temp|=\i:mgif \let\:next|=\:Gif + \else \ifx [\:temp \let\:temp|=\im:g + \else \def\:temp{\im:g[{\csname + a:Picture-alt\endcsname}]}% + \fi \fi \fi \:temp} +>>> + +\<html config util\><<< +\NewConfigure{Picture-alt}{1} +\Configure{Picture-alt}{} +>>> + + + + +\''\Configure{Picture-alt}' is for \''\Picture{...}' commands; it +provides the default content. The other two commands tell whether the +bit maps and given alyternate values, respictively, are to be used. +The are used, iff the argument has non empty value (the argument +itself is not used). + + + + +Without the \''\leavevmode' above, the start of paragraph can +\HPage{enter} +\Verbatim +\Picture{OSU.gif xx yy} + +\Picture{OSU.gif xx yy } + +\Picture{OSU.gif} + + +\Picture{OSU.gif } + + + +\Picture[xx]{OSU.gif xx yy} + +\Picture[xx]{OSU.gif xx yy } + +\Picture[xx]{OSU.gif} + +\Picture[xx]{OSU.gif } +\EndVerbatim +\EndHPage{} +into the \''<IMG ..>' tag. + + + + +Empty file name is a request for a default name of the form +\`'\jobname%\romannumeral +\P:ctureCount'. + + + +\<gif\><<< +\def\P:ct{\leavevmode \futurelet\:temp\:img} +\let\Picture|=\P:ct +\def\yes:pic{\PictureOn} +\def\no:pic{\PictureOff} +>>> + + + + +\Section{Call to Specials of Gif} + + +\<gif\><<< +\def\i:mgif#1{\futurelet\:temp\:gif} + +\def\:gif{% + \ifx \:temp[\expandafter\:GifText + \else \expandafter\:next \fi } +>>> + +The following macro is for imported pictures \`'\Picture{....}' and +\`'\Picture[...]{...}'. + +\<html gif\><<< +\def\xim:g[#1]#2{{\cond:pic{% + \def\gif:nm{\edef\gif:nm}\gif:name{#2}% + \expandafter\get:ext\gif:nm.|<par del|>% + \edef\PictureFile{\gif:nm\ifx\:temp\empty \PictExt\fi}% + \Needs-\PictureFile \ht:special{t4ht@-}% + \a:IMG\ht:special{t4ht=\PictureFile}\b:IMG + \a:PictureAlt{#1}\b:PictureAlt \d:IMG + \a:PictureAttr{\at:IMG}\e:IMG}}\After:Picture} +\def\noim:g[#1]#2{} +\let\im:g|=\xim:g +>>> + +\<html config util\><<< +\NewConfigure{PictureAlt}{2} +\NewConfigure{PictureAttr}[1]{\def\a:PictureAttr##1{#1}} +\Configure{PictureAlt} {\NoFonts} {\EndNoFonts} +\Configure{PictureAttr} {\HCode{\Hnewline #1}} +>>> + + + +The following macro is for labeled bit pictures \`'\Picture+{....}' +and \`'\Picture*{...}'. + + + +\<html gif\><<< +\def\strt:gf#1#2{#2% + \csname a:PictureAlt*+\endcsname + \let\sv:sp\sp + \let\sv:sb\sb + \ifx \s:p\:UnDef \else \let\sp\s:p \fi + \ifx \s:b\:UnDef \else \let\sb\s:b \fi + \if #1!\ht:special{t4ht!\:AltPicture:}% + \global\let\:AltPicture:|=\empty \fi |% send to char map|% + \ht:special{t4ht||}% + \ht:special{t4ht++\PictureFile}% + \iprt:special +} +\def\nd:gf#1#2{% + \let\ht:special|=\tex:special + \ht:special{t4ht+}% + \if #1!\ht:special{t4ht!}\fi |%stop sending to char map|% + \let\sp\sv:sp + \let\sb\sv:sb + \ht:special{t4ht||}% + \csname b:PictureAlt*+\endcsname + \ifx #2\relax \else \csname a:PictureAttr*+\endcsname{#2}\e:IMG\fi +} +\def\img:alt{\ht:special{t4ht@-}% + \a:IMG\ht:special{t4ht=\PictureFile}\b:IMG} +>>> + + + + + + + + +\<shared config\><<< +\NewConfigure{PictureAlt*+}{2} +\NewConfigure{PictureAttr*+}[1]{% + \expandafter\def\csname a:PictureAttr*+\endcsname##1{#1}% +} +\Configure{PictureAttr*+}{\ht:special{t4ht=#1}} +>>> + + + + + + +\Verbatim +flag ){ `<make a special for dvi driver`> } + else switch( get_char() ){ + case '+': { `<out gif filename`> + case '@': { `<write to lg file`> break; } + + case '+': { while( special_n-- > 0 ) (void) get_char(); break; } + case '=': Contribution of text (\''\HCode'). + case '<': + case '>': { `<redirect html output`> break; } + case '!': { `<handle char map mode`> break; } + case '|': { gif_ch = !gif_ch; break; } + + case "..." : Positioned dvi code + +\item \`'.extension for root file' + + +\item \`'@@' for char mode (what is this????) e.g., javascript +\item \`'@+' for note to lg file (where is this???) +\item \`'@-' for removing left margins from char maps + + +\HCode{<HR>} + +\item \`'@%P' --- On-off modes for traceing of POP, PUSH in DVI +\item \`'@%D' --- On-off modes for traceing CHAR...RAHC in DVI +\item \`'@%H' --- On-off modes for traceing h spaces +\item \`'@%V' --- On-off modes for traceing v spaces +\item \`'@%R' --- On-off modes for traceing x rulers + + +In all the above, uppercase for plus, lowercase for minus 1 + +\item \`'@%%x...pre...x...post...' --- Group tracing. + Default \`'<!-- DVI ' and \`'\n-->', where \''\n' represents + new line char (i.e., \`'\Hnewline'). + \`'x' can be any character. if it is not there, + the postfix is assumed to be empty. +\item \`'@%...' --- Not used, if not of the above format + +\HCode{<HR>} + +\item \`':+...' increment by 1( define, if not defined) +\item \`':-...' decrement by 1 +\item \`':>...' push current value +\item \`':<...' pop current value +\item \`':!...' display current value +\item \`':|...' display top value + +\item \`';-' --- yes default font +\item \`';+' --- no default font +\item \`';%' --- insert font size +\item \`';=' --- insert css name of ch + + +\item \`';i' --- i=1 (before ch-name),2 (between ch-name and ch),3 + (after ch), 4 (before img-src), 5 (between img-src and alt), 6 + (between alt and name), 7(after name). +\item \`';8' --- PauseFontStyle +\item \`';9' --- ContFontStyle + +\item \`'~' --- on/off for transport data to group boundaries +\item \`'~<....' --- transport back +\item \`'~>....' --- transport forward + +\EndVerbatim + + + + + + +\Section{The Environment of Gif} + + + +\<html config util\><<< +\NewConfigure{IMG}{5} +>>> + + +The third and forth parameters are separated by user +cotributed attr-list. + + + + +\<html config util\><<< +\NewConfigure{Picture}[1]{\def\PictExt{#1}} +\Configure{Picture}{.png} +>>> + +\<picture off\><<< +\let\im:g|=\noim:g +>>> + +\<picture on\><<< +\let\im:g|=\xim:g +>>> + + + +GIF: +\List{*} + +\item + Lossless compression +\item Supports 256 colors. Good for pictures that use only a few colors +\item Relies on an algorithm copyrighted by Unisys. However, the patent +expired (20 June 2003 in US; a year later in Canada, Germany, +France, Italy, Japan, UK). +\item Supports animation +\item +The name stands for Graphics Interchange Format +\item Doesn't support unicode +\EndList + + +PNG: + +\List{*} +\item Losless compression superior to GIF +\item Recommendation status at W3C: + \Link[http://www.w3.org/Graphics/PNG/]{}{}{\tt + http://www.w3.org/Graphics/PNG/}\EndLink{}. +\item Developed as a patent-free alternative GIF +\item Doesn't support animation +\item The name stands for Portable Network Graphics +\item Supports unicode +\EndList + + + +JPG: +\List{*} +\item +Uses lossy compression that discards information the human eye cannot detect. +\item +Supports 16 million colors +\item +Good for photographs and complex graphics +\item +Noticeable reduction in quality for line drawings +\item Named after the committee Joint Photographic Experts Group +that defined the standard. +\EndList + + +\SubSection{With Char Map} + +Independent block: no brackets. + +Resolution can be an integer number or a pair of integer numbers +separated by a comma. The first for x-resolution, the second for +y-resolution. Then we can have a map for boundary characters made +up of pairs: character to be replaced followed by replcment. + + +For \`'\Picture+{}': (no box, no pre) + +\<html gif\><<< +\def\:Gif#1{\cond:pic{% + \gif:name{#1}\csname a:Picture+\endcsname + \strt:gf!\img:alt + \def\EndPicture{\nd:gf!{\c:IMG\Pic:Img}% + \let\EndPicture|=\:UnDef \csname b:Picture+\endcsname + \After:Picture}}} +>>> + +\<html config util\><<< +\NewConfigure{Picture+}{2} +>>> + + + + + + + + +For \`'\Picture*{}': Vertical box + pre. Might be a problem because +vertical boxes assume the width of the page, and a few of them in a +line may cause a picture to go out of the page boundaies---a problem +for convert. If the content of the box is just a box, or boxes, as is +the case in DraTeX, they the ebeded boxes induce the width. +The \`'\hfill\break' may handle some of these cases. + +\`'\Picture*{}.....\EndPicture' will go to \''\:GIf'. +\`'\Picture*[..]{}.....\EndPicture' will go to \''\:GifText'. + + +\<html gif\><<< +\def\:GIf#1{\cond:pic{\ifvmode\vfill\break\else + \ht:special{t4ht@[}\hfill\break.\ht:special{t4ht@]}\fi + \gif:name{#1}\csname a:Picture*\endcsname + \strt:gf!\img:alt + \ifmmode \expandafter\vcenter\else \expandafter\vtop\fi + \bgroup \let\EndPicture|=\:EndGIf \NoHtmlEnv }} +\def\:EndGIf{% + \egroup \nd:gf!{\c:IMG \Pic:Img}\csname b:Picture*\endcsname + \After:Picture} +>>> + +\<html config util\><<< +\NewConfigure{Picture*}{2} +>>> + + +\<html gif\><<< +\def\After:Picture{\After:EndPicture + \global\let\After:EndPicture|=\empty} +\let\After:EndPicture|=\empty +\def\AfterPicture#1{\append:def\After:EndPicture{#1}% + \global\let\After:EndPicture|=\After:EndPicture} +>>> + + +\''<PRE>'s force line breaks also in visual browsers, and we don't +want these breaks within formulas. + +The \`'\let\:Gif|=\:gobble' is no good in the foolowing because it +does not take care of the presence of \`'\EndPicture'. It is also not +needed because \''\:Gif' has \''\cond:pic' to take care of it. + + +\<html gif\><<< +\def\iprt:special{% + \def\ht:special##1{\tex:special{t4ht+##1}}} +\let\tex:special|=\ht:special +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{With Given Text and Inline Text} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + +\`'\Picture*{}.....\EndPicture' will go to \''\:GIf'. +\`'\Picture+{}.....\EndPicture' will go to \''\:Gif'. +\`'\Picture*[..]{}.....\EndPicture' will go to \''\:GifText' with \`'\:next=\:GIf'. +\`'\Picture+[..]{}.....\EndPicture' will go to \''\:GifText' with \`'\:next=\:Gif'. + +Given text: \`'[non empty]'. Inline text: \`'[]'. + + + +The following macro is for imported pictures \`'\Picture*+{....}' and +\`'\Picture*+[...]{...}'. + + +\<html gif\><<< +\def\x:GifText[#1]#2{\cond:pic{% + \ifx \:next\:GIf + \def\gif:box{\vtop\bgroup \NoHtmlEnv \let\gif:box|=\egroup}% + \else \let\gif:box|=\empty \fi + \gif:name{#2}% + \img:alt \def\:temp{#1}% + \ifx \:temp\empty \else + \csname a:PictureAlt*+[]\endcsname + {#1}\csname b:PictureAlt*+[]\endcsname\fi + \ht:special{t4ht>\jobname.tmp}% |%dump|% + \strt:gf-\empty \gif:box + \def\EndPicture{% + \gif:box \nd:gf-\relax \ht:special{t4ht<\jobname.tmp}% + \csname a:PictureAttr*+[]\endcsname{\c:IMG\Pic:Img}\e:IMG + \After:Picture}% +}} +\let\:GifText|=\x:GifText +\def\no:GifText[#1]{\:gobble} +>>> + + + +\<shared config\><<< +\NewConfigure{PictureAlt*+[]}{2} +\NewConfigure{PictureAttr*+[]}[1]{% + \expandafter\def\csname a:PictureAttr*+[]\endcsname##1{#1}% +} +\Configure{PictureAlt*+[]} {\NoFonts} {\EndNoFonts} +\Configure{PictureAttr*+[]} {\ht:special{t4ht=#1}} +>>> + + + +\<html gif\><<< +\ifx \:DraCatCodes\:UnDef + |<set basic Pic:Img|> +\fi +>>> + +\<set basic Pic:Img\><<< +\def\Pic:Img{\at:IMG} +>>> + + + +The \`'\everypar{t4ht="#1"}' can't be +\List{disc} +\item \`'{\everypar{}\HCode{#1}} --- the \''\leavevmode' can be +ruinful (e.g., in \`'$$ \underbrace{1,...,1} + s_{aaaaaaa}\underbrace{1,...,1} +$$') + +\item \`'{\IgnorePar\HCode{#1}} --- Besides of the above, it +also ruins the paragraph break-up info (e.g., with \''\L' having a definition \`'\def\L{\Picture+[]...\EndPicture'). +\EndList + + + +CHECK ISSUE OF ATTRIBUTES FOR IMAGES + +\<picture off\><<< +\let\:GifText|=\no:GifText +>>> + +\<picture on\><<< +\let\:GifText|=\x:GifText +>>> + + +\SubSection{File Name} + +We have a command of the form \''\gif:name{file-name attributes}' + + + +\<html gif\><<< +\def\gif:name#1{\edef\at:IMG{\noexpand\get:gfnm#1 |<par del|>}\at:IMG} +>>> + +The material within the if is for eliminating the extra space +introduced before \`'|<par del|>'. + +\<html gif\><<< +\def\get:gfnm#1 #2|<par del|>{\def\at:IMG{#2}% + \ifx \at:IMG\empty\else + \expandafter\aT:IMG\at:IMG|<par del|>% + \fi + \gif:nm{#1}} +\def\aT:IMG#1 |<par del|>{\def\at:IMG{#1}} +>>> + +It used to be as follows, which caused extra space at end of arguments. + +\Verbatim +\def\gif:name#1{\edef\at:IMG{\noexpand\get:gfnm#1 |<par del|>}\at:IMG} +\def\get:gfnm#1 #2|<par del|>{\def\at:IMG{#2}\gif:nm{#1}} + +\EndVerbatim + + + + +\<html gif\><<< +\def\NextPictureFile{\def\Next:PictureFile} +\NextPictureFile{} +\def\gif:nm#1{% + \gHAdvance\P:ctureCount |by 1 + \xdef\PictureFile{#1}\ifx \PictureFile\empty + \xdef\PictureFile{\Next:PictureFile}\fi + \global\let\Next:PictureFile|=\empty + \ifx \PictureFile\empty + \bgroup \Advance:\P:ctureCount |by -\Pic:Cnt + \xdef\PictureFile{\j:bname|<tail for file name|>\P:ctureCount + x\Pic:Dm\PictExt}% + \egroup + \else + \expandafter\get:ext\PictureFile.|<par del|>% + \ifx\:temp\empty \xdef\PictureFile{\PictureFile\PictExt}\fi + \fi + \immediate\write-1{l. \the\inputlineno\space Writing + \jobname.idv[\P:ctureCount] (\PictureFile)}% + }% +>>> + +\<html gif\><<< +\def\SavePicture#1{\def\:tempa{#1}\SaveP:cture} +\Odef\SaveP:cture[#1]{% + \edef\:tempb{\noexpand\Odef\expandafter\noexpand\:tempa[####1]{{% + \let\noexpand\Log:Needs|=\noexpand\:gobble + \noexpand\Picture[\HCode{#1}]{\PictureFile\space####1}}}}% + \:tempb \expand:after{\global\expandafter\let\:tempa|=}\:tempa } +>>> + +Without the \''\HCode{#1}' above things like \''-->' expand. Why +the \''\HCode' is not a problem? + + +\<html gif\><<< +\def\NewPictureDomain#1{% + \global\let\Pic:Cnt|=\P:ctureCount + \def\Pic:Dm{#1} \ifx \Pic:Dm\empty + \xdef\Pic:Dm{\P:c:Dm}% + \gHAdvance\P:c:Dm |by 1 + \fi } +\HAssign\P:c:Dm |= 0 +\let\Pic:Dm|=\empty +\HAssign\Pic:Cnt|=1 +>>> + + +\SubSection{Counter} + +\<html gif\><<< +\HAssign\P:ctureCount|=0 +\let\:AltPicture:|=\empty |%100 = default size|% +>>> + +\SubSection{Non-Html} + + + +Don't do \''\let\EndPicture=\relax'. Within \''\PictureOff' it is treated as +undefined. + + + +\Section{Utilities for Gif} + + +In \`'\pic:cond\a\b' the \`'\b' refers to the command to be used when +already within a gif-picture. The \`'\a' is to be used if a +gif-picture is to be opened. + + +\<html gif\><<< +\def\pic:gobble{\ifx \EndPicture\:UnDef \else \expandafter\:gobble\fi} +\def\pic:gobbleII{\ifx \EndPicture\:UnDef \else \expandafter\:gobbleII\fi} +\def\nopic:gobble#1{\ifx \EndPicture\:UnDef \else #1\fi} +\def\pic:cond#1#2{% + \ifx\EndPicture\:UnDef \def\end:condpic{\EndPicture}\expandafter#1% + \else \let\end:condpic|=\empty \expandafter#2% + \fi } +\def\cond:pic#1{% + \ifx \EndPicture\:UnDef #1\else + \let\E:pic|=\EndPicture \PushMacro\E:pic + \def\EndPicture{\PopMacro\E:pic \let\EndPicture|=\E:pic}\fi} +>>> + + + +\SubSection{Disabled Math} + +Global on and off for some reason fails sometimes. + + +\<html gif\><<< +\def\PictureOff{% + \expandafter\let\csname Pic:\Pic:On\endcsname|=\EndPicture + \ifx \EndPicture\:UnDef \let\EndPicture|=\empty \fi + |<picture off|>% + \Advance:\Pic:On |by 1 } +\def\PictureOn{% + \ifnum \Pic:On>0 + \Advance:\Pic:On |by -1 + \ifnum \Pic:On=0 |<picture on|>% + \fi + \expand:after{\let\EndPicture|=}\csname Pic:\Pic:On\endcsname + \ifx \EndPicture\relax \let\EndPicture|=\:UnDef\fi + \else + \:warning{\string\PictureOn\space without \string\PictureOff}% + \fi } +\HAssign\Pic:On |= 0 +>>> + + + + + + + + + + + + + + + +Don't go directly for \`'\PushMacro\EndPicture', just in case the +user wants to use this stack. + +Smash is most often used to produce comples patterns, so +let su go and make them pictures. + +\<html gif\><<< +\def\:temp#1{\ifx \EndPicture\:Undef + \relax\ifmmode\hbox{$#1$}\else \hbox{#1}\fi + \else \o:smash:{#1}\fi} +\HLet\smash|=\:temp +>>> + + + +The definition \''\def\HCode#1{\leavevmode\special{t4ht=#1}}' can be +problematic for grouping in pictures because of the \''\leavevmode' +that in immediate environment produces some side code. + + +It looks like the following problems, or most +of them, have been resolved with a fix to \''\noalign'. + + +The \`'\openup10pt' causes too much space in +% +\ifHtml[\HPage{some pictures}\Verbatim +\openup10pt \halign{ + $2^{#}$\quad&\( + \overbrace{2\cdots 2}^{#\ + \rm times}\)\quad& #\ cr + 3&3&8\ cr } +\EndVerbatim\EndHPage{}]\fi +% +and too much memory in +% +\ifHtml[\HPage{others}\Verbatim +% \input tex4ht.sty \Preamble{html} +% \EndPreamble +% +%\catcode`\@=11 +% +%\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th +% \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil +% \ crcr#1\ crcr}}\,} +% +%\def\eqalignno#1{\displ@y \tabskip\centering +% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip +% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering +% &\llap{$\@lign##$}\tabskip\z@skip\ crcr #1\ crcr}} +% +%\def\displ@y{\global\dt@ptrue\openup\jot\m@th +% \everycr{% +% \noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000\p@ +% \vskip-\lineskiplimit \vskip\normallineskiplimit \fi +% \else \penalty\interdisplaylinepenalty \fi}}} +% +% +%\def\displ@y{\global\dt@ptrue +% \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000\p@ +% \vskip-\lineskiplimit \vskip\normallineskiplimit \fi +% \else \penalty\interdisplaylinepenalty \fi}}} +% +%\def\openup{\afterassignment\@penup\dimen@=} +%\def\@penup{\advance\lineskip\dimen@ +% \advance\baselineskip\dimen@ +% \advance\lineskiplimit\dimen@} +% +%\openup10pt \halign{ +% $2^{#}$\quad&\( +% \overbrace{2\cdots 2}^{#\ +% \rm times}\)\quad& #\ cr +% 3&3&8\ cr } +% +%\eqalignno{ +%li&= 1\ cr +%&> line 2& (7)} +% +%\bye +\EndVerbatim\EndHPage{}]\fi +% +Putting a \''\offinterlineskip' solves sometimes the problem +in some pictures of getting too much vertical +spcace, but may create +\ifHtml[\HPage{improper pictures}\Verbatim +% \input tex4ht.sty \Preamble{html} +% \EndPreamble +% +%\catcode`\@=11 +% +%\def\eqalignno#1{\displ@y \tabskip\centering +% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip +% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering +% &\llap{$\@lign##$}\tabskip\z@skip\ crcr #1\ crcr}} +% +%\eqalignno{ +%li&= 1\ cr +%&> line 2& (7)} +%\bye +\EndVerbatim\EndHPage{}]\fi{} with depth and hiehgt 0 (put +in TeX4ht1.sty the picture in box0 and measure). The problem +is because \''\def\offinterlineskip{\baselineskip-1000\p@ + \lineskip\z@ \lineskiplimit\maxdimen}' puts too much space +in \''\lineskiplimit'. + + + +\Chapter{Math} + + +\<math config util\><<< +\:CheckOption{base} +\if:Option \else + |<config math end-points|> + |<sub and sup|> + |<math classes|> + |<grouped math classes|> + |<built-in tex math ops|> +\fi +>>> + + +\Section{End Points of Math Environments} + + +The following become active only when they are being configured. + + + +\<config math end-points\><<< + \NewConfigure{$}[3]{% + \def\a:mth{\bgroup#1}\def\b:mth{#2\egroup}% + \def\c:mth{|<empty script base trap|>#3}% + \everymath{\ifx \EndPicture\:UnDef + $\a:mth\everymath{}\everydisplay{}$% + \aftergroup\b:mth \c:mth \fi}} +>>> + + + + +\<config math end-points\><<< + \NewConfigure{$$}[3]{% + \def\a:display{\bgroup#1}% + \def\b:display{#2\egroup}% + \def\c:display{#3}% + \everydisplay{\ifx \EndPicture\:UnDef + $$\a:display\everymath{}\everydisplay{}$$% + \aftergroup\b:display \c:display\fi}} + +>>> + + +Can't put \Verb'|<empty script base trap|>' into \Verb+\def\c:display{#3}%+ +because of cases such as \Verb+$$\halign{#\cr a\cr}$$+ + + +\<empty script base trap\><<< +{\csname HCode\endcsname{}}% +>>> + +Tex4ht translate each \`'$$...$$' into \`'$$ +$$$$...$$' and upon +reaching the second environment the mode is already horizontal. For +such case, the above approach of distinguishing in-line and off-line +display math don't work. This is a place where an implimentation +within the tex engine can do a better work. On the other hand, all of +this can be fixed within and XSL-like transformations on the final +output of tex4ht. + + +\''\halign' doesn't allow expansion into content to precede +it within the math mode. Hence, the \''\aftergroup' below. + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Math into Pictures} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\<config math end-points\><<< +\def\PicDisplay{\pic:gobble\env:PD + \def\:temp{$$}\pic:cond\Pic:math\:temp} +\def\EndPicDisplay{\end:condpic\pic:gobble\endenv:PD} +\def\Pic:math{\hfil\break + \expand:after{\Picture*}\alt:Mth{ \c:Math}} +>>> + + +\<config math end-points\><<< +\def\PicMath{\leavevmode\pic:gobble\env:PM\hbox\bgroup + \everymath{}\everydisplay{}\pic:cond\pic:math$} +\def\EndPicMath{\end:condpic\egroup\pic:gobble\endenv:PM} +\def\pic:math{\expand:after{\Picture+}\alt:mth{ \c:math}} +>>> + + + + +\<config math end-points\><<< +\NewConfigure{PicDisplay}[4]{\def\alt:Mth{#3}% + \ifx \alt:Mth\empty\else \def\alt:Mth{[#3]}\fi\def\c:Math{#4}% + \c:def\env:PD{#1}\c:def\endenv:PD{#2}} +\NewConfigure{PicMath}[4]{\def\alt:mth{#3}% + \ifx \alt:mth\empty\else \def\alt:mth{[#3]}\fi\def\c:math{#4}% + \c:def\env:PM{#1}\c:def\endenv:PM{#2}} +>>> + +\`'\Configure{PicDisplay}{}{}{[ALT]}{extra-attributes}' +\`'\Configure{PicMath}{}{}{[ALT]}{extra-attributes}' + + +\Section{Non-Pictorial Math} + + +\SubSection{Dvi Math} + + +\<config math end-points\><<< +\def\DviMath{\a:DviMath\leavevmode \MathClass |<same page|> \DviSend} +\def\EndDviMath{\EndDviSend |<end same page|>\EndMathClass \b:DviMath} +\NewConfigure{DviMath}{2} +>>> + + + +The above need to be boxed to prevent page breaks within the send +environment \`'\special{t4ht~}...\special{t4ht~}'.. + +\<same page\><<< +\ht:special{t4ht@(}\vbox + \bgroup{\expandafter\ifx\csname ht:everypar\endcsname\relax + \expandafter\everypar + \else \expandafter\ht:everypar\fi{}\leavevmode\ht:special{t4ht@)}}% + \relpenalty=10000 + \binoppenalty=10000 +>>> + +\<end same page\><<< +\ht:special{t4ht@(}\egroup\ht:special{t4ht@)}% +>>> + +The penalty is to prohibit line breaks. For instance, the following +formula under the mathml mode. + +\Verbatim +\documentclass{scrartcl} +\begin{document} +$a^{n_{1}+n_{2}+n_{3}} + (1-p_{1})^{n_{4} +n_{6} +n_{7} +(N-n_{1}-...b- n_{7})} + p_{2}^{n_{1} +n_{2} +n_{4} +n_{6}} + (1-p_{2})^{n_{3} +n_{5} +n_{7} +(N-n_{1}-...b- n_{7})} + p_{3}^{n_{1} +n_{3}+n_{4} +n_{7}} + (1-p_{3})^{n_{2} +n_{5} +n_{6} +(N-n_{1}-...b- n_{7})}$ +\end{document} +\EndVerbatim + + +The specials remove the space at the start and end points of the box. + + + +Examples: + +\Verbatim +\Configure{$} {\Tg<math>\DviMath} {\EndDviMath\Tg</math>} {} +\Configure{$$} {\Tg<display>\DviMath} {\EndDviMath\Tg</display>} {} + +\Configure{()} {\Tg<math>\DviMath$} {$\EndDviMath\Tg</math>} +\Configure{[]} {\Tg<display>\DviMath$$} {$$\EndDviMath\Tg</display>} +\EndVerbatim + + + + +\SubSection{Positioned Math} + + + +\<config math end-points\><<< +\def\PMath{\bgroup\Canvas \x:SUBOff \x:SUPOff + \let\Picture|=\empty \everymath{}\everydisplay{}} +\def\EndPMath{\EndCanvas\egroup} +\:CheckOption{PMath} \if:Option + \def\:Pmath{$\PMath$\aftergroup\EndPMath} + \def\:Pdisp{$$\PMath$$\aftergroup\EndPMath} + \everymath{\:Pmath} + \everydisplay{\:Pdisp} +\fi +>>> + + +Example: \`' \def\({\PMath$} \def\){$\EndPMath} \def\[{\PMath$$} +\def\]{$$\EndPMath}'. + + + +\ifHtml[\HPage{positioned math} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + + + +\Verbatim +\Css{.Canvas { position:absolute; }} +\Css{.Canvas { font-size:100\%; }} +\Css{.Canvas .cmr-7{ font-size:70\%; }} +\Css{.Canvas .cmmi-7{ font-size:70\%; font-style: italic;}} + +$ a \over b + c $ +\EndVerbatim + + +\Tg<hr /> + + +\Verbatim +\input tex4ht.sty \Preamble{html,sty,4.0s,PMath} + +\Css + BODY{ font-size : 200% } + .Canvas { position: relative; } + SPAN.cmr-7 .Canvas-char , + SPAN.cmmi-7 .Canvas-char , + SPAN.cmsy-7 .Canvas-char { font-size: 70% ; } + SPAN.cmr-5 .Canvas-char , + SPAN.cmmi-5 .Canvas-char { font-size: 50% ; } +\EndCss + + + \EndPreamble +aa +$ +{{A+C \over B+D}+F \over X*Y} +$ + +\bye +\EndVerbatim +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\EndHPage{}]\fi + + + + + +\Section{Subscripts and Superscripts} + + +\<sp and sb for catcode 13\><<< +\ifnum \the\catcode`^=13 + \let\expandafter\noexpand + \csname x:SUPOff\endcsname|=\noexpand\empty + \let\expandafter\noexpand + \csname x:SUPOn\endcsname|=\noexpand\empty + \catcode`\noexpand ^|=\the\catcode`^\fi +\ifnum \the\catcode`_=13 + \let\expandafter\noexpand + \csname x:SUBOff\endcsname|=\noexpand\empty + \let\expandafter\noexpand + \csname x:SUBOn\endcsname|=\noexpand\empty + \catcode`\noexpand _|=\the\catcode`_\fi +>>> + +The \''\x:SUBOff' (and \''\x:SUPOff') are activated only if the catcodes +of \`'^' and \`'_', respectively, were not 13 when tex4ht.sty was +loaded. If the catcode were 13, we need a user intervention, in which +\`'\sp' and \`'\sb' should be referenced for math mode. That is, +something along the lines \`'\ifmmode \expandafter\sp\else +\expandafter current^\fi' will probably work most of the times. + +TRY: Replace SUBOn with HSUBOn, SUBOff with HSUBOff, Ditto for SUP + +\<sub and sup\><<< +\let\s:b|=\sb +\let\:sbb|=\sb |%DraTeX already uses \:sb|% +\def\sb{\m:op\:sbb{SUB}} +\catcode`\_|=8 +\:CheckOption{no_} \if:Option + \let\s:b|=\:UndFi + |<old SUB 0|> + |<new SUB 0|> + \def\no:restore{\let\no:restore|=\:UnDef} +\else + \Log:Note{for non active \string_, + use the command line option `no\string_'}% + |<old SUB 1|> + |<new SUB 1|> + \catcode`\_|=13 + |<math sb|> + \def\x:SUBOff{\let_|=\s:b} + \def\pr:sb{\ifx \EndPicture\:UnDef + \expandafter\Protect\expandafter\S:b + \else \expandafter\s:b \fi} + |<old SUB 2|> + |<new SUB 2|> + |<old SUB 3|> + |<new SUB 3|> + \catcode`\_|=8 + \:CheckOption{_13} \if:Option + \def\no:restore{\let\no:restore|=\:UnDef + \mathcode`\_|="8000 \catcode`\_|=13 } + \append:def\SUBOn{\mathcode`\_|="8000 \catcode`\_|=13 |<let sb|>} + \else + \Log:Note{for \string_ of catcode 13, + use the command line option `\string_13'} + \def\no:restore{\let\no:restore|=\:UnDef + \mathcode`\_|="8000 \catcode`\_|=12 } + \append:def\SUBOn{\mathcode`\_|="8000 \catcode`\_|=12 |<let sb|>} + \fi + \bgroup + \SUBOn \def\:temp{|<let sb|>} + \expandafter \egroup \:temp +\fi +>>> + + +\<old SUB 0\><<< +\let\x:SUBOff|=\empty \let\x:SUBOn|=\empty +>>> +\<new SUB 0\><<< +\let\SUBOff|=\empty \let\SUBOn|=\empty +>>> + +\<old SUB 1\><<< +\ifx \sys:sb\:UnDef \def\:tempaa{_} +\else \def\:tempaa{\noexpand\sys:sb}\fi +>>> +\<new SUB 1\><<< +\ifx \sys:sb\:UnDef \def\:tempa#1{\append:def\SUBOff{\let#1|=_}} +\else \def\:tempa#1{\append:def\SUBOff{|<HSUBOff op|>}}\fi +>>> + +\<HSUBOff op\><<< +\def#1{% + \ifmmode \expandafter\s:b \else \expandafter\sys:sb \fi +}% +>>> + +\<old SUB 2\><<< +\edef\:SUBOff{\def\noexpand_{\:tempaa}} +>>> + +\<new SUB 2\><<< +\:tempa_ +>>> + +\<old SUB 3\><<< +\def\x:SUBOn{\def_{\ifmmode \expandafter\pr:sb + \else \expandafter\sys:sb\fi}|<let sb|>} +\x:SUBOn +>>> + +\<new SUB 3\><<< +\def\SUBOn{\catcode`\_|=8 + \def_{\ifmmode \expandafter\pr:sb + \else \expandafter\sys:sb\fi}} +\SUBOn +>>> + + + + + + + + + + + + +\<record external sub-sup\><<< +\edef\SUPOff{% + \catcode`\noexpand ^|=\the\catcode`^\relax +} +\edef\SUBOff{% + \catcode`\noexpand _|=\the\catcode`_\relax +} +\bgroup + \catcode`\^|=13 \global\let\sys:sp|=^ + \catcode`\_|=13 \global\let\sys:sb|=_ +\egroup +>>> + + +\<sub and sup\><<< +\let\s:p|=\sp +\let\:spp|=\sp +\def\sp{\m:op\:spp{SUP}} +\catcode`\^|=7 +|<default sup sup config|> +\:CheckOption{no^} \if:Option + \let\s:p|=\:UndFi + |<old SUP 0|> + |<new SUP 0|> +\else + \Log:Note{for non active \string^, + use the command line option `no\string^'}% + |<old SUP 1|>% + |<new SUP 1|>% + \catcode`\^|=13 + |<math sp|> + \def\x:SUPOff{\let^|=\s:p } + \def\pr:sp{\ifx \EndPicture\:UnDef + \expandafter\Protect\expandafter\S:p + \else \expandafter\s:p \fi} + |<old SUP 2|> + |<new SUP 2|> + |<old SUP 3|> + |<new SUP 3|> + |<sup 13|> + \catcode`\^|=7 + \:CheckOption{^13} \if:Option + |<sup sup 13 config|> + \append:def\no:restore{\mathcode`\^|="8000 \catcode`\^|=13 } + \append:def\SUPOn{\mathcode`\^|="8000 \catcode`\^|=13 |<let sp|>} + \else + \Log:Note{for \string^ of catcode 13, + use the command line option `\string^13'}% + \append:def\no:restore{\mathcode`\^|="8000 \catcode`\^|=12 } + \append:def\SUPOn{\mathcode`\^|="8000 \catcode`\^|=12 |<let sp|>} + \fi + \bgroup + \SUPOn \def\:temp{|<let sp|>} + \expandafter \egroup \:temp +\fi +>>> + + +\<default sup sup config\><<< +\NewConfigure{\string^\string^}[2]{% + \def\:tempa##1>{}\def\:temp{#1}\:warning{\string + \Configure{\string\string\string ^\string\string + \string^}{\expandafter\:tempa\meaning \:temp}{...} + ignored; option \string^13 is not on}} +>>> + + + +\<sup 13\><<< +\def\:sUp{% + \let\:sUp|=^% + \def^{\futurelet\:temp\next:hat} + \def\next:hat{\ifx ^\:temp \expandafter\:dblhat\else + \expandafter\:sUp\fi}% +} +>>> + +\<sup sup 13 config\><<< +\:sUp +\def\:dblhat#1#2{\def\:temp{#2}% + \def\:tempc{\def\:tempa####1>{}\:warning{\string^\string + ^\expandafter\:tempa\meaning\:temp? \string\Configure{\string + \string\string ^\string\string\string^}{\expandafter\:tempa + \meaning \:temp}{...} or use option no\string^}}% + \ext:chr \:tempc} +\let\ext:chr|=\empty +\NewConfigure{\string^\string^}[2]{% + \NewConfigure{\string^\string^}{2}% + \append:def\ext:chr{\def\:tempa{#1}\ifx \:temp\:tempa + \def\:tempc{#2}\fi}} +>>> + + + +\<old SUP 0\><<< +\let\x:SUPOff|=\empty \let\x:SUPOn|=\empty +>>> +\<new SUP 0\><<< +\let\SUPOff|=\empty \let\SUPOn|=\empty +>>> +\<old SUP 1\><<< +\ifx \sys:sp\:UnDef \def\:tempbb{^} +\else \def\:tempbb{\noexpand\sys:sp}\fi +>>> +\<new SUP 1\><<< +\ifx \sys:sp\:UnDef \def\:tempb#1{\append:def\SUPOff{\let#1|=^}} +\else \def\:tempb#1{\append:def\SUPOff{|<HSUPOff op|>}}\fi +>>> + + + + + +\<HSUPOff op\><<< +\def#1{% + \ifmmode \expandafter\s:p \else \expandafter\sys:sp \fi +}% +>>> + + +\<old SUP 2\><<< +\edef\:SUPOff{\def\noexpand^{\:tempbb}} +>>> +\<new SUP 2\><<< +\:tempb^ +>>> + +\<old SUP 3\><<< +\def\x:SUPOn{\def^{\ifmmode \expandafter\pr:sp + \else \expandafter\sys:sp\fi}|<let sp|>} +\x:SUPOn +>>> + +\<new SUP 3\><<< +\def\SUPOn{% + \def^{\ifmmode \expandafter\pr:sp + \else \expandafter\sys:sp\fi}} +\SUPOn +>>> + + + +\<let sp\><<< +\let\sp=^ +>>> + +\<let sb\><<< +\let\sb=_ +>>> + + + +\<math sp\><<< +\if:Option + \def\S:p{\m:op\s:p{SUP}} +\else + \def\S:p#1{\def\SuP:{#1}\futurelet\:temp\sup:sub} + \:CheckOption{^13} \if:Option \catcode`\_|=13 + \else \catcode`\_|=12\fi + \def\blank:space{ + } + \def\sup:sub{\expandafter + \ifx \blank:space\:temp \expandafter\sup:subA + \else \expandafter\sup:subB\fi} + \expandafter\def + \expandafter\sup:subA\blank:space{\futurelet\:temp\sup:sub} + \def\sup:subB{\ifx _\:temp \expandafter\SUP:SUB + \else \expandafter\a:putSUP \fi } + \catcode`\_|=8 + \def\a:putSUP{\sup:I \SuP:} + \def\sup:I{\m:op\s:p{SUP}} +\fi +>>> + + +\<math sb\><<< +\if:Option + \def\S:b{\m:op\s:b{SUB}} +\else + \def\S:b#1{\def\SuB:{#1}\futurelet\:temp\sub:sup} + \def\blank:space{ + } + \def\sub:sup{\expandafter + \ifx \blank:space\:temp \expandafter\sub:supA + \else \expandafter\after:sub\fi} + \expandafter\def + \expandafter\sub:supA\blank:space{\futurelet\:temp\sub:sup} + |<extension of sub|> + \def\a:putSUB{\sub:I \SuB:} + \def\sub:I{\m:op\s:b{SUB}} +\fi +>>> + + +% \def\sub:supB{\ifx ^\:temp \expandafter\SUB:SUP +% \else \expandafter\after:sub\fi} + + +\<utilities\><<< +\NewConfigure{afterSUB}[2]{\expandafter + \def \csname \meaning#1sb\endcsname{#2}} +\NewConfigure{putSUB}[1]{\def\a:putSUB{#1}} +\NewConfigure{putSUP}[1]{\def\a:putSUP{#1}} +\:CheckOption{no^} \if:Option \else + \:CheckOption{^13} \if:Option \catcode`\^|=13 + \else \catcode`\^|=12 \fi + \Configure{afterSUB}^{\SUB:SUP} + \catcode`\^|=7 +\fi +>>> + +The following is needed for a math prime after sub. For instance, \'+a_1'$+. + +\<extension of sub\><<< +\def\after:sub{\futurelet\:temp\choose:sub} +\def\choose:sub{\expandafter + \ifx \csname \meaning\:temp sb\endcsname\relax + \expandafter \a:putSUB + \else + \expandafter\expandafter\csname \meaning\:temp sb\endcsname + \fi +} +>>> + + +We need to catch cases like the blank space appearing after the b +within AmsTeX in an equation like: +\Verbatim +\begin{equation} +a^b +_c +\end{equation} +\EndVerbatim +We can't use a declaration of the form + \''\def\sub:supA#1{...' +because the macro consumes the parameter following the space, +and that parameter can a forbidden token. + + + +The \`'\edef\:SUBSUPOff' doesnt wotk with \''\let' instead +of \''\def' in the body. Why? + + +\<sub and sup\><<< +\def\m:op{\ifx \EndPicture\:UnDef \expandafter\:mop + \else \expandafter\:m:p\fi} +\def\:mop{\relax\ifmmode \expandafter \mo:p \else \expandafter\mop:\fi} +\def\mo:p#1#2#3{{\csname a:#2\endcsname + #1{#3}\csname b:#2\endcsname}} +\def\mop:#1#2#3{#1} +\def\:m:p#1#2{#1} +>>> + +\<sub and sup\><<< +\NewConfigure{SUB}{2} +\NewConfigure{SUP}{2} +>>> + +We need to pause the hyperext font for the case that the +subscript itself comes with a font change. Without the +pause we'll get a partial overlap with the \''<SUB/SUP>' +font (e.g., \`'\it $\A_{\mathbf{R}}$'). + + +In case that \`'^' looses its original meaning, TeX will complain +about double exponnet if it follows a quote symbol.\ifHtml[\HPage{'}\Verbatim +\input tex4ht.sty \Preamble{html} \EndPreamble + +$\overline{a'^b}$ + +\csname bye\endcsname + +\EndVerbatim\EndHPage{}]\fi. + +\SubSection{Merging Subscripts and Superscripts} + +Two options \`'\Configure{SUBSUP}{ before }{ between }{ after }' +and +\`'\Configure{SUPSUB}{ before }{ between }{ after }', differing in the +way the reorder the superscript and subscript. However, if the +three parameters are empty, or just a single subscript / superscript +is present, then \`'\Configure{SUB}{ before }{ after }' +and \`'\Configure{SUP}{ before }{ after }' get into effect. + +\<sub and sup\><<< +\:CheckOption{no^} \if:Option \else \:CheckOption{no_}\fi +\if:Option + \NewConfigure{SUBSUP}[3]{} + \NewConfigure{SUPSUB}[3]{} + \NewConfigure{SUB/SUP}[6]{} +\else + \def\SUP:SUB#1#2{\let\chs:sbsp|=\:gobble\def\SuB:{#2}\SUBSUP:} + \def\SUB:SUP#1#2{\def\chs:sbsp##1##2{##1}\def\SuP:{#2}\SUBSUP:} + \let\SUBSUP:|=\empty + \NewConfigure{SUBSUP}[3]{% + \def\:temp{#1#2#3}\ifx \:temp\empty + \def\SUBSUP:{\sub:I\SuB:\sup:I\SuP:}% + \else \def\SUBSUP:{#1\s:b{\SuB:}#2\s:p{\SuP:}#3}\fi} + \NewConfigure{SUPSUB}[3]{% + \def\:temp{#1#2#3}\ifx \:temp\empty + \def\SUBSUP:{\sup:I\SuP:\sub:I\SuB:}% + \else \def\SUBSUP:{#1\s:p{\SuP:}#2\s:b{\SuB:}#3}\fi} + \NewConfigure{SUB/SUP}[6]{% + \def\:temp{#1#2#3#4#5#6}\ifx \:temp\empty + \def\SUBSUP:{\sub:I\SuB:\sup:I\SuP:}% + \else \def\SUBSUP:{\chs:sbsp + {#1\s:b{\SuB:}#2\s:p{\SuP:}#3}% + {#4\s:p{\SuP:}#5\s:b{\SuB:}#6}}\fi} +\fi +>>> + + + +\SubSection{Early Activation of Sub/Sup Scripts} + + +\<early latex subs/sups\><<< +\ifx \config:opt\:UnDef \else + |<defs for early latex subs/sups|> +\fi +>>> + +\<defs for early latex subs/sups\><<< +\append:def\:RestoreCatcodes{\early:sub\early:sup} +\let\:IfFileExists\IfFileExists +\long\def\IfFileExists#1#2#3{% + \csname recall:sub\endcsname + \csname recall:sup\endcsname + \expandafter\let\csname #1:sub\endcsname=\early:sub + \expandafter\let\csname #1:sup\endcsname=\early:sup + \let\early:sub=\relax \let\recall:sub\relax + \let\early:sup=\relax \let\recall:sup\relax + \:IfFileExists{#1}{#2}{#3}% + \expandafter\let\expandafter\early:sub\csname #1:sub\endcsname + \expandafter\let\expandafter\early:sup\csname #1:sup\endcsname + \early:sub \early:sup +} +\ifx \o:document\:UnDef + \pend:def\Preamble{% + \csname recall:sub\endcsname + \csname recall:sup\endcsname} +\fi +>>> + +\</document recall sub/sup\><<< +\csname recall:sub\endcsname +\csname recall:sup\endcsname +>>> + +\<defs for early latex subs/sups\><<< +\def\:CheckOption#1{\def\:temp{#1}% + \:Optionfalse + \expandafter\:ScanOptions\config:opt,,//} +\def\:ScanOptions#1,#2//{\def\:next{#1}% + \ifx \:next\empty + \else \ifx \:temp\:next \:Optiontrue \let\:next\relax + \else \def\:next{\:ScanOptions#2//}% + \fi \fi \:next } +|<cats early latex subs/sups|> +\let\:CheckOption|=\:UnDef +>>> + + + +\<cats early latex subs/sups\><<< +\let\early:sub=\empty +\:CheckOption{early_} \if:Option + \:CheckOption{no_} \if:Option \else + \:CheckOption{_13} \if:Option + \def\early:sub{% + \xdef\recall:sub{% + \mathcode`\noexpand\_=\the\mathcode`\_ + \catcode`\noexpand\_=\the\catcode`\_ + } + \mathcode`\_="8000 \catcode`\_=13 + } + \else + \def\early:sub{% + \xdef\recall:sub{% + \mathcode`\noexpand\_=\the\mathcode`\_ + \catcode`\noexpand\_=\the\catcode`\_ + % \writesixteen{.....sub \the\catcode`\_}% + }% + \mathcode`\_="8000 \catcode`\_=12 + % \writesixteen{.....sub 12} + } + \fi + \fi +\else + \Log:Note{for \string_ at preamble, + use the command line option `early\string_'}% +\fi +>>> + +\<cats early latex subs/sups\><<< +\let\early:sup=\empty +\:CheckOption{early^} \if:Option + \:CheckOption{no^} \if:Option \else + \:CheckOption{^13} \if:Option + \def\early:sup{% + \xdef\recall:sup{% + \mathcode`\noexpand\^=\the\mathcode`\^ + \catcode`\noexpand\^=\the\catcode`\^ + } + \mathcode`\^="8000 \catcode`\^=13 + } + \else + \def\early:sup{% + \xdef\recall:sup{% + \mathcode`\noexpand\^=\the\mathcode`\^ + \catcode`\noexpand\^=\the\catcode`\^ + % \writesixteen{.....sup \the\catcode`\^}% + }% + \mathcode`\^="8000 \catcode`\^=12 + % \writesixteen{.....sup 12}% + } + \fi + \fi +\else + \Log:Note{for \string^ at preamble, + use the command line option `early\string^'}% +\fi +>>> + + +\Section{Math Classes} + + + + + +The requests are placed on symbols of the fonts, which might be a +problem for symbols not used in math. + +\<math classes\><<< +\def\MathClass{\ht:special{t4ht\string^}} +\let\EndMathClass|=\MathClass +\def\PauseMathClass{\ht:special{t4ht\string^-}} +\def\EndPauseMathClass{\ht:special{t4ht\string^+}} +>>> + + + + +Math classes: Ordinary (0), large operators (1), binary operators (2), +relation (3), opening del (4), closing delimiter (5), +punctuation (7). + + + +\SubSection{Configure Characters} + + +Set the class delimiters for the symbols. + +\<math classes\><<< +\catcode`\^=7 +\NewConfigure{MathClass}[5]{\NoFonts \ht:special{t4ht@[}% + \def\:temp{#2}\ifx \:temp\empty \else + \ht:special{t4ht\string^#1#2#3#2#4}\fi + \def\:temp{#5}\ifx \:temp\empty \else + \bgroup \everypar{}\everymath{}\everydisplay{}% + \hbox{${\ht:special{t4ht\string^#1}% + {#5}^{{#5}^{#5}}\ht:special{t4ht\string^}}$}% + \vbox{$${\ht:special + {t4ht\string^#1}{#5}^{{#5}^{#5}}\ht:special{t4ht\string^}}$$}\egroup + \fi + {\everypar{}\noindent\vfill\break}% + \ht:special{t4ht@]}\EndNoFonts +} +\NewConfigure{MathDelimiters}[2]{\NoFonts \ht:special{t4ht@[}% + \bgroup \everypar{}\everymath{}\everydisplay{}% + \hbox{${\ht:special + {t4ht\string^4}#1\ht:special{t4ht\string^5}#2% + \ht:special{t4ht\string^4}{}^{#1}\ht:special{t4ht\string^5}{}^{#2}% + \ht:special{t4ht\string^4}{}^{{}^{#1}}\ht:special + {t4ht\string^5}{}^{{}^{#2}}% + \ht:special{t4ht\string^}}$}% + \vbox{$${\ht:special + {t4ht\string^4}#1\ht:special{t4ht\string^5}#2% + \ht:special{t4ht\string^4}{}^{#1}\ht:special{t4ht\string^5}{}^{#2}% + \ht:special{t4ht\string^4}{}^{{}^{#1}}\ht:special + {t4ht\string^5}{}^{{}^{#2}}% + \ht:special{t4ht\string^}}$$}% + {\everypar{}\noindent\vfill\break}% + \ht:special{t4ht@]}\egroup + \EndNoFonts} +\catcode`\^=12 +>>> + + + +\<math classes\><<< +\HAssign\New:MathClass|=7 +\catcode`\/=0 +\catcode`\\=12 +/def/NewMathClass#1{/relax + /expandafter/ifx /csname /expandafter/:gobble/string#1/endcsname/relax + /gHAdvance/New:MathClass by 1/relax + /ifnum /New:MathClass>78 + /:warning{Too many math classes} + /else + /HAssign#1/New:MathClass /def/:tempc{#1}/:NewMC + 0123456789:;<=>?% + @ABCDEFGHIJKLMNO% + PQRSTUVWXYZ[\]{/string^}{/string_}% + `abcdefghijklmno% + pqrstuvwxyz{/string{}||{/string}}{/string~}|<par del|>% + /fi + /else + /:warning{/string#1 is already defined} + /fi} +/catcode`/\=0 +\catcode`\/=12 +\def\:NewMC#1{% + \ifnum \:tempc=0 \expandafter\xdef\:tempc{#1}\expandafter\stop:do + \else + \expandafter\HAdvance\:tempc |by -1\relax + \expandafter\:NewMC + \fi +} +>>> + +79 math classes: 0--78. + + +\<math classes\><<< +\NewConfigure{nolimits}[1]{\def\:temp{#1}\ifx \:temp\empty + \let\nolimits|=\o:nolimits: \else + \def\:temp{\o:nolimits:\futurelet\:temp\:nolimits}% + \def\:nolimits{\ifx \:temp\limits \else + \ifx \:temp\nolimits \else #1\fi\fi}% + \HLet\nolimits|=\:temp \fi} +\let\o:nolimits:|=\nolimits +\NewConfigure{limits}[1]{\def\:temp{#1}\ifx \:temp\empty + \let\limits|=\o:limits: \else + \def\:limits{\ifx \:temp\nolimits \else#1\fi}% + \def\:temp{\o:limits:\:l:mits}% + \HLet\limits|=\:temp \fi} +\let\o:limits:|=\limits + +\def\::limits{\expandafter\ifx \blank:spc\:temp + \afterassignment\:l:mits \tmp:cnt0% + \else + \ifx \limits\:temp\else + \expandafter\expandafter\expandafter\:limits + \fi + \fi} +\def\:l:mits{\futurelet\:temp\::limits} +\catcode`\ =13\relax\def\blank:spc{\let\blank:spc= }\blank:spc% +\catcode`\ =10\relax +>>> + + +Test case to check: \Verb=\[\sum\nolimits\limits_a^b u_s^2 \]= + + +The assignment \`'\tmp:cnt0%' also consumes the space that follows. + + + + +\<math classes\><<< +\NewConfigure{displaylimits}[1]{\def\:temp{#1}\ifx \:temp\empty + \let\displaylimits|=\o:displaylimits: \else + \def\:displaylimits{\ifx \:temp\nolimits \else + \ifx \:temp\limits \else #1\fi\fi}% + \def\:temp{\o:displaylimits:\display:l:mits}% + \HLet\displaylimits|=\:temp \fi} +\let\o:displaylimits:|=\displaylimits +\def\::displaylimits{\expandafter\ifx \blank:spc\:temp + \afterassignment\display:l:mits \tmp:cnt0% + \else\expandafter\:displaylimits \fi} +\def\display:l:mits{\futurelet\:temp\::displaylimits} +>>> + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Configure Grouped Classes} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\`'\mathord{...}' et al request delimiters for their arguments. The +\`'\special{t4ht^X}' , for `~'-`0' (digit) greater than 79, request +the delimiters of class 0 to apply to the next group (created by the +math ord). The \`'0' asks to ignore nested delimiters; can be +replaced by \`'1' to request the sub delimiters. + + + + +A \`'\special{t4ht\string^)*...*...}' is variant of +\`'\Send{Group}{1}... \Send{EndGroup}{1}' for delimiters, without +subdelimiters. Taking \`'(' (or any other character which below a +digit and not + or -) instead of \`')' gives also the subdelimiters. + +A \`'\special{t4ht\string^i)}' takes the delimiters from +the characters of class i. + + +\<grouped math classes\><<< +\def\:temp{\a:mathord \o:mathord:} \HLet\mathord|=\:temp +\let\a:mathord|=\empty +\def\:temp{\a:mathop \o:mathop:} \HLet\mathop|=\:temp +\let\a:mathop|=\empty +\def\:temp{\a:mathbin \o:mathbin:} \HLet\mathbin|=\:temp +\let\a:mathbin|=\empty +\def\:temp{\a:mathrel \o:mathrel:} \HLet\mathrel|=\:temp +\let\a:mathrel|=\empty +\def\:temp{\a:mathopen \o:mathopen:} \HLet\mathopen|=\:temp +\let\a:mathopen|=\empty +\def\:temp{\a:mathclose \o:mathclose:} \HLet\mathclose|=\:temp +\let\a:mathclose|=\empty +\def\:temp{\a:mathpunct \o:mathpunct:} \HLet\mathpunct|=\:temp +\let\a:mathpunct|=\empty +>>> + + + +\<grouped math classes\><<< +\NewConfigure{FormulaClass}[4]{% + \def\:temp{#2}% + \expandafter\edef\csname a:\ifcase #1 mathord\or mathop\or + mathbin\or mathrel\or mathopen\or mathclose\else + mathpunc\fi\endcsname{\noexpand\ht:special + {t4ht\string^\ifx\:temp\empty#1)\else )#2#3#2#4\fi}}} +>>> + + + + +\`'\Configure{FormulaClass}{class number}{char}{before}{after}': +char+before+after=empty implies same markings as for single +characters. In fact, can do the same for any sub formula with any function, +not just the math functions. + +\<grouped math classes\><<< +\NewConfigure{FormulaClass*}[4]{% + \def\:temp{#2}% + \expandafter\edef\csname a:\ifcase #1 mathord\or mathop\or + mathbin\or mathrel\or mathopen\or mathclose\else + mathpunc\fi\endcsname{\ht:special + {t4ht\string^\ifx\:temp\empty#1(\else (#2#3#2#4\fi}}} +>>> + +The following are generalizations, introduced for allowing temporary +changs, like in \`' +\renewcommand{\opname}[1]{% + \Configure{mathop*}{*}{<mrow>}{</mrow>}{\Configure{FormulaClass}{0}{}{}{}} + \mathop{\fam0#1}}'. + +\<grouped math classes\><<< +\NewConfigure{mathord}[4]{\Configure{FormulaClass}{0}{#1}{#2}{#3}% + \pend:def\a:mathord{#4}} +\NewConfigure{mathop}[4]{\Configure{FormulaClass}{1}{#1}{#2}{#3}% + \pend:def\a:mathop{#4}} +\NewConfigure{mathbin}[4]{\Configure{FormulaClass}{2}{#1}{#2}{#3}% + \pend:def\a:mathbin{#4}} +\NewConfigure{mathrel}[4]{\Configure{FormulaClass}{3}{#1}{#2}{#3}% + \pend:def\a:mathrel{#4}} +\NewConfigure{mathopen}[4]{\Configure{FormulaClass}{4}{#1}{#2}{#3}% + \pend:def\a:mathopen{#4}} +\NewConfigure{mathclose}[4]{\Configure{FormulaClass}{5}{#1}{#2}{#3}% + \pend:def\a:mathclose{#4}} +\NewConfigure{mathpunct}[4]{\Configure{FormulaClass}{6}{#1}{#2}{#3}% + \pend:def\a:mathpunct{#4}} +>>> + + + +\<grouped math classes\><<< +\NewConfigure{mathord*}[4]{\Configure{FormulaClass*}{0}{#1}{#2}{#3}% + \pend:def\a:mathord{#4}} +\NewConfigure{mathop*}[4]{\Configure{FormulaClass*}{1}{#1}{#2}{#3}% + \pend:def\a:mathop{#4}} +\NewConfigure{mathbin*}[4]{\Configure{FormulaClass*}{2}{#1}{#2}{#3}% + \pend:def\a:mathbin{#4}} +\NewConfigure{mathrel*}[4]{\Configure{FormulaClass*}{3}{#1}{#2}{#3}% + \pend:def\a:mathrel{#4}} +\NewConfigure{mathopen*}[4]{\Configure{FormulaClass*}{4}{#1}{#2}{#3}% + \pend:def\a:mathopen{#4}} +\NewConfigure{mathclose*}[4]{\Configure{FormulaClass*}{5}{#1}{#2}{#3}% + \pend:def\a:mathclose{#4}} +\NewConfigure{mathpunct*}[4]{\Configure{FormulaClass*}{6}{#1}{#2}{#3}% + \pend:def\a:mathpunct{#4}} +>>> + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Renewed Commands} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Math Symbols from Macros} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The \`'\MathSymbol' works on empty when the symbol comes from a font. +That is, when the macro is defined as \`'\mathchar"xxxx'. A +\`'\MathSymbol+' variant may be applied to force definitions. Warning +messages are not helpful as the symbols may have nultiple definitions +dependent on the style files being loaded. + +\<built-in tex math ops\><<< +\def\MathSymbol{\futurelet\:temp\:::MathSymbol} +\def\:::MathSymbol{\if +\:temp + \expandafter\:MathSymbol \else + \expandafter\::MathSymbol \fi +} +\def\::MathSymbol#1#2{% + \def\:tempb##1"##2///{##1}% + \edef\:tempa{\expandafter\expandafter\expandafter\:tempb + \expandafter\meaning\csname#2\endcsname"///}% + \edef\:tempc{\string\mathchar}% + \ifx \:tempa\:tempc + \NewConfigure{#2}{1}\Configure{#2}{\csname o:#2:\endcsname}% + \else + \:MathSymbol{}{#1}{#2}% + \fi +} +\def\:MathSymbol#1#2#3{% + \def\:temp{{\math:sym#2{#3}}}% + \expandafter\HLet\csname #3\endcsname\:temp + \NewConfigure{#3}{1}\Configure{#3}{\csname o:#3:\endcsname}% +} +\def\math:sym#1#2{{\relax\ifmmode \expandafter#1\fi + {\csname a:#2\endcsname}}} +>>> + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{/left and /right} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Again, we don't want line breaks from \''<PRE>'s within +formulas in visual browsers. + +\<built-in tex math ops\><<< +\def\:temp#1{\a:left{#1}\o:left:#1\b:left{#1}} +\HLet\left|=\:temp +\def\:temp#1{\a:right{#1}\o:right:#1\b:right{#1}} +\HLet\right|=\:temp +\NewConfigure{left}[2]{\def\a:left##1{#1}\def\b:left##1{#2}} +\NewConfigure{right}[2]{\def\a:right##1{#1}\def\b:right##1{#2}} +\Configure{left}{}{} +\Configure{right}{}{} +>>> + + + +\SubSection{Fractions} + + +\<built-in tex math ops\><<< +\def\:tempc{\pic:gobble\a:over \o:over: \pic:gobble\b:over} +\HLet\over|=\:tempc +\NewConfigure{over}{2} +\def\:tempc{\pic:gobble\a:atop \o:atop: \pic:gobble\b:atop} +\HLet\atop\:tempc +\NewConfigure{atop}{2} +\def\::above{\pic:gobble\a:above \o:above:\tmp:dim + \pic:gobble\b:above } +\def\:above{\afterassignment\::above} +\def\:tempc{\Protect\:above \tmp:dim|=} +\HLet\above\:tempc +\NewConfigure{above}{2} +>>> + +\<built-in tex math ops\><<< +\def\::abovewithdelims#1#2{\pic:gobble\a:abovewithdelims + \o:abovewithdelims:#1#2\tmp:dim\pic:gobble\b:abovewithdelims} +\def\:abovewithdelims#1#2{\def\:temp{\::abovewithdelims#1#2}% + \afterassignment\:temp\tmp:dim=} +\def\:tempc{\Protect\:abovewithdelims } +\HLet\abovewithdelims\:tempc + \NewConfigure{abovewithdelims}{2} +\def\:overwithdelims#1#2{\pic:gobble\a:overwithdelims + \o:overwithdelims:#1#2\pic:gobble\b:overwithdelims} +\def\:tempc{\Protect\:overwithdelims} +\HLet\overwithdelims\:tempc + \NewConfigure{overwithdelims}{2} +\def\:atopwithdelims#1#2{\pic:gobble\a:atopwithdelims + \o:atopwithdelims:#1#2\pic:gobble\b:atopwithdelims} +\def\:tempc{\Protect\:atopwithdelims} +\HLet\atopwithdelims\:tempc + \NewConfigure{atopwithdelims}{2} +>>> + + + +\`'\Configure{over} + {\Send{GROUP}{0}{[before]}[before-rule]} + {[before-argument]\Send{EndGROUP}{0}{[after]}}' + + + +\`' +\Configure{over} + {\special{t4ht\string~<<NOMINATOR>}\HCode + {</NOMINATOR><DENOMINATOR>}} + {\special{t4ht\string~></DENOMINATOR>}}' + + + + Beware of nested formulas for proper arrangments of + \`'\special{t4ht\string~...}' + + + + + + +\SubSection{Radical's} + +\<built-in tex math ops\><<< +\def\:temp{\pic:gobble\a:radical\o:radical:} +\HLet\radical|=\:temp +\NewConfigure{radical}{1} +>>> + +\Verbatim +\Configure{radical}{% + [before-sign]% + \Send{EndGROUP}{2}{[after-sign]}% + \Send{GROUP}{3}{[before-body]}% + \Send{EndGROUP}{3}{[after-body]}% +} +\EndVerbatim + + +\SubSection{Mathchoice} + +The following is disabled because \TeX{} evaluates the four parameters +and then keeps one and throws away the other. With the picture +environment enabled, we'll get messages in the log file of the form +\`'--- needs --- a.idv[1] ==> ai.gif ---' for pictures that are not +included in the code. + + +\<built-in tex math ops\><<< +\def\:temp#1#2#3#4{\a:mathchoice + \o:mathchoice:{#1}{#2}{#3}{#4}\b:mathchoice } +\HLet\mathchoice|=\:temp +\NewConfigure{mathchoice}{2} +>>> + + + +The following, for \''\?phantom', is not needed because it is already +covered by \''\mathchoice'. + +\Verbatim +\def\makeph@nt#1{\PictureOff + \setbox\z@\hbox{#1}\finph@nt \PictureOn} +\def\mathph@nt#1#2{\PictureOff + \setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt \PictureOn} +\EndVerbatim + + + + +\SubSection{Equation Numbers} + +The \''\eqno' and \''\leqno' refer to what follow them in the math +environment as left and right equation numbers, respectively. Tex +typesets them within groups, so material can be sent to the end of the +number with a \`'\Send{GROUP}{0}{...}'. + +\<built-in tex math ops\><<< +\def\:temp{\o:eqno:\a:eqno} +\HLet\eqno|=\:temp +\def\:temp{\o:leqno:\a:leqno} +\HLet\leqno|=\:temp +\NewConfigure{eqno}{1} +\NewConfigure{leqno}{1} +>>> + + + + + + +In addition, +\`'1140. We get into ordinary math mode from display math mode when +the equation numbers \eqno and \leqno appear'. +Hence, the \`'\everymath{}' is needed also for the display case. +To be on the sure side, we also put \`'\everydisplay{}' in the math mode. + + + + +\Chapter{Decorated Symbols} + + + +\Section{Htf Classes: Requesting BackEnd Fonts through /specials} + + +\<font config util\><<< +\NewConfigure{htf}[9]{{% + \tmp:cnt|=#1 \ifnum \tmp:cnt>255 \:warning{Code larger than + 255 in \string\Configure{htf}}\else + \ht:special{t4ht;||\ifnum \tmp:cnt<10 00\else + \ifnum \tmp:cnt<100 0\fi\fi + \the\tmp:cnt#2#3#2#4#2#5#2#6#2#7#2#8#2#9#2\the\tmp:cnt}% + \fi}} +>>> + + +A \`'\%x' requests character code in hexadecimal representation. + + +\`'\Configure{htf}' is essentially a configuration on +fonts, where even cases, for instance, the \`'\special{t4ht;|004...}' +extra independent information for characters. +Odd cases like \`'\special{t4ht;|003...}', on the other hand, are +addition to the \`'IMG' and not an independent info !!! + +\SubSection{Pausing} + +\<font config util\><<< +\def\NoFonts{\ht:special{t4ht;8}} +\def\EndNoFonts{\ht:special{t4ht;9}} +>>> + + +Nesting is allowed. + +\SubSection{Configurations} + +Code for calls made from htf fonts. Should start with three +digits defining a number smaller than 256. Odd numbers apply +to gifs, and even to text. The odd are intended for insertion into +IMG marks, the odd are not used yet. + +The character part is prented for codes that are not given in +cases of characters and image-characters, respectively. +Code 000 is created to groups of non image characters, and the +codes 002, 004, 006, add extras to individual characters. The +od codes deal only with specific characters, not groups. + +The corresponding formatting instructions in the css +file are determined in the `Font' option within the +perl script. + + + +\<font config util\><<< +\NewConfigure{FontCss}[2]{\def\a:FontCss:{#1}\def\a:FontCssPlus:{#2}} +>>> + +\<font config util\><<< +\NewConfigure{htf-css}[2]{{% + \def\:temp##1|<par del|>{\def\:tempa{##1}}% + \afterassignment\:temp\tmp:cnt|=0#1|<par del|>% + \def\:temp{\Configure{Needs}}% + \ifx \:tempa\empty + \expandafter\:temp\expandafter{\a:FontCss:}\Needs{("#1"): #2}% + \else + \expandafter\:temp\expandafter{\a:FontCssPlus:}\Needs{#1 #2}% + \fi}} +\NewConfigure{htf-attr}[2]{{% + \Configure{Needs}{##1}% + \Needs{Font\string_css\string_base: #1Font\string_css\string_mag: #2}}} +>>> + + +\`'\NewConfigure{htf-css}{number}{...}' for a class; +\`'\NewConfigure{htf-css}{not-number}{...}' for a htf font. + + + + +\`'\Configure{htf}{even}{+}{open}{name}{size}{mag}{ord}{ch}{end}{gif-id}' + + + +\`'\Configure{htf}{odd}{+}{open}{alt}{class}{size}{mag}{ord}{end}': mag and +ord must be integer patterns. + + +\`'\Configure{htf-css}{4}{.underline{text-decoration:underline; }}' is +alredy covered. + + + +HOW \`'\Configure{htf-css}{4}{.small-caps{font-variant: small-caps; }}' +differs from \`'\Css{.small-caps{font-variant: small-caps; }}'? +The latter is alway introduced into the +css file, wheras the earlier only conditionally when the font/class is in use. + + +% \special{t4ht;||003"\Hnewline ALIGN="MIDDLE} + + +% \special{t4ht;||003-MIDDLE} + + + + + +We have +\Verbatim +\Configure{htf} + {odd-for-img-chr} + {distinguished delimiter ch+id} + {prefix for file name, if the latter is desired} + {prefix for alt, if the latter is desired} + {c-template, if family name is desired} + {c-template, if font size is desired} + {c-template, if font mag is desired} + {c-template, if ch ord is desired} + {close of tag} +\Configure{htf} + {even-for-reg-chr} + {distinguished delimiter ch+id} + {prefix} + {c-template, if family name is desired} + {c-template, if font size is desired} + {c-template, if font mag is desired} + {c-template, if ch ord is desired} + {postfix} + {closing tag} +\EndVerbatim + + + +The id is to be used in Needs fo associating styles to the +character decorations. Also, due to the id, we can assign to the +same code of font different styles. +\ifHtml[\HPage{example}\Verbatim +\Configure{htf}{6}{+a}{}{}{<a.. + FONT="\%s}{\%s"}{MAG="\%d"}{ORD="\%d"}{>} +$\leq$ +\Configure{htf}{6}{+b}{}{}{<b... + FONT="\%s}{\%s"}{MAG="\%d"}{ORD="\%d"}{>} +$\leq$ + +\Needs{a .......} +\Needs{b .......} +\EndVerbatim + +produces + +\Verbatim +Font class 6 a: <a.. FONT="%s%s"MAG="%d"ORD="%d"> +Font class 6 b: <b... FONT="%s%s"MAG="%d"ORD="%d"> +l. 27 --- needs --- a ....... --- +l. 28 --- needs --- b ....... --- +\EndVerbatim\EndHPage{}]\fi + +Newer: + +\Verbatim +Css: TD.caption{white-space: nowrap; } +Font("cmex","10","100") +Font("cmmi","10","100") +Font("cmmi","5","100") +Font("cmmi","7","100") +Font("cmr","10","100") +Font("cmr","5","100") +Font("cmr","7","100") +Font("cmsy","10","100") +Font("cmsy","7","100") +Font("cmti","10","100") +Font("cmtt","10","100") +Font_Class(1,""): <IMG SRC=""ALT=""CLASS="%s%s-%d--%x"> +Font_Class(3,"mva"): <IMG SRC=""ALT=""CLASS="%s-%d--%x"ALIGN="MIDDLE"> +Font_Class(6,"ul"): <SPAN CLASS="underline"></SPAN> +Font_Css("sc"): .small-caps{font-variant: small-caps; } +Font_Css("ul"): .underline{text-decoration:underline; } +\EndVerbatim + +The \`'Font(...)' indicates the fonts in use; it's format is determined +by the system variable LGFNT, and can be changed within the env file +through a `f' flagged field. The indicated fonts are used for deciding +which entries in \`'htf.sty' should be introduced into the css file. + +The \`'Font_Class(...)' indicates the classes in use within the fonts; +it's format is determined by the system variable LGCLS, and can be +changed within the env file through a `c' flagged field. + +The \`'Font_Css' is a contribution from the TeX file, from +\`'\Configure{htf-css}{...}' commands. +It overides info found in \`'htf.sty'. + Its format can be +changed by \`'\Configure{FontCss}{...##1...}', before the +\''\Preamble' command. + +The \`'Css' is a contribution from the TeX file, from \`'\Css{...}' +comamnds that preced the \''\CssFile' command. Its format can be changed +by \`'\Configure{Css}{...##1...}', before the \''\Preamble' command. + +The \`'\special{t4ht;,}' prevents notification to the +log file of the change requested by \`'\Configure{htf}'. + +\`'\Configure{htf-css}{cmmi}{font-style: italic;}' +produces +\`'Font_Css_Plus cmmi font-style: italic;' +and that appears also in \`'htf.sty'. +The following are already in \`'htf.sty'. + + +%%%%%%%%%%%%%%%%%%%%%% +\Section{New Accents} +%%%%%%%%%%%%%%%%%%%%%% + +\<accents\><<< +\:CheckOption{new-accents} \if:Option + |<new accents|> +\else + |<tools for accents|> + |<old accents|> +\fi +>>> + + + + + +Some accents of TeX are defined through commands of the form +\`'\accent <number> <char>', and some throught macros (e.g., \''\b', +\''\c', and \''\d'). Moreover,the \`'\accent <number> <char>' reduces +to \`'\char <number>', whenever \''<char>' doesn't immediately follows +\''<number>' (however, font changes, etc, are possible in between). + +We can't decide the content of accented charaters without looking at +the htf fonts. The accented characters of the source (la)tex files +may go through transformations due to \''\uppercase' and +\''\lowercase' operations (e.g., \'+\uppercase \'a+). + +\<new accents\><<< +\def\:temp{\leavevmode\ifx \d:mathaccent\empty + \else \ht:special{t4ht\string~>1\d:mathaccent}\fi + \ht:special{t4ht*\string^m}\o:mathaccent:} +\HLet\mathaccent|=\:temp +\def\:temp{\leavevmode\ht:special{t4ht*\string^t}\o:accent:} +\HLet\accent|=\:temp +\NewConfigure{accent}[6]{\ht:special{t4ht*\string^t#1#2#1#3#1#4#1#5#1#6}} +\NewConfigure{mathaccent}[6]{\ht:special{t4ht#1\string + ^m#1#2#1#3#1#4#1#5#1}\edef\d:mathaccent{#6}} +\let\d:mathaccent|=\empty +\NewConfigure{accented}[6]{\ht:special + {t4ht*\string^a#1#2#1#3#1#4#1#5#1#6}} +\NewConfigure{accenting}[3]{\ht:special{t4ht*\string^i#1#2#1#3#1#1}} +>>> + +%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Screening} +%%%%%%%%%%%%%%%%%%%%%% + +The following feature is used as in + +\`'\Configure{HAccent}\hat{AEIOUaeiou{}}{\Picture+{}}{\EndPicture}' + +and it screens which characters are allowed to use the native +definitions of the accents, and which one the commands tailored for +the hooks. + + + + +\<new accents\><<< +\NewConfigure{HAccent}[1]{\pic:Accent#1} +\def\pic:Accent#1#2#3#4{\edef\:tempb##1{{\expandafter\:gobble\string#1}}% + \pend:defI\:tempb{\choose:accent{####1}#2\relax|<par del|>}% + \append:defI\:tempb{{#3}{#4}}% + \expandafter\let\csname \string#1:\endcsname|=\:tempb + \edef\:tempb{\noexpand\Protect\noexpand\acc:nm{\string#1}}% + \HLet#1|=\:tempb} +\def\acc:nm#1{\csname \string#1:\endcsname} +>>> + +The following sub-utilities iteratively search the dictionary to check +whether the parameter is known. + +\<new accents\><<< +\def\choose:accent#1{\def\:accented{#1}\cs:accent} +\def\realx:par{\relax} +\def\cs:accent#1{\def\:tempa{#1}% + \ifx \:tempa\realx:par \expandafter\pic:accent + \else + \ifx \:tempa\:accented + \expandafter\expandafter\expandafter\nopic:accent + \else \expandafter\expandafter\expandafter\cs:accent\fi + \fi} +\def\pic:accent#1|<par del|>#2#3#4{% + #3\nopic:accent|<par del|>{#2}{}{}#4} +\def\nopic:accent#1|<par del|>#2#3#4{\expandafter\expandafter + \csname o:#2:\endcsname\expandafter{\:accented}} +>>> + +%%%%%%%%%%%%%%%%%%%%%% +\Section{Old Accents} +%%%%%%%%%%%%%%%%%%%%%% + + + +For entries not in the given font tables (not specified in the +\`'\Configure{accent}'), problems can arise for cases such as +\`'csname \ifmmode m\else t\fi :\acn:no\endcsname{#2}' and +\`'\hat{\char o}' when they don't go into pictures. + +\SubSection{Accents through `accents' Configurations} + +The +\`'\Configure{accent}\^\hat{{A-in}{A-out}{B-in}{B-out}...{}{last-out}} +{do-found} {do-not-found}' defines the text accent \''\^' and math +accent \''\hat'. In cases that the text or math accent has no counter math +accent, we fake \''\null' for the math part. + +When \''\hat{foo}' is encountered, a search is made for an \`'??-i' +that equals \`'foo' in the given accent table. If found, do-found is +executed; otherwise, do-not-found is executed. The do-found can reference the +??-out through \`'#1'. The do-not-found can reference the +old definition of \`'\hat' through \`'#1' and the foo through \`'#2'. + + + +\SubSection{Foundation for Accents} + + + + +\<tools for accents\><<< +\NewConfigure{accent}[5]{% + \expandafter\ifx \csname x:\string#2\endcsname\relax + \expandafter\edef + \csname x:\string#2\endcsname{\accent:cnt}% + |<save old accent comamnd|>% + |<new accent command|>% + \Advance:\accent:cnt by 1 + \fi + \edef\:tempa{\csname x:\string#2\endcsname}% + |<get accent config|>% + } +\def\accent:cnt{0} +>>> + +The \`'\csname t:\accent:cnt\endcsname' part is for the text mode, +and the \`'\csname m:\accent:cnt\endcsname' part is for math mode. + + +\<save old accent comamnd\><<< +\expandafter\let\csname t:\accent:cnt\endcsname|=#1% +\expandafter\let\csname m:\accent:cnt\endcsname|=#2% +>>> + + +\<new accent command\><<< +\edef\:temp{\ifx \accent:def\:UnDef \noexpand\def \else + \noexpand\accent:def \fi + \noexpand\:temp{\noexpand\ac:pc{\accent:cnt}}% + \noexpand\HLet\noexpand#1|=\noexpand\:temp + |<hook accent table|>}% +\:temp +\def\:temp{#1}\def\:tempa{#2}\ifx \:temp\:tempa \else \HLet#2|=#1\fi +>>> + +The search starts at \`'\ac:pc{\accent:cnt}'. +The accent table is stored in \`'\csname\accent:cnt :ac\endcsname'. +The table is searched by \''\acpc:', which puts the result in \''\end:accent'. + +\<hook accent table\><<< +\noexpand\pend:defI + \noexpand\:accnts{\noexpand\ifnum ########1=\accent:cnt + \noexpand\expandafter \noexpand\acpc: + \expandafter\noexpand\csname\accent:cnt :ac\endcsname + \noexpand\expandafter \noexpand\end:accent \noexpand\fi}% +>>> + +The pend above is just: +\`'\pend:defI\:accnts{\ifnum ########1=\accent:cnt + \expandafter\acpc: \csname\accent:cnt :ac\endcsname + \expandafter\end:accent\fi}' + + + +\<get accent config\><<< +\def\:temp{#3}\ifx \:temp\empty \else + \expandafter\def\csname \:tempa :ac\endcsname{#3} +\fi +\long\def\:temp##1##2{#4#5}\ifx \:temp\:gobbleII \else + \expandafter\def\csname C:\:tempa\endcsname##1{#4}% + \expandafter\def\csname MT:\:tempa\endcsname##1##2{#5}% +\fi +>>> + + + +\''\acp:c' might go to the aux file of latex, where \`':' has standard +cat code. Hence, the the protection on \''\csname' and not the command +itself (as was the case at the beginning). + + +\<old accents\><<< +\def\ac:pc{\Protect\csname acp:c\endcsname} +\def\acp:c#1#2{{\def\acn:no{#1}\def\:temp{#2}\ifx \:temp\empty + |<accent on empty arg|>% + \else |<tabacckludge|>% + \def\ac:pc{\ac:nt{#2}}\a:cpc{#1}\fi }} +\def\ac:nt{\csname \ifmmode m\else t\fi :\acn:no\endcsname} +>>> + +\<accent on empty arg\><<< +\ac:nt{}% +>>> + +\<old accents\><<< +\def\Ac:nt{\edef\:temp{\ifx \EndPicture\:UnDef + \def\noexpand\ac:pc{\noexpand\Protect \noexpand\acp:c}% + \expandafter\noexpand \csname MT:\acn:no\endcsname + \fi + \expandafter\noexpand + \csname\ifmmode m\else t\fi :\acn:no\endcsname}\:temp +} +>>> + +The second line above is for nested accents in nonpictorial +environments (e.g., \''\hat{\hat{x}}'). Otherwise, we are +getting an infinite loop because by now \''\ac:pc' has been +modified to equal \''\Ac:nt'. + + +\`' \def\acp:c#1#2{{\def\:temp{#2}\def\ac:pc{\accent#1 #2}\a:cpc{#1}}}' + +We can't have braces around \`'#2' in \`'\accent#1 #2' because they +get TeX \ifHtml[\HPage{confused}\Verbatim +\Draw \Text(--Ra\'ul--) \EndDraw +\EndVerbatim\EndHPage{}]\fi{} on the exact location of the mark. + + +\<old accents\><<< +\def\a:cpc#1{% + \ifx \EndPicture\:UnDef + \def\AC:PC{|<default accent|>% + }% + \:accnts{#1}\empty + \else \ac:pc \fi } +>>> + + +The \''\empty' is for the skiping over the leftover of the fonts, once +a font is found. It is used in \''\end:accent'. + +\<tools for accents\><<< +\def\end:accent#1\empty{} +\def\:accnts#1{} +>>> + + + + + + + +Latex has \`'\def\@tabacckludge#1{\csname #1\endcsname}'. + +\<tabacckludge\><<< +\let\@tabacckludge|=\:tabacckludge +>>> + +\SubSection{Getting the Html Replacement} + + +\<old accents\><<< +\def\acpc:#1#2{% + \def\:tempa{#1}\ifx \:tempa\empty + |<char/pic accent|>% + \else \ifx \:tempa\:temp \let\AC:PC|=\empty + |<accent for table entry|>\fi + \expandafter\acpc: + \fi} +>>> + +/:temp below is the parameter of the accent, and it can be empty +(e.g. \''\^{}'). If the parameter is empty, the accent is just a +character, given in the last parameter of \''\acpc:'. The recursive +macro \''\acpc:' eats two parameters at a time, and it terminates +when the first in the pair of parameters is empty. + +\<char/pic accent\><<< +\ifx \:temp\empty + \def\:tempa{#2}\ifx \:tempa\empty \AC:PC + \else |<accent for ?|>\fi +\else \AC:PC \fi +>>> + + +\<accent for ?\><<< +\csname \ifmmode m\else t\fi :\acn:no\endcsname{#2}% +>>> + + +\<accent for table entry\><<< +\csname C:\acn:no\endcsname{#2}% +>>> + + +The else \`'\csname \ifmmode m\else t\fi :\acn:no\endcsname{}' is for +the case that the parameter is empty, in which case the accent needs +to be converted into a stand alone character (e.g., \`'\={}'). + + +Default is needed for symbols not found in initiation tables. + + +\<default accent\><<< +{\let\AC:PC|=\ACP:C \let\ac:nt|=\Ac:nt \ac:pc}% +>>> + + + + + +The \`'\let\AC:PC=\ACP:C' above is for recursive cases like in +\`'$A\hat{B\hat{x}}$'. + + +\<config nonspecified accent\><<< + \def\:temp##1##2{#5#6}\ifx \:temp\:gobbleII \else +\expandafter\def\csname C:#3\endcsname##1{#5}% +\expandafter\def\csname MT:#3\endcsname##1##2{#6}% + \fi +>>> + + + + + + + + +\Section{End-of-Line Ch Characters} + +\<html utilities\><<< +\def\Hnewline{\:newlnch} +>>> + +Without the following, we get in toc things like \`'^^J' +that don't go together with catcode 13 for \`'^'. + +\<no Hnewline\><<< +\let\:newlnch|=\space +>>> + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Section{Symbols} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Check that all the symbols belong to TeX and LaTeX + + +\<shared config\><<< +\def\HChar#1{{\leavevmode |%\ifmmode\else\expandafter\immediate\fi|% +\ht:special{t4ht@#1}\ifnum #1>-1 \a:HChar\fi}} +\NewConfigure{HChar}{1} +\Configure{HChar}{x} +>>> + + + +There is a boundary case of \''\HChar{0}' we didn't +handle above. Do we want to take care of it? + + +\`'\HChar{i}' inserts the character code i, with its font info, if +i is positive. If i is negative, the font info is not included. The +first case is obtained with a special that inserts its content +directly, and the second by a special sending its content as override +on top of the next character. + +The \''\Configure' tells from where the font info comes. With the +presence of regular and pictorial symbols, we should be careful +not to get here into a mess. + +Without checking for the math mode the immediate becomes problematic in math mode (why?). + +\Verbatim +\documentclass{article} +\begin{document} +$\_$ vs \_ +\end{document} +\EndVerbatim + + +Same problem for tables (why?) + +\Verbatim +\documentclass{article} +\begin{document} +\begin{tabular}{l} \_ \end{tabular} +\end{document} +\EndVerbatim + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +\SubSection{Symbols} +%%%%%%%%%%%%%%%%%%%%%%%%%% + +% After |<dvi-based hooks|> + +% |<html math and non-math symbols|> |%after <math>|% + +% \<html math and non-math symbols\><<< +% \ifHtml +% \let\:copyright|=\copyright +% \def\::copyright{\gt:ch\:copyright{copy}} +% \def\copyright{\Protect\::copyright} +% \def\gt:ch#1#2{\ifx \EndPicture\:Undef \HCode{}\else #1\fi } +% \fi +% >>> +% + + +\<shared config\><<< +\NewConfigure{@Picture}[1]{\def\a:@Picture{#1}} +\let\a:@Picture|=\:gobble +>>> + + + + + +\Chapter{Dvi-Based Hooks} + +\<dvi-based hooks\><<< +|<tracing dvi|> +|<sent to dvi|> +>>> + + + +\Section{Tracing Dvi} + +\<tracing dvi\><<< +\def\HTrace#1{\csname #1:T\endcsname} +\def\EndHTrace#1{\csname #1:t\endcsname} +>>> + +\<tracing dvi\><<< +\def\RULE:T{\ht:special{t4ht@\%R}} \def\RULE:t{\ht:special{t4ht@\%r}} +>>> + +\<shared config\><<< +\NewConfigure{RULE}[5]{\ht:special{t4ht@\%\%R#1#2#1#3} + \ht:special{t4ht@\%\%r#1#4#1#5}} +>>> + +\<tracing dvi\><<< +\def\GROUP:T{\ht:special{t4ht@\%P}} \def\GROUP:t{\ht:special{t4ht@\%p}} +>>> + + +\<shared config\><<< +\NewConfigure{GROUP}[5]{\ht:special{t4ht@\%\%P#1#2#1#3} + \ht:special{t4ht@\%\%p#1#4#1#5}} +>>> + + +\<tracing dvi\><<< +\def\CHAR:T{\ht:special{t4ht@\%C}} \def\CHAR:t{\ht:special{t4ht@\%c}} +>>> + +\<shared config\><<< +\NewConfigure{CHAR}[5]{\ht:special{t4ht@\%\%C#1#2#1#3} + \ht:special{t4ht@\%\%c#1#4#1#5}} +>>> + +\<tracing dvi\><<< +\def\HSPACE:T{\ht:special{t4ht@\%H}} \def\HSPACE:t{\ht:special{t4ht@\%h}} +>>> + +\<shared config\><<< +\NewConfigure{HSPACE}[3]{\ht:special{t4ht@\%\%H#1#2#1#3}} +>>> + + +\<tracing dvi\><<< +\def\VSPACE:T{\ht:special{t4ht@\%V}} \def\VSPACE:t{\ht:special{t4ht@\%v}} +>>> + +\<shared config\><<< +\NewConfigure{VSPACE}[3]{\ht:special{t4ht@\%\%V#1#2#1#3}} +>>> + + + +tex4ht.c has implicit \`'\Configure{VSPACE}{.}{}{}', etc. for the +above. + + +Comamnd line `-p' requests tracings of specials. \`'\special{t4ht@/}' +for flip-floping requests of such tracings. + +The switch `-c' in the command line asks for context dump into the log +when dvi errors/ warning are provided. + +\Section{Sent to Dvi} + +All the control flow commads should be located within the +\`'\Send' environment. The \`'\send:special' takes care +of killing casses not obeying this requirement. + +\<sent to dvi\><<< +\def\Send#1{\Configure{Send:#1}} +\def\DviSend{\let\send:special|=\ht:special + \ht:special{t4ht\string~}\EndPauseBACK\ht:special{t4ht\string~}% + \ht:special{t4ht\string~}} +\def\EndDviSend{\send:special{t4ht\string~}% + \send:special{t4ht\string~}\PauseBACK\send:special{t4ht\string~}% + \let\send:special|=\:gobble} +\def\PauseBACK{\send:special{t4ht\string~<(}} +\def\EndPauseBACK{\send:special{t4ht\string~<)}} +\def\HideBACK{\send:special{t4ht\string~<[}} +\def\EndHideBACK{\send:special{t4ht\string~<]}} +\def\MiniBACK{\send:special{t4ht\string~<-}} +\def\EndMiniBACK{\send:special{t4ht\string~<+}} +>>> + +\<shared config\><<< +\let\send:special=\:gobble +\NewConfigure{Send:GROUP}[2]{\send:special{t4ht\string~<#1#2}} +\NewConfigure{Send:EndGROUP}[2]{\send:special{t4ht\string~>#1#2}} +\NewConfigure{Send:BACK}[1]{\send:special{t4ht\string~<*#1}} +>>> + + + +What \`'\MiniBACK...\EndMiniBACK' do here. + +\`'{\special{t4ht=}}' ----forcing a group +i.e. use \`'{\special{t4ht=}}^x' instead of \`'{}^x'. + + +\Section{Observations} + +\List{*} +\item \`'\HChar{...}' sends forward a character to the next printable +char (can be refined to specific characters). That is, it uses the +character of the command, with the decoration of the character that +follows. +\item \`'\special{t4ht@+...}' sends forward a string to the next printable +chr + + + +\item +\Verbatim + \special{t4ht@+. ...string...} configure insertions at eoln + \special{t4ht@+(} ignore spaces + \special{t4ht@+)} end ignore spaces + \special{t4ht@+[} ignore chs and spaces + \special{t4ht@+]} end ignore chs and spaces (but not the content of some + of the specials) + \special{t4ht@+!} get last ignored space (none, if from previous lines). +\EndVerbatim + + +\EndList + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\Chapter{Loose Ends} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%% +\Section{Hyphenation} +%%%%%%%%%%%%%%%%%% + +\<core tex\><<< +\def\hyphenation#1{} +>>> + + + + + + + + +%%%%%%%%%%%%% +\Section{String Encode} +%%%%%%%%%%%%% + +\<html config util\><<< +\expandafter\def\csname c:string-encoder:\endcsname#1{% + \expandafter\def\csname c:#1:\endcsname{% + \csname #1:String\endcsname + \expandafter\let\csname #1:String\endcsname=\empty + \expandafter\let\expandafter\Char:dic + \csname #1Char:dic\endcsname + \cnf:transString} + \expandafter\def\csname #1\endcsname##1##2|<par del|>{% + \if !##1!\expandafter\gob:par + \else + \expandafter\ifx \csname \string##1:#1EnCoDe\endcsname\relax + \string ##1\else + \csname \string##1:#1EnCoDe\endcsname + \fi + \if !##2!\expandafter\expandafter\expandafter\gob:par + \else + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \csname #1\endcsname + \fi + \fi + ##2|<par del|>% + } + \expandafter\def\csname #1Char:dic\endcsname##1##2{% + \def\:temp{##1}\ifx \:temp\empty \egroup + \else \egroup + \expandafter\append:def\csname #1:String\endcsname + {\expandafter\let + \csname \string##1:#1EnCoDe\endcsname=\:UnDef}% + \expandafter\def\csname \string##1:#1EnCoDe\endcsname{##2}% + \expandafter \cnf:transString + \fi + } +} +\def\cnf:transString{\bgroup + \catcode`\%=12 + \catcode`\~=12 + \catcode`\$=12 + \catcode`\&=12 + \catcode`\#=12 + \catcode`\^=12 + \catcode`\_=12 + \catcode`\?=12 \Char:dic } +\def\gob:par#1|<par del|>{} +>>> + + +Offers applications similar to the following one. + +\Verbatim +\Configure{string-encoder}{urlEncoder} + +\Configure{urlEncoder} + {!}{%21} + {"}{%22} + {#}{%23} + {$}{%24} + {%}{%25} + {&}{%26} + {'}{%27} + {(}{%28} + {)}{%29} + {+}{%2B} + {,}{%2C} + {<}{%3C} + {>}{%3E} + { }{+} + {}{} + + + + + \catcode`\%=11 + \catcode`\~=11 + \catcode`\$=11 + \catcode`\&=11 + \catcode`\#=11 + \catcode`\^=11 + \catcode`\_=11 + \catcode`\ =12 + + +\urlEncoder ! " # $ % & ' ( ) + , < > |<par del|> + +\Configure{urlEncoder}{}{} + +\urlEncoder ! " # $ % & ' ( ) + , < > |<par del|> +\EndVerbatim + + + +%%%%%%%%%%%%% +\Section{Moveright} +%%%%%%%%%%%%% + +\<shared config\><<< +\def\:temp{\a:moveright \o:moveright:} +\HLet\moveright|=\:temp +\NewConfigure{moveright}{1} +>>> + +The \''\leavevmode' is to force paragraph break, but we might end +here with extra one because of the internal content of the +parameter. An \''\IgnoreIndent' after \''\par' may solve the problem +of extra paragraph breaks, but it might also have adverse effect of +loosing paragraph breaks. + + +\Section{Debugging Mode} + + +\<debug\><<< +\:CheckOption{debug} +\if:Option |<html debug|> +\else |<no debug|> \fi +>>> + + + + + + + + + + + + + + + + +\Chapter{e tex/latex} + + +\Link[http://www.vms.rhbnc.ac.uk/e-TeX/v1/etex\string + _ref.html]{}{}e-TeX\EndLink + +\<e tex\><<< +\def\:temp{\o:beginL:\a:Lregion} +\HLet\beginL=\:temp +\def\:temp{\b:Lregion\o:endL:} +\HLet\endL=\:temp +\NewConfigure{Lregion}{2} +\def\:temp{\o:beginR:\a:Rregion} +\HLet\beginR=\:temp +\def\:temp{\b:Rregion\o:endR:} +\HLet\endR=\:temp +\NewConfigure{Rregion}{2} +>>> + + + + + + +\Chapter{Utilities} + + + +\Section{Vertical Break Points} + +La\TeX{} already has a \''\newpage'. Do we want the following to +be \''\clear:page'? + +\<general utilities\><<< +\ifx \newpage\:UnDef +\def\newpage{\vfil\penalty-10000 } +\fi +>>> + + + + + + + + + +\Section{Counters} + +With packages like pictex around, counters become scarce resources. +Hence, their use is minimized here in favor of macros. The tradeoff +in time is minor because counters are scarcely needed in TeX4ht. + + +NOTE: /g:advance in wripro...????????????????????? + + +\<general utilities\><<< +\ifx\tmp:toks\:UnDeF \csname newtoks\endcsname\tmp:toks\fi +\ifx\tmp:cnt\:UnDeF \csname newcount\endcsname\tmp:cnt\fi +\def\Advance:{\ip:op\advance\:Advance} +\def\Multiply:{\ip:op\multiply\:Advance} +\def\Divide:{\ip:op\divide\:Advance} +\def\gHAdvance{\ip:op\advance\g:Advance} +\def\gHMultiply{\ip:op\multiply\g:Advance} +\def\gHDivide{\ip:op\divide\g:Advance} +>>> + + +psfig already has /Multiply and /Divide + +When defined, \''\HAdvance' is the same as \''\Advance:'. + +\<general utilities\><<< +\def\DefOp#1#2{ + \ifx #1\:UnDef + \expandafter \ifx \csname #2:\endcsname\relax + \:warning{\string\DefOp...\string{#2\string}?}% + \else \expand:after{\let#1|=}\csname #2:\endcsname + \fi + \else \:warning{\string\DefOp\string#1\string{#2\string} + can't redefine \string#1}% + \fi +} +\DefOp\HAdvance{Advance} +\DefOp\HMultiply{Multiply} +\DefOp\HDivide{Divide} +>>> + + + +\<general utilities\><<< +\def\ip:op#1#2{\let\mth:op|=#1\let\adv:c|=#2\adv:} + +\def\adv:#1{\def\:var{#1}\futurelet\:temp\Advanc:} +\def\Advanc:{\ifx [\:temp \expandafter\Advanc:e + \else \expand:after{\expandafter\adv:c\:var}\fi} +\def\Advanc:e[#1]{\expandafter\adv:c\csname + \expandafter\string\:var[#1]\endcsname} + +\def\g:Advance#1{\bgroup \def\:temp{#1}% + \tmp:cnt|=#1\afterassignment\:gplus \mth:op\tmp:cnt} +\def\:gplus{\expandafter\xdef\:temp{\the\tmp:cnt}\egroup} +\def\:Advance#1{\bgroup \def\:temp{#1}% + \tmp:cnt|=#1\afterassignment\:aplus \mth:op\tmp:cnt} +\def\:aplus{\xdef\:temp{\def\expandafter\noexpand\:temp{\the\tmp:cnt}}% + \egroup \:temp} +>>> + +\<general utilities\><<< +\def\HAssign{\:ssg\edef} +\def\gHAssign{\:ssg\xdef} + +\def\:ssg#1#2{\let\d:fn|=#1\def\:var{#2}\futurelet\:temp\:Assgn} +\def\:Assgn{% + \ifx [\:temp + \expandafter\d:fn\:var[##1]{% + \noexpand\csname \expandafter + \string\:var[##1]\noexpand\endcsname}% + \expandafter\assg:m + \else \afterassignment\assg:v \expandafter \tmp:cnt \fi } + +\def\assg:v{\expandafter\d:fn\:var{\the\tmp:cnt}} +\def\assg:m[#1]{% + \def\:temp{\expandafter\d:fn + \csname \expandafter\string\:var[#1]\endcsname{\the\tmp:cnt}}% + \afterassignment\:temp \tmp:cnt} +>>> + + + +\Section{Pushdowns} + +\SubSection{Expanded Lists} + +\<utilities\><<< +\def\PushStack#1#2{% + \ifx #1\:UnDef \global\let#1|=\empty\fi + {\let\Picture|=\relax \xdef#1{{#2}{#1}}}} +\def\PopStack#1#2{% + \ifx #1\empty \:warning{empty \string\PopStack\string#1\string#2?}% + \global\let#2|=\empty + \else \def\:temp{\:recall#1#2}\expandafter\:temp#1\fi} +\def\:recall#1#2#3#4{\gdef#1{#4}\gdef#2{#3}} +>>> + +\SubSection{Control Sequences} + +\<utilities\><<< +\def\PushMacro#1{% + \expandafter\ifx \csname c:\string#1\endcsname\relax + \expandafter\gHAssign \csname c:\string#1\endcsname |= 0 + \fi + \HAssign\:temp |= \csname c:\string#1\endcsname + \let\:tempa|=#1% + \ifx \:tempa\:UnDef \let\:tempa|=\like:unDef\fi + \global\expandafter\let\csname \:temp\string#1\endcsname |= \:tempa + \expandafter\gHAdvance \csname c:\string#1\endcsname |by 1 } +>>> + +\<utilities\><<< +\def\PopMacro#1{% + \expandafter\gHAdvance \csname c:\string#1\endcsname |by -1 + \HAssign\:temp |= \csname c:\string#1\endcsname\relax + \ifnum \:temp < 0 + \expandafter\gHAssign \csname c:\string#1\endcsname |= 0 + \:warning{ignored \string\PopCs\string#1 on empty stack}% + \else + \expand:after{\let#1|=}\csname \:temp\string#1\endcsname + \ifx #1\like:unDef \let#1|=\:UnDef\fi + \fi + } +\def\like:unDef{\:UnDef\:CS} +>>> + + +\<utilities\><<< +\def\PushConfigure#1{\def\cf:name{#1}\expandafter + \expandafter\expandafter\Push:Configure\expandafter + \meaning\csname c:#1:\endcsname|<par del|>} +\def\PopConfigure#1{\def\cf:name{#1}\expandafter + \expandafter\expandafter\Pop:Configure\expandafter + \meaning\csname c:#1:\endcsname|<par del|>} +\def\do:undef#1->#2|<par del|>{% + \if :#2:\:warning{\string\PushConfigure{\cf:name}?}\fi +} +\catcode`\@=6 +\catcode`\#=12 +\def\Push:Configure@1|<par del|>{% + \do:undef@1->|<par del|>% + \do:para@1#1|<par del|>\push:config + \do:parb@1#2|<par del|>\push:config + \do:parc@1#3|<par del|>\push:config + \do:pard@1#4|<par del|>\push:config + \do:pare@1#5|<par del|>\push:config + \do:parf@1#6|<par del|>\push:config + \do:parg@1#7|<par del|>\push:config + \do:parh@1#8|<par del|>\push:config + \do:pari@1#9|<par del|>\push:config +} +\def\Pop:Configure@1|<par del|>{% + \do:pari@1#9|<par del|>\pop:config + \do:parh@1#8|<par del|>\pop:config + \do:parg@1#7|<par del|>\pop:config + \do:parf@1#6|<par del|>\pop:config + \do:pare@1#5|<par del|>\pop:config + \do:pard@1#4|<par del|>\pop:config + \do:parc@1#3|<par del|>\pop:config + \do:parb@1#2|<par del|>\pop:config + \do:para@1#1|<par del|>\pop:config +} +\def\do:para@1#1@2|<par del|>@3{@3{a}{@2}} +\def\do:parb@1#2@2|<par del|>@3{@3{b}{@2}} +\def\do:parc@1#3@2|<par del|>@3{@3{c}{@2}} +\def\do:pard@1#4@2|<par del|>@3{@3{d}{@2}} +\def\do:pare@1#5@2|<par del|>@3{@3{e}{@2}} +\def\do:parf@1#6@2|<par del|>@3{@3{f}{@2}} +\def\do:parg@1#7@2|<par del|>@3{@3{g}{@2}} +\def\do:parh@1#8@2|<par del|>@3{@3{h}{@2}} +\def\do:pari@1#9@2|<par del|>@3{@3{i}{@2}} +\catcode`\@=11 +\catcode`\#=6 +\def\push:config#1#2{% + \if :#2:\else + \expandafter\expandafter\expandafter\ifx \expandafter + \csname \csname#1New:Conf\endcsname\cf:name\endcsname\relax + \:warning{\string\PushConfigure{\cf:name} Failed}% + \else + \expandafter\expandafter\expandafter\PushMacro \expandafter + \csname \csname#1New:Conf\endcsname\cf:name\endcsname + \fi + \fi } +\def\pop:config#1#2{% + \if :#2:\else + \expandafter\expandafter\expandafter\ifx \expandafter + \csname \csname#1New:Conf\endcsname\cf:name\endcsname\relax \else + \expandafter\expandafter\expandafter\PopMacro \expandafter + \csname \csname#1New:Conf\endcsname\cf:name\endcsname + \fi + \fi } +>>> + + +\Section{Catergory Codes} + +We need category code 12, and not 11, because the latter +choise would cause control sequences of unbounded length within +the option \`'\Verbatim-'. + +\<general utilities\><<< +\def\no:catcodes#1#2#3{% + \tmp:cnt|=#1 + \def\no::catcodes{% + \catcode\tmp:cnt|=#3 + \ifnum\tmp:cnt<#2 + \advance\tmp:cnt |by 1 \expandafter\no::catcodes + \fi }% + \no::catcodes } +>>> + + +\Section{/pend:def and /append:def} + +The \''\long' below is to allow \''\par' in the second argument. + +\<early utilities\><<< +\long\def\append:def#1#2{% + \long\def\:temp{\long\def#1}% + \expandafter\expandafter\expandafter\:temp\expandafter{#1#2}} +\long\def\pend:def#1#2{% + \long\def\:temp{#2}% + \long\def\:tempa{\long\def#1}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\:tempa + \expandafter\expandafter\expandafter{\expandafter\:temp #1}} +\long\def\pend:defI#1#2{% + \long\def\:tempa{\long\def#1####1}% + \ex:pend{#2}{\expandafter\:temp #1{##1}}} +\long\def\ex:pend#1{\long\def\:temp{#1}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\:tempa + \expandafter\expandafter\expandafter} +>>> + +\<early utilities\><<< +\long\def\append:defI#1#2{% + \long\def\:temp{\long\def#1####1}% + \expandafter\expandafter\expandafter\:temp\expandafter{#1{##1}#2}} +\long\def\pend:defII#1#2{% + \long\def\:tempa{\long\def#1####1####2}% + \ex:pend{#2}{\expandafter\:temp #1{##1}{##2}}} +\long\def\append:defII#1#2{% + \long\def\:temp{\long\def#1####1####2}% + \expandafter\expandafter\expandafter\:temp\expandafter{#1{##1}{##2}#2}} +\long\def\pend:defIII#1#2{% + \long\def\:tempa{\long\def#1####1####2####3}% + \ex:pend{#2}{\expandafter\:temp #1{##1}{##2}{##3}}} +\long\def\append:defIII#1#2{% + \long\def\:temp{\long\def#1####1####2####3}% + \expandafter\expandafter\expandafter + \:temp\expandafter{#1{##1}{##2}{##3}#2}} +>>> + +\SubSection{/Odef} + +\<general utilities\><<< +\HAssign\def:cnt=0 +\def\Odef#1{\gHAdvance\def:cnt |by 1 + \edef#1{\noexpand\with:op + \expandafter\noexpand\csname \def:cnt \string#1\endcsname }% + \expandafter\gdef\csname\def:cnt\string#1\endcsname} +\def\with:op#1{\let\n:xt|=#1\futurelet\:temp\wth:opt} +\def\wth:opt{\ifx [\:temp + \expandafter\n:xt\else \expand:after{\n:xt[]}\fi} +>>> + +The +\`' \expandafter\gdef\csname\def:cnt\string#1\endcsname}' +allo \`'\global\let#1=#1'. + + + + + +\Section{/Needs} + +\<general utilities\><<< +\def\Log:Needs#1{{\escapechar=`\\\immediate\write-1{\:Neds{#1}}}} +>>> + +\<html config util\><<< +\def\c:Needs:{\def\:Needs##1} +\expandafter\def\csname c:Needs-:\endcsname{\def\:Neds##1} +>>> + + + + + +Put the following in a group so that the temporary variables +will not interfere with other usages. + +\<html utilities\><<< +\def\Needs{\bgroup\catcode`\"=12 \cat:Needs} +\def\cat:Needs#1{\def\:temp{-}\def\:tempa{#1}\ifx \:temp\:tempa + \aftergroup\Log:Needs \else \ht:special{t4ht+@\:Needs{#1}}\fi + \egroup} +>>> + + + + + +\Section{/HCommand and /LinkCommand} + + + + + + +The following is introduced at the end of the style file, to +allow for \''\Contribute{name}{...}' commands that check +for the legality of \`'name'. Otherwise, it +is identical to the above. + + + + +\`'\LinkCommand\Frame{FRAME,SRC,ID} +\Frame{a}{A}...\EndFrame +\LinkCommand\FRAME{FRAME,SRC,ID,attr} +\LinkCommand\FRAME{FRAME,SRC,ID,attr,/,sharp} +\FRAME{a}{A} +\FRAME[b 1]{c}{d}' + + + + +\<html utilities\><<< +\def\LinkCommand#1#2{\L:Com#1#2,,,,,,|<par del|>{#1}} +\let\:Link|=\Link +\def\L:Com#1#2,#3,#4,#5,#6,#7,#8|<par del|>#9{\def\:tempe{#7}% + \def\:tempa{#2}\def\:tempb{#3}\def\:tempc{#4}\def\:tempd{#6}% + \expandafter\edef\csname + End\expandafter\:gobble\string #9\endcsname{% + \ifx\:tempd\empty \noexpand\HCode + {\Hbrakets</\ifx\:tempa\empty \tag:A\else#2\fi>}\fi }% + \edef\:temp{% + \noexpand\Odef\noexpand#1[####1]####2####3{{% + \def\noexpand\tag:A{\ifx\:tempa\empty\tag:A\else#2\fi}% + \def\noexpand\HREF:{ \ifx\:tempb\empty\HREF:\else#3=\fi}% + \def\noexpand\NAME:{ \ifx\:tempc\empty\NAME:\else#4=\fi}% + \def\noexpand\empty:lnk{\ifx\:tempd\empty\else#6\fi}% + \def\noexpand\:sharp{\ifx\:tempe\empty\:sharp\else#7\fi}% + \noexpand\M:link[####1 #5]{####2}{####3}}}}\:temp + |<add - opt to command|>% + } +>>> + + +\<add - opt to command\><<< +\expandafter\let\csname \string#1 :\endcsname|=#1 +\def#1{\bgroup\LD:Link{#1}\futurelet#1\M:link} +>>> + +\<html utilities\><<< +\def\LD:Link#1{% + \def\M:link{\ifx -#1\egroup \def\M:link{\:Link-}\expandafter\gob:lnk + \else \egroup \let\M:link|=\:Link \fi + \csname \string#1 :\endcsname }} +\def\gob:lnk#1-{#1} +>>> + +\<html Configure's\><<< +\NewConfigure{Link}[4]{% + \def\empty:lnk{#4}\ifx\empty:lnk\empty\else \def\:sharp{#4}\fi + \let\empty:lnk|=\empty \def\tag:A{#1}% + \def\HREF:{#2}\def\NAME:{#3}} +\Configure{Link}{}{}{}{} +\let\NOHREF:|=\:gobble +>>> + + + +The \`'\let\:Link|=\Link' is to allow for the redefinition of +\`'\Link' and hadling -. An \`'\if !#4!\else' will not work +for the case that \''\empty' is given to \''#4'. + + +% \`+\Attribute\onSelect{onSelect="loc='#1'"} +% \HCommand\Option{OPTION,\onSelect}+ +% +% \<html utilities\><<< +% \def\Attribute#1{% +% \def#1{\expandafter\noexpand\csname\string#1\endcsname}% +% \expandafter\def\csname\string#1\endcsname="##1"} +% >>> + + + + +\Section{Loose Ends} + + + +\<general utilities\><<< +\def\g:delete#1{% + \expandafter\expandafter\expandafter\global + \expandafter\let\csname #1\endcsname|=\:UnDef +} +\def\xdef:cs#1{\expandafter\xdef \csname #1\endcsname}% +\def\:csname{\expandafter\noexpand\csname} +>>> + + +\<general utilities\><<< +\long\def\:gobble#1{} +\long\def\:gobbleII#1#2{} +\long\def\:gobbleIII#1#2#3{} +\long\def\:gobbleIV#1#2#3#4{} +\long\def\:gobbleV#1#2#3#4#5{} +\long\def\:gobbleVI#1#2#3#4#5#6{} +\long\def\:gobbleVIII#1#2#3#4#5#6#7#8{} +>>> + + + + + + + + + + + +\ifHtml[\HPage{more}\Verbatim +change CutAt{a,b} to CutAt{a,/b} and add exercises here. +\EndVerbatim\EndHPage{}]\fi + + +\ifHtml[\HPage{more}\Verbatim + +In TeX4ht, \''\begin{...}' and \''\end{...}' are redefined +to \''\SaveEverypar\begin{...}' and \''\end{...}\RecallEverypar' +so it is pointless to directly deal with paragraph breaks +and saving. Since the saving and recalling are global +operations (in a pushdown fashion), the following +redefine the saved environment to eliminate +paragraph breaks after the environment. + + +WE HAVE here a problem if someone goes directly, e.g., for +\''\quotation...\endquotation' instead of +\''\begin{quotation}...\end{quotation}'. On the other hand, +LaTeX doesn't mention the first case as an option. +\EndVerbatim\EndHPage{}]\fi + + + +\<html utilities\><<< +\ifx\tmp:dim\:UnDeF \csname newdimen\endcsname\tmp:dim\fi +>>> + + + + +\SubSection{Protection} + +Fonts in sectioning titles can be a problem, when delivered to tocs. Hence, +we need to protect them from early expansions. + +Without the space, we can have in toc file expanded control +sequences (e.g., \`'\protect\tt x' becomming \''\ttx'). + +The following is for preveting expansions in edef environments while +preserving the meaning within standard environments. We need it, in +particular, for writing into toc and for (i.e., HPage?) CutAt when +titles of sections are referenced. + +\<html utilities\><<< +\def\pr:tc{\relax} +\let\prOteCt|=\relax +\def\Protect{% + \let\prOteCt|=\pr:tc + \ifx \prOteCt\pr:tc \let\prOteCt|=\relax + \else \noexpand\Protect\expandafter\noexpand\fi +} +>>> + +LaTeX has \`'\def\@unexpandable@protect{\noexpand\protect\noexpand}' to be included in immediate defines. + + +\Section{Tags} + +\SubSection{Html} + + +The following create \`'<A HREF="aav.\:html#Q1-5-1" +NAME="Q2-5-1">.........</A>' in the table of contents and +\`'<A HREF="a.\:html#Q2-5-1" NAME="Q1-5-1">..........</A>' in the +title. The address \`'Qi-j-m' tells that we deal with tag of type +\`'Qi', in file \`'j', for title \`'m' in the file. + + + +\<toc tag\><<< +Q>>> + + +The prefix \`'\<toc tag\>' is required for distinguishing the tocs tags +from other tags to allow for selective loading of cross references +when communicating toc info. + + + + + +\<csname: file name -> file id\><<< + FN >>> + + + + +\SubSection{Standard} + + +\FreeCode\<tag of Tag\> % to avoid duplication + +\<tag of Tag\><<< + cw:>>> + + + + + + + + + +\<File tag\><<< +(L >>> + + + + +\<next HPage tag\><<< +|<auto tag|>N >>> + + + +\<bib tag\><<< +|<auto tag|>B >>> + + + +\SubSection{Internal} + +\<tag MarkCurFile\><<< +cf: >>> + + + + + + +\Chapter{wripro.tex: HTML Stuff Shared by TeX4ht and AlProTex} + + + +TeX4ht writes its tags into \`+.ref+ files until ProTex takes over +and gets the tags into \`+.xref+ files. + + + + +\<check that TeX4ht is not loaded after protex\><<< +\def\:warning#1{\writesixteen{l.\the\inputlineno\space + --- TeX4ht warning --- #1 ---}} +\ifx \:ShowCode\:UnDeF \else + \:warning{|<TeX4ht name|>.sty loaded after ProTeX?} +\fi +>>> + + + +\`'\NewHaddr' provides an address that encodes a location +together with its file name. + +Is the followint true? We can have for hadresses +\`'\Link{Haddr}{} \Link{}{Haddr}' without worrying about +extracting the file names as long as we use HAddress we get from +\`'\NewHaddr'!!! That is, in \`'\Link'the [] option is needed +just for external files compiled separately. WELL, it seems to be true +for any tags because they are resolved indirectly through thr REF +file!!!! Great , how could I have forgotten about this pearl? + + +AlProTex used something like the following. +Create saving at direct programming of HREF and HTAG in \`'<A>' coomands, because we don't need now Ref/Tag intermediates. + +\<html utilities\><<< +\def\NewHaddr#1{\html:addr \let#1|=\last:haddr} +\def\GetHref#1{\expandafter\get:href#1-} +\def\GetHname#1{\expandafter\get:htag#1-} +\ifx \make:addr\:UnDeF + \def\make:addr#1{|<tail for file name|>#1} \fi +>>> + +\`'make:addr' may already be defined from AlProTex. It had\''\space' after \`'#1' that has been removed (see AlProTex). + + +\<html utilities\><<< +\def\FileNumber{\file:id} +\def\c:XrefFile:#1{\def\aXrefFile{#1}} +>>> + + +\openin15= wripro.tex +\ifeof15 \closein15 + \writesixteen{*********************************} + \writesixteen{* - error - missing wripro.tex *} + \writesixteen{*********************************} +\else \closein15 \input wripro.tex \fi + +\<warnings for missing /Link\><<< +\ifx \:::HRefTag\:UnDef\else + \pend:defII\:::HRefTag{% + \if \relax##1\relax\else + \expandafter\ifx\csname cw:)Q\aXrefFile ##1\endcsname\relax + \:warning{\string\Link{##1}?}\csname a:?Link\endcsname + \fi\fi } +\fi +>>> + +\<cross references\><<< +\NewConfigure{?Link}{1} +>>> + + +\Chapter{Background Material} +\Link[http://www.diku.dk/students/turtle/trick.html]{}{}Tricks for TeX +and LaTeX\EndLink{} (Collected by Peter M\o{}ller Neergaard) + + + +%------------------------------------------------------ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\<TeX4ht name\><<< +tex4ht>>> + + + + +%------------------------------------------------------- +\openin15= wripro.tex +\ifeof15 \closein15 + \writesixteen{***********************************} + \writesixteen{* -- error -- missing wripro.tex -*} + \writesixteen{* Making a broken tex4ht.sty file.*} + \writesixteen{* Don't use this tex4ht.sty file! *} + \writesixteen{***********************************} +\else \closein15 \fi +%------------------------------------------------------- + +\OutputCode\<tex4ht\> + + +\bye |