author | haftmann |
Fri, 24 Mar 2023 18:30:17 +0000 | |
changeset 77704 | 4c5297aa18c8 |
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}} |