| author | wenzelm | 
| Tue, 03 Sep 2019 15:24:04 +0200 | |
| changeset 70647 | 3047b7671279 | 
| parent 42660 | e40648514b34 | 
| permissions | -rw-r--r-- | 
| 2658 | 1  | 
% rail.sty - style file to support railroad diagrams  | 
2  | 
%  | 
|
3  | 
% 09-Jul-90 L. Rooijakkers  | 
|
| 13044 | 4  | 
% 08-Oct-90 L. Rooijakkers fixed centering bug when \rail@tmpc<0.  | 
5  | 
% 07-Feb-91 L. Rooijakkers added \railoptions command, indexing  | 
|
6  | 
% 08-Feb-91 L. Rooijakkers minor fixes  | 
|
7  | 
% 28-Jun-94 K. Barthelmann turned into LaTeX2e package  | 
|
8  | 
% 08-Dec-96 K. Barthelmann replaced \@writefile  | 
|
9  | 
% 13-Dec-96 K. Barthelmann cleanup  | 
|
10  | 
% 22-Feb-98 K. Barthelmann fixed catcodes of special characters  | 
|
11  | 
% 18-Apr-98 K. Barthelmann fixed \par handling  | 
|
12  | 
% 19-May-98 J. Olsson Added new macros to support arrow heads.  | 
|
13  | 
% 26-Jul-98 K. Barthelmann changed \par to output newlines  | 
|
| 
42632
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
14  | 
% 02-May-11 M. Wenzel default setup for Isabelle  | 
| 2658 | 15  | 
%  | 
16  | 
% This style file needs to be used in conjunction with the 'rail'  | 
|
17  | 
% program. Running LaTeX as 'latex file' produces file.rai, which should be  | 
|
18  | 
% processed by Rail with 'rail file'. This produces file.rao, which will  | 
|
19  | 
% be picked up by LaTeX on the next 'latex file' run.  | 
|
20  | 
%  | 
|
21  | 
% LaTeX will warn if there is no file.rao or it's out of date.  | 
|
22  | 
%  | 
|
23  | 
% The macros in this file thus consist of two parts: those that read and  | 
|
24  | 
% write the .rai and .rao files, and those that do the actual formatting  | 
|
25  | 
% of the railroad diagrams.  | 
|
26  | 
||
| 3097 | 27  | 
\NeedsTeXFormat{LaTeX2e}
 | 
| 13044 | 28  | 
\ProvidesPackage{rail}[1998/05/19]
 | 
| 2658 | 29  | 
|
30  | 
% railroad diagram formatting parameters (user level)  | 
|
31  | 
% all of these are copied into their internal versions by \railinit  | 
|
32  | 
%  | 
|
33  | 
% \railunit : \unitlength within railroad diagrams  | 
|
34  | 
% \railextra : extra length at outside of diagram  | 
|
35  | 
% \railboxheight : height of ovals and frames  | 
|
36  | 
% \railboxskip : vertical space between lines  | 
|
37  | 
% \railboxleft : space to the left of a box  | 
|
38  | 
% \railboxright : space to the right of a box  | 
|
39  | 
% \railovalspace : extra space around contents of oval  | 
|
40  | 
% \railframespace : extra space around contents of frame  | 
|
41  | 
% \railtextleft : space to the left of text  | 
|
42  | 
% \railtextright : space to the right of text  | 
|
43  | 
% \railtextup : space to lift text up  | 
|
44  | 
% \railjoinsize : circle size of join/split arcs  | 
|
45  | 
% \railjoinadjust : space to adjust join  | 
|
46  | 
%  | 
|
47  | 
% \railnamesep : separator between name and rule body  | 
|
48  | 
||
| 3097 | 49  | 
\newlength\railunit  | 
50  | 
\newlength\railextra  | 
|
51  | 
\newlength\railboxheight  | 
|
52  | 
\newlength\railboxskip  | 
|
53  | 
\newlength\railboxleft  | 
|
54  | 
\newlength\railboxright  | 
|
55  | 
\newlength\railovalspace  | 
|
56  | 
\newlength\railframespace  | 
|
57  | 
\newlength\railtextleft  | 
|
58  | 
\newlength\railtextright  | 
|
59  | 
\newlength\railtextup  | 
|
60  | 
\newlength\railjoinsize  | 
|
61  | 
\newlength\railjoinadjust  | 
|
62  | 
\newlength\railnamesep  | 
|
63  | 
||
64  | 
% initialize the parameters  | 
|
65  | 
||
66  | 
\setlength\railunit{1sp}
 | 
|
67  | 
\setlength\railextra{4ex}
 | 
|
68  | 
\setlength\railboxleft{1ex}
 | 
|
69  | 
\setlength\railboxright{1ex}
 | 
|
70  | 
\setlength\railovalspace{2ex}
 | 
|
71  | 
\setlength\railframespace{2ex}
 | 
|
72  | 
\setlength\railtextleft{1ex}
 | 
|
73  | 
\setlength\railtextright{1ex}
 | 
|
74  | 
\setlength\railjoinadjust{0pt}
 | 
|
75  | 
\setlength\railnamesep{1ex}
 | 
|
76  | 
||
77  | 
\DeclareOption{10pt}{
 | 
|
78  | 
  \setlength\railboxheight{16pt}
 | 
|
79  | 
  \setlength\railboxskip{24pt}
 | 
|
80  | 
  \setlength\railtextup{5pt}
 | 
|
81  | 
  \setlength\railjoinsize{16pt}
 | 
|
82  | 
}  | 
|
83  | 
\DeclareOption{11pt}{
 | 
|
84  | 
  \setlength\railboxheight{16pt}
 | 
|
85  | 
  \setlength\railboxskip{24pt}
 | 
|
86  | 
  \setlength\railtextup{5pt}
 | 
|
87  | 
  \setlength\railjoinsize{16pt}
 | 
|
88  | 
}  | 
|
89  | 
\DeclareOption{12pt}{
 | 
|
90  | 
  \setlength\railboxheight{20pt}
 | 
|
91  | 
  \setlength\railboxskip{28pt}
 | 
|
92  | 
  \setlength\railtextup{6pt}
 | 
|
93  | 
  \setlength\railjoinsize{20pt}
 | 
|
94  | 
}  | 
|
95  | 
||
96  | 
\ExecuteOptions{10pt}
 | 
|
97  | 
\ProcessOptions  | 
|
| 2658 | 98  | 
|
99  | 
% internal versions of the formatting parameters  | 
|
100  | 
%  | 
|
101  | 
% \rail@extra : \railextra  | 
|
102  | 
% \rail@boxht : \railboxheight  | 
|
103  | 
% \rail@boxsp : \railboxskip  | 
|
104  | 
% \rail@boxlf : \railboxleft  | 
|
105  | 
% \rail@boxrt : \railboxright  | 
|
106  | 
% \rail@boxhht : \railboxheight / 2  | 
|
107  | 
% \rail@ovalsp : \railovalspace  | 
|
108  | 
% \rail@framesp : \railframespace  | 
|
| 8591 | 109  | 
% \rail@textlf : \railtextleft  | 
110  | 
% \rail@textrt : \railtextright  | 
|
111  | 
% \rail@textup : \railtextup  | 
|
| 2658 | 112  | 
% \rail@joinsz : \railjoinsize  | 
113  | 
% \rail@joinhsz : \railjoinsize / 2  | 
|
114  | 
% \rail@joinadj : \railjoinadjust  | 
|
115  | 
%  | 
|
116  | 
% \railinit : internalize all of the parameters.  | 
|
117  | 
||
118  | 
\newcount\rail@extra  | 
|
119  | 
\newcount\rail@boxht  | 
|
120  | 
\newcount\rail@boxsp  | 
|
121  | 
\newcount\rail@boxlf  | 
|
122  | 
\newcount\rail@boxrt  | 
|
123  | 
\newcount\rail@boxhht  | 
|
124  | 
\newcount\rail@ovalsp  | 
|
125  | 
\newcount\rail@framesp  | 
|
126  | 
\newcount\rail@textlf  | 
|
127  | 
\newcount\rail@textrt  | 
|
128  | 
\newcount\rail@textup  | 
|
129  | 
\newcount\rail@joinsz  | 
|
130  | 
\newcount\rail@joinhsz  | 
|
131  | 
\newcount\rail@joinadj  | 
|
132  | 
||
| 3097 | 133  | 
\newcommand\railinit{
 | 
| 2658 | 134  | 
\rail@extra=\railextra  | 
135  | 
\divide\rail@extra by \railunit  | 
|
136  | 
\rail@boxht=\railboxheight  | 
|
137  | 
\divide\rail@boxht by \railunit  | 
|
138  | 
\rail@boxsp=\railboxskip  | 
|
139  | 
\divide\rail@boxsp by \railunit  | 
|
140  | 
\rail@boxlf=\railboxleft  | 
|
141  | 
\divide\rail@boxlf by \railunit  | 
|
142  | 
\rail@boxrt=\railboxright  | 
|
143  | 
\divide\rail@boxrt by \railunit  | 
|
144  | 
\rail@boxhht=\railboxheight  | 
|
145  | 
\divide\rail@boxhht by \railunit  | 
|
146  | 
\divide\rail@boxhht by 2  | 
|
147  | 
\rail@ovalsp=\railovalspace  | 
|
148  | 
\divide\rail@ovalsp by \railunit  | 
|
149  | 
\rail@framesp=\railframespace  | 
|
150  | 
\divide\rail@framesp by \railunit  | 
|
151  | 
\rail@textlf=\railtextleft  | 
|
152  | 
\divide\rail@textlf by \railunit  | 
|
153  | 
\rail@textrt=\railtextright  | 
|
154  | 
\divide\rail@textrt by \railunit  | 
|
155  | 
\rail@textup=\railtextup  | 
|
156  | 
\divide\rail@textup by \railunit  | 
|
157  | 
\rail@joinsz=\railjoinsize  | 
|
158  | 
\divide\rail@joinsz by \railunit  | 
|
159  | 
\rail@joinhsz=\railjoinsize  | 
|
160  | 
\divide\rail@joinhsz by \railunit  | 
|
161  | 
\divide\rail@joinhsz by 2  | 
|
162  | 
\rail@joinadj=\railjoinadjust  | 
|
163  | 
\divide\rail@joinadj by \railunit  | 
|
164  | 
}  | 
|
165  | 
||
| 3097 | 166  | 
\AtBeginDocument{\railinit}
 | 
167  | 
||
168  | 
% \rail@param : declarations for list environment  | 
|
169  | 
%  | 
|
170  | 
% \railparam{TEXT} : sets \rail@param to TEXT
 | 
|
| 13044 | 171  | 
%  | 
172  | 
% \rail@reserved : characters reserved for grammar  | 
|
| 3097 | 173  | 
|
174  | 
\newcommand\railparam[1]{
 | 
|
| 13044 | 175  | 
\def\rail@param{
 | 
176  | 
  \setlength\leftmargin{0pt}\setlength\rightmargin{0pt}
 | 
|
177  | 
  \setlength\labelwidth{0pt}\setlength\labelsep{0pt}
 | 
|
178  | 
  \setlength\itemindent{0pt}\setlength\listparindent{0pt}
 | 
|
179  | 
#1  | 
|
| 3097 | 180  | 
}  | 
| 13044 | 181  | 
}  | 
182  | 
\railparam{}
 | 
|
| 2658 | 183  | 
|
| 13044 | 184  | 
\newtoks\rail@reserved  | 
185  | 
\rail@reserved={:;|*+?[]()'"}
 | 
|
186  | 
||
| 3097 | 187  | 
% \rail@termfont : format setup for terminals  | 
188  | 
%  | 
|
189  | 
% \rail@nontfont : format setup for nonterminals  | 
|
190  | 
%  | 
|
191  | 
% \rail@annofont : format setup for annotations  | 
|
192  | 
%  | 
|
193  | 
% \rail@rulefont : format setup for rule names  | 
|
194  | 
%  | 
|
195  | 
% \rail@indexfont : format setup for index entry  | 
|
196  | 
%  | 
|
197  | 
% \railtermfont{TEXT} : set terminal format setup to TEXT
 | 
|
198  | 
%  | 
|
199  | 
% \railnontermfont{TEXT} : set nonterminal format setup to TEXT
 | 
|
200  | 
%  | 
|
201  | 
% \railannotatefont{TEXT} : set annotation format setup to TEXT
 | 
|
202  | 
%  | 
|
203  | 
% \railnamefont{TEXT} : set rule name format setup to TEXT
 | 
|
204  | 
%  | 
|
205  | 
% \railindexfont{TEXT} : set index entry format setup to TEXT
 | 
|
206  | 
||
207  | 
\def\rail@termfont{\ttfamily\upshape}
 | 
|
208  | 
\def\rail@nontfont{\rmfamily\upshape}
 | 
|
209  | 
\def\rail@annofont{\rmfamily\itshape}
 | 
|
210  | 
\def\rail@namefont{\rmfamily\itshape}
 | 
|
211  | 
\def\rail@indexfont{\rmfamily\itshape}
 | 
|
212  | 
||
213  | 
\newcommand\railtermfont[1]{
 | 
|
214  | 
\def\rail@termfont{#1}
 | 
|
215  | 
}  | 
|
216  | 
||
217  | 
\newcommand\railnontermfont[1]{
 | 
|
218  | 
\def\rail@nontfont{#1}
 | 
|
219  | 
}  | 
|
220  | 
||
221  | 
\newcommand\railannotatefont[1]{
 | 
|
222  | 
\def\rail@annofont{#1}
 | 
|
223  | 
}  | 
|
224  | 
||
225  | 
\newcommand\railnamefont[1]{
 | 
|
226  | 
\def\rail@namefont{#1}
 | 
|
227  | 
}  | 
|
228  | 
||
229  | 
\newcommand\railindexfont[1]{
 | 
|
230  | 
\def\rail@indexfont{#1}
 | 
|
231  | 
}  | 
|
| 2658 | 232  | 
|
| 3097 | 233  | 
% railroad read/write macros  | 
234  | 
%  | 
|
235  | 
% \begin{rail} TEXT \end{rail} : TEXT is written out to the .rai file,
 | 
|
236  | 
%                                as \rail@i{NR}{TEXT}. Then the matching
 | 
|
237  | 
%                                \rail@o{NR}{FMT} from the .rao file is
 | 
|
238  | 
% executed (if defined).  | 
|
239  | 
%  | 
|
240  | 
% \railoptions{OPTIONS} : OPTIONS are written out to the .rai file,
 | 
|
241  | 
%                         as \rail@p{OPTIONS}.
 | 
|
242  | 
%  | 
|
243  | 
% \railterm{IDENT,IDENT,...} : format IDENT as terminals. writes out
 | 
|
244  | 
%                              \rail@t{IDENT} to the .rai file
 | 
|
245  | 
%  | 
|
246  | 
% \railalias{IDENT}{TEXT} : format IDENT as TEXT. defines \rail@t@IDENT as
 | 
|
247  | 
% TEXT.  | 
|
248  | 
%  | 
|
| 13044 | 249  | 
% \railtoken{IDENT}{TEXT} : abbreviates \railalias{IDENT}{TEXT}\railterm{IDENT}
 | 
250  | 
% (for backward compatibility)  | 
|
251  | 
%  | 
|
252  | 
% \rail@setcodes : guards special characters  | 
|
253  | 
%  | 
|
254  | 
% \rail@makeother{CHARACTER} : sets \catcode of CHARACTER to "other"
 | 
|
255  | 
% used inside a loop for \rail@setcodes  | 
|
256  | 
%  | 
|
| 3097 | 257  | 
% \rail@nr : railroad diagram counter  | 
258  | 
%  | 
|
259  | 
% \ifrail@match : current \rail@i{NR}{TEXT} matches
 | 
|
260  | 
%  | 
|
| 8591 | 261  | 
% \rail@first : actions to be done first. read in .rao file,  | 
| 3097 | 262  | 
% open .rai file if \@filesw true, undefine \rail@first.  | 
| 13044 | 263  | 
%               executed from \begin{rail}, \railoptions and \railterm.
 | 
| 3097 | 264  | 
%  | 
265  | 
% \rail@i{NR}{TEXT} : defines \rail@i@NR as TEXT. written to the .rai
 | 
|
266  | 
% file by \rail, read from the .rao file by  | 
|
267  | 
% \rail@first  | 
|
268  | 
%  | 
|
269  | 
% \rail@t{IDENT} : tells Rail that IDENT is to be custom formatted,
 | 
|
270  | 
% written to the .rai file by \railterm.  | 
|
271  | 
%  | 
|
272  | 
% \rail@o{NR}{TEXT} : defines \rail@o@NR as TEXT, read from the .rao
 | 
|
273  | 
% file by \rail@first.  | 
|
274  | 
%  | 
|
275  | 
% \rail@p{OPTIONS} : pass options to rail, written to the .rai file by
 | 
|
276  | 
% \railoptions  | 
|
277  | 
%  | 
|
278  | 
% \rail@write{TEXT} : write TEXT to the .rai file
 | 
|
279  | 
%  | 
|
280  | 
% \rail@warn : warn user for mismatching diagrams  | 
|
281  | 
%  | 
|
282  | 
% \rail@endwarn : either \relax or \rail@warn  | 
|
283  | 
%  | 
|
284  | 
% \ifrail@all : checked at the end of the document  | 
|
285  | 
||
| 13044 | 286  | 
\def\rail@makeother#1{
 | 
287  | 
\expandafter\catcode\expandafter`\csname\string #1\endcsname=12  | 
|
288  | 
}  | 
|
289  | 
||
290  | 
\def\rail@setcodes{
 | 
|
291  | 
\let\par=\relax  | 
|
292  | 
\let\\=\relax  | 
|
293  | 
\expandafter\@tfor\expandafter\rail@symbol\expandafter:\expandafter=%  | 
|
294  | 
\the\rail@reserved  | 
|
295  | 
\do{\expandafter\rail@makeother\rail@symbol}
 | 
|
296  | 
}  | 
|
297  | 
||
| 3097 | 298  | 
\newcount\rail@nr  | 
299  | 
||
300  | 
\newif\ifrail@all  | 
|
301  | 
\rail@alltrue  | 
|
302  | 
||
303  | 
\newif\ifrail@match  | 
|
304  | 
||
305  | 
\def\rail@first{
 | 
|
| 13044 | 306  | 
\begingroup  | 
| 3097 | 307  | 
\makeatletter  | 
| 13044 | 308  | 
\rail@setcodes  | 
| 3097 | 309  | 
\InputIfFileExists{\jobname.rao}{}{\PackageInfo{rail}{No file \jobname.rao}}
 | 
310  | 
\makeatother  | 
|
| 13044 | 311  | 
\endgroup  | 
| 3097 | 312  | 
\if@filesw  | 
313  | 
\newwrite\tf@rai  | 
|
314  | 
\immediate\openout\tf@rai=\jobname.rai  | 
|
| 2658 | 315  | 
\fi  | 
| 3097 | 316  | 
\global\let\rail@first=\relax  | 
317  | 
}  | 
|
| 2658 | 318  | 
|
| 3097 | 319  | 
\long\def\rail@body#1\end{
 | 
| 13044 | 320  | 
{
 | 
321  | 
\newlinechar=`^^J  | 
|
322  | 
\def\par{\string\par^^J}
 | 
|
323  | 
\rail@write{\string\rail@i{\number\rail@nr}{#1}}
 | 
|
324  | 
}  | 
|
| 3097 | 325  | 
\xdef\rail@i@{#1}
 | 
326  | 
\end  | 
|
327  | 
}  | 
|
328  | 
||
329  | 
\newenvironment{rail}{
 | 
|
330  | 
\global\advance\rail@nr by 1  | 
|
331  | 
\rail@first  | 
|
| 13044 | 332  | 
\begingroup  | 
333  | 
\rail@setcodes  | 
|
| 3097 | 334  | 
\rail@body  | 
335  | 
}{
 | 
|
| 13044 | 336  | 
\endgroup  | 
| 3097 | 337  | 
\rail@matchtrue  | 
338  | 
\@ifundefined{rail@o@\number\rail@nr}{\rail@matchfalse}{}
 | 
|
339  | 
\expandafter\ifx\csname rail@i@\number\rail@nr\endcsname\rail@i@  | 
|
340  | 
\else  | 
|
341  | 
\rail@matchfalse  | 
|
342  | 
\fi  | 
|
343  | 
\ifrail@match  | 
|
344  | 
\csname rail@o@\number\rail@nr\endcsname  | 
|
345  | 
\else  | 
|
346  | 
\PackageWarning{rail}{Railroad diagram {\number\rail@nr} doesn't match}
 | 
|
347  | 
\global\let\rail@endwarn=\rail@warn  | 
|
348  | 
\begin{list}{}{\rail@param}
 | 
|
349  | 
\rail@begin{1}{}
 | 
|
350  | 
\rail@setbox{\bfseries ???}
 | 
|
351  | 
\rail@oval  | 
|
352  | 
\rail@end  | 
|
353  | 
\end{list}
 | 
|
354  | 
\fi  | 
|
355  | 
}  | 
|
356  | 
||
357  | 
\newcommand\railoptions[1]{
 | 
|
358  | 
\rail@first  | 
|
359  | 
\rail@write{\string\rail@p{#1}}
 | 
|
360  | 
}  | 
|
361  | 
||
362  | 
\newcommand\railterm[1]{
 | 
|
363  | 
\rail@first  | 
|
364  | 
\@for\rail@@:=#1\do{
 | 
|
365  | 
\rail@write{\string\rail@t{\rail@@}}
 | 
|
366  | 
}  | 
|
367  | 
}  | 
|
368  | 
||
369  | 
\newcommand\railalias[2]{
 | 
|
370  | 
\expandafter\def\csname rail@t@#1\endcsname{#2}
 | 
|
371  | 
}  | 
|
372  | 
||
| 13044 | 373  | 
\newcommand\railtoken[2]{\railalias{#1}{#2}\railterm{#1}}
 | 
374  | 
||
| 3097 | 375  | 
\long\def\rail@i#1#2{
 | 
376  | 
\expandafter\gdef\csname rail@i@#1\endcsname{#2}
 | 
|
377  | 
}  | 
|
378  | 
||
379  | 
\def\rail@o#1#2{
 | 
|
380  | 
\expandafter\gdef\csname rail@o@#1\endcsname{
 | 
|
| 13044 | 381  | 
\begin{list}{}{\rail@param}
 | 
382  | 
#2  | 
|
383  | 
\end{list}
 | 
|
| 3097 | 384  | 
}  | 
385  | 
}  | 
|
386  | 
||
387  | 
\def\rail@t#1{}
 | 
|
388  | 
||
389  | 
\def\rail@p#1{}
 | 
|
390  | 
||
| 13044 | 391  | 
\long\def\rail@write#1{\@ifundefined{tf@rai}{}{\immediate\write\tf@rai{#1}}}
 | 
| 3097 | 392  | 
|
393  | 
\def\rail@warn{
 | 
|
394  | 
\PackageWarningNoLine{rail}{Railroad diagram(s) may have changed.
 | 
|
395  | 
Use 'rail' and rerun}  | 
|
396  | 
}  | 
|
397  | 
||
398  | 
\let\rail@endwarn=\relax  | 
|
399  | 
||
400  | 
\AtEndDocument{\rail@endwarn}
 | 
|
401  | 
||
402  | 
% index entry macro  | 
|
403  | 
%  | 
|
404  | 
% \rail@index{IDENT} : add index entry for IDENT
 | 
|
405  | 
||
406  | 
\def\rail@index#1{
 | 
|
407  | 
\index{\rail@indexfont#1}
 | 
|
408  | 
}  | 
|
| 2658 | 409  | 
|
410  | 
% railroad formatting primitives  | 
|
411  | 
%  | 
|
412  | 
% \rail@x : current x  | 
|
413  | 
% \rail@y : current y  | 
|
414  | 
% \rail@ex : current end x  | 
|
415  | 
% \rail@sx : starting x for \rail@cr  | 
|
416  | 
% \rail@rx : rightmost previous x for \rail@cr  | 
|
417  | 
%  | 
|
418  | 
% \rail@tmpa : temporary count  | 
|
419  | 
% \rail@tmpb : temporary count  | 
|
420  | 
% \rail@tmpc : temporary count  | 
|
421  | 
%  | 
|
422  | 
% \rail@put : put at (\rail@x,\rail@y)  | 
|
| 13044 | 423  | 
% \rail@vput : put vector at (\rail@x,\rail@y)  | 
| 2658 | 424  | 
%  | 
425  | 
% \rail@eline : end line by drawing from \rail@ex to \rail@x  | 
|
426  | 
%  | 
|
| 13044 | 427  | 
% \rail@vreline : end line by drawing a vector from \rail@x to \rail@ex  | 
428  | 
%  | 
|
429  | 
% \rail@vleline : end line by drawing a vector from \rail@ex to \rail@x  | 
|
430  | 
%  | 
|
| 2658 | 431  | 
% \rail@sety{LEVEL} : set \rail@y to level LEVEL
 | 
432  | 
||
433  | 
\newcount\rail@x  | 
|
434  | 
\newcount\rail@y  | 
|
435  | 
\newcount\rail@ex  | 
|
436  | 
\newcount\rail@sx  | 
|
437  | 
\newcount\rail@rx  | 
|
438  | 
||
439  | 
\newcount\rail@tmpa  | 
|
440  | 
\newcount\rail@tmpb  | 
|
441  | 
\newcount\rail@tmpc  | 
|
442  | 
||
443  | 
\def\rail@put{\put(\number\rail@x,\number\rail@y)}
 | 
|
444  | 
||
| 13044 | 445  | 
\def\rail@vput{\put(\number\rail@ex,\number\rail@y)}
 | 
446  | 
||
| 2658 | 447  | 
\def\rail@eline{
 | 
448  | 
\rail@tmpb=\rail@x  | 
|
449  | 
\advance\rail@tmpb by -\rail@ex  | 
|
450  | 
\rail@put{\line(-1,0){\number\rail@tmpb}}
 | 
|
451  | 
}  | 
|
452  | 
||
| 13044 | 453  | 
\def\rail@vreline{
 | 
454  | 
\rail@tmpb=\rail@x  | 
|
455  | 
\advance\rail@tmpb by -\rail@ex  | 
|
456  | 
\rail@vput{\vector(1,0){\number\rail@tmpb}}
 | 
|
457  | 
}  | 
|
458  | 
||
459  | 
\def\rail@vleline{
 | 
|
460  | 
\rail@tmpb=\rail@x  | 
|
461  | 
\advance\rail@tmpb by -\rail@ex  | 
|
462  | 
\rail@put{\vector(-1,0){\number\rail@tmpb}}
 | 
|
463  | 
}  | 
|
464  | 
||
| 2658 | 465  | 
\def\rail@sety#1{
 | 
466  | 
\rail@y=#1  | 
|
467  | 
\multiply\rail@y by -\rail@boxsp  | 
|
468  | 
\advance\rail@y by -\rail@boxht  | 
|
469  | 
}  | 
|
470  | 
||
471  | 
% \rail@begin{HEIGHT}{NAME} : begin a railroad diagram of height HEIGHT
 | 
|
472  | 
%  | 
|
473  | 
% \rail@end : end a railroad diagram  | 
|
| 3097 | 474  | 
%  | 
475  | 
% \rail@expand{IDENT} : expand IDENT
 | 
|
| 2658 | 476  | 
|
477  | 
\def\rail@begin#1#2{
 | 
|
| 13044 | 478  | 
\item  | 
| 3097 | 479  | 
\begin{minipage}[t]{\linewidth}
 | 
| 2658 | 480  | 
\ifx\@empty#2\else  | 
| 3097 | 481  | 
{\rail@namefont \rail@expand{#2}}\\*[\railnamesep]
 | 
| 2658 | 482  | 
\fi  | 
483  | 
\unitlength=\railunit  | 
|
484  | 
\rail@tmpa=#1  | 
|
485  | 
\multiply\rail@tmpa by \rail@boxsp  | 
|
486  | 
\begin{picture}(0,\number\rail@tmpa)(0,-\number\rail@tmpa)
 | 
|
487  | 
\rail@ex=0  | 
|
488  | 
\rail@rx=0  | 
|
489  | 
\rail@x=\rail@extra  | 
|
490  | 
\rail@sx=\rail@x  | 
|
491  | 
\rail@sety{0}
 | 
|
492  | 
}  | 
|
493  | 
||
494  | 
\def\rail@end{
 | 
|
495  | 
\advance\rail@x by \rail@extra  | 
|
496  | 
\rail@eline  | 
|
497  | 
\end{picture}
 | 
|
| 3097 | 498  | 
\end{minipage}
 | 
| 2658 | 499  | 
}  | 
500  | 
||
| 13044 | 501  | 
\def\rail@vend{
 | 
502  | 
\advance\rail@x by \rail@extra  | 
|
503  | 
\rail@vreline  | 
|
504  | 
\end{picture}
 | 
|
505  | 
\end{minipage}
 | 
|
506  | 
}  | 
|
507  | 
||
| 3097 | 508  | 
\def\rail@expand#1{\@ifundefined{rail@t@#1}{#1}{\csname rail@t@#1\endcsname}}
 | 
| 2658 | 509  | 
|
| 3097 | 510  | 
% \rail@token{TEXT}[ANNOT] : format token TEXT with annotation
 | 
| 13044 | 511  | 
% \rail@ltoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow left
 | 
512  | 
% \rail@rtoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow right
 | 
|
| 2658 | 513  | 
%  | 
| 3097 | 514  | 
% \rail@ctoken{TEXT}[ANNOT] : format token TEXT centered with annotation
 | 
| 13044 | 515  | 
% \rail@lctoken{TEXT}[ANNOT] : format token TEXT centered with annotation, arrow left
 | 
516  | 
% \rail@rctoken{TEXT}[ANNOT] : format token TEXT centered with annotation, arrow right
 | 
|
| 3097 | 517  | 
%  | 
518  | 
% \rail@nont{TEXT}[ANNOT] : format nonterminal TEXT with annotation
 | 
|
| 13044 | 519  | 
% \rail@lnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation, arrow left
 | 
520  | 
% \rail@rnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation. arrow right
 | 
|
| 2658 | 521  | 
%  | 
| 3097 | 522  | 
% \rail@cnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation
 | 
| 13044 | 523  | 
% \rail@lcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation,
 | 
524  | 
% arrow left  | 
|
525  | 
% \rail@rcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation,
 | 
|
526  | 
% arrow right  | 
|
| 2658 | 527  | 
%  | 
| 3097 | 528  | 
% \rail@term{TEXT}[ANNOT] : format terminal TEXT with annotation
 | 
| 13044 | 529  | 
% \rail@lterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow left
 | 
530  | 
% \rail@rterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow right
 | 
|
| 2658 | 531  | 
%  | 
| 3097 | 532  | 
% \rail@cterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation
 | 
| 13044 | 533  | 
% \rail@lcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation, arrow left
 | 
534  | 
% \rail@rcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation,
 | 
|
535  | 
% arrow right  | 
|
| 2658 | 536  | 
%  | 
537  | 
% \rail@annote[TEXT] : format TEXT as annotation  | 
|
538  | 
||
| 3097 | 539  | 
\def\rail@token#1[#2]{
 | 
540  | 
\rail@setbox{%
 | 
|
| 13044 | 541  | 
{\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
| 2658 | 542  | 
}  | 
543  | 
\rail@oval  | 
|
544  | 
}  | 
|
545  | 
||
| 13044 | 546  | 
\def\rail@ltoken#1[#2]{
 | 
547  | 
\rail@setbox{%
 | 
|
548  | 
{\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
549  | 
}  | 
|
550  | 
\rail@vloval  | 
|
551  | 
}  | 
|
552  | 
||
553  | 
\def\rail@rtoken#1[#2]{
 | 
|
554  | 
\rail@setbox{%
 | 
|
555  | 
{\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
556  | 
}  | 
|
557  | 
\rail@vroval  | 
|
558  | 
}  | 
|
559  | 
||
| 3097 | 560  | 
\def\rail@ctoken#1[#2]{
 | 
561  | 
\rail@setbox{%
 | 
|
| 13044 | 562  | 
{\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
| 3097 | 563  | 
}  | 
| 2658 | 564  | 
\rail@coval  | 
565  | 
}  | 
|
566  | 
||
| 13044 | 567  | 
\def\rail@lctoken#1[#2]{
 | 
568  | 
\rail@setbox{%
 | 
|
569  | 
{\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
570  | 
}  | 
|
571  | 
\rail@vlcoval  | 
|
572  | 
}  | 
|
573  | 
||
574  | 
\def\rail@rctoken#1[#2]{
 | 
|
575  | 
\rail@setbox{%
 | 
|
576  | 
{\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
577  | 
}  | 
|
578  | 
\rail@vrcoval  | 
|
579  | 
}  | 
|
580  | 
||
| 3097 | 581  | 
\def\rail@nont#1[#2]{
 | 
582  | 
\rail@setbox{%
 | 
|
583  | 
{\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
584  | 
}  | 
|
| 2658 | 585  | 
\rail@frame  | 
586  | 
}  | 
|
587  | 
||
| 13044 | 588  | 
\def\rail@lnont#1[#2]{
 | 
589  | 
\rail@setbox{%
 | 
|
590  | 
{\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
591  | 
}  | 
|
592  | 
\rail@vlframe  | 
|
593  | 
}  | 
|
594  | 
||
595  | 
\def\rail@rnont#1[#2]{
 | 
|
596  | 
\rail@setbox{%
 | 
|
597  | 
{\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
598  | 
}  | 
|
599  | 
\rail@vrframe  | 
|
600  | 
}  | 
|
601  | 
||
| 3097 | 602  | 
\def\rail@cnont#1[#2]{
 | 
603  | 
\rail@setbox{%
 | 
|
604  | 
{\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
605  | 
}  | 
|
| 2658 | 606  | 
\rail@cframe  | 
607  | 
}  | 
|
608  | 
||
| 13044 | 609  | 
\def\rail@lcnont#1[#2]{
 | 
610  | 
\rail@setbox{%
 | 
|
611  | 
{\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
612  | 
}  | 
|
613  | 
\rail@vlcframe  | 
|
614  | 
}  | 
|
615  | 
||
616  | 
\def\rail@rcnont#1[#2]{
 | 
|
617  | 
\rail@setbox{%
 | 
|
618  | 
{\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
619  | 
}  | 
|
620  | 
\rail@vrcframe  | 
|
621  | 
}  | 
|
622  | 
||
| 3097 | 623  | 
\def\rail@term#1[#2]{
 | 
624  | 
\rail@setbox{%
 | 
|
625  | 
{\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
626  | 
}  | 
|
| 2658 | 627  | 
\rail@oval  | 
628  | 
}  | 
|
629  | 
||
| 13044 | 630  | 
\def\rail@lterm#1[#2]{
 | 
631  | 
\rail@setbox{%
 | 
|
632  | 
{\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
633  | 
}  | 
|
634  | 
\rail@vloval  | 
|
635  | 
}  | 
|
636  | 
||
637  | 
\def\rail@rterm#1[#2]{
 | 
|
638  | 
\rail@setbox{%
 | 
|
639  | 
{\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
640  | 
}  | 
|
641  | 
\rail@vroval  | 
|
642  | 
}  | 
|
643  | 
||
| 3097 | 644  | 
\def\rail@cterm#1[#2]{
 | 
645  | 
\rail@setbox{%
 | 
|
646  | 
{\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
647  | 
}  | 
|
| 2658 | 648  | 
\rail@coval  | 
649  | 
}  | 
|
650  | 
||
| 13044 | 651  | 
\def\rail@lcterm#1[#2]{
 | 
652  | 
\rail@setbox{%
 | 
|
653  | 
{\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
654  | 
}  | 
|
655  | 
\rail@vlcoval  | 
|
656  | 
}  | 
|
657  | 
||
658  | 
\def\rail@rcterm#1[#2]{
 | 
|
659  | 
\rail@setbox{%
 | 
|
660  | 
{\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
|
661  | 
}  | 
|
662  | 
\rail@vrcoval  | 
|
663  | 
}  | 
|
664  | 
||
| 2658 | 665  | 
\def\rail@annote[#1]{
 | 
666  | 
\rail@setbox{\rail@annofont #1}
 | 
|
667  | 
\rail@text  | 
|
668  | 
}  | 
|
669  | 
||
670  | 
% \rail@box : temporary box for \rail@oval and \rail@frame  | 
|
671  | 
%  | 
|
672  | 
% \rail@setbox{TEXT} : set \rail@box to TEXT, set \rail@tmpa to width
 | 
|
673  | 
%  | 
|
674  | 
% \rail@oval : format \rail@box of width \rail@tmpa inside an oval  | 
|
| 13044 | 675  | 
% \rail@vloval : format \rail@box of width \rail@tmpa inside an oval, vector left  | 
676  | 
% \rail@vroval : format \rail@box of width \rail@tmpa inside an oval, vector right  | 
|
| 2658 | 677  | 
%  | 
678  | 
% \rail@coval : same as \rail@oval, but centered between \rail@x and  | 
|
679  | 
% \rail@mx  | 
|
| 13044 | 680  | 
% \rail@vlcoval : same as \rail@oval, but centered between \rail@x and  | 
681  | 
% \rail@mx, vector left  | 
|
682  | 
% \rail@vrcoval : same as \rail@oval, but centered between \rail@x and  | 
|
683  | 
% \rail@mx, vector right  | 
|
| 2658 | 684  | 
%  | 
685  | 
% \rail@frame : format \rail@box of width \rail@tmpa inside a frame  | 
|
| 13044 | 686  | 
% \rail@vlframe : format \rail@box of width \rail@tmpa inside a frame, vector left  | 
687  | 
% \rail@vrframe : format \rail@box of width \rail@tmpa inside a frame, vector right  | 
|
| 2658 | 688  | 
%  | 
689  | 
% \rail@cframe : same as \rail@frame, but centered between \rail@x and  | 
|
690  | 
% \rail@mx  | 
|
| 13044 | 691  | 
% \rail@vlcframe : same as \rail@frame, but centered between \rail@x and  | 
692  | 
% \rail@mx, vector left  | 
|
693  | 
% \rail@vrcframe : same as \rail@frame, but centered between \rail@x and  | 
|
694  | 
% \rail@mx, vector right  | 
|
| 2658 | 695  | 
%  | 
696  | 
% \rail@text : format \rail@box of width \rail@tmpa above the line  | 
|
697  | 
||
698  | 
\newbox\rail@box  | 
|
699  | 
||
700  | 
\def\rail@setbox#1{
 | 
|
701  | 
\setbox\rail@box\hbox{\strut#1}
 | 
|
702  | 
\rail@tmpa=\wd\rail@box  | 
|
703  | 
\divide\rail@tmpa by \railunit  | 
|
704  | 
}  | 
|
705  | 
||
706  | 
\def\rail@oval{
 | 
|
707  | 
\advance\rail@x by \rail@boxlf  | 
|
708  | 
\rail@eline  | 
|
709  | 
\advance\rail@tmpa by \rail@ovalsp  | 
|
710  | 
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi  | 
|
711  | 
\rail@tmpb=\rail@tmpa  | 
|
712  | 
\divide\rail@tmpb by 2  | 
|
713  | 
\advance\rail@y by -\rail@boxhht  | 
|
714  | 
\rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | 
|
715  | 
\advance\rail@y by \rail@boxhht  | 
|
716  | 
\advance\rail@x by \rail@tmpb  | 
|
717  | 
\rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
 | 
|
718  | 
\advance\rail@x by \rail@tmpb  | 
|
719  | 
\rail@ex=\rail@x  | 
|
720  | 
\advance\rail@x by \rail@boxrt  | 
|
721  | 
}  | 
|
722  | 
||
| 13044 | 723  | 
\def\rail@vloval{
 | 
724  | 
\advance\rail@x by \rail@boxlf  | 
|
725  | 
\rail@eline  | 
|
726  | 
\advance\rail@tmpa by \rail@ovalsp  | 
|
727  | 
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi  | 
|
728  | 
\rail@tmpb=\rail@tmpa  | 
|
729  | 
\divide\rail@tmpb by 2  | 
|
730  | 
\advance\rail@y by -\rail@boxhht  | 
|
731  | 
\rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | 
|
732  | 
\advance\rail@y by \rail@boxhht  | 
|
733  | 
\advance\rail@x by \rail@tmpb  | 
|
734  | 
\rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
 | 
|
735  | 
\advance\rail@x by \rail@tmpb  | 
|
736  | 
\rail@ex=\rail@x  | 
|
737  | 
\advance\rail@x by \rail@boxrt  | 
|
738  | 
\rail@vleline  | 
|
739  | 
}  | 
|
740  | 
||
741  | 
\def\rail@vroval{
 | 
|
742  | 
\advance\rail@x by \rail@boxlf  | 
|
743  | 
\rail@vreline  | 
|
744  | 
\advance\rail@tmpa by \rail@ovalsp  | 
|
745  | 
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi  | 
|
746  | 
\rail@tmpb=\rail@tmpa  | 
|
747  | 
\divide\rail@tmpb by 2  | 
|
748  | 
\advance\rail@y by -\rail@boxhht  | 
|
749  | 
\rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | 
|
750  | 
\advance\rail@y by \rail@boxhht  | 
|
751  | 
\advance\rail@x by \rail@tmpb  | 
|
752  | 
\rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
 | 
|
753  | 
\advance\rail@x by \rail@tmpb  | 
|
754  | 
\rail@ex=\rail@x  | 
|
755  | 
\advance\rail@x by \rail@boxrt  | 
|
756  | 
}  | 
|
757  | 
||
| 2658 | 758  | 
\def\rail@coval{
 | 
759  | 
\rail@tmpb=\rail@tmpa  | 
|
760  | 
\advance\rail@tmpb by \rail@ovalsp  | 
|
761  | 
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi  | 
|
762  | 
\advance\rail@tmpb by \rail@boxlf  | 
|
763  | 
\advance\rail@tmpb by \rail@boxrt  | 
|
764  | 
\rail@tmpc=\rail@mx  | 
|
765  | 
\advance\rail@tmpc by -\rail@x  | 
|
766  | 
\advance\rail@tmpc by -\rail@tmpb  | 
|
767  | 
\divide\rail@tmpc by 2  | 
|
768  | 
\ifnum\rail@tmpc>0  | 
|
769  | 
\advance\rail@x by \rail@tmpc  | 
|
770  | 
\fi  | 
|
771  | 
\rail@oval  | 
|
772  | 
}  | 
|
773  | 
||
| 13044 | 774  | 
\def\rail@vlcoval{
 | 
775  | 
\rail@tmpb=\rail@tmpa  | 
|
776  | 
\advance\rail@tmpb by \rail@ovalsp  | 
|
777  | 
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi  | 
|
778  | 
\advance\rail@tmpb by \rail@boxlf  | 
|
779  | 
\advance\rail@tmpb by \rail@boxrt  | 
|
780  | 
\rail@tmpc=\rail@mx  | 
|
781  | 
\advance\rail@tmpc by -\rail@x  | 
|
782  | 
\advance\rail@tmpc by -\rail@tmpb  | 
|
783  | 
\divide\rail@tmpc by 2  | 
|
784  | 
\ifnum\rail@tmpc>0  | 
|
785  | 
\advance\rail@x by \rail@tmpc  | 
|
786  | 
\fi  | 
|
787  | 
\rail@vloval  | 
|
788  | 
}  | 
|
789  | 
||
790  | 
\def\rail@vrcoval{
 | 
|
791  | 
\rail@tmpb=\rail@tmpa  | 
|
792  | 
\advance\rail@tmpb by \rail@ovalsp  | 
|
793  | 
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi  | 
|
794  | 
\advance\rail@tmpb by \rail@boxlf  | 
|
795  | 
\advance\rail@tmpb by \rail@boxrt  | 
|
796  | 
\rail@tmpc=\rail@mx  | 
|
797  | 
\advance\rail@tmpc by -\rail@x  | 
|
798  | 
\advance\rail@tmpc by -\rail@tmpb  | 
|
799  | 
\divide\rail@tmpc by 2  | 
|
800  | 
\ifnum\rail@tmpc>0  | 
|
801  | 
\advance\rail@x by \rail@tmpc  | 
|
802  | 
\fi  | 
|
803  | 
\rail@vroval  | 
|
804  | 
}  | 
|
805  | 
||
| 2658 | 806  | 
\def\rail@frame{
 | 
807  | 
\advance\rail@x by \rail@boxlf  | 
|
808  | 
\rail@eline  | 
|
809  | 
\advance\rail@tmpa by \rail@framesp  | 
|
810  | 
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi  | 
|
811  | 
\advance\rail@y by -\rail@boxhht  | 
|
812  | 
\rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | 
|
813  | 
\advance\rail@y by \rail@boxhht  | 
|
814  | 
\advance\rail@x by \rail@tmpa  | 
|
815  | 
\rail@ex=\rail@x  | 
|
816  | 
\advance\rail@x by \rail@boxrt  | 
|
817  | 
}  | 
|
818  | 
||
| 13044 | 819  | 
\def\rail@vlframe{
 | 
820  | 
\advance\rail@x by \rail@boxlf  | 
|
821  | 
\rail@eline  | 
|
822  | 
\advance\rail@tmpa by \rail@framesp  | 
|
823  | 
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi  | 
|
824  | 
\advance\rail@y by -\rail@boxhht  | 
|
825  | 
\rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | 
|
826  | 
\advance\rail@y by \rail@boxhht  | 
|
827  | 
\advance\rail@x by \rail@tmpa  | 
|
828  | 
\rail@ex=\rail@x  | 
|
829  | 
\advance\rail@x by \rail@boxrt  | 
|
830  | 
\rail@vleline  | 
|
831  | 
}  | 
|
832  | 
||
833  | 
\def\rail@vrframe{
 | 
|
834  | 
\advance\rail@x by \rail@boxlf  | 
|
835  | 
\rail@vreline  | 
|
836  | 
\advance\rail@tmpa by \rail@framesp  | 
|
837  | 
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi  | 
|
838  | 
\advance\rail@y by -\rail@boxhht  | 
|
839  | 
\rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | 
|
840  | 
\advance\rail@y by \rail@boxhht  | 
|
841  | 
\advance\rail@x by \rail@tmpa  | 
|
842  | 
\rail@ex=\rail@x  | 
|
843  | 
\advance\rail@x by \rail@boxrt  | 
|
844  | 
}  | 
|
845  | 
||
| 2658 | 846  | 
\def\rail@cframe{
 | 
847  | 
\rail@tmpb=\rail@tmpa  | 
|
848  | 
\advance\rail@tmpb by \rail@framesp  | 
|
849  | 
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi  | 
|
850  | 
\advance\rail@tmpb by \rail@boxlf  | 
|
851  | 
\advance\rail@tmpb by \rail@boxrt  | 
|
852  | 
\rail@tmpc=\rail@mx  | 
|
853  | 
\advance\rail@tmpc by -\rail@x  | 
|
854  | 
\advance\rail@tmpc by -\rail@tmpb  | 
|
855  | 
\divide\rail@tmpc by 2  | 
|
856  | 
\ifnum\rail@tmpc>0  | 
|
857  | 
\advance\rail@x by \rail@tmpc  | 
|
858  | 
\fi  | 
|
859  | 
\rail@frame  | 
|
860  | 
}  | 
|
861  | 
||
| 13044 | 862  | 
\def\rail@vlcframe{
 | 
863  | 
\rail@tmpb=\rail@tmpa  | 
|
864  | 
\advance\rail@tmpb by \rail@framesp  | 
|
865  | 
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi  | 
|
866  | 
\advance\rail@tmpb by \rail@boxlf  | 
|
867  | 
\advance\rail@tmpb by \rail@boxrt  | 
|
868  | 
\rail@tmpc=\rail@mx  | 
|
869  | 
\advance\rail@tmpc by -\rail@x  | 
|
870  | 
\advance\rail@tmpc by -\rail@tmpb  | 
|
871  | 
\divide\rail@tmpc by 2  | 
|
872  | 
\ifnum\rail@tmpc>0  | 
|
873  | 
\advance\rail@x by \rail@tmpc  | 
|
874  | 
\fi  | 
|
875  | 
\rail@vlframe  | 
|
876  | 
}  | 
|
877  | 
||
878  | 
\def\rail@vrcframe{
 | 
|
879  | 
\rail@tmpb=\rail@tmpa  | 
|
880  | 
\advance\rail@tmpb by \rail@framesp  | 
|
881  | 
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi  | 
|
882  | 
\advance\rail@tmpb by \rail@boxlf  | 
|
883  | 
\advance\rail@tmpb by \rail@boxrt  | 
|
884  | 
\rail@tmpc=\rail@mx  | 
|
885  | 
\advance\rail@tmpc by -\rail@x  | 
|
886  | 
\advance\rail@tmpc by -\rail@tmpb  | 
|
887  | 
\divide\rail@tmpc by 2  | 
|
888  | 
\ifnum\rail@tmpc>0  | 
|
889  | 
\advance\rail@x by \rail@tmpc  | 
|
890  | 
\fi  | 
|
891  | 
\rail@vrframe  | 
|
892  | 
}  | 
|
893  | 
||
| 2658 | 894  | 
\def\rail@text{
 | 
895  | 
\advance\rail@x by \rail@textlf  | 
|
896  | 
\advance\rail@y by \rail@textup  | 
|
897  | 
\rail@put{\box\rail@box}
 | 
|
898  | 
\advance\rail@y by -\rail@textup  | 
|
899  | 
\advance\rail@x by \rail@tmpa  | 
|
900  | 
\advance\rail@x by \rail@textrt  | 
|
901  | 
}  | 
|
902  | 
||
903  | 
% alternatives  | 
|
904  | 
%  | 
|
905  | 
% \rail@jx \rail@jy : current join point  | 
|
906  | 
%  | 
|
907  | 
% \rail@gx \rail@gy \rail@gex \rail@grx : global versions of \rail@x etc,  | 
|
908  | 
% to pass values over group closings  | 
|
909  | 
%  | 
|
910  | 
% \rail@mx : maximum x so far  | 
|
911  | 
%  | 
|
912  | 
% \rail@sy : starting \rail@y for alternatives  | 
|
913  | 
%  | 
|
914  | 
% \rail@jput : put at (\rail@jx,\rail@jy)  | 
|
915  | 
%  | 
|
916  | 
% \rail@joval[PART] : put \oval[PART] with adjust  | 
|
917  | 
||
918  | 
\newcount\rail@jx  | 
|
919  | 
\newcount\rail@jy  | 
|
920  | 
||
921  | 
\newcount\rail@gx  | 
|
922  | 
\newcount\rail@gy  | 
|
923  | 
\newcount\rail@gex  | 
|
924  | 
\newcount\rail@grx  | 
|
925  | 
||
926  | 
\newcount\rail@sy  | 
|
927  | 
\newcount\rail@mx  | 
|
928  | 
||
929  | 
\def\rail@jput{
 | 
|
930  | 
\put(\number\rail@jx,\number\rail@jy)  | 
|
931  | 
}  | 
|
932  | 
||
933  | 
\def\rail@joval[#1]{
 | 
|
934  | 
\advance\rail@jx by \rail@joinadj  | 
|
935  | 
\rail@jput{\oval(\number\rail@joinsz,\number\rail@joinsz)[#1]}
 | 
|
936  | 
\advance\rail@jx by -\rail@joinadj  | 
|
937  | 
}  | 
|
938  | 
||
939  | 
% \rail@barsplit : incoming split for '|'  | 
|
940  | 
%  | 
|
941  | 
% \rail@plussplit : incoming split for '+'  | 
|
942  | 
%  | 
|
943  | 
||
944  | 
\def\rail@barsplit{
 | 
|
945  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
946  | 
\rail@joval[tr]  | 
|
947  | 
\advance\rail@jx by \rail@joinhsz  | 
|
948  | 
}  | 
|
949  | 
||
950  | 
\def\rail@plussplit{
 | 
|
951  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
952  | 
\advance\rail@jx by \rail@joinsz  | 
|
953  | 
\rail@joval[tl]  | 
|
954  | 
\advance\rail@jx by -\rail@joinhsz  | 
|
955  | 
}  | 
|
956  | 
||
957  | 
% \rail@alt{SPLIT} : start alternatives with incoming split SPLIT
 | 
|
958  | 
%  | 
|
959  | 
||
960  | 
\def\rail@alt#1{
 | 
|
961  | 
\rail@sy=\rail@y  | 
|
962  | 
\rail@jx=\rail@x  | 
|
963  | 
\rail@jy=\rail@y  | 
|
964  | 
\advance\rail@x by \rail@joinsz  | 
|
965  | 
\rail@mx=0  | 
|
966  | 
\let\rail@list=\@empty  | 
|
967  | 
\let\rail@comma=\@empty  | 
|
968  | 
\let\rail@split=#1  | 
|
969  | 
\begingroup  | 
|
970  | 
\rail@sx=\rail@x  | 
|
971  | 
\rail@rx=0  | 
|
972  | 
}  | 
|
973  | 
||
974  | 
% \rail@nextalt{FIX}{Y} : start next alternative at vertical position Y
 | 
|
975  | 
% and fix-up FIX  | 
|
976  | 
%  | 
|
977  | 
||
978  | 
\def\rail@nextalt#1#2{
 | 
|
979  | 
\global\rail@gx=\rail@x  | 
|
980  | 
\global\rail@gy=\rail@y  | 
|
981  | 
\global\rail@gex=\rail@ex  | 
|
982  | 
\global\rail@grx=\rail@rx  | 
|
983  | 
\endgroup  | 
|
984  | 
#1  | 
|
985  | 
\ifnum\rail@gx>\rail@mx\rail@mx=\rail@gx\fi  | 
|
986  | 
\ifnum\rail@grx>\rail@mx\rail@mx=\rail@grx\fi  | 
|
987  | 
\edef\rail@list{\rail@list\rail@comma\number\rail@gex:\number\rail@gy}
 | 
|
988  | 
\def\rail@comma{,}
 | 
|
989  | 
\rail@split  | 
|
990  | 
\let\rail@split=\@empty  | 
|
991  | 
\rail@sety{#2}
 | 
|
992  | 
\rail@tmpa=\rail@jy  | 
|
993  | 
\advance\rail@tmpa by -\rail@y  | 
|
994  | 
\advance\rail@tmpa by -\rail@joinhsz  | 
|
995  | 
\rail@jput{\line(0,-1){\number\rail@tmpa}}
 | 
|
996  | 
\rail@jy=\rail@y  | 
|
997  | 
\advance\rail@jy by \rail@joinhsz  | 
|
998  | 
\advance\rail@jx by \rail@joinhsz  | 
|
999  | 
\rail@joval[bl]  | 
|
1000  | 
\advance\rail@jx by -\rail@joinhsz  | 
|
1001  | 
\rail@ex=\rail@x  | 
|
1002  | 
\begingroup  | 
|
1003  | 
\rail@sx=\rail@x  | 
|
1004  | 
\rail@rx=0  | 
|
1005  | 
}  | 
|
1006  | 
||
1007  | 
% \rail@barjoin : outgoing join for first '|' alternative  | 
|
1008  | 
%  | 
|
1009  | 
% \rail@plusjoin : outgoing join for first '+' alternative  | 
|
1010  | 
%  | 
|
1011  | 
% \rail@altjoin : join for subsequent alternative  | 
|
1012  | 
%  | 
|
1013  | 
||
1014  | 
\def\rail@barjoin{
 | 
|
1015  | 
\ifnum\rail@y<\rail@sy  | 
|
1016  | 
\global\rail@gex=\rail@jx  | 
|
1017  | 
\else  | 
|
1018  | 
\global\rail@gex=\rail@ex  | 
|
1019  | 
\fi  | 
|
1020  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
1021  | 
\rail@joval[tl]  | 
|
1022  | 
\advance\rail@jx by -\rail@joinhsz  | 
|
1023  | 
\ifnum\rail@y<\rail@sy  | 
|
1024  | 
\rail@altjoin  | 
|
1025  | 
\fi  | 
|
1026  | 
}  | 
|
1027  | 
||
1028  | 
\def\rail@plusjoin{
 | 
|
1029  | 
\global\rail@gex=\rail@ex  | 
|
1030  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
1031  | 
\advance\rail@jx by -\rail@joinsz  | 
|
1032  | 
\rail@joval[tr]  | 
|
1033  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1034  | 
}  | 
|
1035  | 
||
1036  | 
\def\rail@altjoin{
 | 
|
1037  | 
\rail@eline  | 
|
1038  | 
\rail@tmpa=\rail@jy  | 
|
1039  | 
\advance\rail@tmpa by -\rail@y  | 
|
1040  | 
\advance\rail@tmpa by -\rail@joinhsz  | 
|
1041  | 
\rail@jput{\line(0,-1){\number\rail@tmpa}}
 | 
|
1042  | 
\rail@jy=\rail@y  | 
|
1043  | 
\advance\rail@jy by \rail@joinhsz  | 
|
1044  | 
\advance\rail@jx by -\rail@joinhsz  | 
|
1045  | 
\rail@joval[br]  | 
|
1046  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1047  | 
}  | 
|
1048  | 
||
1049  | 
% \rail@eltsplit EX:Y; : split EX:Y into \rail@ex \rail@y  | 
|
1050  | 
%  | 
|
1051  | 
% \rail@endalt{JOIN} : end alternatives with outgoing join JOIN
 | 
|
1052  | 
||
1053  | 
\def\rail@eltsplit#1:#2;{\rail@ex=#1\rail@y=#2}
 | 
|
1054  | 
||
1055  | 
\def\rail@endalt#1{
 | 
|
1056  | 
\global\rail@gx=\rail@x  | 
|
1057  | 
\global\rail@gy=\rail@y  | 
|
1058  | 
\global\rail@gex=\rail@ex  | 
|
1059  | 
\global\rail@grx=\rail@rx  | 
|
1060  | 
\endgroup  | 
|
1061  | 
\ifnum\rail@gx>\rail@mx\rail@mx=\rail@gx\fi  | 
|
1062  | 
\ifnum\rail@grx>\rail@mx\rail@mx=\rail@grx\fi  | 
|
1063  | 
\edef\rail@list{\rail@list\rail@comma\number\rail@gex:\number\rail@gy}
 | 
|
1064  | 
\rail@x=\rail@mx  | 
|
1065  | 
\rail@jx=\rail@x  | 
|
1066  | 
\rail@jy=\rail@sy  | 
|
1067  | 
\advance\rail@jx by \rail@joinsz  | 
|
1068  | 
\let\rail@join=#1  | 
|
1069  | 
\@for\rail@elt:=\rail@list\do{
 | 
|
1070  | 
\expandafter\rail@eltsplit\rail@elt;  | 
|
1071  | 
\rail@join  | 
|
1072  | 
\let\rail@join=\rail@altjoin  | 
|
1073  | 
}  | 
|
1074  | 
\rail@x=\rail@mx  | 
|
1075  | 
\rail@y=\rail@sy  | 
|
1076  | 
\rail@ex=\rail@gex  | 
|
1077  | 
\advance\rail@x by \rail@joinsz  | 
|
1078  | 
}  | 
|
1079  | 
||
1080  | 
% \rail@bar : start '|' alternatives  | 
|
1081  | 
%  | 
|
1082  | 
% \rail@nextbar : next '|' alternative  | 
|
1083  | 
%  | 
|
1084  | 
% \rail@endbar : end '|' alternatives  | 
|
1085  | 
%  | 
|
1086  | 
||
1087  | 
\def\rail@bar{
 | 
|
1088  | 
\rail@alt\rail@barsplit  | 
|
1089  | 
}  | 
|
1090  | 
||
1091  | 
\def\rail@nextbar{
 | 
|
1092  | 
\rail@nextalt\relax  | 
|
1093  | 
}  | 
|
1094  | 
||
1095  | 
\def\rail@endbar{
 | 
|
1096  | 
\rail@endalt\rail@barjoin  | 
|
1097  | 
}  | 
|
1098  | 
||
1099  | 
% \rail@plus : start '+' alternatives  | 
|
1100  | 
%  | 
|
1101  | 
% \rail@nextplus: next '+' alternative  | 
|
1102  | 
%  | 
|
1103  | 
% \rail@endplus : end '+' alternatives  | 
|
1104  | 
%  | 
|
1105  | 
||
1106  | 
\def\rail@plus{
 | 
|
1107  | 
\rail@alt\rail@plussplit  | 
|
1108  | 
}  | 
|
1109  | 
||
1110  | 
\def\rail@nextplus{
 | 
|
1111  | 
\rail@nextalt\rail@fixplus  | 
|
1112  | 
}  | 
|
1113  | 
||
1114  | 
\def\rail@fixplus{
 | 
|
1115  | 
\ifnum\rail@gy<\rail@sy  | 
|
1116  | 
\begingroup  | 
|
1117  | 
\rail@x=\rail@gx  | 
|
1118  | 
\rail@y=\rail@gy  | 
|
1119  | 
\rail@ex=\rail@gex  | 
|
1120  | 
\rail@rx=\rail@grx  | 
|
1121  | 
\ifnum\rail@x<\rail@rx  | 
|
1122  | 
\rail@x=\rail@rx  | 
|
1123  | 
\fi  | 
|
1124  | 
\rail@eline  | 
|
1125  | 
\rail@jx=\rail@x  | 
|
1126  | 
\rail@jy=\rail@y  | 
|
1127  | 
\advance\rail@jy by \rail@joinhsz  | 
|
1128  | 
\rail@joval[br]  | 
|
1129  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1130  | 
\rail@tmpa=\rail@sy  | 
|
1131  | 
\advance\rail@tmpa by -\rail@joinhsz  | 
|
1132  | 
\advance\rail@tmpa by -\rail@jy  | 
|
1133  | 
\rail@jput{\line(0,1){\number\rail@tmpa}}
 | 
|
1134  | 
\rail@jy=\rail@sy  | 
|
1135  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
1136  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1137  | 
\rail@joval[tl]  | 
|
1138  | 
\advance\rail@jy by \rail@joinhsz  | 
|
1139  | 
\global\rail@gx=\rail@jx  | 
|
1140  | 
\global\rail@gy=\rail@jy  | 
|
1141  | 
\global\rail@gex=\rail@gx  | 
|
1142  | 
\global\rail@grx=\rail@rx  | 
|
1143  | 
\endgroup  | 
|
1144  | 
\fi  | 
|
1145  | 
}  | 
|
1146  | 
||
1147  | 
\def\rail@endplus{
 | 
|
1148  | 
\rail@endalt\rail@plusjoin  | 
|
1149  | 
}  | 
|
1150  | 
||
1151  | 
% \rail@cr{Y} : carriage return to vertical position Y
 | 
|
1152  | 
||
1153  | 
\def\rail@cr#1{
 | 
|
1154  | 
\rail@tmpa=\rail@sx  | 
|
1155  | 
\advance\rail@tmpa by \rail@joinsz  | 
|
1156  | 
\ifnum\rail@x<\rail@tmpa\rail@x=\rail@tmpa\fi  | 
|
1157  | 
\rail@eline  | 
|
1158  | 
\rail@jx=\rail@x  | 
|
1159  | 
\rail@jy=\rail@y  | 
|
1160  | 
\advance\rail@x by \rail@joinsz  | 
|
1161  | 
\ifnum\rail@x>\rail@rx\rail@rx=\rail@x\fi  | 
|
1162  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
1163  | 
\rail@joval[tr]  | 
|
1164  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1165  | 
\rail@sety{#1}
 | 
|
1166  | 
\rail@tmpa=\rail@jy  | 
|
1167  | 
\advance\rail@tmpa by -\rail@y  | 
|
1168  | 
\advance\rail@tmpa by -\rail@boxsp  | 
|
1169  | 
\advance\rail@tmpa by -\rail@joinhsz  | 
|
1170  | 
\rail@jput{\line(0,-1){\number\rail@tmpa}}
 | 
|
1171  | 
\rail@jy=\rail@y  | 
|
1172  | 
\advance\rail@jy by \rail@boxsp  | 
|
1173  | 
\advance\rail@jy by \rail@joinhsz  | 
|
1174  | 
\advance\rail@jx by -\rail@joinhsz  | 
|
1175  | 
\rail@joval[br]  | 
|
1176  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
1177  | 
\rail@tmpa=\rail@jx  | 
|
1178  | 
\advance\rail@tmpa by -\rail@sx  | 
|
1179  | 
\advance\rail@tmpa by -\rail@joinhsz  | 
|
1180  | 
\rail@jput{\line(-1,0){\number\rail@tmpa}}
 | 
|
1181  | 
\rail@jx=\rail@sx  | 
|
1182  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1183  | 
\advance\rail@jy by -\rail@joinhsz  | 
|
1184  | 
\rail@joval[tl]  | 
|
1185  | 
\advance\rail@jx by -\rail@joinhsz  | 
|
1186  | 
\rail@tmpa=\rail@boxsp  | 
|
1187  | 
\advance\rail@tmpa by -\rail@joinsz  | 
|
1188  | 
\rail@jput{\line(0,-1){\number\rail@tmpa}}
 | 
|
1189  | 
\advance\rail@jy by -\rail@tmpa  | 
|
1190  | 
\advance\rail@jx by \rail@joinhsz  | 
|
1191  | 
\rail@joval[bl]  | 
|
1192  | 
\rail@x=\rail@jx  | 
|
1193  | 
\rail@ex=\rail@x  | 
|
1194  | 
}  | 
|
| 
42632
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1195  | 
|
| 
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1196  | 
% default setup for Isabelle  | 
| 
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1197  | 
\newenvironment{railoutput}%
 | 
| 
42660
 
e40648514b34
final \makeatother -- catcodes appear to be global;
 
wenzelm 
parents: 
42632 
diff
changeset
 | 
1198  | 
{\begin{list}{}{\rail@param}\def\rail@expand{\relax}\makeatletter}{\makeatother\end{list}}
 | 
| 
42632
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1199  | 
|
| 
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1200  | 
\def\rail@termfont{\isabellestyle{tt}}
 | 
| 
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1201  | 
\def\rail@nontfont{\isabellestyle{it}}
 | 
| 
 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 
wenzelm 
parents: 
13044 
diff
changeset
 | 
1202  | 
\def\rail@namefont{\isabellestyle{it}}
 |