1 % rail.sty - style file to support railroad diagrams |
1 % rail.sty - style file to support railroad diagrams |
2 % |
2 % |
3 % 09-Jul-90 L. Rooijakkers |
3 % 09-Jul-90 L. Rooijakkers |
4 % 08-Oct-90 L. Rooijakkers fixed centering bug when \rail@tmpc<0. |
4 % 08-Oct-90 L. Rooijakkers fixed centering bug when \rail@tmpc<0. |
5 % 07-Feb-91 L. Rooijakkers added \railoptions command, indexing |
5 % 07-Feb-91 L. Rooijakkers added \railoptions command, indexing |
6 % 08-Feb-91 L. Rooijakkers minor fixes |
6 % 08-Feb-91 L. Rooijakkers minor fixes |
7 % 28-Jun-94 K. Barthelmann turned into LaTeX2e package |
7 % 28-Jun-94 K. Barthelmann turned into LaTeX2e package |
8 % 08-Dec-96 K. Barthelmann replaced \@writefile |
8 % 08-Dec-96 K. Barthelmann replaced \@writefile |
9 % 13-Dec-96 K. Barthelmann cleanup |
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 |
10 % |
14 % |
11 % This style file needs to be used in conjunction with the 'rail' |
15 % This style file needs to be used in conjunction with the 'rail' |
12 % program. Running LaTeX as 'latex file' produces file.rai, which should be |
16 % program. Running LaTeX as 'latex file' produces file.rai, which should be |
13 % processed by Rail with 'rail file'. This produces file.rao, which will |
17 % processed by Rail with 'rail file'. This produces file.rao, which will |
14 % be picked up by LaTeX on the next 'latex file' run. |
18 % be picked up by LaTeX on the next 'latex file' run. |
18 % The macros in this file thus consist of two parts: those that read and |
22 % The macros in this file thus consist of two parts: those that read and |
19 % write the .rai and .rao files, and those that do the actual formatting |
23 % write the .rai and .rao files, and those that do the actual formatting |
20 % of the railroad diagrams. |
24 % of the railroad diagrams. |
21 |
25 |
22 \NeedsTeXFormat{LaTeX2e} |
26 \NeedsTeXFormat{LaTeX2e} |
23 \ProvidesPackage{rail}[1996/12/13] |
27 \ProvidesPackage{rail}[1998/05/19] |
24 |
28 |
25 % railroad diagram formatting parameters (user level) |
29 % railroad diagram formatting parameters (user level) |
26 % all of these are copied into their internal versions by \railinit |
30 % all of these are copied into their internal versions by \railinit |
27 % |
31 % |
28 % \railunit : \unitlength within railroad diagrams |
32 % \railunit : \unitlength within railroad diagrams |
161 \AtBeginDocument{\railinit} |
165 \AtBeginDocument{\railinit} |
162 |
166 |
163 % \rail@param : declarations for list environment |
167 % \rail@param : declarations for list environment |
164 % |
168 % |
165 % \railparam{TEXT} : sets \rail@param to TEXT |
169 % \railparam{TEXT} : sets \rail@param to TEXT |
166 |
170 % |
167 \def\rail@param{} |
171 % \rail@reserved : characters reserved for grammar |
168 |
172 |
169 \newcommand\railparam[1]{ |
173 \newcommand\railparam[1]{ |
170 \def\rail@param{#1} |
174 \def\rail@param{ |
171 } |
175 \setlength\leftmargin{0pt}\setlength\rightmargin{0pt} |
172 |
176 \setlength\labelwidth{0pt}\setlength\labelsep{0pt} |
173 % \rail@tokenfont : format setup for \railtoken identifiers |
177 \setlength\itemindent{0pt}\setlength\listparindent{0pt} |
174 % |
178 #1 |
|
179 } |
|
180 } |
|
181 \railparam{} |
|
182 |
|
183 \newtoks\rail@reserved |
|
184 \rail@reserved={:;|*+?[]()'"} |
|
185 |
175 % \rail@termfont : format setup for terminals |
186 % \rail@termfont : format setup for terminals |
176 % |
187 % |
177 % \rail@nontfont : format setup for nonterminals |
188 % \rail@nontfont : format setup for nonterminals |
178 % |
189 % |
179 % \rail@annofont : format setup for annotations |
190 % \rail@annofont : format setup for annotations |
233 % \rail@t{IDENT} to the .rai file |
243 % \rail@t{IDENT} to the .rai file |
234 % |
244 % |
235 % \railalias{IDENT}{TEXT} : format IDENT as TEXT. defines \rail@t@IDENT as |
245 % \railalias{IDENT}{TEXT} : format IDENT as TEXT. defines \rail@t@IDENT as |
236 % TEXT. |
246 % TEXT. |
237 % |
247 % |
|
248 % \railtoken{IDENT}{TEXT} : abbreviates \railalias{IDENT}{TEXT}\railterm{IDENT} |
|
249 % (for backward compatibility) |
|
250 % |
|
251 % \rail@setcodes : guards special characters |
|
252 % |
|
253 % \rail@makeother{CHARACTER} : sets \catcode of CHARACTER to "other" |
|
254 % used inside a loop for \rail@setcodes |
|
255 % |
238 % \rail@nr : railroad diagram counter |
256 % \rail@nr : railroad diagram counter |
239 % |
257 % |
240 % \ifrail@match : current \rail@i{NR}{TEXT} matches |
258 % \ifrail@match : current \rail@i{NR}{TEXT} matches |
241 % |
259 % |
242 % \rail@first : actions to be done first. read in .rao file, |
260 % \rail@first : actions to be done first. read in .rao file, |
243 % open .rai file if \@filesw true, undefine \rail@first. |
261 % open .rai file if \@filesw true, undefine \rail@first. |
244 % executed from \begin{rail} and \railtoken. |
262 % executed from \begin{rail}, \railoptions and \railterm. |
245 % |
263 % |
246 % \rail@i{NR}{TEXT} : defines \rail@i@NR as TEXT. written to the .rai |
264 % \rail@i{NR}{TEXT} : defines \rail@i@NR as TEXT. written to the .rai |
247 % file by \rail, read from the .rao file by |
265 % file by \rail, read from the .rao file by |
248 % \rail@first |
266 % \rail@first |
249 % |
267 % |
262 % |
280 % |
263 % \rail@endwarn : either \relax or \rail@warn |
281 % \rail@endwarn : either \relax or \rail@warn |
264 % |
282 % |
265 % \ifrail@all : checked at the end of the document |
283 % \ifrail@all : checked at the end of the document |
266 |
284 |
|
285 \def\rail@makeother#1{ |
|
286 \expandafter\catcode\expandafter`\csname\string #1\endcsname=12 |
|
287 } |
|
288 |
|
289 \def\rail@setcodes{ |
|
290 \let\par=\relax |
|
291 \let\\=\relax |
|
292 \expandafter\@tfor\expandafter\rail@symbol\expandafter:\expandafter=% |
|
293 \the\rail@reserved |
|
294 \do{\expandafter\rail@makeother\rail@symbol} |
|
295 } |
|
296 |
267 \newcount\rail@nr |
297 \newcount\rail@nr |
268 |
298 |
269 \newif\ifrail@all |
299 \newif\ifrail@all |
270 \rail@alltrue |
300 \rail@alltrue |
271 |
301 |
272 \newif\ifrail@match |
302 \newif\ifrail@match |
273 |
303 |
274 \def\rail@first{ |
304 \def\rail@first{ |
|
305 \begingroup |
275 \makeatletter |
306 \makeatletter |
|
307 \rail@setcodes |
276 \InputIfFileExists{\jobname.rao}{}{\PackageInfo{rail}{No file \jobname.rao}} |
308 \InputIfFileExists{\jobname.rao}{}{\PackageInfo{rail}{No file \jobname.rao}} |
277 \makeatother |
309 \makeatother |
|
310 \endgroup |
278 \if@filesw |
311 \if@filesw |
279 \newwrite\tf@rai |
312 \newwrite\tf@rai |
280 \immediate\openout\tf@rai=\jobname.rai |
313 \immediate\openout\tf@rai=\jobname.rai |
281 \fi |
314 \fi |
282 \global\let\rail@first=\relax |
315 \global\let\rail@first=\relax |
283 } |
316 } |
284 |
317 |
285 \long\def\rail@body#1\end{ |
318 \long\def\rail@body#1\end{ |
286 \begingroup |
319 { |
287 \let\\=\relax |
320 \newlinechar=`^^J |
|
321 \def\par{\string\par^^J} |
|
322 \rail@write{\string\rail@i{\number\rail@nr}{#1}} |
|
323 } |
288 \xdef\rail@i@{#1} |
324 \xdef\rail@i@{#1} |
289 \rail@write{\string\rail@i{\number\rail@nr}{\rail@i@}} |
|
290 \endgroup |
|
291 \end |
325 \end |
292 } |
326 } |
293 |
327 |
294 \newenvironment{rail}{ |
328 \newenvironment{rail}{ |
295 \global\advance\rail@nr by 1 |
329 \global\advance\rail@nr by 1 |
296 \rail@first |
330 \rail@first |
|
331 \begingroup |
|
332 \rail@setcodes |
297 \rail@body |
333 \rail@body |
298 }{ |
334 }{ |
|
335 \endgroup |
299 \rail@matchtrue |
336 \rail@matchtrue |
300 \@ifundefined{rail@o@\number\rail@nr}{\rail@matchfalse}{} |
337 \@ifundefined{rail@o@\number\rail@nr}{\rail@matchfalse}{} |
301 \expandafter\ifx\csname rail@i@\number\rail@nr\endcsname\rail@i@ |
338 \expandafter\ifx\csname rail@i@\number\rail@nr\endcsname\rail@i@ |
302 \else |
339 \else |
303 \rail@matchfalse |
340 \rail@matchfalse |
330 |
367 |
331 \newcommand\railalias[2]{ |
368 \newcommand\railalias[2]{ |
332 \expandafter\def\csname rail@t@#1\endcsname{#2} |
369 \expandafter\def\csname rail@t@#1\endcsname{#2} |
333 } |
370 } |
334 |
371 |
|
372 \newcommand\railtoken[2]{\railalias{#1}{#2}\railterm{#1}} |
|
373 |
335 \long\def\rail@i#1#2{ |
374 \long\def\rail@i#1#2{ |
336 \expandafter\gdef\csname rail@i@#1\endcsname{#2} |
375 \expandafter\gdef\csname rail@i@#1\endcsname{#2} |
337 } |
376 } |
338 |
377 |
339 \def\rail@o#1#2{ |
378 \def\rail@o#1#2{ |
340 \expandafter\gdef\csname rail@o@#1\endcsname{ |
379 \expandafter\gdef\csname rail@o@#1\endcsname{ |
341 \begin{list}{}{\rail@param}#2\end{list} |
380 \begin{list}{}{\rail@param} |
|
381 #2 |
|
382 \end{list} |
342 } |
383 } |
343 } |
384 } |
344 |
385 |
345 \def\rail@t#1{} |
386 \def\rail@t#1{} |
346 |
387 |
347 \def\rail@p#1{} |
388 \def\rail@p#1{} |
348 |
389 |
349 \def\rail@write#1{\@ifundefined{tf@rai}{}{\immediate\write\tf@rai{#1}}} |
390 \long\def\rail@write#1{\@ifundefined{tf@rai}{}{\immediate\write\tf@rai{#1}}} |
350 |
391 |
351 \def\rail@warn{ |
392 \def\rail@warn{ |
352 \PackageWarningNoLine{rail}{Railroad diagram(s) may have changed. |
393 \PackageWarningNoLine{rail}{Railroad diagram(s) may have changed. |
353 Use 'rail' and rerun} |
394 Use 'rail' and rerun} |
354 } |
395 } |
435 \rail@eline |
495 \rail@eline |
436 \end{picture} |
496 \end{picture} |
437 \end{minipage} |
497 \end{minipage} |
438 } |
498 } |
439 |
499 |
|
500 \def\rail@vend{ |
|
501 \advance\rail@x by \rail@extra |
|
502 \rail@vreline |
|
503 \end{picture} |
|
504 \end{minipage} |
|
505 } |
|
506 |
440 \def\rail@expand#1{\@ifundefined{rail@t@#1}{#1}{\csname rail@t@#1\endcsname}} |
507 \def\rail@expand#1{\@ifundefined{rail@t@#1}{#1}{\csname rail@t@#1\endcsname}} |
441 |
508 |
442 % \rail@token{TEXT}[ANNOT] : format token TEXT with annotation |
509 % \rail@token{TEXT}[ANNOT] : format token TEXT with annotation |
|
510 % \rail@ltoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow left |
|
511 % \rail@rtoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow right |
443 % |
512 % |
444 % \rail@ctoken{TEXT}[ANNOT] : format token TEXT centered with annotation |
513 % \rail@ctoken{TEXT}[ANNOT] : format token TEXT centered with annotation |
|
514 % \rail@lctoken{TEXT}[ANNOT] : format token TEXT centered with annotation, arrow left |
|
515 % \rail@rctoken{TEXT}[ANNOT] : format token TEXT centered with annotation, arrow right |
445 % |
516 % |
446 % \rail@nont{TEXT}[ANNOT] : format nonterminal TEXT with annotation |
517 % \rail@nont{TEXT}[ANNOT] : format nonterminal TEXT with annotation |
|
518 % \rail@lnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation, arrow left |
|
519 % \rail@rnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation. arrow right |
447 % |
520 % |
448 % \rail@cnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation |
521 % \rail@cnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation |
|
522 % \rail@lcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation, |
|
523 % arrow left |
|
524 % \rail@rcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation, |
|
525 % arrow right |
449 % |
526 % |
450 % \rail@term{TEXT}[ANNOT] : format terminal TEXT with annotation |
527 % \rail@term{TEXT}[ANNOT] : format terminal TEXT with annotation |
|
528 % \rail@lterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow left |
|
529 % \rail@rterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow right |
451 % |
530 % |
452 % \rail@cterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation |
531 % \rail@cterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation |
|
532 % \rail@lcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation, arrow left |
|
533 % \rail@rcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation, |
|
534 % arrow right |
453 % |
535 % |
454 % \rail@annote[TEXT] : format TEXT as annotation |
536 % \rail@annote[TEXT] : format TEXT as annotation |
455 |
537 |
456 \def\rail@token#1[#2]{ |
538 \def\rail@token#1[#2]{ |
457 \rail@setbox{% |
539 \rail@setbox{% |
458 {\rail@tokenfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
540 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
459 } |
541 } |
460 \rail@oval |
542 \rail@oval |
461 } |
543 } |
462 |
544 |
|
545 \def\rail@ltoken#1[#2]{ |
|
546 \rail@setbox{% |
|
547 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
548 } |
|
549 \rail@vloval |
|
550 } |
|
551 |
|
552 \def\rail@rtoken#1[#2]{ |
|
553 \rail@setbox{% |
|
554 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
555 } |
|
556 \rail@vroval |
|
557 } |
|
558 |
463 \def\rail@ctoken#1[#2]{ |
559 \def\rail@ctoken#1[#2]{ |
464 \rail@setbox{% |
560 \rail@setbox{% |
465 {\rail@tokenfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
561 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
466 } |
562 } |
467 \rail@coval |
563 \rail@coval |
468 } |
564 } |
469 |
565 |
|
566 \def\rail@lctoken#1[#2]{ |
|
567 \rail@setbox{% |
|
568 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
569 } |
|
570 \rail@vlcoval |
|
571 } |
|
572 |
|
573 \def\rail@rctoken#1[#2]{ |
|
574 \rail@setbox{% |
|
575 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
576 } |
|
577 \rail@vrcoval |
|
578 } |
|
579 |
470 \def\rail@nont#1[#2]{ |
580 \def\rail@nont#1[#2]{ |
471 \rail@setbox{% |
581 \rail@setbox{% |
472 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
582 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
473 } |
583 } |
474 \rail@frame |
584 \rail@frame |
475 } |
585 } |
476 |
586 |
|
587 \def\rail@lnont#1[#2]{ |
|
588 \rail@setbox{% |
|
589 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
590 } |
|
591 \rail@vlframe |
|
592 } |
|
593 |
|
594 \def\rail@rnont#1[#2]{ |
|
595 \rail@setbox{% |
|
596 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
597 } |
|
598 \rail@vrframe |
|
599 } |
|
600 |
477 \def\rail@cnont#1[#2]{ |
601 \def\rail@cnont#1[#2]{ |
478 \rail@setbox{% |
602 \rail@setbox{% |
479 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
603 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
480 } |
604 } |
481 \rail@cframe |
605 \rail@cframe |
482 } |
606 } |
483 |
607 |
|
608 \def\rail@lcnont#1[#2]{ |
|
609 \rail@setbox{% |
|
610 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
611 } |
|
612 \rail@vlcframe |
|
613 } |
|
614 |
|
615 \def\rail@rcnont#1[#2]{ |
|
616 \rail@setbox{% |
|
617 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
618 } |
|
619 \rail@vrcframe |
|
620 } |
|
621 |
484 \def\rail@term#1[#2]{ |
622 \def\rail@term#1[#2]{ |
485 \rail@setbox{% |
623 \rail@setbox{% |
486 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
624 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
487 } |
625 } |
488 \rail@oval |
626 \rail@oval |
489 } |
627 } |
490 |
628 |
|
629 \def\rail@lterm#1[#2]{ |
|
630 \rail@setbox{% |
|
631 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
632 } |
|
633 \rail@vloval |
|
634 } |
|
635 |
|
636 \def\rail@rterm#1[#2]{ |
|
637 \rail@setbox{% |
|
638 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
639 } |
|
640 \rail@vroval |
|
641 } |
|
642 |
491 \def\rail@cterm#1[#2]{ |
643 \def\rail@cterm#1[#2]{ |
492 \rail@setbox{% |
644 \rail@setbox{% |
493 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
645 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
494 } |
646 } |
495 \rail@coval |
647 \rail@coval |
|
648 } |
|
649 |
|
650 \def\rail@lcterm#1[#2]{ |
|
651 \rail@setbox{% |
|
652 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
653 } |
|
654 \rail@vlcoval |
|
655 } |
|
656 |
|
657 \def\rail@rcterm#1[#2]{ |
|
658 \rail@setbox{% |
|
659 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi |
|
660 } |
|
661 \rail@vrcoval |
496 } |
662 } |
497 |
663 |
498 \def\rail@annote[#1]{ |
664 \def\rail@annote[#1]{ |
499 \rail@setbox{\rail@annofont #1} |
665 \rail@setbox{\rail@annofont #1} |
500 \rail@text |
666 \rail@text |
503 % \rail@box : temporary box for \rail@oval and \rail@frame |
669 % \rail@box : temporary box for \rail@oval and \rail@frame |
504 % |
670 % |
505 % \rail@setbox{TEXT} : set \rail@box to TEXT, set \rail@tmpa to width |
671 % \rail@setbox{TEXT} : set \rail@box to TEXT, set \rail@tmpa to width |
506 % |
672 % |
507 % \rail@oval : format \rail@box of width \rail@tmpa inside an oval |
673 % \rail@oval : format \rail@box of width \rail@tmpa inside an oval |
|
674 % \rail@vloval : format \rail@box of width \rail@tmpa inside an oval, vector left |
|
675 % \rail@vroval : format \rail@box of width \rail@tmpa inside an oval, vector right |
508 % |
676 % |
509 % \rail@coval : same as \rail@oval, but centered between \rail@x and |
677 % \rail@coval : same as \rail@oval, but centered between \rail@x and |
510 % \rail@mx |
678 % \rail@mx |
|
679 % \rail@vlcoval : same as \rail@oval, but centered between \rail@x and |
|
680 % \rail@mx, vector left |
|
681 % \rail@vrcoval : same as \rail@oval, but centered between \rail@x and |
|
682 % \rail@mx, vector right |
511 % |
683 % |
512 % \rail@frame : format \rail@box of width \rail@tmpa inside a frame |
684 % \rail@frame : format \rail@box of width \rail@tmpa inside a frame |
|
685 % \rail@vlframe : format \rail@box of width \rail@tmpa inside a frame, vector left |
|
686 % \rail@vrframe : format \rail@box of width \rail@tmpa inside a frame, vector right |
513 % |
687 % |
514 % \rail@cframe : same as \rail@frame, but centered between \rail@x and |
688 % \rail@cframe : same as \rail@frame, but centered between \rail@x and |
515 % \rail@mx |
689 % \rail@mx |
|
690 % \rail@vlcframe : same as \rail@frame, but centered between \rail@x and |
|
691 % \rail@mx, vector left |
|
692 % \rail@vrcframe : same as \rail@frame, but centered between \rail@x and |
|
693 % \rail@mx, vector right |
516 % |
694 % |
517 % \rail@text : format \rail@box of width \rail@tmpa above the line |
695 % \rail@text : format \rail@box of width \rail@tmpa above the line |
518 |
696 |
519 \newbox\rail@box |
697 \newbox\rail@box |
520 |
698 |
539 \advance\rail@x by \rail@tmpb |
717 \advance\rail@x by \rail@tmpb |
540 \rail@ex=\rail@x |
718 \rail@ex=\rail@x |
541 \advance\rail@x by \rail@boxrt |
719 \advance\rail@x by \rail@boxrt |
542 } |
720 } |
543 |
721 |
|
722 \def\rail@vloval{ |
|
723 \advance\rail@x by \rail@boxlf |
|
724 \rail@eline |
|
725 \advance\rail@tmpa by \rail@ovalsp |
|
726 \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi |
|
727 \rail@tmpb=\rail@tmpa |
|
728 \divide\rail@tmpb by 2 |
|
729 \advance\rail@y by -\rail@boxhht |
|
730 \rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}} |
|
731 \advance\rail@y by \rail@boxhht |
|
732 \advance\rail@x by \rail@tmpb |
|
733 \rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)} |
|
734 \advance\rail@x by \rail@tmpb |
|
735 \rail@ex=\rail@x |
|
736 \advance\rail@x by \rail@boxrt |
|
737 \rail@vleline |
|
738 } |
|
739 |
|
740 \def\rail@vroval{ |
|
741 \advance\rail@x by \rail@boxlf |
|
742 \rail@vreline |
|
743 \advance\rail@tmpa by \rail@ovalsp |
|
744 \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi |
|
745 \rail@tmpb=\rail@tmpa |
|
746 \divide\rail@tmpb by 2 |
|
747 \advance\rail@y by -\rail@boxhht |
|
748 \rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}} |
|
749 \advance\rail@y by \rail@boxhht |
|
750 \advance\rail@x by \rail@tmpb |
|
751 \rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)} |
|
752 \advance\rail@x by \rail@tmpb |
|
753 \rail@ex=\rail@x |
|
754 \advance\rail@x by \rail@boxrt |
|
755 } |
|
756 |
544 \def\rail@coval{ |
757 \def\rail@coval{ |
545 \rail@tmpb=\rail@tmpa |
758 \rail@tmpb=\rail@tmpa |
546 \advance\rail@tmpb by \rail@ovalsp |
759 \advance\rail@tmpb by \rail@ovalsp |
547 \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi |
760 \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi |
548 \advance\rail@tmpb by \rail@boxlf |
761 \advance\rail@tmpb by \rail@boxlf |
555 \advance\rail@x by \rail@tmpc |
768 \advance\rail@x by \rail@tmpc |
556 \fi |
769 \fi |
557 \rail@oval |
770 \rail@oval |
558 } |
771 } |
559 |
772 |
|
773 \def\rail@vlcoval{ |
|
774 \rail@tmpb=\rail@tmpa |
|
775 \advance\rail@tmpb by \rail@ovalsp |
|
776 \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi |
|
777 \advance\rail@tmpb by \rail@boxlf |
|
778 \advance\rail@tmpb by \rail@boxrt |
|
779 \rail@tmpc=\rail@mx |
|
780 \advance\rail@tmpc by -\rail@x |
|
781 \advance\rail@tmpc by -\rail@tmpb |
|
782 \divide\rail@tmpc by 2 |
|
783 \ifnum\rail@tmpc>0 |
|
784 \advance\rail@x by \rail@tmpc |
|
785 \fi |
|
786 \rail@vloval |
|
787 } |
|
788 |
|
789 \def\rail@vrcoval{ |
|
790 \rail@tmpb=\rail@tmpa |
|
791 \advance\rail@tmpb by \rail@ovalsp |
|
792 \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi |
|
793 \advance\rail@tmpb by \rail@boxlf |
|
794 \advance\rail@tmpb by \rail@boxrt |
|
795 \rail@tmpc=\rail@mx |
|
796 \advance\rail@tmpc by -\rail@x |
|
797 \advance\rail@tmpc by -\rail@tmpb |
|
798 \divide\rail@tmpc by 2 |
|
799 \ifnum\rail@tmpc>0 |
|
800 \advance\rail@x by \rail@tmpc |
|
801 \fi |
|
802 \rail@vroval |
|
803 } |
|
804 |
560 \def\rail@frame{ |
805 \def\rail@frame{ |
561 \advance\rail@x by \rail@boxlf |
806 \advance\rail@x by \rail@boxlf |
562 \rail@eline |
807 \rail@eline |
|
808 \advance\rail@tmpa by \rail@framesp |
|
809 \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi |
|
810 \advance\rail@y by -\rail@boxhht |
|
811 \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}} |
|
812 \advance\rail@y by \rail@boxhht |
|
813 \advance\rail@x by \rail@tmpa |
|
814 \rail@ex=\rail@x |
|
815 \advance\rail@x by \rail@boxrt |
|
816 } |
|
817 |
|
818 \def\rail@vlframe{ |
|
819 \advance\rail@x by \rail@boxlf |
|
820 \rail@eline |
|
821 \advance\rail@tmpa by \rail@framesp |
|
822 \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi |
|
823 \advance\rail@y by -\rail@boxhht |
|
824 \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}} |
|
825 \advance\rail@y by \rail@boxhht |
|
826 \advance\rail@x by \rail@tmpa |
|
827 \rail@ex=\rail@x |
|
828 \advance\rail@x by \rail@boxrt |
|
829 \rail@vleline |
|
830 } |
|
831 |
|
832 \def\rail@vrframe{ |
|
833 \advance\rail@x by \rail@boxlf |
|
834 \rail@vreline |
563 \advance\rail@tmpa by \rail@framesp |
835 \advance\rail@tmpa by \rail@framesp |
564 \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi |
836 \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi |
565 \advance\rail@y by -\rail@boxhht |
837 \advance\rail@y by -\rail@boxhht |
566 \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}} |
838 \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}} |
567 \advance\rail@y by \rail@boxhht |
839 \advance\rail@y by \rail@boxhht |
582 \divide\rail@tmpc by 2 |
854 \divide\rail@tmpc by 2 |
583 \ifnum\rail@tmpc>0 |
855 \ifnum\rail@tmpc>0 |
584 \advance\rail@x by \rail@tmpc |
856 \advance\rail@x by \rail@tmpc |
585 \fi |
857 \fi |
586 \rail@frame |
858 \rail@frame |
|
859 } |
|
860 |
|
861 \def\rail@vlcframe{ |
|
862 \rail@tmpb=\rail@tmpa |
|
863 \advance\rail@tmpb by \rail@framesp |
|
864 \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi |
|
865 \advance\rail@tmpb by \rail@boxlf |
|
866 \advance\rail@tmpb by \rail@boxrt |
|
867 \rail@tmpc=\rail@mx |
|
868 \advance\rail@tmpc by -\rail@x |
|
869 \advance\rail@tmpc by -\rail@tmpb |
|
870 \divide\rail@tmpc by 2 |
|
871 \ifnum\rail@tmpc>0 |
|
872 \advance\rail@x by \rail@tmpc |
|
873 \fi |
|
874 \rail@vlframe |
|
875 } |
|
876 |
|
877 \def\rail@vrcframe{ |
|
878 \rail@tmpb=\rail@tmpa |
|
879 \advance\rail@tmpb by \rail@framesp |
|
880 \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi |
|
881 \advance\rail@tmpb by \rail@boxlf |
|
882 \advance\rail@tmpb by \rail@boxrt |
|
883 \rail@tmpc=\rail@mx |
|
884 \advance\rail@tmpc by -\rail@x |
|
885 \advance\rail@tmpc by -\rail@tmpb |
|
886 \divide\rail@tmpc by 2 |
|
887 \ifnum\rail@tmpc>0 |
|
888 \advance\rail@x by \rail@tmpc |
|
889 \fi |
|
890 \rail@vrframe |
587 } |
891 } |
588 |
892 |
589 \def\rail@text{ |
893 \def\rail@text{ |
590 \advance\rail@x by \rail@textlf |
894 \advance\rail@x by \rail@textlf |
591 \advance\rail@y by \rail@textup |
895 \advance\rail@y by \rail@textup |