% 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 . % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% 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: } \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