summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/zztex/zzvmode.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/plain/zztex/zzvmode.tex')
-rw-r--r--Master/texmf-dist/tex/plain/zztex/zzvmode.tex380
1 files changed, 380 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/plain/zztex/zzvmode.tex b/Master/texmf-dist/tex/plain/zztex/zzvmode.tex
new file mode 100644
index 00000000000..a81b33d2bd1
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/zztex/zzvmode.tex
@@ -0,0 +1,380 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Vertical Mode Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 21 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Interline Skip
+% --------- ----
+
+
+\def \nointerlineskip {%
+ \prevdepth = -1000pt}
+
+\def \offinterlineskip {%
+ \baselineskip = -1000pt
+ \lineskip = 0pt
+ \lineskiplimit = \maxdimen}
+
+% Vertical Skiping Environment
+% -------- ------- -----------
+
+
+% The following registers make up the vertical skiping environment.
+
+\definecount{\zvskenvtype}{0} % Previous vertical skip type.
+\definecount{\zvskenvpen}{0} % Previous columnbreak penalty.
+\defineskip{\zvskenvreq}{0pt} % Previous required base-to-base skip.
+\defineskip{\zvskenvskip}{0pt} % Previous actual skip amount.
+
+\chardef \zvskenvdiscard = 0 % Just initialized the environment.
+\chardef \zvskenvpar = 1 % Previous element was a paragraph.
+\chardef \zvskenvabove = 2 % Just finished an above skip.
+\chardef \zvskenvbelow = 3 % Just finished a below skip.
+\chardef \zvskenvmath = 4 % Previous element was a paragraph ending
+ % with a math display.
+
+\definecount{\zvskenvnopen}{20000\relax}
+
+\let \noskip = \mindimen
+
+
+% The vertical skiping environment is maintained in the vertical context.
+
+\zdeclareeveryvcontext{\zvskenvvcontext}
+
+\def \zvskenvvcontext {%
+ \zsavevcontext{\zvskenvtype=\the\zvskenvtype
+ \zvskenvpen=\the\zvskenvpen
+ \zvskenvreq=\the\zvskenvreq
+ \zvskenvskip=\the\zvskenvskip}%
+ \zvskpar
+ \global\zvskenvtype = \zvskenvdiscard}
+
+% Base-to-Base Skiping
+% ------------ -------
+
+
+\declareeverypar{\zvskpar}
+
+\def \zvskpar {%
+ \global\zvskenvtype = \zvskenvpar
+ \global\zvskenvpen = \zvskenvnopen
+ \global\zvskenvreq = \parskip \global\advance \zvskenvreq by \baselineskip
+ \global\zvskenvskip = 0pt}
+
+
+%~ This command produces vertical space so that the base-to-base
+%~ distance above the next element is equal to the *glue*. The
+%~ space is preceded by the specified *penalty*. If there is a font
+%~ change for the next element, it must be specified before this command.
+
+\def \bbskipabove #1#2{% {penalty}{glue} %^vspace
+ \if \neqlp{\zvskenvtype}{\zvskenvdiscard}%
+ {\zvskprevmath{\parskip}{\baselineskip}%
+ \zparseglue #2\zmark
+ \setflag \znosk = {\dimeqlp{\zskipa}{\noskip}}%
+ \vpenalty{#1}%
+ \ifcase \zvskenvtype
+ \relax
+ \or
+ \if \znosk \zskipa = \zvskenvreq \fi
+ \or
+ \zskipa = \zvskenvreq
+ \or
+ \if \dimlssp{\zskipa}{\zvskenvreq}\zskipa = \zvskenvreq \fi
+ \or
+ \if \dimlssp{\zskipa}{\zvskenvreq}\zskipa = \zvskenvreq \fi
+ \fi
+ \if \notp{\dimzerop{\zvskenvskip}}\vskip -\zvskenvskip \fi
+ \zskipb = \zskipa
+ \advance \zskipb by -\parskip
+ \advance \zskipb by -\baselineskip
+ \vskip \zskipb
+ \if \notp{\znosk}%
+ \global\zvskenvtype = \zvskenvabove
+ \global\zvskenvreq = \zskipa
+ \fi
+ \global\zvskenvskip = \zskipb}%
+ \fi}
+
+%~ This command produces vertical space so that the base-to-base
+%~ distance below the current element is equal to the *glue*. The
+%~ space is preceded by the specified *penalty*.
+
+\def \bbskipbelow #1#2{% {penalty}{glue} %^vspace
+ \zvskbelow{#1}{#2}{\parskip}{\baselineskip}}
+
+\def \bbskipbelowblock #1#2{% {penalty}{glue}
+ \zvskbelow{#1}{#2}{\enclosingparskip}{\enclosingbaselineskip}}
+
+% This macro "returns" a value in \parnext:
+% \noindent if next token does not start a new paragraph.
+% empty if next token starts a new paragraph.
+
+\def \bbskipbelowblockpar #1#2#3{% {token}{penalty}{glue}
+ {\setflag \znext = \false % Set \true if token starts new paragraph.
+ \ifcat \noexpand#1\relax \setflag \znext = \true \fi
+ \ifcat \noexpand#1\endgraf \setflag \znext = \true \fi
+ \ifcat \noexpand#1\egroup \setflag \znext = \true \fi
+ \ifcat \noexpand#1&\setflag \znext = \true \fi
+ \ifx #1\noindent \setflag \znext = \false \fi
+ \xdef \parnext {\if \znext \else \noindent \fi}%
+ \zskipa = #3\relax
+ \if \andp{\znext}{\dimneqlp{#3}{\noskip}}%
+ \tdimena = \zskipa
+ \advance \zskipa by -\tdimena
+ \advance \zskipa by \enclosingparskip
+ \advance \zskipa by \enclosingbaselineskip
+ \if \dimlssp{\zskipa}{#3}\zskipa = #3\fi
+ \fi
+ \zvskbelow{#2}{\zskipa}{\enclosingparskip}{\enclosingbaselineskip}}}
+
+\def \zvskbelow #1#2#3#4{% {penalty}{glue}{parskip}{baselineskip}
+ {\zvskprevmath{#3}{#4}%
+ \zparseglue #2\zmark
+ \setflag \znosk = {\dimeqlp{\zskipa}{\noskip}}%
+ \vpenalty{#1}%
+ \ifcase \zvskenvtype
+ \zzerror{Skiping type is discard}%
+ \or
+ \if \znosk \zskipa = #3 \advance \zskipa by #4\fi
+ \or
+ \error{skipab}{A `skip below' follows a `skip above'}%
+ \or
+ \if \znosk \zskipa = \zvskenvreq \fi
+ \or
+ \if \dimlssp{\zskipa}{\zvskenvreq}\zskipa = \zvskenvreq \fi
+ \fi
+ \if \notp{\dimzerop{\zvskenvskip}}\vskip -\zvskenvskip \fi
+ \zskipb = \zskipa
+ \advance \zskipb by -#3%
+ \advance \zskipb by -#4%
+ \vskip \zskipb
+ \if \notp{\znosk}%
+ \if \neqlp{\zvskenvtype}{\zvskenvmath}% % Stay as math type so
+ \global\zvskenvtype = \zvskenvbelow % subsequent below skip
+ \fi % won't override.
+ \global\zvskenvreq = \zskipa
+ \fi
+ \global\zvskenvskip = \zskipb}}
+
+\def \zvskprevmath #1#2{% {parskip}{baselineskip}
+ \if \eqlp{\mathdisplayprevgraf}{\prevgraf}%
+ \global\zvskenvtype = \zvskenvmath
+ \global\zvskenvpen = \mathdisplayprevpenalty
+ \global\zvskenvreq = \mathdisplayprevskip
+ \global\advance \zvskenvreq by #1
+ \global\advance \zvskenvreq by #2
+ \global\zvskenvskip = \mathdisplayprevskip
+ \global\mathdisplayprevgraf = -1\relax
+ \fi}
+
+%~ This command forces the next base-to-base skip command
+%~ regardless of the relationship between the previous element
+%~ and the next one.
+
+\def \forcenextbbskip {% %^vspace
+ \global\zvskenvtype = \zvskenvpar
+ \global\mathdisplayprevgraf = -1\relax}
+
+\definecount{\zvpen}{0}
+
+\def \vpenalty #1{% {penalty}
+ \zvpen = \if \emptyargp{#1}\breaknever \else #1\fi
+ \if \orp{\eqlp{\zvskenvpen}{\zvskenvnopen}}
+ {\eqlp{\zvpen}{\breaknever}}%
+ \columnbreak{\zvpen}%
+ \global\zvskenvpen = \zvpen\relax
+ \else \if \andp{\posp{\zvskenvpen}}{\gtrp{\zvpen}{\zvskenvpen}}%
+ \columnbreak{\zvpen}%
+ \global\zvskenvpen = \zvpen\relax
+ \fi\fi}
+
+\def \forcenextpenalty {%
+ \global\zvskenvpen = \zvskenvnopen}
+
+\def \repeatpenalty {%
+ \if \neqlp{\zvskenvpen}{\zvskenvnopen}%
+ \columnbreak{\zvskenvpen}%
+ \fi}
+
+%~ This command inserts the specified amount of extra vertical space
+%~ between the previous element and the next one.
+
+\def \vspace #1{% {glue} %^vspace
+ \if \neqlp{\zvskenvtype}{\zvskenvdiscard}%
+ \zparseglue #1\zmark
+ \vskip \zskipa
+ \fi}
+
+%~ This command inserts extra vertical space between the previous element
+%~ and the next one. The space is measured in lines; a fractional number
+%~ is allowed.
+
+\def \linespace #1{\vspace{#1\baselineskip}}% {lines} %^vspace
+
+\def \zparseglue #1#2\zmark{% {token}{tokens...}
+ \def \znext {#1}%
+ \def \zskip {\skip}%
+ \if \tokeqlp{\znext}{\zskip}%
+ \setskip \zskipa = #2\relax
+ \else
+ \zskipa = #1#2\relax
+ \fi}
+
+% Top to Text Skipping
+% --- -- ---- --------
+
+
+% These commands use \zskipb so as not to screw up \fakepar.
+
+\def \vsinkfromtypearea #1{% {sinkage}
+ \endgraf
+ \nobreak % So \fakepar can't break.
+ \fakepar % So \bbskipabove won't discard.
+ \vbox{}% % Force start of page if not already.
+ \kern -\pagetotal
+ \kern -\headerheight
+ \bbskipabove{\breaknever}{#1}}
+
+\let \vsink = \vsinkfromtypearea
+
+\def \vsinkfromtrim #1{% {sinkage}
+ \zskipb = #1\relax
+ \advance \zskipb by -\headmargin
+ \vsinkfromtypearea{\zskipb}}
+
+\def \vsinkfromtextarea #1{% {sinkage}
+ \zskipb = #1\relax
+ \advance \zskipb by \headerheight
+ \if \topdeltaadjustment
+ \advance \zskipb by \topdelta
+ \fi
+ \vsinkfromtypearea{\zskipb}}
+
+% Rules
+% -----
+
+
+\def \parrule #1#2{% {shift}{dimensions}
+ \endgraf
+ {\if \notp{\baselinetoprules}\zadjrule{#2}\fi
+ \hfuzz = 100pc
+ \noindent \hspace{#1}\vbox{\hrule height 0pt depth 0pt #2}\endgraf}}
+
+\def \colorparrule #1#2#3{% {color}{shift}{dimensions}
+ \endgraf
+ {\if \notp{\baselinetoprules}\zadjrule{#3}\fi
+ \hfuzz = 100pc
+ \noindent \hspace{#2}%
+ \color{#1}\vbox{\hrule height 0pt depth 0pt #3}\endcolor \endgraf}}
+
+\def \scotchrule #1#2#3{% {shift}{width}{height,gap,...}
+ \endgraf
+ {\hfuzz = 100pc
+ \commalist{\zscotchlist}{#3}%
+ \tcounta = 1\relax
+ \maplist{\zscotchb{#1}{#2}{##1}}{\zscotchlist}}}
+
+\def \zscotchb #1#2#3{% {shift}{width}{dimension}
+ \if \andp{\eqlp{\tcounta}{1}}{\notp{\baselinetoprules}}%
+ \zadjrule{height #3 depth 0pt}%
+ \fi
+ \if \oddp{\tcounta}
+ \noindent \hspace{#1}\vbox{\hrule height #3 depth 0pt width #2}\endgraf
+ \parskip = 0pt
+ \else
+ \nobreak
+ \vspace{#3}%
+ \nointerlineskip
+ \fi
+ \increment \tcounta}
+
+\def \zadjrule #1{% {dimensions}
+ \if \notp{\innermodep}%
+ \fakepar
+ \tdimena = \baselineskip
+ \advance \tdimena by -\prevdepth
+ \setbox \zboxa = \hbox{\vrule #1}%
+ \advance \tdimena by -\ht\zboxa
+ \vskip \tdimena
+ \vskip \topskip
+ \rule{height 0pt depth 0pt width 0pt}%
+ \penalty \breaknever
+ \vskip -\topskip
+ \parskip = 0pt \baselineskip = \ht\zboxa
+ \fi}
+
+% Vertical Alignment
+% -------- ---------
+
+
+\def \bottomout {%
+ \hrule width 0pt height 0pt % Make sure \vskip isn't discarded.
+ \vskip 0pt plus 1filll}
+
+% Counting Lines
+% -------- -----
+
+
+\definecount{\zlinect}{0}
+
+
+\def \countlines #1#2#3#4{% {\count}{width}{font}{text}
+ \setbox\zboxa = \vbox{%
+ \hsize = #2%
+ #3%
+ #4\par}%
+ \global\zlinect = 0
+ \setbox\zboxa = \vbox{\unvbox\zboxa \zscanvbox}%
+ #1=\zlinect}
+
+\def \zscanvbox {%
+ \loop
+ \setflag \zscanagain = \false
+ \setbox\zboxa = \lastbox
+ \if \hboxp{\zboxa}%
+ \global\increment \zlinect
+ \setflag \zscanagain = \true
+ \else\if \notp{\dimzerop{\lastskip}}%
+ \unskip
+ \setflag \zscanagain = \true
+ \else\if \notp{\dimzerop{\lastkern}}%
+ \unkern
+ \setflag \zscanagain = \true
+ \else\if \notp{\zerop{\lastpenalty}}%
+ \unpenalty
+ \setflag \zscanagain = \true
+ \fi\fi\fi\fi
+ \if \zscanagain \repeat}
+
+% Special Boxes
+% ------- -----
+
+
+\definedimen{\zibprevdepth}{0pt}
+
+
+\long\def \interjectbox #1#2{% {right-shift}{content}
+ {\zibprevdepth = \prevdepth
+ \penalty \breaknever
+ \nointerlineskip
+ \moveright #1 \vbox to 0pt{%
+ \zpushvcontext
+ #1\relax
+ \zpopvcontext}%
+ \prevdepth = \zibprevdepth}}
+
+\long\def \smashbox #1{%
+ \vbox to 0pt{%
+ #1\relax
+ \vss}} \ No newline at end of file