home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / Mathematics / TeX / TeXsis-2.15 / TXSdcol.tex < prev    next >
Text File  |  1992-08-04  |  31KB  |  605 lines

  1. % TXSdcol.tex                                   TeXsis version 2.15 
  2. % $Revision: 15.6 $  :  $Date: 92/06/02 15:56:46 $  :  $Author: myers $
  3. %======================================================================*
  4. % DOUBLE COLUMN FORMAT                          E. Myers and F.E. Paige
  5. %
  6. %       TXSdcol produces double-column output with balanced columns and
  7. % floating single and double column insertions. Adapted from The TeXBook,
  8. % pg 417, and The TUGboat, Vol 6, pg 29.
  9. %
  10. %       \setdoublecolumns initializes the double column format, including
  11. % setting \hsize and \vsize:
  12. %
  13. %       \setdoublecolumns#1#2#3         initializes double column format
  14. %                                       #1 = overall width
  15. %                                       #2 = overall height
  16. %                                       #3 = column width
  17. % Note that \setdoublecolumns redefines \output.
  18. %
  19. %       \doublecolumns and \enddoublecolumns are used to switch between
  20. % single and double column format:
  21. %
  22. %       \doublecolumns                  starts double column format
  23. %       \enddoublecolumns               returns to single column format and
  24. %                                       balances columns
  25. %       \longequation                   begins a long (2-column) equation
  26. %       \endlongequation                ends a long equation
  27. %       \leftcolrule                    draws a rule across left column
  28. %       \rightcolrule                   draws a rule across right column
  29. %
  30. %       Insertions of figures or other vertical mode material can be made
  31. % using the following macros, which are similar to those in Plain TeX:
  32. %
  33. %       \topinsert                      insert at top of current column
  34. %       \midinsert                      insert at current position or at top
  35. %       \pageinsert                     insert full column
  36. %       \widetopinsert                  insert across 2 columns at top of page
  37. %       \widepageinsert                 insert full page across 2 columns
  38. %       \endinsert                      end insertion
  39. %
  40. % The material is put in the left or right column depending on the current
  41. % position. A specific column can be forced by putting inside the insertion
  42. %
  43. %       \forceleft                      force left column insertion
  44. %       \forceright                     force right column insertion
  45. %
  46. % Outside of double column mode, \widetopinsert is equivalent to \topinsert.
  47. %
  48. %
  49. %       A typical TeXsis double-column document will contain:
  50. %
  51. % \texsis                                       % initialize
  52. % \setdoublecolumns{width}{height}{colwidth}    % in cm, in, pt,...
  53. % ... title page, etc ...
  54. % ... title, author, etc ...                    % default is single column
  55. % \doublecolumns                                % switch to 2 columns
  56. % ... text ...
  57. % \longequation
  58. % $$
  59. % ... long equation, table, etc ...             % across both columns
  60. % $$
  61. % \endlongequation
  62. % ... text ...
  63. % \figure{foo}                                  % insert at top of column
  64. % ... top matter ...
  65. % \endfigure                                    % end insertion
  66. % ... text ...
  67. % \enddoublecolumns                             % end
  68. % \bye
  69. %
  70. %       Since double columns are narrow, the normal TeX spacing will produce
  71. % many overfull hboxes. To avoid this, the interword skip \spaceskip is
  72. % replaced by \doublecolskip with the default value
  73. %       \doublecolskip=.3333em plus .3333em minus .1em
  74. % and the \hyphenpenalty is set to zero. To balance the columns, it is
  75. % necessary to allow some vertical stretch; for example use
  76. %       \parskip=\smallskipamount
  77. %
  78. %       To type oversize documents on an 8.5 x 11 inch laser printer, use
  79. % \ninepoint and set the dimensions in \setdoublecolumns to 9/12 of the
  80. % desired size. Then the document enlarged by 4/3 will be correct.
  81. %
  82. %
  83. %       WARNING: Formatting double column documents is very difficult. There
  84. % are many special cases, only some of which are handled in these macros.
  85. % The following is a list of known problems:
  86. %
  87. %       (1) Since double columns are narrow, the normal TeX spacing produces
  88. % many overfull \hbox's. To avoid this, the interword skip \spaceskip is
  89. % changed to
  90. %       \doublecolskip=.3333em plus .3333em minus .1em
  91. % More uniform spacing can be obtained by changing \doublecolskip.
  92. %
  93. %       (2) To balance columns it is essential to have some stretch in the
  94. % column. For example, use
  95. %       \parskip=\smallskipamount
  96. % (This is done automatically in \IEEEproceedings.)
  97. %
  98. %       (3) If the page cannot be balanced, an error message is produced. To
  99. % see the page, try typing i\vfill after the ? prompt.
  100. %
  101. %       (4) Insertions which do not fit on a page move to the same column
  102. % of the next page, so figures may appear in the wrong order. To fix this
  103. % move the insertion to a different position or use \forceleft or \forceright.
  104. %
  105. %       (5) A \topinsert placed after a \midinsert may appear before it, just
  106. % as in Plain. To avoid this, rearrange the figures or use \topinsert for all
  107. % figures.
  108. %
  109. %       (6) Footnotes are not implemented. These may be added in the future.
  110. %
  111. %       (7) Running headlines and footlines are added to each page. But
  112. % forming the double columns destroys the top and bottom marks on the page,
  113. % so the standard TeXsis headlines and footlines do not work very well.
  114. %
  115. %-----------------------------------------------------------------------
  116. %      \twinout is much simpler than \setdoublecolumns; it simply
  117. % redefines \output to produce a reduced format output with two pages per
  118. % physical page in landscape format. Usage with TeXsis:
  119. %
  120. %      [\twinhsize=<dimen>]                     % horizontal width
  121. %      [\twinvsize=<dimen>]                     % vertical height
  122. %      [\twincsize=<dimen>]                     % column width
  123. %      [\def\LandscapeSpecial{\special{...}}]   % \special for landscape
  124. %      \texsis
  125. %      \tenpoint
  126. %      \def\Tbf{\twelvebf}
  127. %      \def\tbf{\tenbf}
  128. %      \twinout
  129. %
  130. % Adapted from Harvmac by Paul Ginsparg.
  131. % -----------------------------------------------------------------------
  132. %
  133. %       Dependencies: This file is independent of the rest of TeXsis and
  134. % can be used with Plain TeX.
  135. %
  136. % -----------------------------------------------------------------------
  137. \message{Double Column Format.}
  138.  
  139. \catcode`@=11                                   % make @ a letter for this file
  140.  
  141. \newdimen\colwidth                              % col. width
  142. \newdimen\pagewidth                             % total width
  143. \newdimen\pageheight                            % total height
  144. \newdimen\ruleht          \ruleht=.5pt          % col. rule height
  145. \newdimen\colmaxdepth     \colmaxdepth=4pt      % max. split depth
  146.  
  147. \newdimen\bigc@lheight                          % 2 * col. height
  148. \newdimen\l@ftpluscenter                        % left + middle
  149. \newdimen\splitmaxs@ve                          % save \splitmaxdepth
  150. \newdimen\s@vesize                              % save \vsize
  151.  
  152. %       TXShead.tex defines similar dimensions for headlines, but if if
  153. % has not been loaded then we need to create new ones.
  154.  
  155. \newdimen\wideheadlineoffset \wideheadlineoffset=0.0pt % how much to raise
  156. \newdimen\widefootlineoffset \widefootlineoffset=0.0pt % how much to lower
  157.  
  158. \newskip\s@veskip                               % save \spaceskip
  159. \newskip\doublecolskip                          % new \spaceskip
  160. \doublecolskip=.3333em plus .3333em minus .1em  % with more stretch
  161.  
  162. \newbox\partialpage                             % partial page
  163.  
  164. \newinsert\leftins        \count\leftins=1000   % left col. insert
  165. \dimen\leftins=\maxdimen  \skip\leftins=0pt     %
  166. \newinsert\rightins       \count\rightins=1000  % right col. insert 
  167. \dimen\rightins=\maxdimen \skip\rightins=0pt    %
  168.  
  169. \newif\ifleftc@lumn                             % insert left col.
  170. \newif\ifwid@           \wid@false              % wide insert
  171.  
  172. %----------------------------------------------------------------------*
  173. %     Until or unless you say \setdoublecolumns, the \doublecolumns,
  174. % \enddoublecolumns, \leftcolrule and \rightcolrule macros are
  175. % simply \relax.  This is so you can put these in a document that 
  176. % uses double columns, but then print it with one of the single
  177. % column formats without them getting in the way.  Or vice versa.
  178. %
  179. %     For the same reason, \widetopinsert and \widefullinsert are just
  180. % \topinsert and \fullinsert. There is no need to define the table and 
  181. % figure macros here because they use appropriate the inserts.
  182.  
  183. \colwidth=\hsize                        % default column width is \hsize
  184.  
  185. \def\doublecolumns{\relax}
  186. \def\enddoublecolumns{\relax}
  187. \def\leftcolrule{\relax}
  188. \def\rightcolrule{\relax}
  189. \def\longequation{\relax}
  190. \def\endlongequation{\relax}
  191. \def\newcolumn{\relax}
  192. \def\widetopinsert{\topinsert}
  193. \def\widepageinsert{\pageinsert}
  194.  
  195. \def\begindoublecolumns{\doublecolumns} % synonym
  196. \def\singlecolumn{\enddoublecolumns}    % synonym
  197.  
  198. %       Save Plain definitions of inserts to we can use them
  199.  
  200. \let\topinsertpl@in=\topinsert
  201. \let\midinsertpl@in=\midinsert
  202. \let\pageinsertpl@in=\pageinsert
  203. \let\endinsertpl@in=\endinsert
  204.  
  205. % \@newcolumn is like \newpage but only active in double column mode
  206.  
  207. \def\@newcolumn{\vfill\eject}
  208.  
  209. %----------------------------------------------------------------------*
  210. %     \setdoublecolumns initializes double column format. #1 is the
  211. % overall width, #2 is the height, and #3 is the column width.
  212.  
  213. \def\setdoublecolumns#1#2#3{%
  214.    \global\hsize=#1\relax                       % width
  215.    \global\vsize=#2\relax                       % height
  216.    \global\colwidth=#3\relax                    % column width
  217.    \pagewidth=\hsize \pageheight=\vsize         % page sizes
  218.    \bigc@lheight=\vsize                         % total height = \vsize
  219.    \multiply \bigc@lheight by 2                 % times 2
  220.    \l@ftpluscenter=\pagewidth                   % \l@ftpluscenter = size
  221.    \advance \l@ftpluscenter by -\colwidth       % to right column
  222.    \dimen\leftins=\pageheight                   % max. insert
  223.    \dimen\rightins=\pageheight                  % max. insert
  224.    \output{\onep@geout{\unvbox255}}%            % just ship out page
  225.    \let\doublecolumns=\@doublecolumns           % enable \doublecolumns
  226.    \let\enddoublecolumns=\@enddoublecolumns     % enable \enddoublecolumns
  227.    \let\rightcolrule=\@rightcolrule             % enable
  228.    \let\leftcolrule=\@leftcolrule               %
  229.    \def\longequation{\@longequation}%           % to begin long equations
  230. }
  231.  
  232.  
  233. %     \@doublecolumns starts double column output. It redefines \endinsert
  234. % to handle double column insertions and \widetopinsert and \widepageinsert
  235. % to do them.
  236.  
  237. \def\@doublecolumns{%                           % begin 2 columns
  238.    \begingroup                                  % keep changes local
  239.    \def\endmode{\@enddoublecolumns}             % how to end 
  240.    \output={\global\setbox\partialpage=%        % set up output
  241.       \vbox{%                                   % box containing...
  242.          \ifvoid\topins\else\unvbox\topins\fi%  %top insert
  243.          \unvbox255}}\eject                     % and main page
  244.    \output={\d@ublec@lumnout}%                  % set 2 column output
  245.    \s@vesize=\vsize                             % save old \vsize
  246.    \hsize=\colwidth\vsize=\bigc@lheight         % set width, 2*height
  247.    \advance \vsize by -2\ht\partialpage         %   less partial page
  248.    \advance \vsize by -2\dp\partialpage         %   less partial page
  249.    \global\s@veskip=\spaceskip                  % save old interword glue
  250.    \global\spaceskip=\doublecolskip             % stretch for small cols.
  251.    \global\displaywidth=\colwidth               % equations have \colwidth
  252.    \global\hyphenpenalty=0                      % hyphens are OK
  253.    \let\topinsert=\topinsertd@uble              % 2-col top insert
  254.    \global\let\midinsert=\midinsertd@uble       %   mid insert
  255.    \global\let\pageinsert=\pageinsertd@uble     %   full column insert
  256.    \global\let\endinsert=\endinsertd@uble       % 2-col end inserts
  257.    \global\let\widetopinsert=\widet@pinsert     % allow wide inserts
  258.    \global\let\widepageinsert=\widep@geinsert   % or full page inserts
  259.    \global\let\newcolumn=\@newcolumn            % to break columns
  260. }
  261.  
  262. %----------------------------------------------------------------------*
  263. % \@enddoublecolumns ends double column output and balances columns.
  264. % This also allows double width equations. The grouping insures that
  265. % \endinsert is reset to the Plain version.
  266.  
  267. \def\@enddoublecolumns{%                        % end double column mode
  268.    \output={\b@lancecolumns}\eject              % output 2 columns
  269.    \global\output={\onep@geout{%                % output page =
  270.       \ifvoid\topins\else\unvbox\topins\fi      %   top insert
  271.       \unvbox255}}%                             %   plus main page
  272.    \global\vsize=\s@vesize                      % reset vsize
  273.    \endgroup                                    % end 2 col. group
  274.    \pagegoal=\vsize                             % overall goal size
  275.    \spaceskip=\s@veskip                         % reset interword glue
  276.    \displaywidth=\hsize                         %   equation width
  277.    \hyphenpenalty=50                            %   hyphen penalty
  278.    \global\let\topinsert=\topinsertpl@in        %   top insert
  279.    \global\let\midinsert=\midinsertpl@in        %   mid insert
  280.    \global\let\pageinsert=\pageinsertpl@in      %   page insert
  281.    \global\let\endinsert=\endinsertpl@in        %   end insert
  282.    \global\let\widetopinsert=\topinsertpl@in    %   wide insert
  283.    \global\let\widepageinsert=\pageinsertpl@in  %   page insert
  284.    \count\topins=1000                           % standard top insert
  285. }                                               % end of \@enddoublecolumns
  286.  
  287. %----------------------------------------------------------------------*
  288. % Output and related routines:
  289. % \onep@geout ships out a page. From the TeXbook, p. 416. Running
  290. % headlines and footlines have been added.
  291.  
  292. \def\onep@geout#1{%                             % output one page
  293.    \shipout\vbox{%                              % output a box
  294.       \offinterlineskip                         % no interline skip
  295.       \wideheadline                             % make wide headline
  296.       \vbox to \pageheight{#1%                  % box containing #1
  297.       \boxmaxdepth=\maxdepth}%                  %
  298.       \widefootline}%                           % make wide footline
  299.    \advancepageno}%                             % increment page number
  300.  
  301. %       The following are like \makeheadline and \makefootline in Plain
  302. % except that they use \pagewidth.
  303.  
  304. \def\wideheadline{%                             % make wide headline
  305.    \vbox to\z@{\vskip-22.5\p@%                  % skip up some
  306.       \vskip-\wideheadlineoffset                % and then some, if needed
  307.       \hbox to \pagewidth{%                     % like \line
  308.          \vbox to8.5\p@{}\the\headline}\vss}%   % content in \headline
  309.    \nointerlineskip}%                           %
  310.  
  311. \def\widefootline{%                             % make wide footline
  312.    \baselineskip24\p@%                          % space down
  313.    \vskip\widefootlineoffset                    % and then some, if needed
  314.    \hbox to \pagewidth{\the\footline}}%         % content in \footline
  315.  
  316. % \d@ublec@lumnout splits the page into two columns, inserting any
  317. % top insertions which have accumulated.
  318.  
  319. \def\d@ublec@lumnout{%                          %
  320.    \splitmaxs@ve=\splitmaxdepth                 % save it
  321.    \splitmaxdepth=\colmaxdepth                  % and reset it
  322.    \dimen@=\pageheight                          % total height...
  323.    \advance\dimen@ by -\ht\partialpage          % less partial page
  324.    \advance\dimen@ by -\dp\partialpage          % less partial page
  325.    \ifvoid\topins\else                          % if undone top insert
  326.       \advance\dimen@ by -\ht\topins            %   subtract its height
  327.       \advance\dimen@ by -\dp\topins\fi         %   subtract its height
  328.    \splittopskip=\topskip                       % top glue for splits
  329.    \ifdim\dimen@>\baselineskip%                 % if room for 1 line...
  330.       \setbox3=\vbox{%                          % box3 = working box
  331.          \ifvoid\leftins\else\unvbox\leftins\fi%%   left insertion
  332.          \unvbox255}%                           %   plus main material
  333.       \setbox1=\vsplit3 to \dimen@              % box1 = left column
  334.       \setbox4=\vbox{%                          % box4 = working box
  335.          \ifvoid\rightins\else\unvbox\rightins\fi%  right insertion
  336.          \unvbox3}%                             %   rest if main material
  337.       \setbox2=\vsplit4 to \dimen@              % box2 = right column
  338.       \setbox255=\vbox{\unvbox255\unvbox4}%     % rest back on output list
  339.    \else%                                       % ... else no room
  340.       \setbox1=\vbox{}%                         % so do nothing
  341.       \setbox2=\vbox{}%                         %
  342.    \fi%                                         % end if no room
  343.    \onep@geout\p@gesofar%                       % output page
  344.    \global\vsize=\bigc@lheight%                 %
  345.    \unvbox255 \penalty\outputpenalty%           %
  346.    \splitmaxdepth=\splitmaxs@ve}%               % reset it
  347.  
  348. %     \p@gesofar adds double column material to the page, putting box1 on the
  349. % left, box2 on the right.
  350.  
  351. \def\p@gesofar{%                                %
  352.    \ifvoid\topins\else\unvbox\topins\fi         % unbox top insert
  353.    \unvbox\partialpage                          % unbox partial page
  354.    \wd1=\hsize \wd2=\hsize                      % set sizes
  355.    \hbox to \pagewidth{\box1\hfil\box2}}%       % and combining 2 boxes
  356.  
  357. %       \b@lancecolumns is the output routine for 2 balanced columns. Taken
  358. % from The TeXbook, p. 417, with major modifications.
  359.  
  360. \def\b@lancecolumns{%                           %
  361.    \splitmaxs@ve=\splitmaxdepth%                % save it
  362.    \splitmaxdepth=\colmaxdepth%                 % and reset it
  363.    \setbox0=\vbox{%                             % box0 = working box
  364.       \ifvoid\leftins\else\unvbox\leftins\fi%   %   left insert
  365.       \unvbox255}%                              %   plus main page
  366.    \dimen@=\ht0 \advance\dimen@ by \dp0%        % get height
  367.    \ifvoid\rightins\else%                       % if right insert
  368.       \advance \dimen@ by \ht\rightins%         %   add its height
  369.       \advance \dimen@ by \dp\rightins\fi%      %   add its height
  370.    \ifvoid\topins\else                          % if undone top insert
  371.       \advance\dimen@ by -\ht\topins            %   subtract its height
  372.       \advance\dimen@ by -\dp\topins\fi         %   subtract its height
  373.    \advance \dimen@ by \topskip                 % add top skip
  374.    \advance \dimen@ by -\baselineskip           % add baseline skip
  375.    \divide \dimen@ by 2%                        % and divide by 2
  376.    \splittopskip=\topskip                       % top skip for split boxes
  377. % Loop over possible splits of text into left and right columns.
  378.    {\vbadness=10000 \loop%                      % suppress errors
  379.       \setbox3=\copy0%                          % box3 = working copy
  380.       \setbox6=\copy\rightins%                  % box6 = working rightins
  381.       \global\setbox4=\vbox{%                   % box 4 =
  382.          \vsplit3 to\dimen@}%                   %   left column
  383.       \global\setbox5=\vbox{%                   % box5 = right column
  384.          \ifvoid\rightins\else\unvbox6\fi%      %   right insert
  385.          \unvbox3}%                             %   rest of text
  386.       \ifdim\ht5>\dimen@%                       % if box5 too big,
  387.          \global\advance\dimen@ by 1pt\repeat}% %   increment and try again
  388. % End loop over possible splits. Set up output.
  389.    \dimen@ = \ht4 \dimen5 = \ht5%               % get heights
  390.    \ifdim\dimen5 > \dimen@ \dimen@=\dimen5 \fi% % find larger
  391.    \setbox1=\vbox to \dimen@{\unvbox4}%         % box1 = left column
  392.    \setbox2=\vbox to \dimen@{\unvbox5}%         % box2 = right column
  393.    \global\output={\b@lancingerror}%            % prepare for error
  394.    \p@gesofar%                                  % and output page
  395.    \splitmaxdepth=\splitmaxs@ve}%               % reset it
  396.  
  397.  
  398. % if there is a problem balancing the lines we display an error message
  399.  
  400.  
  401. \newhelp\b@l@ncingerror{%
  402. b@lancecolumns: I couldn't figure out how to balance the^^J
  403. two columns.  Maybe you can re-arange some text to make ^^J
  404. the job easier.  To see the page anyway try inserting a \string\vfill.}
  405.  
  406. \def\b@lancingerror{%                           % error exit
  407.    \newlinechar=10                              % ^^J is line break
  408.    \errhelp=\b@l@ncingerror                     % longer help message
  409.    \errmessage{Page cannot be balanced}%        % error message
  410.    \onep@geout{\unvbox255}}%                    % do something
  411.  
  412. %======================================================================*
  413. %       \@leftcolrule and \@rightcolrule put rules across left and right
  414. % columns for spanned equations
  415.  
  416. \def\@leftcolrule{%     Rule across bottom of left column
  417.    \vskip 2pt\nointerlineskip    % some whitespace first
  418.    \vbox to \baselineskip{\hbox to \colwidth{                    % short vertical bar at right
  419.       \hss \vrule height6pt width\ruleht}%      % and above the horiz. rule
  420.       \hrule width\colwidth height\ruleht}%     % rule
  421.    \vskip 4pt}
  422.  
  423. \def\@rightcolrule{\vskip 4pt
  424.    \moveright\l@ftpluscenter                    % move over
  425.    \vbox to \baselineskip {%
  426.        \hrule width\colwidth height\ruleht      % rule across column
  427.          \hbox to \colwidth{%                   % 
  428.       \vrule height 6pt width\ruleht\hss}%
  429.     }}
  430.  
  431. \def\@longequation{%  what to do for a long (2-column) equation
  432.    \enddoublecolumns                            % single column mode
  433.    \leftcolrule                                 % and draw a rule
  434.    \def\endlongequation{\@endlongequation}}     % how to get out
  435.  
  436. \def\@endlongequation{                          % ending a long equation
  437.     \rightcolrule                               % rule at top of right column
  438.     \doublecolumns}                             % then back to double column mode
  439.  
  440. \def\longequation{\relax}                       % default for single column
  441. \def\endlongequation{\relax}                    %   does nothing
  442.  
  443. %----------------------------------------------------------------------*
  444. % Floating insertions:
  445. %       \endinsertd@uble is a modified version of \endinsert from Plain which
  446. % decides whether to put a top insertion in the left or the right column.
  447. % \endinsert is let equal this in \doublecolumns.
  448. %       Note: Writing \ifdim\pagetotal<\dimen1 ... near the beginning of this
  449. % macro worked with an \emsg{\the\pagetotal} preceding it but failed when it
  450. % was removed. \dimen3 =\pagetotal \ifdim\dimen3 <\dimen1 ... seems to work.
  451. % Is this a bug or a feature???
  452.  
  453. \def\endinsertd@uble{\egroup%                   % finish the \vbox
  454. %       Decide whether in left or right column.
  455.    \dimen2 =\vsize%                             % 2 col. height = \vsize
  456.    \dimen1 =\dimen2 \divide\dimen1 by 2%        % 1 col height = 1/2 \dimen2
  457.    \dimen3 =\pagetotal%                         % get value of pagetotal
  458.    \ifdim\dimen3 <\dimen1 \leftc@lumntrue%      % left if page total < 1 col
  459.       \else \leftc@lumnfalse\fi                 %   right otherwise
  460.    \ifx L\LRf@rce \leftc@lumntrue \fi           % forced left
  461.    \ifx R\LRf@rce \leftc@lumnfalse \fi          % forced right
  462. %       If midinsert requested, decide whether there is room.
  463.    \if@mid                                      % midinsert selected
  464.       \dimen@\ht\z@ \advance\dimen@\dp\z@%      % dimen0 = height + depth
  465.       \advance\dimen@ \baselineskip%            % + baselineskip
  466.       \advance\dimen@\pagetotal%                % + page total
  467.       \ifleftc@lumn                             % if in left column
  468.          \ifdim\dimen@>\dimen1 %                % \dimen1 = 1 col height
  469.             \@midfalse\p@gefalse\fi             % top insert
  470.       \else%                                    % in right column
  471.          \ifdim\dimen@>\dimen2 %                % \dimen2 = 2 col height
  472.             \@midfalse\p@gefalse\fi\fi          % top insert
  473.    \fi                                          % end if@mid
  474. %       If room for midinsert, do it; otherwise make topinsert in same column.
  475.    \if@mid \bigskip\box\z@\bigbreak%            % if mid, insert
  476.    \else%                                       % doesn't fit
  477.       \ifwid@%                                  % wide insert
  478.          \count\topins=2000%                    % counts 2 x 1000 for length
  479.          \insert\topins{\penalty100%            % put wide insertion into
  480.          \topskip\z@skip\splittopskip\z@skip%   %   \topins with inserts
  481.          \splitmaxdepth\maxdimen%               %   from 1-col mode.
  482.          \floatingpenalty\z@%                   % no penalty
  483.          \hsize=\pagewidth%                     % full width
  484.          \ifp@ge \dimen@\dp\z@%                 % dimen0 = depth
  485.             \vbox to\pageheight{\unvbox\z@%     % full page = \pageheight
  486.             \kern-\dimen@}%                     %
  487.          \else \box\z@\nobreak\bigskip\fi}%     % just add box0
  488.       \else%                                    % single column insertion
  489.          \ifleftc@lumn%                         % in left column
  490.             \let\m@keins=\leftins%              %   so insert in left
  491.             \else \let\m@keins=\rightins\fi     %   or insert in right
  492.          \insert\m@keins{\penalty100%           % do the insertion just
  493.          \splittopskip\z@skip%                  % like Plain TeX...
  494.          \splitmaxdepth\maxdimen%               %
  495.          \floatingpenalty\z@%                   %
  496.          \ifp@ge \dimen@\dp\z@%                 % full page insert
  497.             \vbox to\pageheight{\unvbox\z@%     %   height is pageheight
  498.             \kern-\dimen@}%                     %   depth is 0pt
  499.          \else \box\z@\nobreak\bigskip\fi}%     % top insert
  500.       \fi                                       % end ifwid@
  501.    \fi\endgroup%                                % end if@mid
  502.    \global\let\LRf@rce=X}%                      % reset forcing flag
  503.  
  504. %     \@widetopinsert makes a floating insertion across both columns. It
  505. % uses the same \topins as the normal top insert because it goes in the same
  506. % place. \widetopinsert is let equal to this by \doublecolumns.
  507.  
  508. \def\widet@pinsert{%                           % let \widetopinsert = this
  509.    \@midfalse                                   % not mid insert
  510.    \p@gefalse                                   % not page
  511.    \wid@true                                    % is wide
  512.    \@ins                                        % Plain insert macro
  513.    \hsize=\pagewidth}                           % but set full width
  514.  
  515. \def\widep@geinsert{%                           % let \widepageinsert = this
  516.    \@midfalse                                   % not mid insert
  517.    \p@getrue                                    % not page
  518.    \wid@true                                    % is wide
  519.    \@ins                                        % Plain insert macro
  520.    \hsize=\pagewidth}                           % but set full width
  521.  
  522. %       \topinsertd@uble,... are like \topinsert,... in Plain but also reset
  523. % \ifwid@ for wide inserts. \topinsert,... are set to these by \doublecolumns.
  524. % The Plain versions must be saved to reset these in \enddoublecolumns.
  525.  
  526. \def\topinsertd@uble{\@midfalse\p@gefalse\wid@false\@ins}
  527. \def\midinsertd@uble{\@midtrue\wid@false\@ins}
  528. \def\pageinsertd@uble{\@midfalse\p@getrue\wid@false\@ins}
  529.  
  530. % \forceleft and \forceright force left and right insertions independent
  531. % of the current column position.
  532.  
  533. \def\forceleft{\global\let\LRf@rce=L}           % force left insert
  534. \def\forceright{\global\let\LRf@rce=R}          % force right insert
  535. \let\LRf@rce=X                                  % default is no force
  536.  
  537. %======================================================================*
  538. % TWIN PAGE OUTPUT
  539.  
  540. %      \twinout is much simpler than \setdoublecolumns; it simply
  541. % redefines \output to produce a reduced format output with two pages per
  542. % physical page in landscape format.
  543.  
  544. %-----------------------------------------------------------------------
  545. %      Counters and such
  546.  
  547. \newbox\l@ftp@ge                                % box for first column
  548. \newdimen\twinhsize     \twinhsize=10truein     % twin width
  549. \newdimen\twinvsize     \twinvsize=7truein      % twin height
  550. \newdimen\twincsize     \twincsize=4.75truein   % twin column width
  551. \newdimen\normhsize     \normhsize=6.5truein    % normal hsize
  552. \newdimen\normvsize     \normvsize=9.0truein    % normal vsize
  553.  
  554. %      \LandscapeSpecial is the \special hack for landscape. Otherwise
  555. % you can use the landscape option for the device driver. The default
  556. % is for dvips 5.484 by Tom Rokikki:
  557.  
  558. \def\LandscapeSpecial{\special{papersize=11in,8.5in}}
  559.  
  560. %      \twinout redefines \output to generate two columns per page.
  561. % You should also set font sizes, etc.
  562.  
  563. \def\twinout{%                                  % reduced size output
  564.    \def\l@r{L}%                                 % left-right flag
  565.    \hsize=\twincsize                            % twin col width
  566.    \vsize=\twinvsize                            % twin height
  567.    \twin@ffset                                  % twin offsets
  568.    \output={\almostship@ut{\leftline{\vbox{%    % new \output
  569.       \makeheadline\pagebody\makefootline}}}%   %   just like Plain
  570.       \advancepageno}%                          % advance number
  571. }
  572.  
  573. %      \twin@ffset sets the offsets for \twinout assuming that the
  574. % initial offsets are 0pt. Otherwise trouble...
  575.  
  576. \def\twin@ffset{%                               % set \twinout sizes
  577.    \dimen0 =\twinhsize                          % get new \hsize
  578.       \advance\dimen0 by-\normvsize             %   subtract normal
  579.       \divide\dimen0 by 2                       %   divide by 2
  580.       \global\hoffset=-\dimen0                  %   and fix \hoffset
  581.    \dimen0 =\twinvsize                          % get new \vsize
  582.       \advance\dimen0 by-\normhsize             %   subtract normal
  583.       \divide\dimen0 by 2                       %   divide by 2
  584.       \global\voffset=-\dimen0                  %   and fix \voffset
  585. }
  586.  
  587. %      \almostship@ut either builds a box or does a \shipout of the
  588. % new box plus the old \leftb@x.
  589.  
  590. \def\almostship@ut#1{%                          % new \shipout
  591.    \if L\l@r%                                   % left page
  592.       \global\setbox\l@ftp@ge=#1                %   save in box
  593.       \global\let\l@r=R                         %   set flag
  594.       \message{[\the\pageno]}%                  % page number
  595.    \else                                        % right page
  596.       \shipout\vbox{\LandscapeSpecial%          %   \special hack
  597.       \hbox to \twinhsize{\box\l@ftp@ge\hfil#1}}%%   text
  598.       \global\let\l@r=L                         % reset flag
  599.    \fi}
  600.  
  601. %-----------------------------------------------------------------------
  602. \catcode`@=12
  603.  
  604. % >>> EOF TXSdcol.tex <<<
  605.