summaryrefslogtreecommitdiff
path: root/info/examples/tip/out-ds.tip
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /info/examples/tip/out-ds.tip
Initial commit
Diffstat (limited to 'info/examples/tip/out-ds.tip')
-rw-r--r--info/examples/tip/out-ds.tip443
1 files changed, 443 insertions, 0 deletions
diff --git a/info/examples/tip/out-ds.tip b/info/examples/tip/out-ds.tip
new file mode 100644
index 0000000000..04ca97b0bc
--- /dev/null
+++ b/info/examples/tip/out-ds.tip
@@ -0,0 +1,443 @@
+% This macro source file is from the four volume series
+% "TeX in Practice" by Stephan von Bechtolsheim, published
+% 1993 by Springer-Verlag, New York.
+% Copyright 1993 Stephan von Bechtolsheim.
+% No warranty or liability is assumed.
+% This macro may be copied freely if no fees other than
+% media cost or shipping charges are charged and as long
+% as this copyright and the following source code itself
+% is not changed. Please see the series for further information.
+%
+% Version: 1.0
+% Date: May 1, 1993
+%
+%
+% This source code is documented in 37.2.7.1, p. IV-170.
+% Original source in file "o4.TEX", starting line 461.
+\wlog{L: "out-ds.tip" ["o4.TEX," l. 461, p. IV-170]}%
+% This file DOES NOT belong to format "texip."
+\InputD{box-mac.tip}
+\InputD{rangetst.tip}
+\InputD{maxmindi.tip}
+\InputD{prot.tip}
+\InputD{vtbox.tip}
+\InputD{nathd.tip}
+\InputD{shiftudb.tip}
+\catcode`\@ = 11
+\newdimen\@PageWidth
+\newdimen\@ColWidth
+\newdimen\@ColIndent
+\newdimen\@PageHeight
+\newcount\@DSCCurNumberOfColumns
+\newcount\@PageLayoutCodeDSC
+\newcount\@DSCDebugging
+\def\SetUpDSC #1#2#3#4#5#6{%
+ \@DSCDebugging = #6
+ \CheckZeroOneRange{\@DSCDebugging}%
+ {\string\SetUpDSC: debugging code wrong}
+ \ifnum\@DSCDebugging = 0
+ \ProtWritefalse
+ \else
+ \ProtWritetrue
+ \fi
+ \InitProtWrite
+ \WriteProtocol{0}{\string\SetUpDSC: begin}%
+ \@PageWidth = #1%
+ \@ColWidth = #2%
+ \@ColIndent = #3%
+ \@PageHeight = #4%
+ \@PageLayoutCodeDSC = #5%
+ \CheckZeroOneRange{\@PageLayoutCodeDSC}%
+ {\string\SetUpDSC: page layout code wrong}%
+ \hsize = \@PageWidth
+ \dimen0 = 2\@ColIndent
+ \advance\dimen0 by 2\@ColWidth
+ \ifdim\dimen0 > \hsize
+ \errmessage{\string\SetUpDSC: Initial values of
+ \string\hsize, \noexpand\@ColWidth and
+ \noexpand\@ColIndent do not make sense.}%
+ \fi
+ \vsize = \@PageHeight
+ \@DSCCurNumberOfColumns = 1
+ \@SetSingleColumnOutput{As part of \string\SetUpDSC}%
+ \ifcase \@PageLayoutCodeDSC
+ \topskip = 10pt % Top / bottom flush
+ \or
+ \topskip = 10pt plus 50pt % Ragged bottom
+ \else
+ \errmessage{\string\SetUpDSC: illegal
+ page layout parameter.}%
+ \fi
+ \WriteProtocol{0}{\string\SetUpDSC: end}%
+}
+\def\UnDoDSC{%
+ \global\output = {\plainoutput}%
+}
+\newbox\@BoxOfPageSoFar
+\newbox\@DSCLeftColumnBox
+\newdimen\@DSCLeftNaturalHeight
+\newbox\@DSCRightColumnBox
+\newdimen\@DSCRightNaturalHeight
+\newbox\@DSCTempBox
+\def\@EliminateRulesConditional{%
+ \ifnum\@DSCDebugging = 0
+ \EliminateRuledBoxes
+ \fi
+}
+\newif\if@CaseCPageBreak
+\def\@EjectPenalty{-10000 }
+\def\eject{\penalty\@EjectPenalty}
+\def\@BalancePenalty{-10001 }
+\def\@PageLine{\hbox to \@PageWidth}
+\def\@PageLineR{\HboxR to \@PageWidth}
+\def\@ProtDSC #1{
+ \WriteProtocol{1}{\string\@ProtDSC: Begin (page \the\pageno)}
+ \WriteProtocol{2}{"#1",
+ number of cols: \the\@DSCCurNumberOfColumns}
+ \WriteProtocol{2}{\string\vsize: \the\vsize,
+ \string\pagetotal: \the\pagetotal,
+ \string\pagegoal: \the\pagegoal}
+ \BoxToProtocol{2}{\@BoxOfPageSoFar}{}
+ \WriteProtocol{2}{\string\dimen0: \the\dimen0,
+ \string\outputpenalty: \the\outputpenalty}
+ \WriteProtocol{1}{\string\@ProtDSC: End}
+}
+\def\@CaseReport #1{%
+ \WriteProtocol{0}{CASE #1}%
+ \message{CASE #1.}%
+}
+\def\@SetOutputRoutine #1#2#3{%
+ #1\output = {#2}%
+ \WriteProtocol{0}{\string\@SetOutputRoutine:}%
+ \WriteProtocol{1}{#3}%
+}
+\def\@SingleColumnOutputRoutine{%
+ \@EliminateRulesConditional
+ \WriteProtocol{0}{\noexpand\@SingleColumnOutputRoutine called,
+ \noexpand\outputpenalty is \the\outputpenalty}
+ \WriteProtocol{1}{Page number is \the\pageno}
+ \showboxdepth = 2
+ \showboxbreadth = 1000
+ \@ProtDSC{\string\@SingleColumnOutputRoutine: begin}%
+ \BoxToProtocol{1}{255}{}%
+ \@CheckNumberOfColumns{1}{\@SingleColumnOutputRoutine}%
+ \@ShipAPageBox{%
+ \ifnum\@PageLayoutCodeDSC = 0
+ \vbox to \@PageHeight{\unvbox 255}%
+ \else
+ \vbox to \@PageHeight{\unvbox 255 \vfill}%
+ \fi
+ }%
+}
+\def\@SetSingleColumnOutput #1{%
+ \WriteProtocol{0}{\string\@SetSingleColumnOutput: set to single
+ column output!}%
+ \global\@DSCCurNumberOfColumns = 1
+ \@SetOutputRoutine{\global}{\@SingleColumnOutputRoutine}{#1}%
+ \global\vsize = \@PageHeight
+ \global\pagegoal = \@PageHeight
+}
+\def\@SaveCurrentPageOutputRoutine{%
+ \global\setbox\@BoxOfPageSoFar = \vbox{\unvbox 255}%
+ \BoxToProtocol{0}{\@BoxOfPageSoFar}%
+ {\string\@SaveCurrentPageOutputRoutine}
+}
+\newcount\@VsizeFactor
+\def\@ComputeVsizeForDoubleColumns{%
+ \vsize = \@PageHeight
+ \advance\vsize by -\ht\@BoxOfPageSoFar
+ \advance\vsize by -\dp\@BoxOfPageSoFar
+ \multiply\vsize by 2
+ \@VsizeFactor = \vsize
+ \divide\@VsizeFactor by \baselineskip
+ \ifodd\@VsizeFactor
+ \advance\@VsizeFactor by -1
+ \fi
+ \global\vsize = \@VsizeFactor \baselineskip
+ \@ProtDSC{\string\@ComputeVsizeForDoubleColumns}%
+}
+\newdimen\@HalfVsize
+\def\@ComputeHalfVsize{%
+ \@HalfVsize = \vsize
+ \divide\@HalfVsize by 2
+}
+\def\BeginDoubleColumns{%
+ \par
+ \WriteProtocol{0}{\string\BeginDoubleColumns: begin}
+ \@CheckNumberOfColumns{1}{\BeginDoubleOfColumns}%
+ \global\@DSCCurNumberOfColumns = 2
+ \begingroup
+ \@CaseCPageBreakfalse
+ \@EliminateRulesConditional
+ \WriteProtocol{1}{\string\BeginDoubleColumns: put rest of page
+ into \string\@BoxOfPageSoFar}%
+ \@SetOutputRoutine{}{\@SaveCurrentPageOutputRoutine}%
+ {\string\BeginDoubleColumns: save page built up to now.}%
+ \eject
+ \@ProtDSC{\string\BeginDoubleColumns: 2}%
+ \@SetOutputRoutine{}{\@DoubleColumnOutputRoutine}%
+ {Double column output set up by \string\BeginDoubleColumns}%
+ \hsize = \@ColWidth
+ \@ComputeVsizeForDoubleColumns
+ \@ProtDSC{\string\BeginDoubleColumns: 3}%
+}
+\def\EndDoubleColumns{%
+ \par
+ \WriteProtocol{0}{\string\EndDoubleColumns: begin}
+ \@CheckNumberOfColumns{2}{\EndDoubleOfColumns}
+ \@ProtDSC{In \string\EndDoubleColumns}
+ \@CaseReport{A}
+ \penalty\@BalancePenalty
+ \@BuildPageSoFar
+ \@SetSingleColumnOutput{\string\EndDoubleColumns}
+ \endgroup
+}
+\def\@DoubleColumnOutputRoutine{%
+ \@EliminateRulesConditional
+ \WriteProtocol{0}{\string\@DoubleColumnOutputRoutineput:
+ begin (penalty: \the\outputpenalty)}
+ \if@CaseCPageBreak
+ \@CaseReport{D/E}%
+ \ifvoid\@DSCLeftColumnBox
+ \errmessage{\string\@DoubleColumnOutputRoutine:
+ missing left column!}%
+ \else
+ \ifvoid\@DSCRightColumnBox
+ \global\setbox\@DSCRightColumnBox =
+ \vbox{\unvbox 255}%
+ \global\@DSCRightNaturalHeight =
+ \ht\@DSCRightColumnBox
+ \ifnum\outputpenalty = \@EjectPenalty
+ \errmessage{\string\@DoubleColumnOutput:
+ \noexpand\eject in right column illegal.}%
+ \@CaseReport{D}
+ \MaxDimen{\dimen0}{\@DSCRightNaturalHeight}%
+ {\@DSCLeftNaturalHeight}{}%
+ \else
+ \ifnum\outputpenalty = \@BalancePenalty
+ \@CaseReport{E}
+ \MaxDimen{\dimen0}{\@DSCRightNaturalHeight}
+ {\@DSCLeftNaturalHeight}{}%
+ \else
+ \@CaseReport{D}%
+ \dimen0 = \vsize
+ \fi
+ \fi
+ \@SetColumnBox{\@DSCLeftColumnBox}{}%
+ \@SetColumnBox{\@DSCRightColumnBox}{}%
+ \Vtbox{\@DSCRightColumnBox}{\global}%
+ \ShiftRefPointUpOrDown{\@DSCRightColumnBox}{12pt}%
+ \Vtbox{\@DSCLeftColumnBox}{\global}%
+ \ShiftRefPointUpOrDown{\@DSCLeftColumnBox}{12pt}%
+ \ifnum\outputpenalty > -10000
+ \@ShipAPageBox{%
+ \ifnum\@PageLayoutCodeDSC = 0
+ \vbox to \@PageHeight{\@BuildPageSoFar}%
+ \else
+ \vbox to \@PageHeight{\@BuildPageSoFar
+ \vfill}%
+ \fi
+ }%
+ \else
+ % It's \EndDoubleColumns!
+ \fi
+ \global\@CaseCPageBreakfalse
+ \@ComputeVsizeForDoubleColumns
+ \global\pagegoal = \vsize
+ \else
+ \errmessage{\string\@DoubleColumnOutputRoutine:
+ left / right columns messed up.}
+ \fi
+ \fi
+ \else
+ \ifnum\outputpenalty = \@EjectPenalty
+ \@CaseReport{C}
+ \WriteProtocol{1}{\string\@DoubleColumnOutputRoutineput:
+ penalty \@EjectPenalty call.}
+ \global\@CaseCPageBreaktrue
+ \ifvoid\@DSCLeftColumnBox
+ \global\setbox\@DSCLeftColumnBox =
+ \vbox{\unvbox 255}
+ \global\@DSCLeftNaturalHeight = \ht\@DSCLeftColumnBox
+ \@ComputeHalfVsize
+ \WriteProtocol{2}{*\string\vsize/2 is
+ \the\@HalfVsize}%
+ \dimen1 = \ht\@DSCLeftColumnBox
+ \advance\dimen1 by \dp\@DSCLeftColumnBox
+ \ifdim\dimen1 > \@HalfVsize
+ \message{WARNING: column is to long!}%
+ \fi
+ \global\pagegoal = \@HalfVsize
+ \global\vsize = \@HalfVsize
+ \else
+ \errmessage{\string\@DoubleColumnOutputRoutine:
+ left column box already loaded!}%
+ \fi
+ \else
+ \@StandardBalanceColumns
+ \ifnum\outputpenalty = \@BalancePenalty
+ \@CaseReport{A}%
+ \else
+ \@CaseReport{B}%
+ \@ShipAPageBox{%
+ \ifnum\@PageLayoutCodeDSC = 0
+ \vbox to \@PageHeight{\@BuildPageSoFar}%
+ \else
+ \vbox to \@PageHeight{\@BuildPageSoFar
+ \vfill}%
+ \fi
+ }%
+ \@ComputeVsizeForDoubleColumns
+ \global\pagegoal = \vsize
+ \fi
+ \fi
+ \fi
+}
+\newcount\@EmptyBoxesBuildPageCount
+\def\@BuildPageSoFar{%
+ \@EmptyBoxesBuildPageCount = 0
+ \ifvoid\@BoxOfPageSoFar
+ \advance\@EmptyBoxesBuildPageCount by 1
+ \fi
+ \ifvoid\@DSCLeftColumnBox
+ \advance\@EmptyBoxesBuildPageCount by 1
+ \fi
+ \ifvoid\@DSCRightColumnBox
+ \advance\@EmptyBoxesBuildPageCount by 1
+ \fi
+ \WriteProtocol{1}{\string\@BuildPageSoFar: begin
+ (\noexpand\@EmptyBoxesBuildPageCount is
+ \the\@EmptyBoxesBuildPageCount)}
+ \ifnum\@EmptyBoxesBuildPageCount < 3
+ \BoxToProtocol{2}{\@BoxOfPageSoFar}{}
+ \BoxToProtocol{2}{\@DSCLeftColumnBox}{}
+ \BoxToProtocol{2}{\@DSCRightColumnBox}{}
+ \unvbox\@BoxOfPageSoFar % May be empty.
+ \wd\@DSCLeftColumnBox = \@ColWidth % Left column.
+ \wd\@DSCRightColumnBox = \@ColWidth % Right column.
+ \@PageLine{%
+ \hskip\@ColIndent
+ \BoxR\@DSCLeftColumnBox
+ \hfil
+ \BoxR\@DSCRightColumnBox
+ \hskip\@ColIndent
+ }
+ \smallskip
+ \fi
+ \WriteProtocol{1}{\string\@BuildPageSoFar: end}
+}
+\def\@SetColumnBox #1#2{%
+ \global\setbox#1 = \vbox to \dimen0{\unvbox#1 #2}%
+ \Vtbox{#1}{\global}%
+ \ShiftRefPointUpOrDown{#1}{12pt}%
+}
+\def\@StandardBalanceColumns{%
+ \setbox\@DSCTempBox = \vbox{\unvcopy 255}
+ \dimen0 = \ht\@DSCTempBox
+ \advance\dimen0 by \dp\@DSCTempBox
+ \advance\dimen0 by \topskip
+ \divide\dimen0 by 2
+ \WriteProtocol{1}{\string\@StandardBalanceColumns:
+ \noexpand\dimen0 is \the\dimen0, page \the\pageno.}
+ \@BalanceColumns{\dimen0}%
+}
+\def\@BalanceColumns #1{%
+ \@ProtDSC{\string\@BalanceColumns: Start}%
+ \@EliminateRulesConditional
+ \ifvoid\@DSCLeftColumnBox\else
+ \errmessage{\string\@BalanceColumns: left column box
+ not empty.}%
+ \fi
+ \ifvoid\@DSCRightColumnBox\else
+ \errmessage{\string\@BalanceColumns: right column box
+ not empty.}%
+ \fi
+ \ifvoid 255
+ \errmessage{\string\@BalanceColumns: box 255 is void.}%
+ \fi
+ \setbox\@DSCTempBox = \vbox{\unvbox 255}
+ \dimen0 = #1
+ \splittopskip = \topskip
+ \BoxToProtocol{0}{\@DSCTempBox}{Before \noexpand\vsplit loop}%
+ {%
+ \vbadness = 10000 % Don't report underfull boxes.
+ \loop
+ \global\setbox\@DSCRightColumnBox = \copy\@DSCTempBox
+ \global\setbox\@DSCLeftColumnBox =
+ \vsplit\@DSCRightColumnBox to \dimen0
+ \WriteProtocol{1}{\string\dimen0: \the\dimen0}%
+ \BoxToProtocol{1}{\@DSCLeftColumnBox}%
+ {[1] (left column) in \noexpand\vsplit loop}%
+ \BoxToProtocol{1}{\@DSCRightColumnBox}%
+ {[2] (right column) in \noexpand\vsplit loop}%
+ \NaturalHeight{\dimen3}{\@DSCLeftColumnBox}%
+ \NaturalHeight{\dimen4}{\@DSCRightColumnBox}%
+ \WriteProtocol{3}{\string\dimen3: \the\dimen3}%
+ \WriteProtocol{3}{\string\dimen4: \the\dimen4}%
+ \advance\dimen3 by 1sp
+ \ifdim\dimen4 > \dimen3
+ \global\advance\dimen0 by 1pt
+ \repeat
+ }
+ \setbox\@DSCLeftColumnBox = \vbox{\unvbox\@DSCLeftColumnBox}%
+ \setbox\@DSCRightColumnBox = \vbox{\unvbox\@DSCRightColumnBox}%
+ \MaxDimen{\dimen0}{\ht\@DSCLeftColumnBox}%
+ {\ht\@DSCRightColumnBox}{}%
+ \ifcase\@PageLayoutCodeDSC
+ \@SetColumnBox{\@DSCLeftColumnBox}{}%
+ \@SetColumnBox{\@DSCRightColumnBox}{}%
+ \or
+ \@SetColumnBox{\@DSCLeftColumnBox}{\vfill}%
+ \@SetColumnBox{\@DSCRightColumnBox}{\vfill}%
+ \fi
+ \WriteProtocol{1}{\string\@BalanceColumns:
+ balancing done.}%
+}
+\def\DSCHeader{%
+ \@PageLineR{%
+ \bf Header
+ \hfil
+ \tt \the\pageno
+ }%
+}
+\def\DSCFooter{%
+% \@PageLineR{%
+% \vrule width \@PageWidth height 1pt depth 2pt
+% }%
+ \@PageLineR{%
+ \bf FOOTER
+ \hfil
+ \tt \the\pageno
+ }%
+}
+\def\@ShipAPageBox #1{%
+ \WriteProtocol{0}{\string\@ShipAPageBox:
+ called (page \the\pageno)}%
+ \shipout\vbox{%
+ \@EliminateRulesConditional
+ \DSCHeader
+ \vskip 12pt
+ #1
+ \vskip 12pt
+ \DSCFooter
+ }
+ \WriteProtocol{0}%
+ {\string\@ShipAPageBox: done (page \the\pageno)}%
+ \advancepageno
+}
+\def\@CheckNumberOfColumns #1#2{%
+ \ifnum \@DSCCurNumberOfColumns = #1\relax
+ \else
+ \errmessage{\string\@CheckNumberOfColumns: [\string#2]:
+ currently \the\@DSCCurNumberOfColumns\space columns,
+ should be #1.}
+ \fi
+}
+\def\bye{}
+\def\bye{%
+ \@CheckNumberOfColumns{1}{\string\bye: Still in double
+ column mode, forgotten a \string\EndDoubleColumns?}%
+ \vfill\supereject
+ \end
+}
+\catcode`\@ = 12