<..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 }
-_-_-
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
-_-_-
<..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:}%
-_-_-
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{\immediate\write16}
\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////%
-_-_-
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}
-_-_-
<..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{\immediate
\write16{\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{}%
\immediate\write16{\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
\immediate\write16{\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
\immediate\write16{\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{}%
\immediate\write16{\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}
-_-_-