1 % rail.sty - style file to support railroad diagrams
3 % 09-Jul-90 L. Rooijakkers
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
14 % 02-May-11 M. Wenzel default setup for Isabelle
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.
21 % LaTeX will warn if there is no file.rao or it's out of date.
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.
27 \NeedsTeXFormat{LaTeX2e}
28 \ProvidesPackage{rail}[1998/05/19]
30 % railroad diagram formatting parameters (user level)
31 % all of these are copied into their internal versions by \railinit
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
47 % \railnamesep : separator between name and rule body
51 \newlength\railboxheight
52 \newlength\railboxskip
53 \newlength\railboxleft
54 \newlength\railboxright
55 \newlength\railovalspace
56 \newlength\railframespace
57 \newlength\railtextleft
58 \newlength\railtextright
60 \newlength\railjoinsize
61 \newlength\railjoinadjust
62 \newlength\railnamesep
64 % initialize the parameters
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}
78 \setlength\railboxheight{16pt}
79 \setlength\railboxskip{24pt}
80 \setlength\railtextup{5pt}
81 \setlength\railjoinsize{16pt}
84 \setlength\railboxheight{16pt}
85 \setlength\railboxskip{24pt}
86 \setlength\railtextup{5pt}
87 \setlength\railjoinsize{16pt}
90 \setlength\railboxheight{20pt}
91 \setlength\railboxskip{28pt}
92 \setlength\railtextup{6pt}
93 \setlength\railjoinsize{20pt}
99 % internal versions of the formatting parameters
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
109 % \rail@textlf : \railtextleft
110 % \rail@textrt : \railtextright
111 % \rail@textup : \railtextup
112 % \rail@joinsz : \railjoinsize
113 % \rail@joinhsz : \railjoinsize / 2
114 % \rail@joinadj : \railjoinadjust
116 % \railinit : internalize all of the parameters.
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
133 \newcommand\railinit{
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
166 \AtBeginDocument{\railinit}
168 % \rail@param : declarations for list environment
170 % \railparam{TEXT} : sets \rail@param to TEXT
172 % \rail@reserved : characters reserved for grammar
174 \newcommand\railparam[1]{
176 \setlength\leftmargin{0pt}\setlength\rightmargin{0pt}
177 \setlength\labelwidth{0pt}\setlength\labelsep{0pt}
178 \setlength\itemindent{0pt}\setlength\listparindent{0pt}
184 \newtoks\rail@reserved
185 \rail@reserved={:;|*+?[]()'"}
187 % \rail@termfont : format setup for terminals
189 % \rail@nontfont : format setup for nonterminals
191 % \rail@annofont : format setup for annotations
193 % \rail@rulefont : format setup for rule names
195 % \rail@indexfont : format setup for index entry
197 % \railtermfont{TEXT} : set terminal format setup to TEXT
199 % \railnontermfont{TEXT} : set nonterminal format setup to TEXT
201 % \railannotatefont{TEXT} : set annotation format setup to TEXT
203 % \railnamefont{TEXT} : set rule name format setup to TEXT
205 % \railindexfont{TEXT} : set index entry format setup to TEXT
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}
213 \newcommand\railtermfont[1]{
214 \def\rail@termfont{#1}
217 \newcommand\railnontermfont[1]{
218 \def\rail@nontfont{#1}
221 \newcommand\railannotatefont[1]{
222 \def\rail@annofont{#1}
225 \newcommand\railnamefont[1]{
226 \def\rail@namefont{#1}
229 \newcommand\railindexfont[1]{
230 \def\rail@indexfont{#1}
233 % railroad read/write macros
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).
240 % \railoptions{OPTIONS} : OPTIONS are written out to the .rai file,
241 % as \rail@p{OPTIONS}.
243 % \railterm{IDENT,IDENT,...} : format IDENT as terminals. writes out
244 % \rail@t{IDENT} to the .rai file
246 % \railalias{IDENT}{TEXT} : format IDENT as TEXT. defines \rail@t@IDENT as
249 % \railtoken{IDENT}{TEXT} : abbreviates \railalias{IDENT}{TEXT}\railterm{IDENT}
250 % (for backward compatibility)
252 % \rail@setcodes : guards special characters
254 % \rail@makeother{CHARACTER} : sets \catcode of CHARACTER to "other"
255 % used inside a loop for \rail@setcodes
257 % \rail@nr : railroad diagram counter
259 % \ifrail@match : current \rail@i{NR}{TEXT} matches
261 % \rail@first : actions to be done first. read in .rao file,
262 % open .rai file if \@filesw true, undefine \rail@first.
263 % executed from \begin{rail}, \railoptions and \railterm.
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
269 % \rail@t{IDENT} : tells Rail that IDENT is to be custom formatted,
270 % written to the .rai file by \railterm.
272 % \rail@o{NR}{TEXT} : defines \rail@o@NR as TEXT, read from the .rao
273 % file by \rail@first.
275 % \rail@p{OPTIONS} : pass options to rail, written to the .rai file by
278 % \rail@write{TEXT} : write TEXT to the .rai file
280 % \rail@warn : warn user for mismatching diagrams
282 % \rail@endwarn : either \relax or \rail@warn
284 % \ifrail@all : checked at the end of the document
286 \def\rail@makeother#1{
287 \expandafter\catcode\expandafter`\csname\string #1\endcsname=12
293 \expandafter\@tfor\expandafter\rail@symbol\expandafter:\expandafter=%
295 \do{\expandafter\rail@makeother\rail@symbol}
309 \InputIfFileExists{\jobname.rao}{}{\PackageInfo{rail}{No file \jobname.rao}}
314 \immediate\openout\tf@rai=\jobname.rai
316 \global\let\rail@first=\relax
319 \long\def\rail@body#1\end{
322 \def\par{\string\par^^J}
323 \rail@write{\string\rail@i{\number\rail@nr}{#1}}
329 \newenvironment{rail}{
330 \global\advance\rail@nr by 1
338 \@ifundefined{rail@o@\number\rail@nr}{\rail@matchfalse}{}
339 \expandafter\ifx\csname rail@i@\number\rail@nr\endcsname\rail@i@
344 \csname rail@o@\number\rail@nr\endcsname
346 \PackageWarning{rail}{Railroad diagram {\number\rail@nr} doesn't match}
347 \global\let\rail@endwarn=\rail@warn
348 \begin{list}{}{\rail@param}
350 \rail@setbox{\bfseries ???}
357 \newcommand\railoptions[1]{
359 \rail@write{\string\rail@p{#1}}
362 \newcommand\railterm[1]{
365 \rail@write{\string\rail@t{\rail@@}}
369 \newcommand\railalias[2]{
370 \expandafter\def\csname rail@t@#1\endcsname{#2}
373 \newcommand\railtoken[2]{\railalias{#1}{#2}\railterm{#1}}
375 \long\def\rail@i#1#2{
376 \expandafter\gdef\csname rail@i@#1\endcsname{#2}
380 \expandafter\gdef\csname rail@o@#1\endcsname{
381 \begin{list}{}{\rail@param}
391 \long\def\rail@write#1{\@ifundefined{tf@rai}{}{\immediate\write\tf@rai{#1}}}
394 \PackageWarningNoLine{rail}{Railroad diagram(s) may have changed.
395 Use 'rail' and rerun}
398 \let\rail@endwarn=\relax
400 \AtEndDocument{\rail@endwarn}
404 % \rail@index{IDENT} : add index entry for IDENT
407 \index{\rail@indexfont#1}
410 % railroad formatting primitives
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
418 % \rail@tmpa : temporary count
419 % \rail@tmpb : temporary count
420 % \rail@tmpc : temporary count
422 % \rail@put : put at (\rail@x,\rail@y)
423 % \rail@vput : put vector at (\rail@x,\rail@y)
425 % \rail@eline : end line by drawing from \rail@ex to \rail@x
427 % \rail@vreline : end line by drawing a vector from \rail@x to \rail@ex
429 % \rail@vleline : end line by drawing a vector from \rail@ex to \rail@x
431 % \rail@sety{LEVEL} : set \rail@y to level LEVEL
443 \def\rail@put{\put(\number\rail@x,\number\rail@y)}
445 \def\rail@vput{\put(\number\rail@ex,\number\rail@y)}
449 \advance\rail@tmpb by -\rail@ex
450 \rail@put{\line(-1,0){\number\rail@tmpb}}
455 \advance\rail@tmpb by -\rail@ex
456 \rail@vput{\vector(1,0){\number\rail@tmpb}}
461 \advance\rail@tmpb by -\rail@ex
462 \rail@put{\vector(-1,0){\number\rail@tmpb}}
467 \multiply\rail@y by -\rail@boxsp
468 \advance\rail@y by -\rail@boxht
471 % \rail@begin{HEIGHT}{NAME} : begin a railroad diagram of height HEIGHT
473 % \rail@end : end a railroad diagram
475 % \rail@expand{IDENT} : expand IDENT
479 \begin{minipage}[t]{\linewidth}
481 {\rail@namefont \rail@expand{#2}}\\*[\railnamesep]
483 \unitlength=\railunit
485 \multiply\rail@tmpa by \rail@boxsp
486 \begin{picture}(0,\number\rail@tmpa)(0,-\number\rail@tmpa)
495 \advance\rail@x by \rail@extra
502 \advance\rail@x by \rail@extra
508 \def\rail@expand#1{\@ifundefined{rail@t@#1}{#1}{\csname rail@t@#1\endcsname}}
510 % \rail@token{TEXT}[ANNOT] : format token TEXT with annotation
511 % \rail@ltoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow left
512 % \rail@rtoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow right
514 % \rail@ctoken{TEXT}[ANNOT] : format token TEXT centered with annotation
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
518 % \rail@nont{TEXT}[ANNOT] : format nonterminal TEXT with annotation
519 % \rail@lnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation, arrow left
520 % \rail@rnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation. arrow right
522 % \rail@cnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation
523 % \rail@lcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation,
525 % \rail@rcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation,
528 % \rail@term{TEXT}[ANNOT] : format terminal TEXT with annotation
529 % \rail@lterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow left
530 % \rail@rterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow right
532 % \rail@cterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation
533 % \rail@lcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation, arrow left
534 % \rail@rcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation,
537 % \rail@annote[TEXT] : format TEXT as annotation
539 \def\rail@token#1[#2]{
541 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
546 \def\rail@ltoken#1[#2]{
548 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
553 \def\rail@rtoken#1[#2]{
555 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
560 \def\rail@ctoken#1[#2]{
562 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
567 \def\rail@lctoken#1[#2]{
569 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
574 \def\rail@rctoken#1[#2]{
576 {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
581 \def\rail@nont#1[#2]{
583 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
588 \def\rail@lnont#1[#2]{
590 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
595 \def\rail@rnont#1[#2]{
597 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
602 \def\rail@cnont#1[#2]{
604 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
609 \def\rail@lcnont#1[#2]{
611 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
616 \def\rail@rcnont#1[#2]{
618 {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
623 \def\rail@term#1[#2]{
625 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
630 \def\rail@lterm#1[#2]{
632 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
637 \def\rail@rterm#1[#2]{
639 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
644 \def\rail@cterm#1[#2]{
646 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
651 \def\rail@lcterm#1[#2]{
653 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
658 \def\rail@rcterm#1[#2]{
660 {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
665 \def\rail@annote[#1]{
666 \rail@setbox{\rail@annofont #1}
670 % \rail@box : temporary box for \rail@oval and \rail@frame
672 % \rail@setbox{TEXT} : set \rail@box to TEXT, set \rail@tmpa to width
674 % \rail@oval : format \rail@box of width \rail@tmpa inside an oval
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
678 % \rail@coval : same as \rail@oval, but centered between \rail@x and
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
685 % \rail@frame : format \rail@box of width \rail@tmpa inside a frame
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
689 % \rail@cframe : same as \rail@frame, but centered between \rail@x and
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
696 % \rail@text : format \rail@box of width \rail@tmpa above the line
701 \setbox\rail@box\hbox{\strut#1}
702 \rail@tmpa=\wd\rail@box
703 \divide\rail@tmpa by \railunit
707 \advance\rail@x by \rail@boxlf
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
720 \advance\rail@x by \rail@boxrt
724 \advance\rail@x by \rail@boxlf
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
737 \advance\rail@x by \rail@boxrt
742 \advance\rail@x by \rail@boxlf
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
755 \advance\rail@x by \rail@boxrt
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
765 \advance\rail@tmpc by -\rail@x
766 \advance\rail@tmpc by -\rail@tmpb
767 \divide\rail@tmpc by 2
769 \advance\rail@x by \rail@tmpc
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
781 \advance\rail@tmpc by -\rail@x
782 \advance\rail@tmpc by -\rail@tmpb
783 \divide\rail@tmpc by 2
785 \advance\rail@x by \rail@tmpc
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
797 \advance\rail@tmpc by -\rail@x
798 \advance\rail@tmpc by -\rail@tmpb
799 \divide\rail@tmpc by 2
801 \advance\rail@x by \rail@tmpc
807 \advance\rail@x by \rail@boxlf
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
816 \advance\rail@x by \rail@boxrt
820 \advance\rail@x by \rail@boxlf
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
829 \advance\rail@x by \rail@boxrt
834 \advance\rail@x by \rail@boxlf
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
843 \advance\rail@x by \rail@boxrt
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
853 \advance\rail@tmpc by -\rail@x
854 \advance\rail@tmpc by -\rail@tmpb
855 \divide\rail@tmpc by 2
857 \advance\rail@x by \rail@tmpc
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
869 \advance\rail@tmpc by -\rail@x
870 \advance\rail@tmpc by -\rail@tmpb
871 \divide\rail@tmpc by 2
873 \advance\rail@x by \rail@tmpc
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
885 \advance\rail@tmpc by -\rail@x
886 \advance\rail@tmpc by -\rail@tmpb
887 \divide\rail@tmpc by 2
889 \advance\rail@x by \rail@tmpc
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
905 % \rail@jx \rail@jy : current join point
907 % \rail@gx \rail@gy \rail@gex \rail@grx : global versions of \rail@x etc,
908 % to pass values over group closings
910 % \rail@mx : maximum x so far
912 % \rail@sy : starting \rail@y for alternatives
914 % \rail@jput : put at (\rail@jx,\rail@jy)
916 % \rail@joval[PART] : put \oval[PART] with adjust
930 \put(\number\rail@jx,\number\rail@jy)
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
939 % \rail@barsplit : incoming split for '|'
941 % \rail@plussplit : incoming split for '+'
945 \advance\rail@jy by -\rail@joinhsz
947 \advance\rail@jx by \rail@joinhsz
951 \advance\rail@jy by -\rail@joinhsz
952 \advance\rail@jx by \rail@joinsz
954 \advance\rail@jx by -\rail@joinhsz
957 % \rail@alt{SPLIT} : start alternatives with incoming split SPLIT
964 \advance\rail@x by \rail@joinsz
966 \let\rail@list=\@empty
967 \let\rail@comma=\@empty
974 % \rail@nextalt{FIX}{Y} : start next alternative at vertical position Y
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
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}
990 \let\rail@split=\@empty
993 \advance\rail@tmpa by -\rail@y
994 \advance\rail@tmpa by -\rail@joinhsz
995 \rail@jput{\line(0,-1){\number\rail@tmpa}}
997 \advance\rail@jy by \rail@joinhsz
998 \advance\rail@jx by \rail@joinhsz
1000 \advance\rail@jx by -\rail@joinhsz
1007 % \rail@barjoin : outgoing join for first '|' alternative
1009 % \rail@plusjoin : outgoing join for first '+' alternative
1011 % \rail@altjoin : join for subsequent alternative
1015 \ifnum\rail@y<\rail@sy
1016 \global\rail@gex=\rail@jx
1018 \global\rail@gex=\rail@ex
1020 \advance\rail@jy by -\rail@joinhsz
1022 \advance\rail@jx by -\rail@joinhsz
1023 \ifnum\rail@y<\rail@sy
1029 \global\rail@gex=\rail@ex
1030 \advance\rail@jy by -\rail@joinhsz
1031 \advance\rail@jx by -\rail@joinsz
1033 \advance\rail@jx by \rail@joinhsz
1039 \advance\rail@tmpa by -\rail@y
1040 \advance\rail@tmpa by -\rail@joinhsz
1041 \rail@jput{\line(0,-1){\number\rail@tmpa}}
1043 \advance\rail@jy by \rail@joinhsz
1044 \advance\rail@jx by -\rail@joinhsz
1046 \advance\rail@jx by \rail@joinhsz
1049 % \rail@eltsplit EX:Y; : split EX:Y into \rail@ex \rail@y
1051 % \rail@endalt{JOIN} : end alternatives with outgoing join JOIN
1053 \def\rail@eltsplit#1:#2;{\rail@ex=#1\rail@y=#2}
1056 \global\rail@gx=\rail@x
1057 \global\rail@gy=\rail@y
1058 \global\rail@gex=\rail@ex
1059 \global\rail@grx=\rail@rx
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}
1067 \advance\rail@jx by \rail@joinsz
1069 \@for\rail@elt:=\rail@list\do{
1070 \expandafter\rail@eltsplit\rail@elt;
1072 \let\rail@join=\rail@altjoin
1077 \advance\rail@x by \rail@joinsz
1080 % \rail@bar : start '|' alternatives
1082 % \rail@nextbar : next '|' alternative
1084 % \rail@endbar : end '|' alternatives
1088 \rail@alt\rail@barsplit
1096 \rail@endalt\rail@barjoin
1099 % \rail@plus : start '+' alternatives
1101 % \rail@nextplus: next '+' alternative
1103 % \rail@endplus : end '+' alternatives
1107 \rail@alt\rail@plussplit
1111 \rail@nextalt\rail@fixplus
1115 \ifnum\rail@gy<\rail@sy
1121 \ifnum\rail@x<\rail@rx
1127 \advance\rail@jy by \rail@joinhsz
1129 \advance\rail@jx by \rail@joinhsz
1131 \advance\rail@tmpa by -\rail@joinhsz
1132 \advance\rail@tmpa by -\rail@jy
1133 \rail@jput{\line(0,1){\number\rail@tmpa}}
1135 \advance\rail@jy by -\rail@joinhsz
1136 \advance\rail@jx by \rail@joinhsz
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
1148 \rail@endalt\rail@plusjoin
1151 % \rail@cr{Y} : carriage return to vertical position Y
1155 \advance\rail@tmpa by \rail@joinsz
1156 \ifnum\rail@x<\rail@tmpa\rail@x=\rail@tmpa\fi
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
1164 \advance\rail@jx by \rail@joinhsz
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}}
1172 \advance\rail@jy by \rail@boxsp
1173 \advance\rail@jy by \rail@joinhsz
1174 \advance\rail@jx by -\rail@joinhsz
1176 \advance\rail@jy by -\rail@joinhsz
1178 \advance\rail@tmpa by -\rail@sx
1179 \advance\rail@tmpa by -\rail@joinhsz
1180 \rail@jput{\line(-1,0){\number\rail@tmpa}}
1182 \advance\rail@jx by \rail@joinhsz
1183 \advance\rail@jy by -\rail@joinhsz
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
1196 % default setup for Isabelle
1197 \newenvironment{railoutput}%
1198 {\begin{list}{}{\rail@param}\def\rail@expand{\relax}\makeatletter}{\makeatother\end{list}}
1200 \def\rail@termfont{\isabellestyle{tt}}
1201 \def\rail@nontfont{\isabellestyle{it}}
1202 \def\rail@namefont{\isabellestyle{it}}