home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / misc / nice.tex < prev    next >
Encoding:
Text File  |  1991-01-15  |  18.5 KB  |  556 lines

  1. % NICE Version 2 macro package for plain TeX
  2. % written by
  3. %   Christian Rank
  4. %   Br\"augasse 13/225
  5. %   D-8390 Passau
  6. %   E-Mail: rank@unipas.fmi.uni-passau.de
  7. %   (please don't e-mail from outside Germany!)
  8.  
  9. % THIS MACRO PACKAGE MAY BE COPIED AND USED FREELY ONLY IN THIS ORIGINAL STATE
  10. % WITHOUT ANY CHANGES.
  11. % TO PRESERVE COMPATIBILITY, PLEASE DO NOT MODIFY THIS FILE UNDER ANY
  12. % CIRCUMSTANCES. YOU CAN CUSTOMIZE THE NICE PACKAGE FOR YOUR NEEDS VIA AN
  13. % AUXILIARY FILE WHICH READS IN NICE.TEX AND THEN CHANGES PARAMETERS
  14. % AND/OR DEFINES ADDITIONAL COMMANDS.
  15.  
  16. % we check first if NICE has already been read, in which case we do not need
  17. % to define the NICE macros again.
  18. \expandafter\ifx\csname niceversion\endcsname \relax \else \endinput \fi
  19.  
  20. % NICE hasn't already been read, so we continue
  21.  
  22. \def\niceversion{2.0}
  23. \def\versionof {17/09/90}
  24.  
  25. \immediate\write16 {NICE version \niceversion, (c) 1990 by C. Rank}
  26. \everyjob {\immediate\write16 {NICE version \niceversion \space of \versionof}}
  27.  
  28. \catcode`\@=11 % for definition of private macros
  29.  
  30. %
  31. % adjustment of general parameters
  32. %
  33. \vsize 9.2truein \hsize 6.5truein % page layout
  34. \baselineskip=12pt \lineskiplimit=0pt \lineskip=0pt
  35. \smallskipamount=6pt plus 1pt minus 1pt
  36. \medskipamount=12pt plus 2pt minus 2pt
  37. \bigskipamount=18pt plus 3pt minus 3pt
  38. \parskip=6pt plus 1pt minus 1pt
  39. \parindent=0pt
  40.  
  41. \tolerance=10000
  42. \hbadness=5000
  43.  
  44. %
  45. % the fonts used
  46. %
  47. \font\documenttitlefont=cmr10 scaled \magstep4
  48. \font\sectiontitlefont=cmbx10 scaled \magstep2
  49. \font\subsectiontitlefont=cmbx10 scaled \magstep1
  50. \font\subsubsectiontitlefont=cmbx10 scaled \magstephalf
  51. % fonts used for variable size styles
  52. \font\ninerm=cmr9 \font\eightrm=cmr8 \font\sixrm=cmr6
  53. \font\ninei=cmmi9 \font\eighti=cmmi8 \font\sixi=cmmi6
  54. \font\ninesy=cmsy9 \font\eightsy=cmsy8 \font\sixsy=cmsy6
  55. \font\ninebf=cmbx9 \font\eightbf=cmbx8 \font\sixbf=cmbx6
  56. \font\ninesl=cmsl9 \font\eightsl=cmsl8
  57. \font\ninett=cmtt9 \font\eighttt=cmtt8
  58. \font\nineit=cmti9 \font\eightit=cmti8 \font\sevenit=cmti7
  59.  
  60. %
  61. % the variable size styles
  62. %
  63. \def\ninept{\textfont0=\ninerm \scriptfont0=\sevenrm
  64.         \scriptscriptfont0=\fiverm
  65.         \def\rm{\fam0 \ninerm}
  66.         \textfont1=\ninei \scriptfont1=\seveni \scriptscriptfont1=\fivei
  67.         \def\oldstyle{\fam1 \ninei}
  68.         \textfont2=\ninesy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
  69.         \textfont\itfam=\nineit \def\it{\fam\itfam \nineit}
  70.         \textfont\slfam=\ninesl \def\sl{\fam\slfam \ninesl}
  71.         \textfont\bffam=\ninebf \scriptfont\bffam=\sevenbf
  72.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \ninebf}
  73.         \textfont\ttfam=\ninett \def\tt{\fam\ttfam \ninett}
  74.         \baselineskip=11pt
  75.         \rm
  76. }
  77.  
  78. \def\eightpt{\textfont0=\eightrm \scriptfont0=\sixrm
  79.         \scriptscriptfont0=\fiverm
  80.         \def\rm{\fam0 \eightrm}
  81.         \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
  82.         \def\oldstyle{\fam1 \eighti}
  83.         \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  84.         \textfont\itfam=\eightit \def\it{\fam\itfam \eightit}
  85.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  86.         \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
  87.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \eightbf}
  88.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  89.         \baselineskip=10pt
  90.         \rm
  91. }
  92.  
  93. \def\sevenpt{\textfont0=\sevenrm \scriptfont0=\sixrm
  94.         \scriptscriptfont0=\fiverm
  95.         \def\rm{\fam0 \sevenrm}
  96.         \textfont1=\seveni \scriptfont1=\sixi \scriptscriptfont1=\fivei
  97.         \def\oldstyle{\fam1 \seveni}
  98.         \textfont2=\sevensy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  99.         \textfont\itfam=\sevenit \def\it{\fam\itfam \sevenit}
  100.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  101.         \textfont\bffam=\sevenbf \scriptfont\bffam=\sixbf
  102.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \sevenbf}
  103.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  104.         \baselineskip=9pt
  105.         \rm
  106. }
  107.  
  108. \def\sixpt{\textfont0=\sixrm \scriptfont0=\fiverm
  109.         \scriptscriptfont0=\fiverm
  110.         \def\rm{\fam0 \sixrm}
  111.         \textfont1=\sixi \scriptfont1=\fivei \scriptscriptfont1=\fivei
  112.         \def\oldstyle{\fam1 \sixi}
  113.         \textfont2=\sixsy \scriptfont2=\fivesy \scriptscriptfont2=\fivesy
  114.         \textfont\itfam=\sevenit \def\it{\fam\itfam \sevenit}
  115.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  116.         \textfont\bffam=\sixbf \scriptfont\bffam=\fivebf
  117.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \sixbf}
  118.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  119.         \baselineskip=8pt
  120.         \rm
  121. }
  122.  
  123. \def\fivept{\textfont0=\fiverm \scriptfont0=\fiverm
  124.         \scriptscriptfont0=\fiverm
  125.         \def\rm{\fam0 \fiverm}
  126.         \textfont1=\fivei \scriptfont1=\fivei \scriptscriptfont1=\fivei
  127.         \def\oldstyle{\fam1 \fivei}
  128.         \textfont2=\fivesy \scriptfont2=\fivesy \scriptscriptfont2=\fivesy
  129.         \textfont\itfam=\sevenit \def\it{\fam\itfam \sevenit}
  130.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  131.         \textfont\bffam=\fivebf \scriptfont\bffam=\fivebf
  132.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \fivebf}
  133.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  134.         \baselineskip=7pt
  135.         \rm
  136. }
  137.  
  138. %
  139. % this stuff defines a macro `include', which has the same effect as plain
  140. % TeX's `input', except that it is no error if the file does not exist.
  141. %
  142. \newread\testinclude
  143. \def\include#1{\immediate\openin\testinclude #1
  144.         \ifeof\testinclude \immediate\write16 {No file #1.}
  145.         \else \immediate\closein\testinclude \input #1
  146.         \fi}
  147.  
  148. %
  149. % general utilities
  150. %
  151. \def\newpage{\vfill\eject}
  152.  
  153. \def\\{$\backslash$}
  154.  
  155. \def\raggedcenter{\leftskip=0pt plus 4em \rightskip=\leftskip
  156.         \parfillskip=0pt \spaceskip=.3333em \xspaceskip=.5em
  157.         \pretolerance=9999 \tolerance=9999 \hbadness=10000
  158.         \hyphenpenalty=9999 \exhyphenpenalty=9999}
  159.  
  160. \def\parwithoutskip{{\parskip=0pt plus 0.5pt\par\noindent}\ignorespaces}
  161.  
  162. \newdimen\narrowskip \narrowskip=20pt
  163. \def\lnarrower{\advance\leftskip by \narrowskip}
  164. \let\onarrower=\narrower
  165. \def\narrower{\advance\leftskip by \narrowskip
  166.         \advance\rightskip by \narrowskip}
  167.  
  168. \def\tw@num#1{\ifnum#1>9 #1\else 0#1\fi}
  169. \def\date{\tw@num{\the\day}/\tw@num{\the\month}/\the\year}
  170.  
  171. \def\ifndef#1{\expandafter\ifx\csname#1\endcsname\relax}
  172.  
  173. %
  174. % title and section layout
  175. %
  176. \long\def\title#1{{\raggedcenter \documenttitlefont #1 \par}}
  177.  
  178. \def\titlepage{\begingroup
  179.         \def\title##1{{\raggedcenter \documenttitlefont ##1 \par}\medskip}
  180.         \long\def\author##1{{\parskip=0pt \raggedcenter \rm ##1 \par}}
  181.         \def\release##1{\centerline{\bf ##1}}
  182.         \def\abstract{\centerline{\bf Abstract}\narrowskip=3truecm \narrower}
  183.         \def\endtitlepage{\vfil\egroup \newpage \endgroup}
  184.         \vbox to \vsize \bgroup \vfil}
  185.  
  186. \newcount\sectionno \sectionno=0
  187. \newcount\subsectionno
  188. \newcount\subsubsectionno
  189.  
  190. \newtoks\sectionnscheme
  191. \sectionnscheme={\gensect. }
  192. \newtoks\subsectionnscheme
  193. \subsectionnscheme={\gensect.\number\subsectionno. }
  194. \newtoks\subsubsectionnscheme
  195. \subsubsectionnscheme={\gensect.\number\subsectionno
  196.         .\number\subsubsectionno. }
  197.  
  198. \def\genheading#1#2#3{\vskip\parskip \vbox{
  199.         \setbox0 \hbox{#1#2} \hangindent=\the\wd0 \hangafter=1
  200.         \noindent \raggedright \pretolerance=10000 \box0 #1#3\par}}
  201. \def\gensect{\ifnum \sectionno<0 \char\number-\sectionno
  202.         \else \number\sectionno\fi}
  203.  
  204. \def\plainsection#1{\removelastskip
  205.         \bigskip
  206.         \genheading{\sectiontitlefont}{}{#1}
  207.         \ifnum\contentslevel>0
  208.         {\let\the=0 \edef\next{\write\fcontents
  209.                 {\vskip\contskip \hbox to \hsize
  210.                 {\scstyle \hskip\the\scindent #1 \the\contfill\ 
  211.                  \the\pageno}}}\next}
  212.         \immediate\write16 {#1}
  213.         \fi
  214.         \ifnum\marklevel>0 \mark {#1} \fi
  215.         \nobreak}
  216.  
  217. \def\section#1{\removelastskip
  218.         \bigskip
  219.         \ifnum \sectionno<-1 \global\advance\sectionno by -1
  220.         \else \global\advance\sectionno by 1
  221.         \fi
  222.         \global\subsectionno=0
  223.         \genheading{\sectiontitlefont}{\the\sectionnscheme}{#1}
  224.         {\edef\nscheme{\the\sectionnscheme}
  225.         \ifnum\contentslevel>0
  226.         {\let\the=0 \edef\next{\write\fcontents
  227.                 {\vskip\contskip \hbox to \hsize
  228.                 {\scstyle \hskip\the\scindent \nscheme #1 \the\contfill\
  229.                 \the\pageno}}}\next}
  230.         \immediate\write16 {\nscheme #1}
  231.         \fi
  232.         \ifnum\marklevel>0 \mark {\nscheme #1} \fi
  233.         }
  234.         \nobreak}
  235.  
  236. \def\subsection#1{\removelastskip
  237.         \smallskip
  238.         \global\advance\subsectionno by 1 \global\subsubsectionno=0
  239.         \genheading{\subsectiontitlefont}{\the\subsectionnscheme}{#1}
  240.         {\edef\nscheme{\the\subsectionnscheme}
  241.         \ifnum\contentslevel>1
  242.         {\let\the=0 \edef\next{\write\fcontents
  243.                 {\hbox to \hsize
  244.                 {\sscstyle \hskip\the\sscindent \nscheme #1 \the\contfill\ 
  245.                 \the\pageno}}}\next}
  246.         \immediate\write16 {\nscheme #1}
  247.         \fi
  248.         \ifnum\marklevel>1 \mark {\nscheme #1} \fi
  249.         }
  250.         \nobreak}
  251.  
  252. \def\subsubsection#1{
  253.         \par
  254.         \global\advance\subsubsectionno by 1
  255.         \genheading{\subsubsectiontitlefont}{\the\subsubsectionnscheme}{#1}
  256.         {\edef\nscheme{\the\subsubsectionnscheme}
  257.         \ifnum\contentslevel>2
  258.         {\let\the=0 \edef\next{\write\fcontents
  259.                 {\hbox to \hsize
  260.                 {\ssscstyle \hskip\the\ssscindent \nscheme #1 \the\contfill\
  261.                 \the\pageno}}}\next}
  262.         \immediate\write16 {\nscheme #1}
  263.         \fi
  264.         \ifnum\marklevel>2 \mark {\nscheme #1} \fi
  265.         }
  266.         \nobreak}
  267.  
  268. \def\appendix{\global\sectionno=-64\relax}
  269.  
  270. %
  271. % macros for making a table of contents
  272. %
  273. \newtoks\contfill
  274. \contfill={\hfil}
  275. \newskip\contskip \contskip=0pt % additional skip between section headings
  276.                                 % in contents table
  277. \newcount\contentslevel \contentslevel=0
  278. \newwrite\fcontents
  279. \def\makevoidcontents{
  280.         \openout\fcontents \jobname.toc
  281.         \ifnum\contentslevel=0 \global\contentslevel=1 \fi
  282.         \immediate\write16 {Writing contents on \jobname.toc.}
  283.         }
  284. \def\makecontents{
  285.         \catcode`\@=11
  286.         \include {\jobname.toc}
  287.         \catcode`@=12
  288.         \makevoidcontents
  289.         }
  290. \newdimen\scindent
  291. \newdimen\sscindent
  292. \newdimen\ssscindent % please forgive me;
  293.                      % i know it's a horrible abbreviation
  294. \scindent=0pt
  295. \sscindent=12pt
  296. \ssscindent=32pt
  297. \let\scstyle=\rm
  298. \let\sscstyle=\rm
  299. \let\ssscstyle=\rm % please forgive me once again ...
  300.  
  301. %
  302. % footnotes
  303. %
  304. \let\ovfootnote=\vfootnote
  305. \newdimen\footnoteindent
  306. \footnoteindent=20pt
  307. \def\vfootnote#1{\insert\footins\bgroup
  308.   \parindent=\footnoteindent % change
  309.   \ifndef{footnotestyle} \baselineskip=\fbaselineskip \footfont
  310.   \else \footnotestyle \fi
  311.   \interlinepenalty\interfootnotelinepenalty
  312.   \splittopskip\ht\strutbox % top baseline for broken footnotes
  313.   \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
  314.   \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
  315.   \def\par{\endgraf \hangindent=\footnoteindent \hangafter=1}
  316.   \hangindent=\footnoteindent \hangafter=1
  317.   \textindent{#1}\footstrut\futurelet\next\fo@t}
  318. \let\plainfootnote=\footnote
  319. \newcount\footno \footno=0
  320. \newskip\fbaselineskip \fbaselineskip=\baselineskip
  321. \font\footfont=cmr10
  322. \def\footnote{\global\advance\footno by 1
  323.         \plainfootnote{\hbox{$^{\the\footno}$}}
  324.         }
  325. \long\def\f@t#1{#1\@foot} % enable \par in footnotes
  326.  
  327. %
  328. % defs for staggered layout
  329. %
  330. \newbox\staggbox
  331. \def\staggered#1{\begingroup
  332.         \setbox\staggbox \hbox {#1}
  333.         \edef\key##1{\par \hangindent=\the\wd\staggbox \hangafter=1
  334.                 \noindent \hbox to \the\wd\staggbox {##1\hfil}\ignorespaces}
  335.         \def\endstaggered{\endgraf \endgroup}
  336.         \skip0=\hangindent
  337.         \parskip=0pt plus 0.5pt \vskip\parskip
  338.         \advance \leftskip by \skip0
  339.         \def\par{\endgraf \hangindent=\the\wd\staggbox \hangafter=0}
  340.         }
  341.  
  342. \def\itemlist#1{\begingroup
  343.         \setbox\staggbox \hbox {#1}
  344.         \edef\next{\par \hangindent=\the\wd\staggbox \hangafter=1
  345.                 \noindent \hbox{#1}\ignorespaces}
  346.         \def\enditemlist{\endgraf \endgroup}
  347.         \skip0=\hangindent
  348.         \parskip=0pt plus 0.5pt \vskip\parskip
  349.         \advance \leftskip by \skip0
  350.         \def\par{\endgraf \hangindent=\the\wd\staggbox \hangafter=0}
  351.         }
  352.  
  353. \newcount\itemno
  354. \def\numbered#1{\ifcase #1 \staggered {0. } \or \staggered {0. } \or
  355.         \staggered {00. } \or \staggered {000. } \fi
  356.         \itemno=0
  357.         \def\next{\advance \itemno by 1 \key {\hfill \the\itemno. }}
  358.         \def\endnumbered{\endstaggered}
  359.         }
  360.  
  361. \def\alphanumbered{\staggered {m) }
  362.         \itemno=96
  363.         \def\next{\advance \itemno by 1 \key {\char\itemno ) }}
  364.         \def\endalphanumbered{\endstaggered}
  365.         }
  366.  
  367. \def\pnumbered{\staggered{(0) }
  368.         \itemno=0
  369.         \def\next{\advance \itemno by 1 \key {(\the\itemno)}}
  370.         \def\endpnumbered{\endstaggered}
  371.         }
  372.  
  373. \def\prnumbered{\staggered{(iii) }
  374.         \itemno=0
  375.         \def\next{\advance \itemno by 1 \key {(\romannumeral\itemno)}}
  376.         \def\endprnumbered{\endstaggered}
  377.         }
  378.  
  379. %
  380. % the style for headlines and footlines
  381. %
  382. \newcount\marklevel \marklevel=1
  383. \newdimen\hdrulepos \hdrulepos=-2pt
  384. \def\hdrule{\kern\hdrulepos \hrule}
  385. \def\book{
  386.         \headline={\ifnum\pageno>1\vbox
  387.                 {\line{\strut \ifodd\pageno \tenit\firstmark\hfil\tenbf\folio
  388.                 \else \tenbf\folio\hfil\tenit\firstmark \fi}\hdrule}\else
  389.                 \hfil \fi}
  390.         \footline={\hfil}
  391. }
  392. \def\article{
  393.         \headline={\ifnum\pageno>1\vbox
  394.                 {\line{\strut \tenit\firstmark\hfil\tenbf\folio}\hdrule}\else
  395.         \hfil \fi}
  396.         \footline={\hfil}
  397. }
  398.  
  399. %
  400. % macros for verbatim mode
  401. %
  402. \font\verbatimfont=cmtt10
  403. \newskip\vbaselineskip
  404. \vbaselineskip=\baselineskip
  405. \let\d@specials=\dospecials
  406. \def\uncatcodespecials{\def\do##1{\catcode`##1=12}\dospecials}
  407. \def\beginverbatim{\par\begingroup \let\oldpar=\par
  408.         \ifndef{verbatimstyle} \baselineskip=\vbaselineskip \verbatimfont
  409.         \else \verbatimstyle\tt \fi
  410.         \noindent\parskip=0pt
  411.         \catcode`|=12
  412.         \setupverbatim \doverbatim}
  413. {\catcode`\|=0 \catcode`\\=12
  414.  |obeylines|gdef|doverbatim^^M#1\endverbatim{#1|endgroup}}
  415. \def\setupverbatim{\def\par{\leavevmode\oldpar}\catcode`\`=\active
  416.         \obeylines \uncatcodespecials \obeyspaces}
  417. {\obeyspaces\global\let =\ }
  418. {\catcode`\`=\active \gdef`{\relax\lq}}
  419.  
  420. %
  421. % macros for verbatim mode inside paragraph
  422. %
  423. \def\spvert{\ifmmode\def\n@xt{|}\else\let\n@xt=\txver\fi\n@xt}
  424. \catcode`\|=\active \let |=\spvert
  425. {\obeylines\gdef\txver{\begingroup\tt\setupverbatim\let^^M=\ \let|=\endgroup}}
  426.  
  427. %
  428. % this defines the environment for \usemathsymbols
  429. %
  430. {\catcode`|=12
  431. \global\let\nice@mvert=|
  432. }
  433. \let\nice@mlt=<
  434. \let\nice@mgt=>
  435. \let\nice@mlbr=\{
  436. \let\nice@mrbr=\}
  437. \def\{{\ifmmode \nice@mlbr \else $\nice@mlbr$\fi}
  438. \def\}{\ifmmode \nice@mrbr \else $\nice@mrbr$\fi}
  439.  
  440. {
  441. \catcode`\|=\active
  442. \catcode`\<=\active
  443. \catcode`\>=\active
  444. \gdef\usemathsymbols{
  445.         \catcode`\|=\active
  446.         \catcode`\<=\active
  447.         \catcode`\>=\active
  448.         \def|{\ifmmode \nice@mvert \else $\nice@mvert$\fi}
  449.         \def<{\ifmmode \nice@mlt \else $\nice@mlt$\fi}
  450.         \def>{\ifmmode \nice@mgt \else $\nice@mgt$\fi}
  451.         \let\d@@specials=\dospecials
  452.         \def\dospecials{\d@@specials \do \< \do \>}
  453. }
  454. }
  455.  
  456. %
  457. % cross references
  458. %
  459. \newwrite\frefs
  460. \def\userefs{
  461.         \catcode`\@=11
  462.         \include {\jobname.crf}
  463.         \catcode`@=12
  464.         \openout\frefs \jobname.crf
  465.         \immediate\write16 {Writing references on \jobname.crf.}
  466.         }
  467. {\catcode`\|=0 \catcode`\\=12
  468. |gdef|escapeit{\}
  469. }
  470.  
  471. \def\label#1{{\let\the=0\edef\next{\write\frefs
  472.         {\def\noexpand\escapeit rs@#1{\number\sectionno
  473.         \ifnum\subsectionno=0 \else
  474.                 .\number\subsectionno
  475.         \ifnum\subsubsectionno=0 \else
  476.                 .\number\subsubsectionno
  477.         \fi\fi}}}\next
  478.         \edef\next{\write\frefs
  479.                 {\def\noexpand\escapeit rp@#1{\the\pageno}}}\next
  480.         }}
  481. \def\sref#1{{\catcode`\@=11 \toks0=\expandafter{\csname rs@#1\endcsname}\relax
  482.         \expandafter\ifx\the\toks0\relax
  483.                 [`#1']\write16{Label `#1' undefined on page \the\pageno.}\else
  484.                 \the\toks0 \fi
  485.         }}
  486. \def\pref#1{{\catcode`\@=11 \toks0=\expandafter{\csname rp@#1\endcsname}\relax
  487.         \expandafter\ifx\the\toks0\relax
  488.                 [`#1']\write16{Label `#1' undefined on page \the\pageno.}\else
  489.                 \the\toks0 \fi
  490.         }}
  491.  
  492. %
  493. % automatic numbering of figures
  494. %
  495. \newcount\figureno \figureno=0
  496. \def\figure#1#2{\global\advance\figureno by 1 \centerline {\bf Fig.\
  497.         \the\figureno: #2}{\let\the=0\edef\next{\write\frefs
  498.                 {\def\noexpand\escapeit rf@#1{\number\figureno}}}\next
  499.         }}
  500. \def\fref#1{{\catcode`\@=11 \toks0=\expandafter{\csname rf@#1\endcsname}\relax
  501.         \expandafter\ifx\the\toks0\relax
  502.                 [`#1']\write16{Figure `#1' undefined on page \the\pageno.}\else
  503.                 \the\toks0 \fi
  504.         }}
  505.  
  506. %
  507. % \program macro for the comfortable typing of program texts
  508. %
  509. \newdimen\pindent \pindent=0pt
  510. \newdimen\ppindent
  511. \newif\ifinb@x \inb@xfalse
  512. {\let\+=\undefined
  513. \gdef\program{\begingroup
  514.         \def\bb@x{\setbox0=\hbox\bgroup\inb@xtrue\ignorespaces}
  515.         \def\cr{\egroup \hbox {\hskip\leftskip \hskip\ppindent 
  516.                 \unhbox1 \unhbox0}
  517.                 \ppindent=\pindent
  518.                 \bb@x}
  519.         \def\+{\egroup \begingroup
  520.                 \def\endprogram{\errmessage{\noexpand\- inserted}
  521.                         \ifinb@x \egroup \fi \endgroup \endprogram}
  522.                 \advance \pindent by \wd0
  523.                 \setbox1=\hbox{\unhbox1 \unhbox0}
  524.                 \bb@x}
  525.         \def\-{\egroup \endgroup \ppindent=\pindent
  526.                 \bb@x}
  527.         \def\noalign##1{\egroup ##1\bb@x}
  528.         \def\endprogram{\ifinb@x \egroup \fi \endgroup}
  529.         \setbox1=\null
  530.         \ppindent=\pindent
  531.         \futurelet\next\pr@gram}
  532. }
  533. \def\pr@gram{\ifx\next\obeylines \let\par=\cr 
  534.         \let\next=\pr@gr@m \obeylines \else \let\next=\relax \fi
  535.         \bb@x\next}
  536. \def\pr@gr@m{\let\next=}
  537.  
  538. %
  539. % macros for making framed boxes
  540. %
  541. \long\def\gbox#1#2#3#4{\vbox{\hrule height#1 \hbox
  542.         {\vrule width#1\kern#3\vbox{
  543.         \kern#2 #4\ifhmode \par \fi \kern#2}\kern#3\vrule width#1}
  544.         \hrule height#1}
  545. }
  546. \newdimen\boxedkern \boxedkern=12pt
  547. \newdimen\rulethickness \rulethickness=0.4pt
  548. \long\def\boxed#1{\gbox\rulethickness\boxedkern\boxedkern{
  549.         \advance\hsize by -\rulethickness
  550.         \advance\hsize by -\rulethickness
  551.         \advance\hsize by -\boxedkern
  552.         \advance\hsize by -\boxedkern
  553.         {\parskip=0pt \noindent}\ignorespaces #1}}
  554.  
  555. \catcode`@=12 % disable use of private macros
  556.