Chapter 6
HPages and Cut Points

   6.1 HPages
      Specification Separated from Realization
      End HPage
      Debugging
      Utilities
   6.2 Requests for Cutpoints
      Connection to Super Divisions
      HPages
   6.3 Prev/Next Cut Buttons
      The ‘next’ Option
      File Naming
   6.4 Grouping Mecahanism for CutAt
      Utilities

<..cut points..>
 <.elements for cut points.>
 \ifHtml  <.html cut points.>
        <.tex html cut points.>
 \fi
 -_-_-

6.1 HPages

\HPage<block name>[tag]{title} ... \EndHPage{block name}

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

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

End HPage

\EndHPage[level]{bloc name}

<..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{}
 -_-_-

<..close HPages in @end..>
 \ifnum \HPageDepth> 0 \EndHPage[1]{}\fi
 <.document end for non-cut logical units.>%
 -_-_-

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  \immediate\write16{%
        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
 -_-_-

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

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

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 <button for cut at sect>.

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

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

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

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

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

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

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

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

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

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

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

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.>{}
 -_-_-