Chapter 2
Configurations

   2.1 Contributes
   2.2 Configurations
      Configure
      NewConfigure
   2.3 Tracing Configurations
   2.4 Editing and Xml
   2.5 Verify Elements

2.1 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 }
 -_-_-

2.2 Configurations

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
 -_-_-

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:}%
 -_-_-

2.3 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{\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////%
 -_-_-

2.4 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">&lt;}}
                 {\HCode{&gt;</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>&lt;}}{\HCode{&gt;</strong>}}
                 {<strong>&lt;}{&gt;</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}
 -_-_-

2.5 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{\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}
 -_-_-