[comp.sources.unix] v22i095: GNU AWK, version 2.11, Part09/16

rsalz@uunet.uu.net (Rich Salz) (06/08/90)

Submitted-by: "Arnold D. Robbins" <arnold@unix.cc.emory.edu>
Posting-number: Volume 22, Issue 95
Archive-name: gawk2.11/part09

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# Contents:  ./FUTURES ./PROBLEMS ./missing.d/dup2.c
#   ./missing.d/memcmp.c ./support/texinfo.tex.01
# Wrapped by rsalz@litchi.bbn.com on Wed Jun  6 12:24:54 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
echo If this archive is complete, you will see the following message:
echo '          "shar: End of archive 9 (of 16)."'
if test -f './FUTURES' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./FUTURES'\"
else
  echo shar: Extracting \"'./FUTURES'\" \(555 characters\)
  sed "s/^X//" >'./FUTURES' <<'END_OF_FILE'
XThis file lists future projects and enhancments for gawk.
X
XSynchronize alloca.[cs] and regex.[ch] with the latest versions at GNU.
X(this will likely be done as a patch to 2.11.)
X
XConvert yylex() to allow arbitrary-length program lines.
X
XAllow OFMT to be other than a floating point format.
X
XMake printf fully compatible with the ANSI C spec.
X
XMake it faster and smaller.
X
XAllow RS to be a regexp.
X
XRead in environment only if necessary. (Is this all that big a deal?)
X
XUse faster regex algorithms.
X
XCreate a gawk-to-C translator?
X
XCreate a gawk compiler?
END_OF_FILE
  if test 555 -ne `wc -c <'./FUTURES'`; then
    echo shar: \"'./FUTURES'\" unpacked with wrong size!
  fi
  # end of './FUTURES'
fi
if test -f './PROBLEMS' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./PROBLEMS'\"
else
  echo shar: Extracting \"'./PROBLEMS'\" \(380 characters\)
  sed "s/^X//" >'./PROBLEMS' <<'END_OF_FILE'
XThis is a list of known problems in gawk 2.11.
XHopefully they will all be fixed in the next major release of gawk.
X
XPlease keep in mind that this is still beta software and the code
Xis still undergoing significant evolution.
X
X1. The debugging code does not print redirection info.
X
X2. The scanner needs work.
X
X3. Gawk's printf doesn't yet match the latest nawk's.
X
XArnold Robbins
END_OF_FILE
  if test 380 -ne `wc -c <'./PROBLEMS'`; then
    echo shar: \"'./PROBLEMS'\" unpacked with wrong size!
  fi
  # end of './PROBLEMS'
fi
if test -f './missing.d/dup2.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./missing.d/dup2.c'\"
else
  echo shar: Extracting \"'./missing.d/dup2.c'\" \(136 characters\)
  sed "s/^X//" >'./missing.d/dup2.c' <<'END_OF_FILE'
X#ifndef F_DUPFD
X#include <fcntl.h>
X#endif
X
Xint
Xdup2 (old, new)
Xint old, new;
X{
X	(void) close(new);
X
X	return fcntl(old, F_DUPFD, new);
X}
END_OF_FILE
  if test 136 -ne `wc -c <'./missing.d/dup2.c'`; then
    echo shar: \"'./missing.d/dup2.c'\" unpacked with wrong size!
  fi
  # end of './missing.d/dup2.c'
fi
if test -f './missing.d/memcmp.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./missing.d/memcmp.c'\"
else
  echo shar: Extracting \"'./missing.d/memcmp.c'\" \(345 characters\)
  sed "s/^X//" >'./missing.d/memcmp.c' <<'END_OF_FILE'
X/*
X * memcmp --- compare strings.
X *
X * We use our own routine since it has to act like strcmp() for return
X * value, and the BSD manual says bcmp() only returns zero/non-zero.
X */
X
Xint
Xmemcmp (s1, s2, l)
Xregister char *s1, *s2;
Xregister int l;
X{
X	for (; l--; s1++, s2++) {
X		if (*s1 != *s2)
X			return (*s1 - *s2);
X	}
X	return (*--s1 - *--s2);
X}
END_OF_FILE
  if test 345 -ne `wc -c <'./missing.d/memcmp.c'`; then
    echo shar: \"'./missing.d/memcmp.c'\" unpacked with wrong size!
  fi
  # end of './missing.d/memcmp.c'
fi
if test -f './support/texinfo.tex.01' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./support/texinfo.tex.01'\"
else
  echo shar: Extracting \"'./support/texinfo.tex.01'\" \(49357 characters\)
  sed "s/^X//" >'./support/texinfo.tex.01' <<'END_OF_FILE'
X%% TeX macros to handle texinfo files
X
X%   Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
X
X%GNU CC is free software; you can redistribute it and/or modify
X%it under the terms of the GNU General Public License as published by
X%the Free Software Foundation; either version 1, or (at your option)
X%any later version.
X
X%GNU CC is distributed in the hope that it will be useful,
X%but WITHOUT ANY WARRANTY; without even the implied warranty of
X%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
X%GNU General Public License for more details.
X
X%You should have received a copy of the GNU General Public License
X%along with GNU CC; see the file COPYING.  If not, write to
X%the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
X
X
X%In other words, you are welcome to use, share and improve this program.
X%You are forbidden to forbid anyone else to use, share and improve
X%what you give them.   Help stamp out software-hoarding!
X
X\def\texinfoversion{2.1}
X\message{Loading texinfo package [Version \texinfoversion]:}
X\message{}
X
X% Save some parts of plain tex whose names we will redefine.
X
X\let\ptexlbrace=\{
X\let\ptexrbrace=\}
X\let\ptexdot=\.
X\let\ptexstar=\*
X\let\ptexend=\end
X\let\ptexbullet=\bullet
X\let\ptexb=\b
X\let\ptexc=\c
X\let\ptexi=\i
X\let\ptext=\t
X\let\ptexl=\l
X\let\ptexL=\L
X
X\def\tie{\penalty 10000\ }     % Save plain tex definition of ~.
X
X\message{Basics,}
X\chardef\other=12
X
X\hyphenation{ap-pen-dix}
X\hyphenation{mini-buf-fer mini-buf-fers}
X\hyphenation{eshell}
X
X% Margin to add to right of even pages, to left of odd pages.
X\newdimen \bindingoffset  \bindingoffset=0pt
X\newdimen \normaloffset   \normaloffset=\hoffset
X\newdimen\pagewidth \newdimen\pageheight
X\pagewidth=\hsize \pageheight=\vsize
X
X%---------------------Begin change-----------------------
X%
X% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
X%
X\newdimen\cornerlong \newdimen\cornerthick
X\newdimen \topandbottommargin
X\newdimen \outerhsize \newdimen \outervsize
X\cornerlong=1pc\cornerthick=.3pt	% These set size of cropmarks
X\outerhsize=7in
X\outervsize=9.5in
X\topandbottommargin=.75in
X%
X%---------------------End change-----------------------
X
X% \onepageout takes a vbox as an argument.  Note that \pagecontents
X% does insertions itself, but you have to call it yourself.
X\chardef\PAGE=255  \output={\onepageout{\pagecontents\PAGE}}
X\def\onepageout#1{\hoffset=\normaloffset
X\ifodd\pageno  \advance\hoffset by \bindingoffset
X\else \advance\hoffset by -\bindingoffset\fi
X\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
X {\let\hsize=\pagewidth \makefootline}}
X\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
X
X
X% Here is a modification of the main output routine for Near East Publications
X% This provides right-angle cropmarks at all four corners.
X% The contents of the page are centerlined into the cropmarks,
X% and any desired binding offset is added as an \hskip on either
X% site of the centerlined box.  (P. A. MacKay, 12 November, 1986)
X%
X\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
X		 \shipout
X		 \vbox to \outervsize{\hsize=\outerhsize
X                 \vbox{\line{\ewtop\hfill\ewtop}}
X                 \nointerlineskip
X                 \line{\vbox{\moveleft\cornerthick\nstop}
X                       \hfill
X                       \vbox{\moveright\cornerthick\nstop}}
X                 \vskip \topandbottommargin
X                 \centerline{\ifodd\pageno\hskip\bindingoffset\fi
X			\vbox{
X			{\let\hsize=\pagewidth \makeheadline}
X			\pagebody{#1}
X			{\let\hsize=\pagewidth \makefootline}}
X			\ifodd\pageno\else\hskip\bindingoffset\fi}
X		 \vskip \topandbottommargin plus1fill minus1fill
X                 \boxmaxdepth\cornerthick
X                 \line{\vbox{\moveleft\cornerthick\nsbot}
X                       \hfill
X                       \vbox{\moveright\cornerthick\nsbot}}
X                 \nointerlineskip
X                 \vbox{\line{\ewbot\hfill\ewbot}}
X	}
X  \advancepageno 
X  \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
X%
X% Do @cropmarks to get crop marks
X\def\cropmarks{\let\onepageout=\croppageout }
X
X\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
X{\catcode`\@ =11
X\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
X\dimen@=\dp#1 \unvbox#1
X\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
X\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
X}
X
X%
X% Here are the rules for the cropmarks.  Note that they are
X% offset so that the space between them is truly \outerhsize or \outervsize
X% (P. A. MacKay, 12 November, 1986)
X%
X\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
X\def\nstop{\vbox
X  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
X\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
X\def\nsbot{\vbox
X  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
X
X% Parse an argument, then pass it to #1.
X% The argument can be delimited with [...] or with "..." or braces
X% or it can be a whole line.
X% #1 should be a macro which expects
X% an ordinary undelimited TeX argument.
X
X\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}
X
X\def\parseargx{%
X\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
X\aftergroup \parseargline %
X\fi \endgroup}
X
X{\obeyspaces %
X\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}
X
X\gdef\obeyedspace{\ }
X
X\def\parseargline{\begingroup \obeylines \parsearglinex}
X{\obeylines %
X\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}
X
X\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
X
X%% These are used to keep @begin/@end levels from running away
X%% Call \inENV within environments (after a \begingroup)
X\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
X\def\ENVcheck{%
X\ifENV\errmessage{Still within an environment.  Type Return to continue.}
X\endgroup\fi} % This is not perfect, but it should reduce lossage
X
X% @begin foo  is the same as @foo, for now.
X\newhelp\EMsimple{Type <Return> to continue}
X
X\outer\def\begin{\parsearg\beginxxx}
X
X\def\beginxxx #1{%
X\expandafter\ifx\csname #1\endcsname\relax
X{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
X\csname #1\endcsname\fi}
X
X%% @end foo executes the definition of \Efoo.
X%% foo can be delimited by doublequotes or brackets.
X
X\def\end{\parsearg\endxxx}
X
X\def\endxxx #1{%
X\expandafter\ifx\csname E#1\endcsname\relax
X\expandafter\ifx\csname #1\endcsname\relax
X\errmessage{Undefined command @end #1}\else
X\errorE{#1}\fi\fi
X\csname E#1\endcsname}
X\def\errorE#1{
X{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}}
X
X% Single-spacing is done by various environments.
X
X\newskip\singlespaceskip \singlespaceskip = \baselineskip
X\def\singlespace{%
X{\advance \baselineskip by -\singlespaceskip
X\kern \baselineskip}%
X\baselineskip=\singlespaceskip
X}
X
X%% Simple single-character @ commands
X
X% @@ prints an @
X% Kludge this until the fonts are right (grr).
X\def\@{{\sf \char '100}}
X
X% Define @` and @' to be the same as ` and '
X% but suppressing ligatures.
X\def\`{{`}}
X\def\'{{'}}
X
X% Used to generate quoted braces.
X
X\def\mylbrace {{\tt \char '173}}
X\def\myrbrace {{\tt \char '175}}
X\let\{=\mylbrace
X\let\}=\myrbrace
X
X% @: forces normal size whitespace following.
X\def\:{\spacefactor=1000 }
X
X% @* forces a line break.
X\def\*{\hfil\break}
X
X% @. is an end-of-sentence period.
X\def\.{.\spacefactor=3000 }
X
X% @w prevents a word break
X\def\w #1{\hbox{#1}}
X
X% @group ... @end group  forces ... to be all on one page.
X
X\def\group{\begingroup% \inENV ???
X\def \Egroup{\egroup\endgroup}
X\vbox\bgroup}
X
X% @br   forces paragraph break
X
X\let\br = \par
X
X% @dots{}  output some dots
X
X\def\dots{$\ldots$}
X
X% @page    forces the start of a new page
X
X\def\page{\par\vfill\supereject}
X
X% @exdent text....
X% outputs text on separate line in roman font, starting at standard page margin
X
X\def\exdent{\errmessage{@exdent in filled text}}
X  % @lisp, etc, define \exdent locally from \internalexdent
X
X{\obeyspaces
X\gdef\internalexdent{\parsearg\exdentzzz}}
X
X\def\exdentzzz #1{{\advance \leftskip by -\lispnarrowing
X\advance \hsize by -\leftskip
X\advance \hsize by -\rightskip
X\leftline{{\rm#1}}}}
X
X% @include file    insert text of that file as input.
X
X\def\include{\parsearg\includezzz}
X\def\includezzz #1{{\def\thisfile{#1}\input #1
X}}
X
X\def\thisfile{}
X
X% @center line   outputs that line, centered
X
X\def\center{\parsearg\centerzzz}
X\def\centerzzz #1{{\advance\hsize by -\leftskip
X\advance\hsize by -\rightskip
X\centerline{#1}}}
X
X% @sp n   outputs n lines of vertical space
X
X\def\sp{\parsearg\spxxx}
X\def\spxxx #1{\par \vskip #1\baselineskip}
X
X% @comment ...line which is ignored...
X% @c is the same as @comment
X% @ignore ... @end ignore  is another way to write a comment
X
X\def\comment{\parsearg \commentxxx}
X
X\def\commentxxx #1{}
X
X\let\c=\comment
X
X% Prevent errors for section commands.
X% Used in @ignore and in failing conditionals.
X\def\ignoresections{%
X\let\chapter=\relax
X\let\unnumbered=\relax
X\let\unnumberedsec=\relax
X\let\unnumberedsection=\relax
X\let\unnumberedsubsec=\relax
X\let\unnumberedsubsection=\relax
X\let\unnumberedsubsubsec=\relax
X\let\unnumberedsubsubsection=\relax
X\let\section=\relax
X\let\subsec=\relax
X\let\subsubsec=\relax
X\let\subsection=\relax
X\let\subsubsection=\relax
X\let\appendix=\relax
X\let\appendixsec=\relax
X\let\appendixsection=\relax
X\let\appendixsubsec=\relax
X\let\appendixsubsection=\relax
X\let\appendixsubsubsec=\relax
X\let\appendixsubsubsection=\relax
X}
X
X\def\ignore{\begingroup\ignoresections\ignorexxx}
X\long\def\ignorexxx #1\end ignore{\endgroup}
X
X% Conditionals to test whether a flag is set.
X
X\outer\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}
X
X\def\ifsetxxx #1{\endgroup
X\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
X\else \let\temp=\relax \fi
X\temp}
X\def\Eifset{}
X\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
X\long\def\ifsetfailxxx #1\end ifset{\endgroup}
X
X\outer\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}
X
X\def\ifclearxxx #1{\endgroup
X\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
X\else \let\temp=\ifclearfail \fi
X\temp}
X\def\Eifclear{}
X\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
X\long\def\ifclearfailxxx #1\end ifclear{\endgroup}
X
X% Some texinfo constructs that are trivial in tex
X
X\def\iftex{}
X\def\Eiftex{}
X\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
X\long\def\ifinfoxxx #1\end ifinfo{\endgroup}
X
X\long\def\menu #1\end menu{}
X\def\asis#1{#1}
X
X\def\node{\ENVcheck\parsearg\nodezzz}
X\def\nodezzz#1{\nodexxx [#1,]}
X\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
X\let\lastnode=\relax
X
X\def\donoderef{\ifx\lastnode\relax\else
X\expandafter\expandafter\expandafter\setref{\lastnode}\fi
X\let\lastnode=\relax}
X
X\def\unnumbnoderef{\ifx\lastnode\relax\else
X\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
X\let\lastnode=\relax}
X
X\def\appendixnoderef{\ifx\lastnode\relax\else
X\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
X\let\lastnode=\relax}
X
X\let\refill=\relax
X  
X% @setfilename is done at the beginning of every texinfo file.
X% So open here the files we need to have open while reading the input.
X% This makes it possible to make a .fmt file for texinfo.
X\def\setfilename{%
X   \readauxfile
X   \opencontents
X   \openindices
X   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
X   \comment % Ignore the actual filename.
X}
X
X\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
X
X\def\inforef #1{\inforefzzz #1,,,,**}
X\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}}, node `\losespace#1{}'}
X\def\losespace #1{#1}
X
X\message{fonts,}
X
X% Font-change commands.
X
X%% Try out Computer Modern fonts at \magstephalf
X\font\tenrm=cmr10 scaled \magstephalf
X\font\tentt=cmtt10 scaled \magstephalf
X% Instead of cmb10, you many want to use cmbx10.
X% cmbx10 is a prettier font on its own, but cmb10
X% looks better when embedded in a line with cmr10.
X\font\tenbf=cmb10 scaled \magstephalf 
X\font\tenit=cmti10 scaled \magstephalf
X\font\tensl=cmsl10 scaled \magstephalf
X\font\tensf=cmss10 scaled \magstephalf
X\def\li{\sf}
X\font\tensc=cmcsc10 scaled \magstephalf
X
X% Fonts for @defun, etc.
X\font\defbf=cmbx10 scaled \magstep1 %was 1314
X\let\deftt=\tentt
X\def\df{\let\tt=\deftt \defbf}
X
X% Font for title
X\font\titlerm = cmbx10 scaled \magstep5
X
X% Fonts for indices
X\font\indit=cmti9 \font\indrm=cmr9
X\font\indtt=cmtt9
X\def\indbf{\indrm} \def\indsl{\indit}
X\def\indexfonts{\let\it=\indit \let\sl=\indsl \let\bf=\indbf \let\rm=\indrm
X\let\tt=\indtt}
X
X% Fonts for headings
X\font\chaprm=cmbx10 scaled \magstep3
X\font\chapit=cmti10 scaled \magstep3
X\font\chapsl=cmsl10 scaled \magstep3
X\font\chaptt=cmtt10 scaled \magstep3
X\font\chapsf=cmss10 scaled \magstep3
X\let\chapbf=\chaprm
X
X\font\secrm=cmbx10 scaled \magstep2
X\font\secit=cmti10 scaled \magstep2
X\font\secsl=cmsl10 scaled \magstep2
X\font\sectt=cmtt10 scaled \magstep2
X\font\secsf=cmss10 scaled \magstep2
X\let\secbf=\secrm
X
X% \font\ssecrm=cmbx10 scaled \magstep1    % This size an fontlooked bad.
X% \font\ssecit=cmti10 scaled \magstep1    % The letters were too crowded.
X% \font\ssecsl=cmsl10 scaled \magstep1
X% \font\ssectt=cmtt10 scaled \magstep1
X% \font\ssecsf=cmss10 scaled \magstep1
X
X\font\ssecrm=cmb10 at 13pt	% Note the use of cmb rather than cmbx.
X\font\ssecit=cmti10 at 13pt	% Also, the size is a little larger than
X\font\ssecsl=cmsl10 at 13pt	% being scaled magstep1.
X\font\ssectt=cmtt10 at 13pt
X\font\ssecsf=cmss10 at 13pt
X
X\let\ssecbf=\ssecrm
X
X\def\textfonts{\let\rm=\tenrm\let\it=\tenit\let\sl=\tensl\let\bf=\tenbf%
X\let\smallcaps=\tensc\let\sf=\tensf}
X\def\chapfonts{\let\rm=\chaprm\let\it=\chapit\let\sl=\chapsl\let\bf=\chapbf\let\tt=\chaptt\let\sf=\chapsf}
X\def\secfonts{\let\rm=\secrm\let\it=\secit\let\sl=\secsl\let\bf=\secbf\let\tt=\sectt\let\sf=\secsf}
X\def\subsecfonts{\let\rm=\ssecrm\let\it=\ssecit\let\sl=\ssecsl\let\bf=\ssecbf\let\tt=\ssectt\let\sf=\ssecsf}
X% Count depth in font-changes, for error checks
X\newcount\fontdepth \fontdepth=0
X
X% Font for table of contents.
X\font\truesecrm=cmr12
X
X%% Add scribe-like font environments, plus @l for inline lisp (usually sans
X%% serif) and @ii for TeX italic
X
X% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
X% unless the following character is such as not to need one.
X\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
X\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
X
X\let\i=\smartitalic
X\let\var=\smartitalic
X\let\dfn=\smartitalic
X\let\emph=\smartitalic
X\let\cite=\smartitalic
X
X\def\b#1{{\bf #1}}
X\let\strong=\b
X
X\def\t#1{{\tt \rawbackslash \frenchspacing #1}\null}
X\let\ttfont = \t
X%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
X\def\samp #1{`\tclose{#1}'\null}
X\def\key #1{{\tt \uppercase{#1}}\null}
X\def\ctrl #1{{\tt \rawbackslash \hat}#1}
X
X\let\file=\samp
X
X% @code is a modification of @t,
X% which makes spaces the same size as normal in the surrounding text.
X\newdimen\tclosesave
X\newdimen\tcloserm
X\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font
X\fontdimen2\font=\tcloserm
X\def\ {{\fontdimen2\font=\tclosesave{} }}%
X \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null}
X\let\code=\tclose
X%\let\exp=\tclose  %Was temporary
X
X% @kbd is like @code, except that if the argument is just one @key command, 
X% then @kbd has no effect.
X
X\def\xkey{\key}
X\def\kbdfoo#1#2#3*{\def\one{#1}\def\three{#3}\def\threex{??}%
X\ifx\one\xkey\ifx\threex\three \key{#2}
X\else\tclose{\look}\fi
X\else\tclose{\look}\fi}
X
X\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??*}
X
X\def\l#1{{\li #1}\null}		% 
X
X\def\r#1{{\rm #1}}		% roman font
X\def\sc#1{{\smallcaps #1}}	% smallcaps font
X\def\ii#1{{\it #1}}		% italic font
X
X\message{page headings,}
X
X\newskip\titlepagetopglue \titlepagetopglue = 1.5in
X\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
X
X% First the title page.  Must do @settitle before @titlepage.
X\font\titlerm = cmbx12 scaled \magstep2
X\def\titlefont#1{{\titlerm #1}}
X
X\newtoks\realeverypar
X\newif\ifseenauthor
X
X\def\titlepage{\begingroup \parindent=0pt \textfonts
X   \font\subtitlerm = cmr10 scaled \magstephalf
X   \def\subtitlefont{\subtitlerm \normalbaselineskip = 12pt \normalbaselines}%
X   %
X   \font\authorrm = cmbx12 scaled \magstep1
X   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
X   %
X   % The first subtitle should have some space before it, but not the
X   % others.  They all should be ragged left.
X% This code caused a bug, since two groups were started, but only
X% one was ended.  Also, I can't see the point of this code.
X%   \begingroup \realeverypar = {\leftskip = 2in plus 3em minus 1em
X%                    \parfillskip = 0pt}%
X%   \everypar = {\vglue \baselineskip \the\realeverypar
X%                \everypar={\the\realeverypar}}%
X   %
X   % Now you can print the title using @title.
X   \def\title{\parsearg\titlezzz}%
X   \def\titlezzz##1{\leftline{\titlefont{##1}
X		    \vskip4pt \hrule height 4pt \vskip4pt}}%
X   \vglue\titlepagetopglue
X   %
X   % Now you can put text using @subtitle.
X   \def\subtitle{\parsearg\subtitlezzz}%
X   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
X   %
X   % @author should come last, but may come many times.
X   \def\author{\parsearg\authorzzz}%
X   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
X      {\authorfont \leftline{##1}}}%
X   %  
X   % Most title ``pages'' are actually two pages long, with space
X   % at the top of the second.  We don't want the ragged left on the second.
X   \let\oldpage = \page
X%   \def\page{\vskip4pt \hrule height 2pt \vskip\titlepagebottomglue
X%      \oldpage \endgroup\hrule height0pt\relax}%
X   \def\page{\oldpage \hbox{}}
X}
X
X\def\Etitlepage{\endgroup\page\HEADINGSon}
X
X%%% Set up page headings and footings.
X
X\let\thispage=\folio
X
X\newtoks \evenheadline    % Token sequence for heading line of even pages
X\newtoks \oddheadline     % Token sequence for heading line of odd pages
X\newtoks \evenfootline    % Token sequence for footing line of even pages
X\newtoks \oddfootline     % Token sequence for footing line of odd pages
X
X% Now make Tex use those variables
X\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}}
X\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}}
X
X% Commands to set those variables.
X% For example, this is what  @headings on  does
X% @evenheading @thistitle|@thispage|@thischapter
X% @oddheading @thischapter|@thispage|@thistitle
X% @evenfooting @thisfile||
X% @oddfooting ||@thisfile
X
X\def\evenheading{\parsearg\evenheadingxxx}
X\def\oddheading{\parsearg\oddheadingxxx}
X\def\everyheading{\parsearg\everyheadingxxx}
X
X\def\evenfooting{\parsearg\evenfootingxxx}
X\def\oddfooting{\parsearg\oddfootingxxx}
X\def\everyfooting{\parsearg\everyfootingxxx}
X
X{\catcode`\@=0 %
X
X\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
X\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
X\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
X
X\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
X\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
X\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
X
X\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
X\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
X\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
X\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
X
X\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
X\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
X\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
X
X\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
X\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
X\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
X
X\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
X\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
X\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
X\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
X%
X}% unbind the catcode of @.
X
X% @headings double	turns headings on for double-sided printing.
X% @headings single	turns headings on for single-sided printing.
X% @headings off		turns them off.
X% @headings on		same as @headings double, retained for compatibility.
X% By default, they are off.
X
X\def\headings #1 {\csname HEADINGS#1\endcsname}
X
X\def\HEADINGSoff{
X\global\evenheadline={\hfil} \global\evenfootline={\hfil}
X\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
X\HEADINGSoff
X% When we turn headings on, set the page number to 1.
X% For double-sided printing, put current file name in lower left corner,
X% chapter name on inside top of right hand pages, document
X% title on inside top of left hand pages, and page numbers on outside top
X% edge of all pages.
X\def\HEADINGSdouble{
X%\pagealignmacro
X\global\pageno=1
X\global\evenfootline={\hfil}
X\global\oddfootline={\hfil}
X\global\evenheadline={\line{\folio\hfil\thistitle}}
X\global\oddheadline={\line{\thischapter\hfil\folio}}
X}
X% For single-sided printing, chapter title goes across top left of page,
X% page number on top right.
X\def\HEADINGSsingle{
X%\pagealignmacro
X\global\pageno=1
X\global\evenfootline={\hfil}
X\global\oddfootline={\hfil}
X\global\evenheadline={\line{\thischapter\hfil\folio}}
X\global\oddheadline={\line{\thischapter\hfil\folio}}
X}
X\def\HEADINGSon{\HEADINGSdouble}
X
X% Subroutines used in generating headings
X% Produces Day Month Year style of output.
X\def\today{\number\day\space
X\ifcase\month\or
XJanuary\or February\or March\or April\or May\or June\or
XJuly\or August\or September\or October\or November\or December\fi
X\space\number\year}
X
X% Use this if you want the Month Day, Year style of output.
X%\def\today{\ifcase\month\or
X%January\or February\or March\or April\or May\or June\or
X%July\or August\or September\or October\or November\or December\fi
X%\space\number\day, \number\year}
X
X% @settitle line...  specifies the title of the document, for headings
X% It generates no output of its own
X
X\def\thistitle{No Title}
X\def\settitle{\parsearg\settitlezzz}
X\def\settitlezzz #1{\gdef\thistitle{#1}}
X
X\message{tables,}
X
X% Tables -- @table, @ftable, @item(x), @kitem(x), @xitem(x).
X
X% default indentation of table text
X\newdimen\tableindent \tableindent=.8in
X% default indentation of @itemize and @enumerate text
X\newdimen\itemindent  \itemindent=.3in
X% margin between end of table item and start of table text.
X\newdimen\itemmargin  \itemmargin=.1in
X
X% used internally for \itemindent minus \itemmargin
X\newdimen\itemmax
X
X% Note @table and @ftable define @item, @itemx, etc., with these defs.
X% They also define \itemindex
X% to index the item name in whatever manner is desired (perhaps none).
X
X\def\internalBitem{\smallbreak \parsearg\itemzzz}
X\def\internalBitemx{\par \parsearg\itemzzz}
X
X\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
X\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
X
X\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
X\def\internalBkitemx{\par \parsearg\kitemzzz}
X
X\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}\itemzzz {#1}}
X
X\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}\itemzzz {#1}}
X
X\def\itemzzz #1{\begingroup %
X\advance \hsize by -\rightskip %
X\advance \hsize by -\leftskip %
X\setbox0=\hbox{\itemfont{#1}}%
X\itemindex{#1}%
X\parskip=0in %
X\noindent %
X\ifdim \wd0>\itemmax %
X\vadjust{\penalty 10000}%
X\hbox to \hsize{\hskip -\tableindent\box0\hss}\ %
X\else %
X\hbox to 0pt{\hskip -\tableindent\box0\hss}%
X\fi %
X\endgroup %
X}
X
X\def\item{\errmessage{@item while not in a table}}
X\def\itemx{\errmessage{@itemx while not in a table}}
X\def\kitem{\errmessage{@kitem while not in a table}}
X\def\kitemx{\errmessage{@kitemx while not in a table}}
X\def\xitem{\errmessage{@xitem while not in a table}}
X\def\xitemx{\errmessage{@xitemx while not in a table}}
X
X%% Contains a kludge to get @end[description] to work
X\def\description{\tablez{\dontindex}{1}{}{}{}{}}
X
X\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
X{\obeylines\obeyspaces%
X\gdef\tablex #1^^M{%
X\tabley\dontindex#1        \endtabley}}
X
X\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
X{\obeylines\obeyspaces%
X\gdef\ftablex #1^^M{%
X\tabley\fnitemindex#1        \endtabley}}
X
X\def\dontindex #1{}
X\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
X
X{\obeyspaces %
X\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
X\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
X
X\def\tablez #1#2#3#4#5#6{%
X\aboveenvbreak %
X\begingroup %
X\def\Edescription{\Etable}% Neccessary kludge.
X\let\itemindex=#1%
X\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
X\ifnum 0#4>0 \tableindent=#4\mil \fi %
X\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
X\def\itemfont{#2}%
X\itemmax=\tableindent %
X\advance \itemmax by -\itemmargin %
X\advance \leftskip by \tableindent %
X\parindent = 0pt
X\parskip = \smallskipamount
X\ifdim \parskip=0pt \parskip=2pt \fi%
X\def\Etable{\endgraf\endgroup\afterenvbreak}%
X\let\item = \internalBitem %
X\let\itemx = \internalBitemx %
X\let\kitem = \internalBkitem %
X\let\kitemx = \internalBkitemx %
X\let\xitem = \internalBxitem %
X\let\xitemx = \internalBxitemx %
X}
X
X% This is the counter used by @enumerate, which is really @itemize
X
X\newcount \itemno
X
X\def\itemize{\parsearg\itemizezzz}
X
X\def\itemizezzz #1{\itemizey {#1}{\Eitemize}}
X
X\def\itemizey #1#2{%
X\aboveenvbreak %
X\begingroup %
X\itemno = 0 %
X\itemmax=\itemindent %
X\advance \itemmax by -\itemmargin %
X\advance \leftskip by \itemindent %
X\parindent = 0pt
X\parskip = \smallskipamount
X\ifdim \parskip=0pt \parskip=2pt \fi%
X\def#2{\endgraf\endgroup\afterenvbreak}%
X\def\itemcontents{#1}%
X\let\item=\itemizeitem}
X
X\def\bullet{$\ptexbullet$}
X\def\minus{$-$}
X
X% Set sfcode to normal for the chars that usually have another value.
X% These are `.?!:;,'
X\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
X  \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
X
X\def\enumerate{\itemizey{\the\itemno.}\Eenumerate\flushcr}
X
X% Definition of @item while inside @itemize.
X
X\def\itemizeitem{%
X\advance\itemno by 1
X{\let\par=\endgraf \smallbreak}%
X\ifhmode \errmessage{\in hmode at itemizeitem}\fi
X{\parskip=0in \hskip 0pt
X\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
X\vadjust{\penalty 300}}%
X\flushcr}
X
X\message{indexing,}
X% Index generation facilities
X
X% Define \newwrite to be identical to plain tex's \newwrite
X% except not \outer, so it can be used within \newindex.
X{\catcode`\@=11
X\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
X
X% \newindex {foo} defines an index named foo.
X% It automatically defines \fooindex such that
X% \fooindex ...rest of line... puts an entry in the index foo.
X% It also defines \fooindfile to be the number of the output channel for
X% the file that	accumulates this index.  The file's extension is foo.
X% The name of an index should be no more than 2 characters long
X% for the sake of vms.
X
X\def\newindex #1{
X\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
X\openout \csname#1indfile\endcsname \jobname.#1	% Open the file
X\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
X\noexpand\doindex {#1}}
X}
X
X% @defindex foo  ==  \newindex{foo}
X
X\def\defindex{\parsearg\newindex}
X
X% Define @defcodeindex, like @defindex except put all entries in @code.
X
X\def\newcodeindex #1{
X\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
X\openout \csname#1indfile\endcsname \jobname.#1	% Open the file
X\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
X\noexpand\docodeindex {#1}}
X}
X
X\def\defcodeindex{\parsearg\newcodeindex}
X
X% @synindex foo bar    makes index foo feed into index bar.
X% Do this instead of @defindex foo if you don't want it as a separate index.
X\def\synindex #1 #2 {%
X\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
X\noexpand\doindex {#2}}%
X}
X
X% @syncodeindex foo bar   similar, but put all entries made for index foo
X% inside @code.
X\def\syncodeindex #1 #2 {%
X\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
X\noexpand\docodeindex {#2}}%
X}
X
X% Define \doindex, the driver for all \fooindex macros.
X% Argument #1 is generated by the calling \fooindex macro,
X%  and it is "foo", the name of the index.
X
X% \doindex just uses \parsearg; it calls \doind for the actual work.
X% This is because \doind is more useful to call from other macros.
X
X% There is also \dosubind {index}{topic}{subtopic}
X% which makes an entry in a two-level index such as the operation index.
X
X\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
X\def\singleindexer #1{\doind{\indexname}{#1}}
X
X% like the previous two, but they put @code around the argument.
X\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
X\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
X
X\def\indexdummies{%
X\def\bf{\realbackslash bf }%
X\def\rm{\realbackslash rm }%
X\def\sl{\realbackslash sl }%
X\def\dots{\realbackslash dots }%
X\def\copyright{\realbackslash copyright }%
X\def\tclose##1{\realbackslash tclose {##1}}%
X\def\code##1{\realbackslash code {##1}}%
X\def\samp##1{\realbackslash samp {##1}}%
X\def\r##1{\realbackslash r {##1}}%
X\def\i##1{\realbackslash i {##1}}%
X\def\b##1{\realbackslash b {##1}}%
X\def\cite##1{\realbackslash cite {##1}}%
X\def\key##1{\realbackslash key {##1}}%
X\def\file##1{\realbackslash file {##1}}%
X\def\var##1{\realbackslash var {##1}}%
X\def\kbd##1{\realbackslash kbd {##1}}%
X}
X
X% \indexnofonts no-ops all font-change commands.
X% This is used when outputting the strings to sort the index by.
X\def\indexdummyfont#1{#1}
X\def\indexnofonts{%
X\let\r=\indexdummyfont
X\let\i=\indexdummyfont
X\let\b=\indexdummyfont
X\let\emph=\indexdummyfont
X\let\strong=\indexdummyfont
X\let\cite=\indexdummyfont
X\let\sc=\indexdummyfont
X%Don't no-op \tt, since it isn't a user-level command
X% and is used in the definitions of the actuve chars like <, >, |...
X%\let\tt=\indexdummyfont
X\let\tclose=\indexdummyfont
X\let\code=\indexdummyfont
X\let\file=\indexdummyfont
X\let\samp=\indexdummyfont
X\let\kbd=\indexdummyfont
X\let\key=\indexdummyfont
X\let\var=\indexdummyfont
X}
X
X% To define \realbackslash, we must make \ not be an escape.
X% We must first make another character (@) an escape
X% so we do not become unable to do a definition.
X
X{\catcode`\@=0 \catcode`\\=\other
X@gdef@realbackslash{\}}
X
X\let\indexbackslash=0  %overridden during \printindex.
X
X\def\doind #1#2{%
X{\indexdummies % Must do this here, since \bf, etc expand at this stage
X\count10=\lastpenalty %
X\escapechar=`\\%
X{\let\folio=0% Expand all macros now EXCEPT \folio
X\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
X% so it will be output as is; and it will print as backslash in the indx.
X%
X% Now process the index-string once, with all font commands turned off,
X% to get the string to sort the index by.
X{\indexnofonts
X\xdef\temp1{#2}%
X}%
X% Now produce the complete index entry.  We process the index-string again,
X% this time with font commands expanded, to get what to print in the index.
X\edef\temp{%
X\write \csname#1indfile\endcsname{%
X\realbackslash entry {\temp1}{\folio}{#2}}}%
X\temp }%
X\penalty\count10}}
X
X\def\dosubind #1#2#3{%
X{\indexdummies % Must do this here, since \bf, etc expand at this stage
X\count10=\lastpenalty %
X\escapechar=`\\%
X{\let\folio=0%
X\def\rawbackslashxx{\indexbackslash}%
X%
X% Now process the index-string once, with all font commands turned off,
X% to get the string to sort the index by.
X{\indexnofonts
X\xdef\temp1{#2 #3}%
X}%
X% Now produce the complete index entry.  We process the index-string again,
X% this time with font commands expanded, to get what to print in the index.
X\edef\temp{%
X\write \csname#1indfile\endcsname{%
X\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
X\temp }%
X\penalty\count10}}
X
X% The index entry written in the file actually looks like
X%  \entry {sortstring}{page}{topic}
X% or
X%  \entry {sortstring}{page}{topic}{subtopic}
X% The texindex program reads in these files and writes files
X% containing these kinds of lines:
X%  \initial {c}
X%     before the first topic whose initial is c
X%  \entry {topic}{pagelist}
X%     for a topic that is used without subtopics
X%  \primary {topic}
X%     for the beginning of a topic that is used with subtopics
X%  \secondary {subtopic}{pagelist}
X%     for each subtopic.
X
X% Define the user-accessible indexing commands 
X% @findex, @vindex, @kindex, @cindex.
X
X\def\findex {\fnindex}
X\def\kindex {\kyindex}
X\def\cindex {\cpindex}
X\def\vindex {\vrindex}
X\def\tindex {\tpindex}
X\def\pindex {\pgindex}
X
X\def\cindexsub {\begingroup\obeylines\cindexsub}
X{\obeylines %
X\gdef\cindexsub "#1" #2^^M{\endgroup %
X\dosubind{cp}{#2}{#1}}}
X
X% Define the macros used in formatting output of the sorted index material.
X
X% This is what you call to cause a particular index to get printed.
X% Write
X% @unnumbered Function Index
X% @printindex fn
X
X\def\printindex{\parsearg\doprintindex}
X
X\def\doprintindex#1{\tex %
X\catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
X\catcode`\$=\other\catcode`\_=\other
X\catcode`\~=\other
X% The following don't help, since the chars were translated
X% when the raw index was written, and their fonts were discarded
X% due to \indexnofonts.
X%\catcode`\"=\active
X%\catcode`\^=\active
X%\catcode`\_=\active
X%\catcode`\|=\active
X%\catcode`\<=\active
X%\catcode`\>=\active
X\def\indexbackslash{\rawbackslashxx}
X\indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
X\begindoublecolumns
X\openin 1 \jobname.#1s
X\ifeof 1 \else \closein 1 \input \jobname.#1s
X\fi
X\enddoublecolumns
X\Etex}
X
X% These macros are used by the sorted index file itself.
X% Change them to control the appearance of the index.
X
X% Same as \bigskipamount except no shrink.
X% \balancecolumns gets confused if there is any shrink.
X\newskip\initialskipamount \initialskipamount 12pt plus4pt
X
X\outer\def\initial #1{%
X{\let\tentt=\sectt \let\sf=\sectt
X\ifdim\lastskip<\initialskipamount
X\removelastskip \penalty-200 \vskip \initialskipamount\fi
X\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
X
X\outer\def\entry #1#2{
X{\parfillskip=0in \parskip=0in \parindent=0in
X\hangindent=1in \hangafter=1%
X\noindent\hbox{#1}\dotfill #2\par
X}}
X
X\def\primary #1{\line{#1\hfil}}
X
X\newskip\secondaryindent \secondaryindent=0.5cm
X
X\def\secondary #1#2{
X{\parfillskip=0in \parskip=0in
X\hangindent =1in \hangafter=1
X\noindent\hskip\secondaryindent\hbox{#1}\dotfill #2\par
X}}
X
X%% Define two-column mode, which is used in indexes.
X%% Adapted from the TeXBook, page 416
X\catcode `\@=11
X
X\newbox\partialpage
X
X\newdimen\doublecolumnhsize  \doublecolumnhsize = 3.11in
X\newdimen\doublecolumnvsize  \doublecolumnvsize = 19.1in
X\newdimen\availdimen@
X
X\def\begindoublecolumns{\begingroup
X  \output={\global\setbox\partialpage=\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
X  \output={\doublecolumnout} \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
X\def\enddoublecolumns{\output={\balancecolumns}\eject
X  \endgroup \pagegoal=\vsize}
X
X\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
X  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
X  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
X  \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
X\def\pagesofar{\unvbox\partialpage %
X  \hsize=\doublecolumnhsize % have to restore this since output routine
X%	      changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
X  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
X\def\balancecolumns{%
X% Unset the glue.
X  \setbox255=\vbox{\unvbox255}
X  \dimen@=\ht255
X  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
X  \divide\dimen@ by2
X  \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage
X% If the remaining data is too big for one page,
X% output one page normally, then work with what remains.
X  \ifdim \dimen@>\availdimen@
X   {
X     \splittopskip=\topskip \splitmaxdepth=\maxdepth
X     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
X     \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
X     \onepageout\pagesofar
X   }
X% Recompute size of what remains, in case we just output some of it.
X  \dimen@=\ht255
X  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
X  \divide\dimen@ by2
X  \fi
X  \setbox0=\vbox{\unvbox255}
X  \splittopskip=\topskip
X  {\vbadness=10000 \loop \global\setbox3=\copy0
X    \global\setbox1=\vsplit3 to\dimen@
X    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
X  \setbox0=\vbox to\dimen@{\unvbox1}  \setbox2=\vbox to\dimen@{\unvbox3}
X  \pagesofar}
X
X\catcode `\@=\other
X\message{sectioning,}
X% Define chapters, sections, etc.
X
X\newcount \chapno
X\newcount \secno
X\newcount \subsecno
X\newcount \subsubsecno
X
X% This counter is funny since it counts through charcodes of letters A, B, ...
X\newcount \appendixno  \appendixno = `\@
X\def\appendixletter{\char\the\appendixno}
X
X\newwrite \contentsfile
X% This is called from \setfilename.
X\def\opencontents{\openout \contentsfile = \jobname.toc}
X
X% Each @chapter defines this as the name of the chapter.
X% page headings and footings can use it.  @section does likewise
X
X\def\thischapter{} \def\thissection{}
X\def\seccheck#1{\if \pageno<0 %
X\errmessage{@#1 not allowed after generating table of contents}\fi
X%
X}
X
X\def\chapternofonts{%
X\let\rawbackslash=\relax%
X\let\frenchspacing=\relax%
X\def\char{\realbackslash char}
X\def\tclose##1{\realbackslash tclose {##1}}
X\def\code##1{\realbackslash code {##1}}
X\def\samp##1{\realbackslash samp {##1}}
X\def\r##1{\realbackslash r {##1}}
X\def\i##1{\realbackslash i {##1}}
X\def\b##1{\realbackslash b {##1}}
X\def\cite##1{\realbackslash cite {##1}}
X\def\key##1{\realbackslash key {##1}}
X\def\file##1{\realbackslash file {##1}}
X\def\var##1{\realbackslash var {##1}}
X\def\kbd##1{\realbackslash kbd {##1}}
X}
X
X\outer\def\chapter{\parsearg\chapterzzz}
X\def\chapterzzz #1{\seccheck{chapter}%
X\secno=0 \subsecno=0 \subsubsecno=0 \global\advance \chapno by 1 \message{Chapter \the\chapno}%
X\chapmacro {#1}{\the\chapno}%
X\gdef\thissection{#1}\gdef\thischapter{#1}%
X{\chapternofonts%
X\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp  %
X\donoderef %
X}}
X
X\outer\def\appendix{\parsearg\appendixzzz}
X\def\appendixzzz #1{\seccheck{appendix}%
X\secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}%
X\chapmacro {#1}{Appendix \appendixletter}%
X\gdef\thischapter{#1}\gdef\thissection{#1}%
X{\chapternofonts%
X\edef\temp{{\realbackslash chapentry {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp  %
X\appendixnoderef %
X}}
X
X\outer\def\unnumbered{\parsearg\unnumberedzzz}
X\def\unnumberedzzz #1{\seccheck{unnumbered}%
X\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
X\unnumbchapmacro {#1}%
X\gdef\thischapter{#1}\gdef\thissection{#1}%
X{\chapternofonts%
X\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp  %
X\unnumbnoderef %
X}}
X
X\outer\def\section{\parsearg\sectionzzz}
X\def\sectionzzz #1{\seccheck{section}%
X\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
X\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
X{\chapternofonts%
X\edef\temp{{\realbackslash secentry %
X{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\donoderef %
X\penalty 10000 %
X}}
X
X\outer\def\appendixsection{\parsearg\appendixsectionzzz}
X\outer\def\appendixsec{\parsearg\appendixsectionzzz}
X\def\appendixsectionzzz #1{\seccheck{appendixsection}%
X\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
X\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
X{\chapternofonts%
X\edef\temp{{\realbackslash secentry %
X{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\appendixnoderef %
X\penalty 10000 %
X}}
X
X\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
X\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
X\plainsecheading {#1}\gdef\thissection{#1}%
X{\chapternofonts%
X\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\unnumbnoderef %
X\penalty 10000 %
X}}
X
X\outer\def\subsection{\parsearg\subsectionzzz}
X\def\subsectionzzz #1{\seccheck{subsection}%
X\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
X\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
X{\chapternofonts%
X\edef\temp{{\realbackslash subsecentry %
X{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\donoderef %
X\penalty 10000 %
X}}
X
X\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
X\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
X\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
X\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
X{\chapternofonts%
X\edef\temp{{\realbackslash subsecentry %
X{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\appendixnoderef %
X\penalty 10000 %
X}}
X
X\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
X\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
X\plainsecheading {#1}\gdef\thissection{#1}%
X{\chapternofonts%
X\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\unnumbnoderef %
X\penalty 10000 %
X}}
X
X\outer\def\subsubsection{\parsearg\subsubsectionzzz}
X\def\subsubsectionzzz #1{\seccheck{subsubsection}%
X\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
X\subsubsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
X{\chapternofonts%
X\edef\temp{{\realbackslash subsubsecentry %
X{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%\
X\escapechar=`\\%
X\write \contentsfile \temp %
X\donoderef %
X\penalty 10000 %
X}}
X
X\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
X\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
X\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
X\subsubsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
X{\chapternofonts%
X\edef\temp{{\realbackslash subsubsecentry{#1}%
X{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%\
X\escapechar=`\\%
X\write \contentsfile \temp %
X\appendixnoderef %
X\penalty 10000 %
X}}
X
X\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
X\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
X\plainsecheading {#1}\gdef\thissection{#1}%
X{\chapternofonts%
X\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
X\escapechar=`\\%
X\write \contentsfile \temp %
X\unnumbnoderef %
X\penalty 10000 %
X}}
X
X% These are variants which are not "outer", so they can appear in @ifinfo.
X\def\infounnumbered{\parsearg\unnumberedzzz}
X\def\infounnumberedsec{\parsearg\unnumberedseczzz}
X\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
X\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
X
X\def\infoappendix{\parsearg\appendixzzz}
X\def\infoappendixsec{\parsearg\appendixseczzz}
X\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
X\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
X
X\def\infochapter{\parsearg\chapterzzz}
X\def\infosection{\parsearg\sectionzzz}
X\def\infosubsection{\parsearg\subsectionzzz}
X\def\infosubsubsection{\parsearg\subsubsectionzzz}
X
X% Define @majorheading, @heading and @subheading
X
X\def\majorheading #1{%
X{\advance\chapheadingskip by 10pt \chapbreak }%
X{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 200}
X
X\def\chapheading #1{\chapbreak %
X{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 200}
X
X\def\heading{\parsearg\secheadingi}
X
X% These macros generate a chapter, section, etc. heading only
X% (including whitespace, linebreaking, etc. around it),
X% given all the information in convenient, parsed form.
X
X%%% Args are the skip and penalty (usually negative)
X\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
X
X\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
X
X%%% Define plain chapter starts, and page on/off switching for it
X% Parameter controlling skip before chapter headings (if needed)
X
X\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
X
X\def\chapbreak{\dobreak \chapheadingskip {-4000}}
X\def\chappager{\par\vfill\supereject}
X\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
X
X\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
X
X\def\CHAPPAGoff{
X\global\let\pchapsepmacro=\chapbreak
X\global\let\pagealignmacro=\chappager}
X
X\def\CHAPPAGon{
X\global\let\pchapsepmacro=\chappager
X\global\let\pagealignmacro=\chappager
X\global\def\HEADINGSon{\HEADINGSsingle}}
X
X\def\CHAPPAGodd{
X\global\let\pchapsepmacro=\chapoddpage
X\global\let\pagealignmacro=\chapoddpage
X\global\def\HEADINGSon{\HEADINGSdouble}}
X
X\CHAPPAGon
X
X\def\CHAPFplain{
X\global\let\chapmacro=\chfplain
X\global\let\unnumbchapmacro=\unnchfplain}
X
X\def\chfplain #1#2{%
X\pchapsepmacro %
X{\chapfonts \line{\rm #2.\enspace #1\hfill}}\bigskip \par\penalty 5000 %
X}
X
X\def\unnchfplain #1{%
X\pchapsepmacro %
X{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 %
X}
X\CHAPFplain % The default
X
X\def\unnchfopen #1{%
X\chapoddpage {\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 %
X}
X
X\def\chfopen #1#2{\chapoddpage {\chapfonts
X\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
X\par\penalty 5000 %
X}
X
X\def\CHAPFopen{
X\global\let\chapmacro=\chfopen
X\global\let\unnumbchapmacro=\unnchfopen}
X
X% Parameter controlling skip before section headings.
X
X\newskip \subsecheadingskip  \subsecheadingskip = 17pt plus 8pt minus 4pt
X\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
X
X\newskip \secheadingskip  \secheadingskip = 21pt plus 8pt minus 4pt
X\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
X
X
X% Section fonts are the base font at magstep2, which produces
X% a size a bit more than 14 points in the default situation.	
X
X\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
X\def\plainsecheading #1{\secheadingi {#1}}
X\def\secheadingi #1{{\advance \secheadingskip by \parskip %
X\secheadingbreak}%
X{\secfonts \line{\rm #1\hfill}}%
X\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
X
X
X% Subsection fonts are the base font at magstep1, 
X% which produces a size of 12 points.
X
X\def\subsecheading #1#2#3#4{{\advance \subsecheadingskip by \parskip %
X\subsecheadingbreak}%
X{\subsecfonts \line{\rm#2.#3.#4\enspace #1\hfill}}%
X\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
X
X\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
X				  % Perhaps make sssec fonts scaled
X				  % magstep half
X\def\subsubsecheading #1#2#3#4#5{{\advance \subsecheadingskip by \parskip %
X\subsecheadingbreak}%
X{\subsubsecfonts \line{\rm#2.#3.#4.#5\enspace #1\hfill}}%
X\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
X
X
X\message{toc printing,}
X
X% Finish up the main text and prepare to read what we've written
X% to \contentsfile.
X
X\def\startcontents#1{%
X   \ifnum \pageno>0
X      \pagealignmacro
X      \immediate\closeout \contentsfile
X      \pageno = -1		% Request roman numbered pages.
X   \fi
X   \unnumbchapmacro{#1}\def\thischapter{#1}%
X   \begingroup   		% Set up to handle contents files properly.
X      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
X      \raggedbottom             % Worry more about breakpoints than the bottom.
X      \advance\hsize by -1in    % Don't use the full line length.
X}
X
X  
X% Normal (long) toc.
X\outer\def\contents{%
X   \startcontents{Table of Contents}%
X      \input \jobname.toc
X   \endgroup
X   \vfill \eject
X}
X
X% And just the chapters.
X\outer\def\summarycontents{%
X   \startcontents{Short Contents}%
X      %
X      \let\chapentry = \shortchapentry
X      \let\unnumbchapentry = \shortunnumberedentry
X      % We want a true roman here for the page numbers.
X      \secfonts \let\rm = \truesecrm \rm
X      \advance\baselineskip by 1pt % Open it up a little.
X      \def\secentry ##1##2##3##4{}
X      \def\unnumbsecentry ##1##2{}
X      \def\subsecentry ##1##2##3##4##5{}
X      \def\unnumbsubsecentry ##1##2{}
X      \def\subsubsecentry ##1##2##3##4##5##6{}
X      \def\unnumbsubsubsecentry ##1##2{}
X      \input \jobname.toc
X   \endgroup
X   \vfill \eject
X}
X\let\shortcontents = \summarycontents
X
X% These macros generate individual entries in the table of contents.
X% The first argument is the chapter or section name.
X% The last argument is the page number.
X% The arguments in between are the chapter number, section number, ...
X
X% Chapter-level things, for both the long and short contents.
X\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
X\def\shortchapentry#1#2#3{%
X   \line{{#2\labelspace #1}\dotfill\doshortpageno{#3}}%
X}
X
X\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
X\def\shortunnumberedentry#1#2{%
X   \line{#1\dotfill\doshortpageno{#2}}%
X}
X
X% Sections.
X\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
X\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
X
X% Subsections.
X\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
X\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
X
X% And subsubsections.
X\def\subsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
X\def\unnumbsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
X
X
X% This parameter controls the indentation of the various levels.
X\newdimen\tocindent \tocindent = 3pc
X
X% Now for the actual typesetting. In all these, #1 is the text and #2 is the 
X% page number.
X%
X% If the toc has to be broken over pages, we would want to be at chapters 
X% if at all possible; hence the \penalty.
X\def\dochapentry#1#2{%
X   \penalty-300 \vskip\baselineskip
END_OF_FILE
  if test 49357 -ne `wc -c <'./support/texinfo.tex.01'`; then
    echo shar: \"'./support/texinfo.tex.01'\" unpacked with wrong size!
  fi
  # end of './support/texinfo.tex.01'
fi
echo shar: End of archive 9 \(of 16\).
cp /dev/null ark9isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 16 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still must unpack the following archives:
    echo "        " ${MISSING}
fi
exit 0
exit 0 # Just in case...
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.