% lollipop-text.tex copyright 1992 Victor Eijkhout
% copyright 2014--2016 Vafa Khalighi
%
%
%    This program is free software: you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as published by
%    the Free Software Foundation, either version 3 of the License, or
%    (at your option) any later version.
%
%    This program is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Text Blocks

\@GenericConstruct{TextBlock}

% commands can be before and after text
% store in two token lists
% switch from one to other by option 'text'
% this may also be used by ParagraphShape
%
\add@TextBlock@default{
    \def\@current@options@list{before@coms}
    \def\switch@lists{\at@breakpointyes
        \def\@current@options@list{after@coms}}
    }
\@TextBlockOption{text}{\switch@lists}

\def\@DefineTextBlock{
    \csarg\edef{\@name}{\@gen@open
        \the\before@coms
        }
    \@DefineStopCommand{\the\after@coms \@gen@close}
    }

    

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% A L I N E A V O R M E N
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% via \everypar:
% \everypar={\@everyeverypar { ...locaal spul...
%                              \def\par{... \@par\egroup}
\@GenericConstruct{ParagraphShape}

%%%%!!!!!!!!!!!!!!!!
% not functioning.
% note: \@defaulteverypar is installed now
% as a start@command!

%% anonieme namen
% \iftempa : moet dit inspringen
% \iftempb : speciale behandeling staart?

\def\@ParagraphShapeverstekwaardes{
    \tempano \tempbno
    \temptoksb={} \temptoksc={}
    \def\cs@d{b}\def\@current@options@list{temptoks\cs@d}
    }
\def\@DefineParagraphShape{
    \csarg{\edef}{\@name}{%
          \CSname{AltijdInspringen\iftempa yes\else no\fi}%
          \nxp\everypar={\nxp\@everyeverypar
              \iftempb \bgroup \fi
              \the\temptoksb 
              \iftempb \parfillskip\z@ 
                  \else \if@erislinkswit \parfillskip\z@ \fi\fi
              \relax
              \iftempb \def\nxp\par{\nxp\unskip\nxp\nobreak\the\temptoksc 
                                  \hbox{}\nxp\@par\egroup}\fi
         }}              }

\@ParagraphShapeNOOP{verticaal}

%-- inspringen
\@ParagraphShapeOption{inspringen}{
    \if\EqualString{#1}{no}\else\tempayes\fi}

%-- tekst
\@ParagraphShapeOption{tekst}{\tempbyes\def\cs@d{c}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% U T I L I T I E S
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%% Space, white space
%
% unit space \@@space is set by switching font style
%
\newdimen\@@space \@@space=.5em
\def\Spaces:#1 {\hskip#1\@@space}

% handig voor bibliografieen
\def\lax{\tolerance\@m \hfuzz\p@}


%%%%%%%%%%%%%%%%%%%%%%%
% White space
%
\NewTrace:skip

\def\hwhite:#1 {\@hwhite{#1}}
\def\@hwhite#1{\ifhmode\unskip\fi\relax 
    \if\EqualString{#1}{fillup}\hfill\else\hskip\@ww{#1}\relax\fi}

% Vertical
% subtle: argument should be placed even if
% size is equal: stretch may be different,
% probably more. (cf \par\vwit{0pt plus 1fil} )
%
\def\vwhite:#1 {\@vwhite{#1}}
\@GenericOption{vwhite}{\protect@breakpoint
    \@add@toks{\@vwhite{#1}}\at@breakpointno}
\def\@vwhite#1{\tempskipa=\@ww{#1}\relax \tempskipb\lastskip
    \Tmessage[skip]{Considering vskip \the\tempskipa}%
    \ifvmode \ifdim\tempskipb>\tempskipa
             \Tmessage[skip]{Ignored. (lastskip=\the\tempskipb)}%
          \else \Tmessage[skip]{Backvspacing \the\tempskipb}%
             \vskip-\tempskipb 
             \Tmessage[skip]{Vskip \the\tempskipa}%
             \vskip\tempskipa \fi
    \else \if\EqualString{#1}{fillup}\hfill
          \else\vskip\tempskipa \fi
    \fi}

% advance skip by literal or name of control sequence
\def\advance@skip#1#2{\advance#1\@ww{#2}\relax}

% only backspace the previous; 
% in this case prevent creating a breakpoint
% if there was no glue
%
\def\v@buffer#1{\tempskipa=\@ww{#1}\relax \tempskipb\lastskip
    \Tmessage[skip]{Clearing for vskip \the\tempskipa}%
    \ifvmode \ifdim\tempskipb>\tempskipa 
        \else \ifdim\tempskipb=\z@ 
            \else \vskip-\tempskipb\relax 
                  \Tmessage[skip]{Backspaced}\fi
    \fi \fi}
\def\unhskip{\ifhmode\unskip\fi}
\def\leavehmode{\unvbox\voidb@x}
\def\novbreak{\leavehmode\nobreak}

\def\white:#1 {\@white{#1}}
\@GenericOption{white}{\protect@breakpoint
    \@add@toks{\@white{#1}}\at@breakpointyes}
\def\@white#1{\ifhmode\@hwhite{#1}\else
    \ifvmode\@vwhite{#1}\fi\fi}
\def\fillup{\@white{0pt plus1fill}}

\def\@@distance#1{\csarg\newskip{#1}}
\def\Distance:#1=#2
   {\if\UndefinedCS{#1}\@@distance{#1}\fi
    \edef\cs@e{\global\noexpand\set@value{#1}%
               \if\UndefinedCS{#2}{#2}%
               \else \CSname{#2}\fi}
    \cs@e}
\def\AdaptiveDistance:#1=#2 {\Distance:#1=#2
    \adds@stop@command
      {\ifWriteExtern\immediate\write\aux@file
         {\string\Distance:#1={\xp\the\csn#1\ecs}}\fi
         }}

\Distance:filler={0pt plus 1fil}
\parindent=30pt
\parskip=0pt
\parfillskip=0cm plus 1 fil
\baselineskip=12pt

%%%%%%%%%%%%%%%% Rules
\@GenericOption{rule}{
    \if\EqualString{#1}{h}\protect@breakpoint
         \@add@toks{\hrule#2\relax}
         \at@breakpointyes
    \else\if\EqualString{#1}{v}\@add@toks{\vrule#2\relax}
         \else\Wmessage{Strange option: <rule:#1=#2>}
    \fi  \fi}
\@GenericOption{hrule}{\protect@breakpoint
    \@add@toks{\hrule}\at@breakpointyes}
\@GenericOption{vrule}{\@add@toks{\vrule}}

%%%%%%%%%%%%%%%% Indentation Control
% default value for all paragraphs set by AlwaysIndent
% this one is set by by the user,
% or by 'indentinside' option of paragraph shapes
%
\DefineTest:AlwaysIndent
\AlwaysIndent:yes

% override by Indent
% can be set by the user,
% or by start/end of text constructs
%
\DefineTest:Indent       %forceer/onderdruk inspringen

% Remove indentation
% this is executed by \every@everypar
%
\def\controlled@indentation
   {\ifAlwaysIndent
          \ifIndent \else \remove@indent \Indent:yes \fi
    \else \ifIndent \Indent:no \else \remove@indent \fi
    \fi}
\def\remove@indent{{\setbox0=\lastbox}}

\def\noindentation{\AlwaysIndentno \Indentno}

% Indentation control in Universal Block
% control sequences \first@indent \inside@indent \after@indent
% are called (in \edef context) in general open/close macros
% for universal environments

% Indent after this block
% \global because the block may be in a further group
%
\add@generic@default{\def\after@indent{\global\nxp\Indent:no }}
\@GenericOption{indentafter}{
    \def\after@indent{\global\nxp\Indent:#1 }}

% Indent in this block
\add@generic@default{\def\inside@indent{}}
\@GenericOption{indentinside}{
    \def\inside@indent{\nxp\AlwaysIndent:#1 }}

% Indent first in this block
\add@generic@default{\def\first@indent{\nxp\Indent:no }}
\@GenericOption{indentfirst}{
    \def\first@indent{\nxp\Indent:#1 }}

%%%% Level dependent indentation
%
\NewTrace:indent

% Lots of commands and parameters
%
% \levelindent is the indentation that will be taken
%    on the current level, jumping to the next
%
\newdimen\levelindent 

% \previousindent is the indentation that got us to this level
%    list item labels have to outdent over this amount
%
\newdimen\previousindent \previousindent\z@

% indentlevel counter: used to generate automatic indentation,
%    for instance \levelindentvi for level vi
%
\new@@counter{indentlevel}
\set@counter{indentlevel}1

% \set@level@indent : set \levelindent to automatically
%    generated indentation; if \levelindentiii is defined take it,
%    otherwise use \@@level@indent{3}, which uses fraction
%    of a \basicindent
%
\def\set@level@indent{\levelindent=
    \level@indent{\cs@counter@name{indentlevel}}}
\def\level@indent
 #1{\if\UndefinedCS{\@level@indent{#1}}\@@level@indent{#1}%
    \else \csname \@level@indent{#1}\endcsname \fi}
\def\@level@indent#1{levelindent\romannumeral#1}
\def\@@level@indent#1{\ifcase#1\z@\or
 \basicindent \or .75\basicindent \else .5\basicindent \fi}

\DefineTest:BasicIndentIsSet
% the following lines appear as the last command in \Start,
% so that the user can tinker with \parindent
% through adaptive distances or in the style
%\ifBasicIndentIsSet\else\Distance:basicindent=parindent\fi
%\set@level@indent

% \SetLevelIndent : set exact amount of indentation for
%    specific level
%
\def\LevelIndent:#1=#2 {\csarg\edef{\@level@indent{#1}}{\@ww{#2}}}

% Push/Pop indentlevels
%
\def\PushLeftIndentLevel
   {\Tmessage[indent]{Old left indent: \the\leftskip}%
    \advance\leftskip\levelindent 
    \previousindent=\levelindent
    \step@counter{indentlevel}\set@level@indent
    \Tmessage[indent]{New left indent: \the\leftskip, 
                      at level \the\cs@counter@name{indentlevel}}%
    }
    
\let\PushIndentLevel\PushLeftIndentLevel % for backwards compatibility

% Popping an indent level requires two pops: one for the \levelindent
% and one for the \previousindent. This last one then has to be 
% pushed again.
%
\def\PopLeftIndentLevel
   {\ifnum\cs@counter@name{indentlevel}=\@ne
        \Emessage{Pop left indent level attempted at outer level}
    \else \back@step@counter{indentlevel}%
        \back@step@counter{indentlevel}%
        \set@level@indent \previousindent\levelindent
        \step@counter{indentlevel}%
        \set@level@indent\advance\leftskip-\levelindent
    \fi}
    
\let\PopIndentLevel\PopLeftIndentLevel % for backwards compatibility
  
\def\PushRightIndentLevel
   {\Tmessage[indent]{Old right indent: \the\rightskip}%
    \advance\rightskip\levelindent 
    \previousindent=\levelindent
    \step@counter{indentlevel}\set@level@indent
    \Tmessage[indent]{New right indent: \the\rightskip, 
                      at level \the\cs@counter@name{indentlevel}}%
    }
    
\def\PopRightIndentLevel
   {\ifnum\cs@counter@name{indentlevel}=\@ne
        \Emessage{Pop right indent level attempted at outer level}
    \else \back@step@counter{indentlevel}%
        \back@step@counter{indentlevel}%
        \set@level@indent \previousindent\levelindent
        \step@counter{indentlevel}%
        \set@level@indent\advance\rightskip-\levelindent
    \fi}
    
\def\PushLeftRightIndentLevels
   {\Tmessage[indent]{Old left indent: \the\leftskip}%
     \Tmessage[indent]{Old right indent: \the\rightskip}%
    \advance\leftskip\levelindent 
    \advance\rightskip\levelindent 
    \previousindent=\levelindent
    \step@counter{indentlevel}\set@level@indent
    \Tmessage[indent]{New left indent: \the\leftskip, 
                      at level \the\cs@counter@name{indentlevel}}%
    \Tmessage[indent]{New right indent: \the\rightskip, 
                      at level \the\cs@counter@name{indentlevel}}%
    }    

\def\PopLeftRightIndentLevels
   {\ifnum\cs@counter@name{indentlevel}=\@ne
        \Emessage{Pop left and right indents level attempted at outer level}
    \else \back@step@counter{indentlevel}%
        \back@step@counter{indentlevel}%
        \set@level@indent \previousindent\levelindent
        \step@counter{indentlevel}%
        \set@level@indent\advance\rightskip-\levelindent
                                       \advance\leftskip-\levelindent
    \fi}

%%%%%%%%%%%%%%%% Paragraph Skip control
% parskip is stored and set to zero at the start and end
% of environments
\newskip\@restoreparskip 

% it is recorded if a parskip has been stored
%
\newif\if@parskipsaved \@parskipsavedno

% Do no parskip
% used at start of environment
%
\def\hold@parskip
   {\@restoreparskip\parskip \parskip\z@ \@parskipsavedyes}

% Hold off parskip
% used at end of environment
%
\def\dono@parskip{\if@parskipsaved \else \hold@parskip \fi}

% Reestablish the parskip
% this is executed in \every@everypar
%
\def\controlled@parskip
   {\if@parskipsaved \@parskipsavedno 
        \parskip\@restoreparskip
    \fi}

\def\noparskip{\parskip\z@ \@restoreparskip\z@}

%%%%%%%%%%%%%%%% Every Paragraph
% \everypar is supposed to contain \every@everypar
% as its first element.
%
\newtoks\EveryParagraph
\def\every@everypar{\controlled@indentation \controlled@parskip
    \one@shot@coms \@headedno}
\def\default@everypar{\everypar={\every@everypar\the\EveryParagraph}}
\add@start@command{\default@everypar}
\everypar{\Emessage{You forgot to give the \nxp\Start\@space command.}}

% Execute once
%
\newtoks\one@shot@toks
\def\one@shot@coms{\temptoksa\one@shot@toks 
    \global\one@shot@toks={}\the\temptoksa\temptoksa{}}
\def\next@paragraph#1{\append@to@list{one@shot@toks}{#1}}

%%%%%%%%%%%%%%%% Every Math
% just like \everypar.
%
\newtoks\EveryMath
\newtoks\EveryDisplay
\newtoks\every@everymath \newcount\high@fam
\every@everymath{\high@fam\count18\relax
    %\MainFace
    \xp\math@setsize\style@sizes}
\everymath{\the\every@everymath\the\EveryMath}
\everydisplay{\the\every@everymath\the\EveryDisplay}

% Flush margins
%
\Distance:rightmarginstretch={0pt plus 6cm}
\Distance:leftmarginstretch={0pt plus 6cm}
\def\FlushLeft:#1 {\switch {\if\EqualString{#1}}
    {yes} {\leftskip=1\leftskip}
    {default} {\leftskip=1\leftskip
               \advance\leftskip\leftmarginstretch}
    \endswitch \relax}
\FlushLeft:yes
\def\FlushRight:#1 {\switch {\if\EqualString{#1}}
    {yes} {\rightskip=1\rightskip}
    {default} {\rightskip=1\rightskip
               \advance\rightskip\rightmarginstretch}
    \endswitch \relax}
\FlushRight:yes


% French Spacing
%
\def\FrenchSpacing:#1 {\switch {\if\EqualString{#1}}
    {yes} {\frenchspacing}
    {no} {\nonfrenchspacing}
    \endswitch \relax}
\FrenchSpacing:no

%%%%%%% lijn
% #1 : hoogte; #2 : lengte; #3 : elevatie
% parameters kunnen van achter af aan weggelaten worden;
% #4 is dummy, kan niet door de gebruiker gespecificeerd worden.
% NNNNNNNNNBBBBBBBBBBBBB: #2 werkt nog niet!!!!!!!!!!!!
\newtoks\@lijntoks
\@lijntoks={}

% Lijn. Hier moet ik nog eens naar kijken.
\@GenericOption{lijn}{
    \edef\cs@e{\nxp\lijnanalyse:#1:\@restarg::::;}\cs@e
    \edef\cs@e{\nxp\@add@toks{\nxp\leavevmode\the\@lijntoks}}
    \cs@e}

\def\lijnanalyse:#1:#2:#3:#4;{\@lijntoks={}
    \eqstring{#1}{}{}{\achteraanlijst{@lijntoks}{height #1 }}
    \eqstring{#2}{}{\vooraanlijst{@lijntoks}{\leaders\hrule depth 0cm }
                    \achteraanlijst{@lijntoks}{\hfill}}%
                   {\eqstring{#2}{uitvullen}%
                    {\vooraanlijst{@lijntoks}{\leaders\hrule depth 0cm }
                     \achteraanlijst{@lijntoks}{\hfill}}%
                    {\achteraanlijst{@lijntoks}{width \w@w{#2} }%
                     \vooraanlijst{@lijntoks}{\vrule depth 0cm }}
%    \eqstring{#3}{}{}{\vooraanlijst{@lijntoks}{\raise #3\hbox\bgroup}
%                      \achteraanlijst{@lijntoks}{\egroup}}
                   }
    \achteraanlijst{@lijntoks}{\hbox{}} % \par doet \unskip!!!
    }
    

%%%%%%%%%%%%%%%%%%%%%%%%%%% accenten
\gdef\allowhyphens{\penalty\@M \hskip\z@\relax}

%{\catcode`\"=12 \gdef\hex{"}}

%\catcode`\"=13
%\def "#1{\ifx#1i\discretionary{-}{i}{{\accent'177 \i}}%
\def\"#1{\ifx#1i\discretionary{-}{i}{{\accent'177 \i}}%
    \else\ifx#1-\allowhyphens-\penalty\z@\allowhyphens
    \else\ifx#1"\hskip\z@\relax
%    \else\ifx#1!\hex
    \else\ifx#1!"
    \else\ifx#1|\allowhyphens
    \else {\accent'177 #1}\fi\fi\fi\fi\fi}
      
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
%%%%%%%%%%%%%%%%%% C A S E
%% 
\def\UpperCase#1{\edef\cs@a{\uppercase{#1}}\cs@a}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% L E T T E R S P A C I N G
%% 
\def\LetterSpace
   {\ifnextchar[\@LetterSpace %] <- to fool emacs
               {\@LetterSpace[0ptplus1fil]}}
\def\@LetterSpace[#1]#2{\def\@LS{\hskip#1\relax}%
    \edef\cs@e{#2}\xp\@@LS\cs@e&}
\def\@@LS#1#2&{#1\if\IsEmptyList{#2}\xp\take@one\else\@LS\xp\@@LS\fi#2&}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%% Interdictions
%% 
\def\NoHyphenation{\hyphenpenalty\@M \exhyphenpenalty\@M}
\def\NoWidows{\widowpenalty\@M}
\def\NoOrphans{\clubpenalty\@M}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
%%%%%%%%%%%%%%%%%% V E R B A T I M
%% 

\def\setupverbatim{\let\do=\makeother \dospecials}

%% inline verbatim
\def\ver{\leavevmode\begingroup \setupverbatim \obeyspaces\tt \@ver}
\def\@ver#1{\def\@@ver##1#1{##1\endgroup}\@@ver}

%% display verbatim
{\activecr %
 \gdef\vVer>{\setupverbatim \obeyspaces %
      \tt \parindent\z@ \noparskip \obeylines %
      \ifnextchar
      \@@Ver\@Ver}\noeol %
 \gdef\@Ver#1<Rev{#1\VerStop}%
 \gdef\@@Ver
    #1<Rev{#1\VerStop}}

%% verbatim files
\def\verbatimfile#1{\begingroup
    \setupverbatim \obeyspaces \parindent\z@ \noparskip \obeylines %
    \tt \input#1\relax
    \endgroup}

\endinput

% 2016/05/14 defined \FrenchSpacing
% 2016/04/14 defined \PushLeftIndentLevel, \PopLeftIndentLevel, 
%                    \PushRightIndentLevel, \PopRightIndentLevel, 
%                    \PushLeftRightIndentLevels, and \PopLeftRightIndentLevels
%                    commands. \PushIndentLevel is now a synonym for
%                    \PushLeftIndentLevel and \PopIndentLevel is a synonym
%                    for \PopLeftIndentLevel
% 2014/04/13 defined \EveryParagraph, \EveryMath, and \EveryDisplay
% 2014/04/12 changed "#1 cs to \"#1 cs to be compatible with plain;
% also we can not make " active since it is used by xetex for font selection
% 92/11/08 white options created;
%      breakpoint protection in white options
% 92/11/18 AdaptiveDistance implemented
% 92/11/20 \set@counter calls updated for \w@w use
% 92/12/14 default flush right
