chiark / gitweb /
Build HTML documentation and install it.
[become] / manual / syntax.sty
1 %%
2 %% This is file `syntax.sty',
3 %% generated with the docstrip utility.
4 %%
5 %% The original source files were:
6 %%
7 %% syntax.dtx  (with options: `package')
8 %% doafter.dtx  (with options: `macro')
9 %% 
10 %% IMPORTANT NOTICE
11 %%
12 %% syntax package -- typesetting syntax descriptions
13 %% Copyright (c) 1996 Mark Wooding
14 %%
15 %% This program is free software; you can redistribute it and/or modify
16 %% it under the terms of the GNU General Public License as published by
17 %% the Free Software Foundation; either version 2 of the License, or
18 %% (at your option) any later version.
19 %%
20 %% This program is distributed in the hope that it will be useful,
21 %% but WITHOUT ANY WARRANTY; without even the implied warranty of
22 %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 %% GNU General Public License for more details.
24 %%
25 %% You should have received a copy of the GNU General Public License
26 %% along with this program; if not, write to the Free Software
27 %% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 %%
29 \NeedsTeXFormat{LaTeX2e}
30 \ProvidesPackage{syntax}
31                 [1996/05/17 1.9 Syntax typesetting (MDW)]
32 %% \CharacterTable
33 %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
34 %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
35 %%   Digits        \0\1\2\3\4\5\6\7\8\9
36 %%   Exclamation   \!     Double quote  \"     Hash (number) \#
37 %%   Dollar        \$     Percent       \%     Ampersand     \&
38 %%   Acute accent  \'     Left paren    \(     Right paren   \)
39 %%   Asterisk      \*     Plus          \+     Comma         \,
40 %%   Minus         \-     Point         \.     Solidus       \/
41 %%   Colon         \:     Semicolon     \;     Less than     \<
42 %%   Equals        \=     Greater than  \>     Question mark \?
43 %%   Commercial at \@     Left bracket  \[     Backslash     \\
44 %%   Right bracket \]     Circumflex    \^     Underscore    \_
45 %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
46 %%   Right brace   \}     Tilde         \~}
47 %%
48 \DeclareOption{rounded}{\sd@roundtrue}
49 \DeclareOption{square}{\sd@roundfalse}
50 \DeclareOption{nounderscore}{\@uscorefalse}
51 \newif\ifsd@round
52 \newif\if@uscore\@uscoretrue
53 \ExecuteOptions{square}
54 \ProcessOptions
55 \def\addspecial#1{%
56   \remspecial{#1}%
57   \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do#1}%
58   \expandafter\def\expandafter\@santize\expandafter{%
59     \@sanitize\@makeother#1}%
60 }
61 \def\remspecial#1{%
62   \def\do##1{\ifnum`#1=`##1 \else\noexpand\do\noexpand##1\fi}%
63   \edef\dospecials{\dospecials}%
64   \def\@makeother##1{\ifnum`#1=`##1 \else%
65     \noexpand\@makeother\noexpand##1\fi}%
66   \edef\@sanitize{\@sanitize}%
67   \def\@makeother##1{\catcode`##112}%
68 }
69 \def\underscore{%
70   \leavevmode%
71   \kern.06em%
72   \vbox{%
73     \hrule\@width.6em\@depth.4ex\@height-.34ex%
74   }%
75   \ifdim\fontdimen\@ne\font=\z@%
76     \kern.06em%
77   \fi%
78 }
79 \let\usc@builtindischyphen\-
80 \def\@uscore.{%
81   \ifmmode%
82     \expandafter\@firstoftwo%
83   \else%
84     \expandafter\@secondoftwo%
85   \fi%
86   \sb%
87   {\textunderscore\@ifnextchar_{}{\usc@builtindischyphen}}%
88 }
89 \if@uscore
90   \AtBeginDocument{%
91     \catcode`\_\active%
92     \begingroup%
93     \lccode`\~`\_%
94     \lowercase{\endgroup\def~{\protect\@uscore.}}%
95   }
96 \fi
97 \expandafter\let\csname?\string\textunderscore\endcsname\underscore
98 \def\shortverb#1{%
99   \@ifundefined{cc@\string#1}{%
100     \addspecial#1%
101     \begingroup%
102     \lccode`\~`#1%
103     \lowercase{%
104       \endgroup%
105       \expandafter\let\csname mn@\string#1\endcsname~%
106       \expandafter\edef\csname cc@\string#1\endcsname{%
107         \catcode`\noexpand#1\the\catcode`#1%
108         \let\noexpand~\expandafter\noexpand%
109           \csname mn@\string#1\endcsname%
110         \noexpand\remspecial\noexpand#1%
111         \let\csname cc@\string#1\endcsname\relax%
112       }%
113       \def~{\verb~\syn@ttspace}%
114     }%
115     \catcode`#1\active%
116   }{%
117     \PackageWarning{syntax}{Character `\expandafter\@gobble\string#1'
118                             is already a verbatim\MessageBreak
119                             delimiter}%
120   }%
121 }
122 \def\unverb#1{%
123   \@ifundefined{cc@\string#1}{%
124     \PackageWarning{syntax}{Character `\expandafter\@gobble\string#1'
125                             is not a verbatim\MessageBreak
126                             delimiter}%
127   }{%
128     \csname cc@\string#1\endcsname%
129   }%
130 }
131 \newcommand{\syntleft}{$\langle$\normalfont\itshape}
132 \newcommand{\syntright}{$\rangle$}
133 \newcommand{\ulitleft}{\normalfont\ttfamily\syn@ttspace\frenchspacing}
134 \newcommand{\ulitright}{}
135 \newcommand{\litleft}{`\bgroup\ulitleft}
136 \newcommand{\litright}{\ulitright\egroup'}
137 \def\synt#1{\mbox{\syntleft{#1\/}\syntright}}
138 \def\lit{\@ifstar{\lit@i\ulitleft\ulitright}{\lit@i\litleft\litright}}
139 \def\lit@i#1#2#3{\mbox{#1{#3\/}#2}}
140 \def\syn@ttspace@{\spaceskip.35em\@plus.2em\@minus.15em\relax}
141 \def\ttthinspace{\let\syn@ttspace\syn@ttspace@}
142 \def\ttthickspace{\let\syn@ttspace\@empty}
143 \ttthinspace
144 \def\readupto#1#2#3{%
145   \bgroup%
146   \verb@eol@error%
147   \let\do\@makeother\dospecials%
148   #2%
149   \catcode`#1\active%
150   \lccode`\~`#1%
151   \gdef\verb@balance@group{\verb@egroup%
152      \@latex@error{\noexpand\verb illegal in command argument}\@ehc}%
153   \def\@vhook{\verb@egroup#3}%
154   \aftergroup\verb@balance@group%
155   \lowercase{\let~\@vhook}%
156 }
157 \def\syn@assist#1#2#3#4#5{%
158   \mbox\bgroup%
159   \chardef\\`\\%
160   \chardef\>`\>%
161   \chardef\'`\'%
162   \chardef\"`\"%
163   \chardef\ `\ %
164   \def\ch##1{\char`##1}%
165   \def\act##1{%
166     \catcode`##1\active%
167     \begingroup%
168     \lccode`\~`##1%
169     \lowercase{\endgroup\def~}%
170   }%
171   #1%
172   \begingroup%
173   \readupto#3{%
174     \catcode`\\0%
175     \catcode`\ 10%
176     #2%
177   }{%
178     \/\endgroup#4\egroup#5%
179   }%
180 }
181 \begingroup
182 \catcode`\<\active
183 \catcode`\|\active
184 \catcode`\"\active
185 \catcode`\`\active
186 \gdef\syn@shorts#1#2{%
187   \def<{%
188     #1%
189     \syn@assist%
190       \syntleft%
191       {\act_{\@foundunderscore}}%
192       >%
193       \syntright%
194       {#2}%
195   }%
196   \def`{%
197     #1%
198     \syn@assist%
199       \litleft%
200       \relax%
201       '%
202       \litright%
203       {#2}%
204   }%
205   \def"{%
206     #1%
207     \syn@assist%
208       \ulitleft%
209       \relax%
210       "%
211       \ulitright%
212       {#2}%
213   }%
214   \def|{\textbar}%
215 }
216 \endgroup
217 \def\syntaxShortcuts#1#2{%
218   \syn@shorts{#1}{#2}%
219   \addspecial\`%
220   \addspecial\<%
221   \addspecial\|%
222   \addspecial\"%
223   \catcode`\|\active%
224   \catcode`\<\active%
225   \catcode`\"\active%
226   \catcode`\`\active%
227 }
228 \def\synshorts{\syntaxShortcuts\relax\relax}
229 \def\synshortsoff{%
230   \catcode`\|12%
231   \catcode`\<12%
232   \catcode`\"12%
233   \catcode`\`12%
234 }
235 \def\syntax#{\bgroup\syntaxShortcuts\relax\relax\let\@let@token}
236 \newskip\grammarparsep
237   \grammarparsep8\p@\@plus\p@\@minus\p@
238 \newdimen\grammarindent
239   \grammarindent2em
240 \newcommand{\grammarlabel}[2]{%
241   \synt{#1} \hfill#2%
242 }
243 \def\gr@implitem<#1> #2 {%
244   \sbox\z@{\hskip\labelsep\grammarlabel{#1}{#2}}%
245   \strut\@@par%
246   \vskip-\parskip%
247   \vskip-\baselineskip%
248   \hrule\@height\z@\@depth\z@\relax%
249   \item[\unhbox\z@]%
250   \catcode`\<\active%
251 }
252 \let\gr@leftsq\[
253 \let\gr@rightsq\]
254 \def\[{\gr@leftsq}
255 \def\]{\gr@rightsq}
256 \newenvironment{grammar}{%
257   \list{}{%
258     \labelwidth\grammarindent%
259     \leftmargin\grammarindent%
260     \advance\grammarindent\labelsep
261     \itemindent\z@%
262     \listparindent\z@%
263     \parsep\grammarparsep%
264   }%
265   \let\\\@normalcr
266   \syntaxShortcuts\relax\relax%
267   \def\alt{\\\llap{\textbar\quad}}%
268   \def\gr@setpar{%
269     \def\par{%
270       \parshape\@ne\@totalleftmargin\linewidth%
271       \@@par%
272       \catcode`\<12%
273       \everypar{%
274         \everypar{}%
275         \catcode`\<\active%
276         \gr@implitem%
277       }%
278     }%
279   }%
280   \gr@setpar%
281   \par%
282   \def\gr@endsyntdiag]{\end{syntdiag}\gr@setpar\par}%
283   \def\[{\@ifnextchar[{\begin{syntdiag}\@gobble}\gr@leftsq}%
284   \def\]{\@ifnextchar]\gr@endsyntdiag\gr@rightsq}%
285 }{%
286   \@newlistfalse%
287   \everypar{}%
288   \endlist%
289 }
290 \newskip\sdstartspace
291 \newskip\sdendspace
292 \newskip\sdmidskip
293 \newskip\sdtokskip
294 \newskip\sdfinalskip
295 \newdimen\sdrulewidth
296 \newdimen\sdcirclediam
297 \newdimen\sdindent
298 \dimendef\sd@lower\z@
299 \dimendef\sd@upper\tw@
300 \dimendef\sd@mid4
301 \dimendef\sd@topcirc6
302 \dimendef\sd@botcirc8
303 \def\sd@setsize{%
304   \sd@mid\ht\strutbox%
305   \advance\sd@mid-\dp\strutbox%
306   \sd@mid.5\sd@mid%
307   \sd@upper\sdrulewidth%
308     \advance\sd@upper\sd@mid%
309   \sd@lower\sdrulewidth%
310     \advance\sd@lower-\sd@mid%
311   \sd@topcirc-.5\sdcirclediam%
312     \advance\sd@topcirc\sd@mid%
313   \sd@botcirc-.5\sdcirclediam%
314     \advance\sd@botcirc-\sd@mid%
315 }
316 \newcommand{\sdsize}{%
317   \small%
318 }
319 \newcommand{\sdlengths}{%
320   \setlength{\sdstartspace}{1em minus 10pt}%
321   \setlength{\sdendspace}{1em minus 10pt}%
322   \setlength{\sdmidskip}{0.5em plus 0.0001fil}%
323   \setlength{\sdtokskip}{0.25em plus 0.0001fil}%
324   \setlength{\sdfinalskip}{0.5em plus 10000fil}%
325   \setlength{\sdrulewidth}{0.2pt}%
326   \setlength{\sdcirclediam}{8pt}%
327   \setlength{\sdindent}{0pt}%
328 }
329 \newif\ifsd@base
330 \newif\ifsd@top
331 \newif\ifsd@toplayer
332 \newif\ifsd@backwards
333 \def\sd@err{\PackageError{syntax}}
334 \def\sd@arrow{%
335   \ht\tw@\z@%
336   \dp\tw@\z@%
337   \raise\sd@mid\box\tw@%
338   \egroup%
339 }
340 \def\sd@rightarr{%
341   \bgroup%
342   \setbox\tw@\hbox{\kern-6\p@\@linefnt\char'55}%
343   \sd@arrow%
344 }
345 \def\sd@leftarr{%
346   \bgroup%
347   \raise\sd@mid\hbox{\@linefnt\char'33\kern-6\p@}%
348   \sd@arrow%
349 }
350 \def\sd@uparr{%
351   \bgroup%
352   \setbox\tw@\hb@xt@\z@{\kern-\sdrulewidth\@linefnt\char'66\hss}%
353   \setbox\tw@\hbox{\lower10\p@\box\tw@}%
354   \sd@arrow%
355 }
356 \def\sd@downarr{%
357   \bgroup%
358   \setbox\tw@\hb@xt@\z@{\kern-\sdrulewidth\@linefnt\char'77\hss}%
359   \sd@arrow%
360 }
361 \def\sd@circ#1{%
362   \@getcirc\sdcirclediam%
363   \advance\@tempcnta#1%
364   \setbox\tw@\hbox{\lower\sdrulewidth%
365     \hbox{\@circlefnt\char\@tempcnta}}%
366   \wd\tw@\z@%
367   \leavevmode%
368 }
369 \def\sd@tlcirc{{%
370   \sd@circ3%
371   \ht\tw@\sdrulewidth%
372   \dp\tw@.5\sdcirclediam%
373   \kern-\tw@\sdrulewidth%
374   \raise\sd@mid\box\tw@%
375   \kern.5\sdcirclediam%
376 }}
377 \def\sd@trcirc{{%
378   \sd@circ0%
379   \ht\tw@\sdrulewidth%
380   \dp\tw@.5\sdcirclediam%
381   \kern.5\sdcirclediam%
382   \raise\sd@mid\box\tw@%
383 }}
384 \def\sd@blcirc{{%
385   \sd@circ2%
386   \ht\tw@.5\sdcirclediam%
387   \dp\tw@\sdrulewidth%
388   \kern-\tw@\sdrulewidth%
389   \raise\sd@mid\box\tw@%
390   \kern.5\sdcirclediam%
391 }}
392 \def\sd@brcirc{{%
393   \sd@circ1%
394   \ht\tw@.5\sdcirclediam%
395   \dp\tw@\sdrulewidth%
396   \kern.5\sdcirclediam%
397   \raise\sd@mid\box\tw@%
398 }}
399 \def\sd@llc#1{%
400   \hb@xt@.5\sdcirclediam{%
401     \sd@rule\hskip.5\sdcirclediam%
402     \hss%
403     #1%
404   }%
405 }
406 \def\sd@rlc#1{%
407   \hb@xt@.5\sdcirclediam{%
408     #1%
409     \hss%
410     \sd@rule\hskip.5\sdcirclediam%
411   }%
412 }
413 \def\sd@rule{\leaders\hrule\@height\sd@upper\@depth\sd@lower}
414 \def\sd@gap#1{%
415   \ifsd@base%
416     \skip@#1%
417       \divide\skip\z@\tw@%
418     \nobreak\sd@rule\hskip\skip@%
419     \discretionary{%
420       \sd@qarrow{->}%
421     }{%
422       \hbox{%
423         \sd@qarrow{>-}%
424         \sd@rule\hskip\sdstartspace%
425         \sd@rule\hskip3.5\p@%
426       }%
427     }{%
428     }%
429     \nobreak\sd@rule\hskip\skip@%
430   \else%
431     \sd@rule\hskip#1%
432   \fi%
433 }
434 \def\syntdiag{%
435   \syntaxShortcuts\sd@tok@i\sd@tok@ii%
436   \@ifnextchar[\syntdiag@i{\syntdiag@i[]}%
437 }
438 \def\syntdiag@i[#1]{%
439   \sdsize\sdlengths%
440   #1%
441   \sd@setsize%
442   \list{}{%
443     \leftmargin\sdindent%
444     \rightmargin\leftmargin%
445     \labelsep\z@%
446     \labelwidth\z@%
447   }%
448   \item[]%
449   \parfillskip\z@%
450   \noindent%
451   \sd@qarrow{>>-}%
452   \nobreak\sd@rule\hskip\sdstartspace%
453   \sd@basetrue%
454   \sloppy%
455   \interlinepenalty100%
456   \hyphenpenalty0%
457   \catcode`\ 9%
458   \catcode`\^^M9%
459   \def\gr@leftsq{\begin{stack}\\}%
460   \def\gr@rightsq{\end{stack}}%
461   \def\({\begin{stack}}%
462   \def\){\end{stack}}%
463   \def\<{\begin{rep}}%
464   \def\>{\end{rep}}%
465   \let\\\sd@newline%
466   \ignorespaces%
467 }
468 \def\endsyntdiag{%
469   \unskip%
470   \nobreak\sd@rule\hskip\sdmidskip%
471   \sd@rule\hskip\sdfinalskip%
472   \sd@qarrow{-><}%
473   \endlist%
474 }
475 \@namedef{syntdiag*}{%
476   \syntaxShortcuts\sd@tok@i\sd@tok@ii%
477   \@ifnextchar[\syntdiag@s@i{\syntdiag@s@i[]}%
478 }
479 \def\syntdiag@s@i[#1]{%
480   \@ifnextchar[{\syntdiag@s@ii{#1}}{\syntdiag@s@iii{#1}{\hbox}}%
481 }
482 \def\syntdiag@s@ii#1[#2]{\syntdiag@s@iii{#1}{\hb@xt@#2}}
483 \def\syntdiag@s@iii#1#2{%
484   \leavevmode%
485   #2\bgroup%
486   \let\@@left\left%
487   \let\@@right\right%
488   \def\left##1{\def\sd@startarr{##1}}%
489   \def\right##1{\def\sd@endarr{##1}}%
490   \left{>-}\right{->}%
491   \sdsize\sdlengths%
492   #1%
493   \sd@setsize%
494   \let\left\@@left%
495   \let\right\@@right%
496   \sd@qarrow\sd@startarr%
497   \sd@rule\hskip\sdmidskip%
498   \sd@basefalse%
499   \catcode`\ 9%
500   \catcode`\^^M9%
501   \ignorespaces%
502 }
503 \@namedef{endsyntdiag*}{%
504   \unskip%
505   \sd@rule\hskip\sdmidskip%
506   \sd@rule\hskip\sdfinalskip%
507   \sd@qarrow\sd@endarr%
508   \egroup%
509 }
510 \def\sd@qarrow#1{%
511   \begingroup%
512   \lccode`\~=`\<\lowercase{\def~{<}}%
513   \hbox{\csname sd@arr@#1\endcsname}%
514   \endgroup%
515 }
516 \@namedef{sd@arr@>>-}{\sd@rightarr\kern-.5\p@\sd@rightarr\kern-\p@}
517 \@namedef{sd@arr@>-}{\sd@rightarr\kern-\p@}
518 \@namedef{sd@arr@->}{\sd@rightarr}
519 \@namedef{sd@arr@-><}{\sd@rightarr\kern-\p@\sd@leftarr}
520 \@namedef{sd@arr@...}{$\cdots$}
521 \@namedef{sd@arr@-}{}
522 \def\sd@newline{\@ifstar{\vadjust{\penalty\@M}\sd@nl@i}\sd@nl@i}
523 \def\sd@nl@i{\@ifnextchar[\sd@nl@ii\sd@nl@iii}
524 \def\sd@nl@ii[#1]{\vspace{#1}\sd@nl@iii}
525 \def\sd@nl@iii{%
526   \nobreak\sd@rule\hskip\sdmidskip%
527   \sd@rule\hskip\sdfinalskip%
528   \kern-3\p@%
529   \sd@rightarr%
530   \newline%
531   \sd@rightarr%
532   \nobreak\sd@rule\hskip\sdstartspace%
533   \sd@rule\hskip3.5\p@%
534 }
535 \def\sdbox#1{%
536   \@tempskipa#1\relax%
537   \sd@gap\@tempskipa%
538   \setbox\z@\hbox\bgroup%
539     \begingroup%
540     \catcode`\ 10%
541     \catcode`\^^M5%
542     \synshortsoff%
543 }
544 \def\endsdbox{%
545     \endgroup%
546   \egroup%
547   \@tempdima\ht\z@%
548   \advance\@tempdima-\dp\z@%
549   \advance\@tempdima-\tw@\sd@mid%
550   \lower.5\@tempdima\box\z@%
551   \sd@gap\@tempskipa%
552 }
553 \def\sd@tok@i{%
554   \sdbox\sdtokskip%
555   \strut%
556   \space%
557 }
558 \def\sd@tok@ii{%
559   \space%
560   \endsdbox%
561 }
562 \def\tok#{%
563   \sdbox\sdtokskip%
564   \strut%
565   \enspace%
566   \syntaxShortcuts\relax\relax%
567   \doafter\sd@tok%
568 }
569 \def\sd@tok{%
570   \enspace%
571   \endsdbox%
572 }
573 \newcommand\stack[1][t]{%
574   \sd@gap\sdmidskip%
575   \begingroup\sd@basefalse%
576   \sd@toplayertrue%
577   \let\\\sd@stackcr%
578   \if#1t%
579     \let\@tempa\vtop%
580     \sd@toptrue%
581     \ifsd@round\llap{\sd@trcirc\kern\tw@\sdrulewidth}\fi%
582   \else\if#1b%
583     \let\@tempa\vbox%
584     \sd@topfalse%
585     \ifsd@round\llap{\sd@brcirc\kern\tw@\sdrulewidth}\fi%
586   \else%
587     \sd@err{Bad position argument passed to stack}%
588            {The positioning argument must be one of `t' or `b'.  I%
589             have^^Jassumed you meant to type `t'.}%
590     \let\@tempa\vtop%
591   \fi\fi%
592   \@tempa\bgroup%
593   \offinterlineskip%
594   \ialign\bgroup%
595     ##\cr%
596   \setbox\z@\hbox\bgroup%
597     \strut%
598 }
599 \def\endstack{%
600   \egroup%
601   \ifsd@toplayer%
602     \sd@dostack\sd@upper\sd@lower\relax\relax%
603   \else%
604     \ifsd@round%
605       \ifsd@top%
606         \sd@dostack{\ht\z@}\sd@botcirc\sd@blcirc\sd@brcirc%
607       \else%
608         \sd@dostack{\ht\z@}\sd@botcirc\relax\relax%
609       \fi%
610     \else%
611       \sd@dostack{\ht\z@}\sd@lower\relax\relax%
612     \fi%
613   \fi%
614   \egroup%
615   \egroup%
616   \ifsd@round%
617     \ifsd@top
618       \rlap{\kern\tw@\sdrulewidth\sd@tlcirc}%
619     \else%
620       \rlap{\kern\tw@\sdrulewidth\sd@blcirc}%
621     \fi%
622   \fi%
623   \endgroup\sd@gap\sdmidskip%
624 }
625 \def\sd@stackcr{%
626   \egroup%
627   \ifsd@toplayer%
628     \ifsd@round%
629       \ifsd@top%
630         \sd@dostack\sd@topcirc{\dp\z@}\relax\relax%
631       \else%
632         \sd@dostack\sd@topcirc{\dp\z@}\sd@tlcirc\sd@trcirc%
633       \fi%
634     \else%
635       \sd@dostack\sd@upper{\dp\z@}\relax\relax%
636     \fi%
637   \else%
638     \ifsd@round%
639       \ifsd@top%
640         \sd@dostack{\ht\z@}{\dp\z@}\sd@blcirc\sd@brcirc%
641       \else%
642         \sd@dostack{\ht\z@}{\dp\z@}\sd@tlcirc\sd@trcirc%
643       \fi%
644     \else%
645       \sd@dostack{\ht\z@}{\dp\z@}\relax\relax%
646     \fi%
647   \fi%
648   \sd@toplayerfalse%
649   \setbox\z@\hbox\bgroup%
650     \strut%
651 }
652 \def\sd@dostack#1#2#3#4{%
653   \@tempdima#1%
654   \@tempdimb#2%
655   \kern-\tw@\sdrulewidth%
656   \vrule\@height\@tempdima\@depth\@tempdimb\@width\tw@\sdrulewidth%
657   #3%
658   \sd@rule\hfill%
659   \sd@gap\sdtokskip%
660   \unhbox\z@%
661   \sd@gap\sdtokskip%
662   \sd@rule\hfill%
663   #4%
664   \vrule\@height\@tempdima\@depth\@tempdimb\@width\tw@\sdrulewidth%
665   \kern-\tw@\sdrulewidth%
666   \cr%
667 }
668 \newcommand\rep[1][t]{%
669   \sd@gap\sdmidskip%
670   \begingroup\sd@basefalse%
671   \ifsd@backwards\sd@backwardsfalse\else\sd@backwardstrue\fi%
672    \let\\\sd@loop%
673   \if#1t%
674     \let\@tempa\vbox%
675     \sd@toptrue%
676   \else\if#1b%
677     \let\@tempa\vtop%
678     \sd@topfalse%
679   \else%
680     \sd@err{Bad position argument passed to loop}%
681            {The positioning argument must be `t' or `b'.  I have^^J%
682             assumed you meant to type `t'.}%
683     \let\@tempa\vbox%
684     \sd@toptrue%
685   \fi\fi%
686   \@tempa\bgroup%
687   \setbox\tw@\copy\strutbox%
688   \setbox\z@\hbox\bgroup\strut%
689 }
690 \def\endrep{%
691   \egroup%
692   \ifsd@top%
693     \ifsd@round%
694       \sd@doloop\tw@\z@\relax\relax%
695         \sd@tlcirc\sd@trcirc{\sd@rlc\sd@blcirc}{\sd@llc\sd@brcirc}%
696     \else%
697       \sd@doloop\tw@\z@\relax\sd@downarr\relax\relax\relax\relax%
698     \fi%
699   \else%
700     \ifsd@round%
701       \sd@doloop\z@\tw@\relax\relax%
702         {\sd@rlc\sd@tlcirc}{\sd@llc\sd@trcirc}\sd@blcirc\sd@brcirc%
703     \else%
704       \sd@doloop\z@\tw@\sd@uparr\relax\relax\relax\relax\relax%
705     \fi%
706   \fi%
707   \egroup%
708   \endgroup\sd@gap\sdmidskip%
709 }
710 \def\sd@loop{%
711   \egroup%
712   \def\\{\sd@err{Too many \string\\\space commands in loop}\@ehc}%
713   \setbox\tw@\hbox\bgroup\strut%
714 }
715 \def\sd@doloop#1#2#3#4#5#6#7#8{%
716   \@tempdima\dp#1\relax%
717   \@tempdimb\ht#2\relax%
718   \offinterlineskip%
719   \ialign{%
720     ##\cr%
721     \ifsd@round%
722       \sd@doloop@i#1#3\sd@topcirc\@tempdima{#5}{#6}%
723       \sd@doloop@i#2#4\@tempdimb\sd@botcirc{#7}{#8}%
724     \else%
725       \sd@doloop@i#1#3\sd@upper\@tempdima{#5}{#6}%
726       \sd@doloop@i#2#4\@tempdimb\sd@lower{#7}{#8}%
727     \fi%
728   }%
729 }
730 \def\sd@doloop@i#1#2#3#4#5#6{%
731   \ifsd@backwards#2\fi%
732   \kern-\tw@\sdrulewidth%
733   \vrule\@height#3\@depth#4\@width\tw@\sdrulewidth%
734   #5%
735   \sd@rule\hfill%
736   \sd@gap\sdtokskip%
737   \unhbox#1%
738   \sd@gap\sdtokskip%
739   \sd@rule\hfill%
740   #6%
741   \vrule\@height#3\@depth#4\@width\tw@\sdrulewidth%
742   \ifsd@backwards\else#2\fi%
743   \kern-\tw@\sdrulewidth%
744   \cr%
745 }
746 %%
747 %% doafter package -- insert a token really after a group
748 %% Copyright (c) 1996 Peter Schmitt and Mark Wooding
749 %%
750 \let\@@aftergroup\aftergroup
751 \def\doafter#1{%
752   \def\@tempa{\@@aftergroup#1}%
753   \afterassignment\doafter@i\let\@let@token%
754 }
755 \def\doafter@i{%
756   \@let@token%
757   \let\aftergroup\@my@aftergroup%
758   \@@aftergroup\@prepare@after\@tempa%
759 }
760 \def\ag@cnt@local{0 }
761 \let\ag@cnt@global\ag@cnt@local
762 \def\@my@aftergroup{%
763   \begingroup%
764     \count@\ag@cnt@local%
765     \advance\count@\@ne%
766     \xdef\ag@cnt@global{\the\count@\space}%
767   \endgroup%
768   \let\ag@cnt@local\ag@cnt@global%
769   \@@aftergroup\@after@token\@@aftergroup%
770 }
771 \def\@after@token{%
772   \@start@after@group%
773   \@after@token%
774 }
775 \def\@start@after@group{%
776   \begingroup%
777   \count@\ag@cnt@global%
778   \clubpenalty\ag@cnt@local%
779   \let\@after@token\@after@token@i%
780 }
781 \def\@after@token@i{%
782   \advance\count@\m@ne%
783   \ifnum\count@=\clubpenalty%
784     \global\let\ag@cnt@global\ag@cnt@local%
785     \expandafter\@after@aftertoken\expandafter\@after@all%
786   \else%
787     \expandafter\@@aftergroup%
788   \fi%
789 }
790 \let\@after@all\endgroup
791 \def\@prepare@after{%
792   \ifx\ag@cnt@local\ag@cnt@global\else%
793     \expandafter\@prepare@after@i%
794   \fi%
795 }
796 \def\@prepare@after@i#1{%
797   \@start@after@group%
798   \def\@after@all{\@@aftergroup#1\endgroup}%
799 }
800 \def\@after@aftertoken#1{%
801   \let\bgroup\relax\let\egroup\relax%
802   \toks@{#1}%
803   \futurelet\@let@token\@after@aftertoken@i%
804 }
805 \def\@after@aftertoken@i{%
806   \ifcat\noexpand\@let@token{%
807     \@@aftergroup{%
808   \else\ifcat\noexpand\@let@token}%
809     \@@aftergroup}%
810   \else%
811     \def\@tempa##1{\@@aftergroup##1\the\toks@}%
812     \expandafter\expandafter\expandafter\@tempa%
813   \fi\fi%
814 }
815 \endinput
816 %%
817 %% End of file `syntax.sty'.