doc-src/rail.sty
author wenzelm
Thu, 20 Feb 1997 15:15:17 +0100
changeset 2658 13ba951a4572
child 3097 ae362c99a635
permissions -rw-r--r--
added this file;
wenzelm@2658
     1
% rail.sty - style file to support railroad diagrams
wenzelm@2658
     2
%
wenzelm@2658
     3
% 09-Jul-90 L. Rooijakkers
wenzelm@2658
     4
% 08-Oct-90 L. Rooijakkers	fixed centering bug when \rail@tmpc<0.
wenzelm@2658
     5
% 07-Feb-91 L. Rooijakkers	added \railoptions command, indexing
wenzelm@2658
     6
% 08-Feb-91 L. Rooijakkers	minor fixes
wenzelm@2658
     7
%
wenzelm@2658
     8
% This style file needs to be used in conjunction with the 'rail'
wenzelm@2658
     9
% program. Running LaTeX as 'latex file' produces file.rai, which should be
wenzelm@2658
    10
% processed by Rail with 'rail file'. This produces file.rao, which will
wenzelm@2658
    11
% be picked up by LaTeX on the next 'latex file' run.
wenzelm@2658
    12
%
wenzelm@2658
    13
% LaTeX will warn if there is no file.rao or it's out of date.
wenzelm@2658
    14
%
wenzelm@2658
    15
% The macros in this file thus consist of two parts: those that read and
wenzelm@2658
    16
% write the .rai and .rao files, and those that do the actual formatting
wenzelm@2658
    17
% of the railroad diagrams.
wenzelm@2658
    18
wenzelm@2658
    19
% railroad read/write macros
wenzelm@2658
    20
%
wenzelm@2658
    21
% \begin{rail} TEXT \end{rail} : TEXT is written out to the .rai file,
wenzelm@2658
    22
%                                as \rail@i{NR}{TEXT}. Then the matching
wenzelm@2658
    23
%                                \rail@o{NR}{FMT} from the .rao file is
wenzelm@2658
    24
%                                executed (if defined).
wenzelm@2658
    25
%
wenzelm@2658
    26
% \railoptions{OPTIONS} : OPTIONS are written out to the .rai file,
wenzelm@2658
    27
%                         as \rail@p{OPTIONS}.
wenzelm@2658
    28
%
wenzelm@2658
    29
% \railterm{IDENT,IDENT,...} : format IDENT as terminals. writes out
wenzelm@2658
    30
%                              \rail@t{IDENT} to the .rai file and
wenzelm@2658
    31
%                              defines \rail@t@IDENT as \rail@termfont IDENT.
wenzelm@2658
    32
%
wenzelm@2658
    33
% \railtoken{IDENT}{TEXT} : format IDENT as terminal TEXT. writes out
wenzelm@2658
    34
%                           \rail@t{IDENT} to the .rai file and defines
wenzelm@2658
    35
%                           \rail@t@IDENT as TEXT.
wenzelm@2658
    36
%
wenzelm@2658
    37
% \rail@nr : railroad diagram counter, starts at 1
wenzelm@2658
    38
%
wenzelm@2658
    39
% \ifrail@match : current \rail@i{NR}{TEXT} matches
wenzelm@2658
    40
%
wenzelm@2658
    41
% \rail@first :	actions to be done first. read in .rao file,
wenzelm@2658
    42
%               open .rai file if \@filesw true, undefine \rail@first.
wenzelm@2658
    43
%               executed from \begin{rail} and \railtoken.
wenzelm@2658
    44
%
wenzelm@2658
    45
% \rail@i{NR}{TEXT} : defines \rail@i@NR as TEXT. written to the .rai
wenzelm@2658
    46
%                     file by \rail, read from the .rao file by
wenzelm@2658
    47
%                     \rail@first
wenzelm@2658
    48
%
wenzelm@2658
    49
% \rail@t{IDENT} : tells Rail that IDENT is to be custom formatted,
wenzelm@2658
    50
%                  written to the .rai file by \railterm and \railtoken.
wenzelm@2658
    51
%
wenzelm@2658
    52
% \rail@o{NR}{TEXT} : defines \rail@o@NR as TEXT, read from the .rao
wenzelm@2658
    53
%                     file by \rail@first.
wenzelm@2658
    54
%
wenzelm@2658
    55
% \rail@p{OPTIONS} : pass options to rail, written to the .rai file by
wenzelm@2658
    56
%                    \railoptions
wenzelm@2658
    57
%
wenzelm@2658
    58
% \rail@warn : warn user for mismatching diagrams
wenzelm@2658
    59
%
wenzelm@2658
    60
% \rail@endwarn : either \relax or \rail@warn
wenzelm@2658
    61
%
wenzelm@2658
    62
% \rail@enddocument : original \enddocument
wenzelm@2658
    63
%
wenzelm@2658
    64
% \enddocument : checks \ifrail@all
wenzelm@2658
    65
wenzelm@2658
    66
\newcount\rail@nr
wenzelm@2658
    67
\rail@nr=1
wenzelm@2658
    68
wenzelm@2658
    69
\newif\ifrail@all
wenzelm@2658
    70
\rail@alltrue
wenzelm@2658
    71
wenzelm@2658
    72
\newif\ifrail@match
wenzelm@2658
    73
wenzelm@2658
    74
\def\rail@first{
wenzelm@2658
    75
\makeatletter
wenzelm@2658
    76
\@input{\jobname.rao}
wenzelm@2658
    77
\makeatother
wenzelm@2658
    78
\if@filesw
wenzelm@2658
    79
\newwrite\tf@rai
wenzelm@2658
    80
\immediate\openout\tf@rai\jobname.rai\relax
wenzelm@2658
    81
\fi
wenzelm@2658
    82
\global\let\rail@first=\relax
wenzelm@2658
    83
}
wenzelm@2658
    84
wenzelm@2658
    85
\long\def\rail#1\end#2{
wenzelm@2658
    86
\end{#2}
wenzelm@2658
    87
\rail@first
wenzelm@2658
    88
\begingroup
wenzelm@2658
    89
\let\\=\relax
wenzelm@2658
    90
\global\edef\rail@i@{#1}
wenzelm@2658
    91
\endgroup
wenzelm@2658
    92
\@ifundefined{tf@rai}{}{
wenzelm@2658
    93
\begingroup
wenzelm@2658
    94
\let\\=\relax
wenzelm@2658
    95
\immediate\write\tf@rai{\noexpand\rail@i{\number\rail@nr}{\rail@i@}}
wenzelm@2658
    96
\endgroup
wenzelm@2658
    97
}
wenzelm@2658
    98
\rail@matchtrue
wenzelm@2658
    99
\@ifundefined{rail@o@\number\rail@nr}{\rail@matchfalse}{}
wenzelm@2658
   100
\expandafter\ifx\csname rail@i@\number\rail@nr\endcsname\rail@i@
wenzelm@2658
   101
\else
wenzelm@2658
   102
\rail@matchfalse
wenzelm@2658
   103
\fi
wenzelm@2658
   104
\ifrail@match
wenzelm@2658
   105
\expandafter\relax\csname rail@o@\number\rail@nr\endcsname
wenzelm@2658
   106
\else
wenzelm@2658
   107
\@warning{Railroad diagram {\number\rail@nr} doesn't match}
wenzelm@2658
   108
\global\let\rail@endwarn=\rail@warn
wenzelm@2658
   109
\rail@begin{1}{}
wenzelm@2658
   110
\rail@setbox{\bf ???}
wenzelm@2658
   111
\rail@oval
wenzelm@2658
   112
\rail@end
wenzelm@2658
   113
\fi
wenzelm@2658
   114
\global\advance\rail@nr by 1
wenzelm@2658
   115
}
wenzelm@2658
   116
wenzelm@2658
   117
\def\railoptions#1{
wenzelm@2658
   118
\rail@first
wenzelm@2658
   119
\@writefile{rai}{\noexpand\rail@p{#1}}
wenzelm@2658
   120
}
wenzelm@2658
   121
wenzelm@2658
   122
\def\railterm#1{
wenzelm@2658
   123
\rail@first
wenzelm@2658
   124
\@for\rail@i@:=#1\do{
wenzelm@2658
   125
\@writefile{rai}{\noexpand\rail@t{\rail@i@}}
wenzelm@2658
   126
}
wenzelm@2658
   127
}
wenzelm@2658
   128
wenzelm@2658
   129
\def\railtoken#1#2{
wenzelm@2658
   130
\rail@first
wenzelm@2658
   131
\@writefile{rai}{\noexpand\rail@t{#1}}
wenzelm@2658
   132
\expandafter\def\csname rail@t@#1\endcsname{#2}
wenzelm@2658
   133
}
wenzelm@2658
   134
wenzelm@2658
   135
\long\def\rail@i#1#2{
wenzelm@2658
   136
\expandafter\gdef\csname rail@i@#1\endcsname{#2}
wenzelm@2658
   137
}
wenzelm@2658
   138
wenzelm@2658
   139
\def\rail@o#1#2{
wenzelm@2658
   140
\expandafter\gdef\csname rail@o@#1\endcsname{#2}
wenzelm@2658
   141
}
wenzelm@2658
   142
wenzelm@2658
   143
\def\rail@t#1{}
wenzelm@2658
   144
wenzelm@2658
   145
\def\rail@p#1{}
wenzelm@2658
   146
wenzelm@2658
   147
\def\rail@warn{
wenzelm@2658
   148
\@warning{Railroad diagram(s) may have changed. Use 'rail' and rerun}
wenzelm@2658
   149
}
wenzelm@2658
   150
wenzelm@2658
   151
\let\rail@endwarn=\relax
wenzelm@2658
   152
wenzelm@2658
   153
\let\rail@enddocument=\enddocument
wenzelm@2658
   154
wenzelm@2658
   155
\def\enddocument{
wenzelm@2658
   156
\rail@endwarn
wenzelm@2658
   157
\rail@enddocument
wenzelm@2658
   158
}
wenzelm@2658
   159
wenzelm@2658
   160
% index entry macro
wenzelm@2658
   161
%
wenzelm@2658
   162
% \rail@index{IDENT} : add index entry for IDENT
wenzelm@2658
   163
wenzelm@2658
   164
\def\rail@index#1{
wenzelm@2658
   165
\index{\rail@indexfont#1}
wenzelm@2658
   166
}
wenzelm@2658
   167
wenzelm@2658
   168
% railroad diagram formatting parameters (user level)
wenzelm@2658
   169
% all of these are copied into their internal versions by \railinit
wenzelm@2658
   170
%
wenzelm@2658
   171
% \railunit : \unitlength within railroad diagrams
wenzelm@2658
   172
% \railextra : extra length at outside of diagram
wenzelm@2658
   173
% \railboxheight : height of ovals and frames
wenzelm@2658
   174
% \railboxskip : vertical space between lines
wenzelm@2658
   175
% \railboxleft : space to the left of a box
wenzelm@2658
   176
% \railboxright : space to the right of a box
wenzelm@2658
   177
% \railovalspace : extra space around contents of oval
wenzelm@2658
   178
% \railframespace : extra space around contents of frame
wenzelm@2658
   179
% \railtextleft : space to the left of text
wenzelm@2658
   180
% \railtextright : space to the right of text
wenzelm@2658
   181
% \railtextup : space to lift text up
wenzelm@2658
   182
% \railjoinsize : circle size of join/split arcs
wenzelm@2658
   183
% \railjoinadjust : space to adjust join
wenzelm@2658
   184
%
wenzelm@2658
   185
% \railnamesep : separator between name and rule body
wenzelm@2658
   186
wenzelm@2658
   187
\newdimen\railunit
wenzelm@2658
   188
\newdimen\railextra
wenzelm@2658
   189
\newdimen\railboxheight
wenzelm@2658
   190
\newdimen\railboxskip
wenzelm@2658
   191
\newdimen\railboxleft
wenzelm@2658
   192
\newdimen\railboxright
wenzelm@2658
   193
\newdimen\railovalspace
wenzelm@2658
   194
\newdimen\railframespace
wenzelm@2658
   195
\newdimen\railtextleft
wenzelm@2658
   196
\newdimen\railtextright
wenzelm@2658
   197
\newdimen\railtextup
wenzelm@2658
   198
\newdimen\railjoinsize
wenzelm@2658
   199
\newdimen\railjoinadjust
wenzelm@2658
   200
\newdimen\railnamesep
wenzelm@2658
   201
wenzelm@2658
   202
% internal versions of the formatting parameters
wenzelm@2658
   203
%
wenzelm@2658
   204
% \rail@extra   : \railextra
wenzelm@2658
   205
% \rail@boxht   : \railboxheight
wenzelm@2658
   206
% \rail@boxsp   : \railboxskip
wenzelm@2658
   207
% \rail@boxlf   : \railboxleft
wenzelm@2658
   208
% \rail@boxrt   : \railboxright
wenzelm@2658
   209
% \rail@boxhht  : \railboxheight / 2
wenzelm@2658
   210
% \rail@ovalsp  : \railovalspace
wenzelm@2658
   211
% \rail@framesp : \railframespace
wenzelm@2658
   212
% \rail@textlf	: \railtextleft
wenzelm@2658
   213
% \rail@textrt	: \railtextright
wenzelm@2658
   214
% \rail@textup	: \railtextup
wenzelm@2658
   215
% \rail@joinsz  : \railjoinsize
wenzelm@2658
   216
% \rail@joinhsz : \railjoinsize / 2
wenzelm@2658
   217
% \rail@joinadj : \railjoinadjust
wenzelm@2658
   218
%
wenzelm@2658
   219
% \railinit : internalize all of the parameters.
wenzelm@2658
   220
wenzelm@2658
   221
\newcount\rail@extra
wenzelm@2658
   222
\newcount\rail@boxht
wenzelm@2658
   223
\newcount\rail@boxsp
wenzelm@2658
   224
\newcount\rail@boxlf
wenzelm@2658
   225
\newcount\rail@boxrt
wenzelm@2658
   226
\newcount\rail@boxhht
wenzelm@2658
   227
\newcount\rail@ovalsp
wenzelm@2658
   228
\newcount\rail@framesp
wenzelm@2658
   229
\newcount\rail@textlf
wenzelm@2658
   230
\newcount\rail@textrt
wenzelm@2658
   231
\newcount\rail@textup
wenzelm@2658
   232
\newcount\rail@joinsz
wenzelm@2658
   233
\newcount\rail@joinhsz
wenzelm@2658
   234
\newcount\rail@joinadj
wenzelm@2658
   235
wenzelm@2658
   236
\def\railinit{
wenzelm@2658
   237
\rail@extra=\railextra
wenzelm@2658
   238
\divide\rail@extra by \railunit
wenzelm@2658
   239
\rail@boxht=\railboxheight
wenzelm@2658
   240
\divide\rail@boxht by \railunit
wenzelm@2658
   241
\rail@boxsp=\railboxskip
wenzelm@2658
   242
\divide\rail@boxsp by \railunit
wenzelm@2658
   243
\rail@boxlf=\railboxleft
wenzelm@2658
   244
\divide\rail@boxlf by \railunit
wenzelm@2658
   245
\rail@boxrt=\railboxright
wenzelm@2658
   246
\divide\rail@boxrt by \railunit
wenzelm@2658
   247
\rail@boxhht=\railboxheight
wenzelm@2658
   248
\divide\rail@boxhht by \railunit
wenzelm@2658
   249
\divide\rail@boxhht by 2
wenzelm@2658
   250
\rail@ovalsp=\railovalspace
wenzelm@2658
   251
\divide\rail@ovalsp by \railunit
wenzelm@2658
   252
\rail@framesp=\railframespace
wenzelm@2658
   253
\divide\rail@framesp by \railunit
wenzelm@2658
   254
\rail@textlf=\railtextleft
wenzelm@2658
   255
\divide\rail@textlf by \railunit
wenzelm@2658
   256
\rail@textrt=\railtextright
wenzelm@2658
   257
\divide\rail@textrt by \railunit
wenzelm@2658
   258
\rail@textup=\railtextup
wenzelm@2658
   259
\divide\rail@textup by \railunit
wenzelm@2658
   260
\rail@joinsz=\railjoinsize
wenzelm@2658
   261
\divide\rail@joinsz by \railunit
wenzelm@2658
   262
\rail@joinhsz=\railjoinsize
wenzelm@2658
   263
\divide\rail@joinhsz by \railunit
wenzelm@2658
   264
\divide\rail@joinhsz by 2
wenzelm@2658
   265
\rail@joinadj=\railjoinadjust
wenzelm@2658
   266
\divide\rail@joinadj by \railunit
wenzelm@2658
   267
}
wenzelm@2658
   268
wenzelm@2658
   269
% initialize the parameters
wenzelm@2658
   270
wenzelm@2658
   271
\railunit=1sp
wenzelm@2658
   272
\railextra=4ex
wenzelm@2658
   273
\railboxleft=1ex
wenzelm@2658
   274
\railboxright=1ex
wenzelm@2658
   275
\railovalspace=2ex
wenzelm@2658
   276
\railframespace=2ex
wenzelm@2658
   277
\railtextleft=1ex
wenzelm@2658
   278
\railtextright=1ex
wenzelm@2658
   279
\railjoinadjust=0pt
wenzelm@2658
   280
\railnamesep=1ex
wenzelm@2658
   281
wenzelm@2658
   282
\ifcase\@ptsize
wenzelm@2658
   283
% 10 pt
wenzelm@2658
   284
\railboxheight=16pt
wenzelm@2658
   285
\railboxskip=24pt
wenzelm@2658
   286
\railtextup=5pt
wenzelm@2658
   287
\railjoinsize=16pt
wenzelm@2658
   288
\or
wenzelm@2658
   289
% 11 pt
wenzelm@2658
   290
\railboxheight=16pt
wenzelm@2658
   291
\railboxskip=24pt
wenzelm@2658
   292
\railtextup=5pt
wenzelm@2658
   293
\railjoinsize=16pt
wenzelm@2658
   294
\or
wenzelm@2658
   295
% 12 pt
wenzelm@2658
   296
\railboxheight=20pt
wenzelm@2658
   297
\railboxskip=28pt
wenzelm@2658
   298
\railtextup=6pt
wenzelm@2658
   299
\railjoinsize=20pt
wenzelm@2658
   300
\fi
wenzelm@2658
   301
wenzelm@2658
   302
\railinit
wenzelm@2658
   303
wenzelm@2658
   304
% railroad formatting primitives
wenzelm@2658
   305
%
wenzelm@2658
   306
% \rail@x : current x
wenzelm@2658
   307
% \rail@y : current y
wenzelm@2658
   308
% \rail@ex : current end x
wenzelm@2658
   309
% \rail@sx : starting x for \rail@cr
wenzelm@2658
   310
% \rail@rx : rightmost previous x for \rail@cr
wenzelm@2658
   311
%
wenzelm@2658
   312
% \rail@tmpa : temporary count
wenzelm@2658
   313
% \rail@tmpb : temporary count
wenzelm@2658
   314
% \rail@tmpc : temporary count
wenzelm@2658
   315
%
wenzelm@2658
   316
% \rail@put : put at (\rail@x,\rail@y)
wenzelm@2658
   317
%
wenzelm@2658
   318
% \rail@eline : end line by drawing from \rail@ex to \rail@x
wenzelm@2658
   319
%
wenzelm@2658
   320
% \rail@sety{LEVEL} : set \rail@y to level LEVEL
wenzelm@2658
   321
wenzelm@2658
   322
\newcount\rail@x
wenzelm@2658
   323
\newcount\rail@y
wenzelm@2658
   324
\newcount\rail@ex
wenzelm@2658
   325
\newcount\rail@sx
wenzelm@2658
   326
\newcount\rail@rx
wenzelm@2658
   327
wenzelm@2658
   328
\newcount\rail@tmpa
wenzelm@2658
   329
\newcount\rail@tmpb
wenzelm@2658
   330
\newcount\rail@tmpc
wenzelm@2658
   331
wenzelm@2658
   332
\def\rail@put{\put(\number\rail@x,\number\rail@y)}
wenzelm@2658
   333
wenzelm@2658
   334
\def\rail@eline{
wenzelm@2658
   335
\rail@tmpb=\rail@x
wenzelm@2658
   336
\advance\rail@tmpb by -\rail@ex
wenzelm@2658
   337
\rail@put{\line(-1,0){\number\rail@tmpb}}
wenzelm@2658
   338
}
wenzelm@2658
   339
wenzelm@2658
   340
\def\rail@sety#1{
wenzelm@2658
   341
\rail@y=#1
wenzelm@2658
   342
\multiply\rail@y by -\rail@boxsp
wenzelm@2658
   343
\advance\rail@y by -\rail@boxht
wenzelm@2658
   344
}
wenzelm@2658
   345
wenzelm@2658
   346
% \rail@list : declarations for list environment
wenzelm@2658
   347
%
wenzelm@2658
   348
% \railparam{TEXT} : sets \rail@list to TEXT
wenzelm@2658
   349
%
wenzelm@2658
   350
% \rail@begin{HEIGHT}{NAME} : begin a railroad diagram of height HEIGHT
wenzelm@2658
   351
%
wenzelm@2658
   352
% \rail@end : end a railroad diagram
wenzelm@2658
   353
wenzelm@2658
   354
\def\rail@list{}
wenzelm@2658
   355
wenzelm@2658
   356
\def\railparam#1{
wenzelm@2658
   357
\def\rail@list{#1}
wenzelm@2658
   358
}
wenzelm@2658
   359
wenzelm@2658
   360
\newbox\tempbox
wenzelm@2658
   361
wenzelm@2658
   362
\def\rail@begin#1#2{
wenzelm@2658
   363
\medskip
wenzelm@2658
   364
\begin{list}{}{\rail@list}
wenzelm@2658
   365
\item[]
wenzelm@2658
   366
\vbox\bgroup
wenzelm@2658
   367
\ifx\@empty#2\else
wenzelm@2658
   368
{\rail@namefont #2}
wenzelm@2658
   369
\\*[\railnamesep]\nopagebreak
wenzelm@2658
   370
\fi
wenzelm@2658
   371
\unitlength=\railunit
wenzelm@2658
   372
\rail@tmpa=#1
wenzelm@2658
   373
\multiply\rail@tmpa by \rail@boxsp
wenzelm@2658
   374
\begin{picture}(0,\number\rail@tmpa)(0,-\number\rail@tmpa)
wenzelm@2658
   375
\rail@ex=0
wenzelm@2658
   376
\rail@rx=0
wenzelm@2658
   377
\rail@x=\rail@extra
wenzelm@2658
   378
\rail@sx=\rail@x
wenzelm@2658
   379
\rail@sety{0}
wenzelm@2658
   380
}
wenzelm@2658
   381
wenzelm@2658
   382
\def\rail@end{
wenzelm@2658
   383
\advance\rail@x by \rail@extra
wenzelm@2658
   384
\rail@eline
wenzelm@2658
   385
\end{picture}
wenzelm@2658
   386
\egroup
wenzelm@2658
   387
\end{list}
wenzelm@2658
   388
}
wenzelm@2658
   389
wenzelm@2658
   390
% \rail@tokenfont : format setup for \railtoken identifiers
wenzelm@2658
   391
%
wenzelm@2658
   392
% \rail@termfont : format setup for terminals
wenzelm@2658
   393
%
wenzelm@2658
   394
% \rail@nontfont : format setup for nonterminals
wenzelm@2658
   395
%
wenzelm@2658
   396
% \rail@annofont : format setup for annotations
wenzelm@2658
   397
%
wenzelm@2658
   398
% \rail@rulefont : format setup for rule names
wenzelm@2658
   399
%
wenzelm@2658
   400
% \rail@indexfont : format setup for index entry
wenzelm@2658
   401
%
wenzelm@2658
   402
% \railtokenfont{TEXT} : set \railtoken format setup to TEXT
wenzelm@2658
   403
%
wenzelm@2658
   404
% \railtermfont{TEXT} : set terminal format setup to TEXT
wenzelm@2658
   405
%
wenzelm@2658
   406
% \railnontermfont{TEXT} : set nonterminal format setup to TEXT
wenzelm@2658
   407
%
wenzelm@2658
   408
% \railannotatefont{TEXT} : set annotation format setup to TEXT
wenzelm@2658
   409
%
wenzelm@2658
   410
% \railnamefont{TEXT} : set rule name format setup to TEXT
wenzelm@2658
   411
%
wenzelm@2658
   412
% \railindexfont{TEXT} : set index entry format setup to TEXT
wenzelm@2658
   413
wenzelm@2658
   414
\let\rail@tokenfont=\tt
wenzelm@2658
   415
\let\rail@termfont=\tt
wenzelm@2658
   416
\let\rail@nontfont=\rm
wenzelm@2658
   417
\let\rail@annofont=\it
wenzelm@2658
   418
\let\rail@namefont=\it
wenzelm@2658
   419
\let\rail@indexfont=\it
wenzelm@2658
   420
wenzelm@2658
   421
\def\railtokenfont#1{
wenzelm@2658
   422
\def\rail@tokenfont{#1}
wenzelm@2658
   423
}
wenzelm@2658
   424
wenzelm@2658
   425
\def\railtermfont#1{
wenzelm@2658
   426
\def\rail@termfont{#1}
wenzelm@2658
   427
}
wenzelm@2658
   428
wenzelm@2658
   429
\def\railnontermfont#1{
wenzelm@2658
   430
\def\rail@nontfont{#1}
wenzelm@2658
   431
}
wenzelm@2658
   432
wenzelm@2658
   433
\def\railannotatefont#1{
wenzelm@2658
   434
\def\rail@annofont{#1}
wenzelm@2658
   435
}
wenzelm@2658
   436
wenzelm@2658
   437
\def\railnamefont#1{
wenzelm@2658
   438
\def\rail@namefont{#1}
wenzelm@2658
   439
}
wenzelm@2658
   440
wenzelm@2658
   441
\def\railindexfont#1{
wenzelm@2658
   442
\def\rail@indexfont{#1}
wenzelm@2658
   443
}
wenzelm@2658
   444
wenzelm@2658
   445
% \rail@token{TEXT} : format token TEXT
wenzelm@2658
   446
%
wenzelm@2658
   447
% \rail@ctoken{TEXT} : format token TEXT centered
wenzelm@2658
   448
%
wenzelm@2658
   449
% \rail@nont{TEXT} : format nonterminal TEXT
wenzelm@2658
   450
%
wenzelm@2658
   451
% \rail@cnont{TEXT} : format nonterminal TEXT centered
wenzelm@2658
   452
%
wenzelm@2658
   453
% \rail@cterm{TEXT} : format terminal TEXT
wenzelm@2658
   454
%
wenzelm@2658
   455
% \rail@cterm{TEXT} : format terminal TEXT centered
wenzelm@2658
   456
%
wenzelm@2658
   457
% \rail@annote[TEXT] : format TEXT as annotation
wenzelm@2658
   458
%
wenzelm@2658
   459
% \rail@annotebox[TEXT] : annotate box with TEXT
wenzelm@2658
   460
wenzelm@2658
   461
\def\rail@token#1{
wenzelm@2658
   462
\expandafter\@ifundefined{rail@t@#1}{
wenzelm@2658
   463
\rail@setbox{\rail@termfont #1}
wenzelm@2658
   464
}{
wenzelm@2658
   465
\rail@setbox{\rail@tokenfont \csname rail@t@#1\endcsname}
wenzelm@2658
   466
}
wenzelm@2658
   467
\rail@oval
wenzelm@2658
   468
}
wenzelm@2658
   469
wenzelm@2658
   470
\def\rail@ctoken#1{
wenzelm@2658
   471
\rail@setbox{\rail@tokenfont \csname rail@t@#1\endcsname}
wenzelm@2658
   472
\rail@coval
wenzelm@2658
   473
}
wenzelm@2658
   474
wenzelm@2658
   475
\def\rail@nont#1{
wenzelm@2658
   476
\rail@setbox{\rail@nontfont #1}
wenzelm@2658
   477
\rail@frame
wenzelm@2658
   478
}
wenzelm@2658
   479
wenzelm@2658
   480
\def\rail@cnont#1{
wenzelm@2658
   481
\rail@setbox{\rail@nontfont #1}
wenzelm@2658
   482
\rail@cframe
wenzelm@2658
   483
}
wenzelm@2658
   484
wenzelm@2658
   485
\def\rail@term#1{
wenzelm@2658
   486
\rail@setbox{\rail@termfont #1}
wenzelm@2658
   487
\rail@oval
wenzelm@2658
   488
}
wenzelm@2658
   489
wenzelm@2658
   490
\def\rail@cterm#1{
wenzelm@2658
   491
\rail@setbox{\rail@termfont #1}
wenzelm@2658
   492
\rail@coval
wenzelm@2658
   493
}
wenzelm@2658
   494
wenzelm@2658
   495
\def\rail@annote[#1]{
wenzelm@2658
   496
\rail@setbox{\rail@annofont #1}
wenzelm@2658
   497
\rail@text
wenzelm@2658
   498
}
wenzelm@2658
   499
wenzelm@2658
   500
\def\rail@annotebox[#1]{
wenzelm@2658
   501
\ \rail@annofont #1
wenzelm@2658
   502
}
wenzelm@2658
   503
wenzelm@2658
   504
% \rail@box : temporary box for \rail@oval and \rail@frame
wenzelm@2658
   505
%
wenzelm@2658
   506
% \rail@setbox{TEXT} : set \rail@box to TEXT, set \rail@tmpa to width
wenzelm@2658
   507
%
wenzelm@2658
   508
% \rail@oval : format \rail@box of width \rail@tmpa inside an oval
wenzelm@2658
   509
%
wenzelm@2658
   510
% \rail@coval : same as \rail@oval, but centered between \rail@x and
wenzelm@2658
   511
%               \rail@mx
wenzelm@2658
   512
%
wenzelm@2658
   513
% \rail@frame : format \rail@box of width \rail@tmpa inside a frame
wenzelm@2658
   514
%
wenzelm@2658
   515
% \rail@cframe : same as \rail@frame, but centered between \rail@x and
wenzelm@2658
   516
%                \rail@mx
wenzelm@2658
   517
%
wenzelm@2658
   518
% \rail@text : format \rail@box of width \rail@tmpa above the line
wenzelm@2658
   519
wenzelm@2658
   520
\newbox\rail@box
wenzelm@2658
   521
wenzelm@2658
   522
\def\rail@setbox#1{
wenzelm@2658
   523
\setbox\rail@box\hbox{\strut#1}
wenzelm@2658
   524
\rail@tmpa=\wd\rail@box
wenzelm@2658
   525
\divide\rail@tmpa by \railunit
wenzelm@2658
   526
}
wenzelm@2658
   527
wenzelm@2658
   528
\def\rail@oval{
wenzelm@2658
   529
\advance\rail@x by \rail@boxlf
wenzelm@2658
   530
\rail@eline
wenzelm@2658
   531
\advance\rail@tmpa by \rail@ovalsp
wenzelm@2658
   532
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi
wenzelm@2658
   533
\rail@tmpb=\rail@tmpa
wenzelm@2658
   534
\divide\rail@tmpb by 2
wenzelm@2658
   535
\advance\rail@y by -\rail@boxhht
wenzelm@2658
   536
\rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
wenzelm@2658
   537
\advance\rail@y by \rail@boxhht
wenzelm@2658
   538
\advance\rail@x by \rail@tmpb
wenzelm@2658
   539
\rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
wenzelm@2658
   540
\advance\rail@x by \rail@tmpb
wenzelm@2658
   541
\rail@ex=\rail@x
wenzelm@2658
   542
\advance\rail@x by \rail@boxrt
wenzelm@2658
   543
}
wenzelm@2658
   544
wenzelm@2658
   545
\def\rail@coval{
wenzelm@2658
   546
\rail@tmpb=\rail@tmpa
wenzelm@2658
   547
\advance\rail@tmpb by \rail@ovalsp
wenzelm@2658
   548
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi
wenzelm@2658
   549
\advance\rail@tmpb by \rail@boxlf
wenzelm@2658
   550
\advance\rail@tmpb by \rail@boxrt
wenzelm@2658
   551
\rail@tmpc=\rail@mx
wenzelm@2658
   552
\advance\rail@tmpc by -\rail@x
wenzelm@2658
   553
\advance\rail@tmpc by -\rail@tmpb
wenzelm@2658
   554
\divide\rail@tmpc by 2
wenzelm@2658
   555
\ifnum\rail@tmpc>0
wenzelm@2658
   556
\advance\rail@x by \rail@tmpc
wenzelm@2658
   557
\fi
wenzelm@2658
   558
\rail@oval
wenzelm@2658
   559
}
wenzelm@2658
   560
wenzelm@2658
   561
\def\rail@frame{
wenzelm@2658
   562
\advance\rail@x by \rail@boxlf
wenzelm@2658
   563
\rail@eline
wenzelm@2658
   564
\advance\rail@tmpa by \rail@framesp
wenzelm@2658
   565
\ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi
wenzelm@2658
   566
\advance\rail@y by -\rail@boxhht
wenzelm@2658
   567
\rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
wenzelm@2658
   568
\advance\rail@y by \rail@boxhht
wenzelm@2658
   569
\advance\rail@x by \rail@tmpa
wenzelm@2658
   570
\rail@ex=\rail@x
wenzelm@2658
   571
\advance\rail@x by \rail@boxrt
wenzelm@2658
   572
}
wenzelm@2658
   573
wenzelm@2658
   574
\def\rail@cframe{
wenzelm@2658
   575
\rail@tmpb=\rail@tmpa
wenzelm@2658
   576
\advance\rail@tmpb by \rail@framesp
wenzelm@2658
   577
\ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi
wenzelm@2658
   578
\advance\rail@tmpb by \rail@boxlf
wenzelm@2658
   579
\advance\rail@tmpb by \rail@boxrt
wenzelm@2658
   580
\rail@tmpc=\rail@mx
wenzelm@2658
   581
\advance\rail@tmpc by -\rail@x
wenzelm@2658
   582
\advance\rail@tmpc by -\rail@tmpb
wenzelm@2658
   583
\divide\rail@tmpc by 2
wenzelm@2658
   584
\ifnum\rail@tmpc>0
wenzelm@2658
   585
\advance\rail@x by \rail@tmpc
wenzelm@2658
   586
\fi
wenzelm@2658
   587
\rail@frame
wenzelm@2658
   588
}
wenzelm@2658
   589
wenzelm@2658
   590
\def\rail@text{
wenzelm@2658
   591
\advance\rail@x by \rail@textlf
wenzelm@2658
   592
\advance\rail@y by \rail@textup
wenzelm@2658
   593
\rail@put{\box\rail@box}
wenzelm@2658
   594
\advance\rail@y by -\rail@textup
wenzelm@2658
   595
\advance\rail@x by \rail@tmpa
wenzelm@2658
   596
\advance\rail@x by \rail@textrt
wenzelm@2658
   597
}
wenzelm@2658
   598
wenzelm@2658
   599
% alternatives
wenzelm@2658
   600
%
wenzelm@2658
   601
% \rail@jx \rail@jy : current join point
wenzelm@2658
   602
%
wenzelm@2658
   603
% \rail@gx \rail@gy \rail@gex \rail@grx : global versions of \rail@x etc,
wenzelm@2658
   604
%                                         to pass values over group closings
wenzelm@2658
   605
%
wenzelm@2658
   606
% \rail@mx : maximum x so far
wenzelm@2658
   607
%
wenzelm@2658
   608
% \rail@sy : starting \rail@y for alternatives
wenzelm@2658
   609
%
wenzelm@2658
   610
% \rail@jput : put at (\rail@jx,\rail@jy)
wenzelm@2658
   611
%
wenzelm@2658
   612
% \rail@joval[PART] : put \oval[PART] with adjust
wenzelm@2658
   613
wenzelm@2658
   614
\newcount\rail@jx
wenzelm@2658
   615
\newcount\rail@jy
wenzelm@2658
   616
wenzelm@2658
   617
\newcount\rail@gx
wenzelm@2658
   618
\newcount\rail@gy
wenzelm@2658
   619
\newcount\rail@gex
wenzelm@2658
   620
\newcount\rail@grx
wenzelm@2658
   621
wenzelm@2658
   622
\newcount\rail@sy
wenzelm@2658
   623
\newcount\rail@mx
wenzelm@2658
   624
wenzelm@2658
   625
\def\rail@jput{
wenzelm@2658
   626
\put(\number\rail@jx,\number\rail@jy)
wenzelm@2658
   627
}
wenzelm@2658
   628
wenzelm@2658
   629
\def\rail@joval[#1]{
wenzelm@2658
   630
\advance\rail@jx by \rail@joinadj
wenzelm@2658
   631
\rail@jput{\oval(\number\rail@joinsz,\number\rail@joinsz)[#1]}
wenzelm@2658
   632
\advance\rail@jx by -\rail@joinadj
wenzelm@2658
   633
}
wenzelm@2658
   634
wenzelm@2658
   635
% \rail@barsplit : incoming split for '|'
wenzelm@2658
   636
%
wenzelm@2658
   637
% \rail@plussplit : incoming split for '+'
wenzelm@2658
   638
%
wenzelm@2658
   639
wenzelm@2658
   640
\def\rail@barsplit{
wenzelm@2658
   641
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   642
\rail@joval[tr]
wenzelm@2658
   643
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   644
}
wenzelm@2658
   645
wenzelm@2658
   646
\def\rail@plussplit{
wenzelm@2658
   647
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   648
\advance\rail@jx by \rail@joinsz
wenzelm@2658
   649
\rail@joval[tl]
wenzelm@2658
   650
\advance\rail@jx by -\rail@joinhsz
wenzelm@2658
   651
}
wenzelm@2658
   652
wenzelm@2658
   653
% \rail@alt{SPLIT} : start alternatives with incoming split SPLIT
wenzelm@2658
   654
%
wenzelm@2658
   655
wenzelm@2658
   656
\def\rail@alt#1{
wenzelm@2658
   657
\rail@sy=\rail@y
wenzelm@2658
   658
\rail@jx=\rail@x
wenzelm@2658
   659
\rail@jy=\rail@y
wenzelm@2658
   660
\advance\rail@x by \rail@joinsz
wenzelm@2658
   661
\rail@mx=0
wenzelm@2658
   662
\let\rail@list=\@empty
wenzelm@2658
   663
\let\rail@comma=\@empty
wenzelm@2658
   664
\let\rail@split=#1
wenzelm@2658
   665
\begingroup
wenzelm@2658
   666
\rail@sx=\rail@x
wenzelm@2658
   667
\rail@rx=0
wenzelm@2658
   668
}
wenzelm@2658
   669
wenzelm@2658
   670
% \rail@nextalt{FIX}{Y} : start next alternative at vertical position Y
wenzelm@2658
   671
%                         and fix-up FIX
wenzelm@2658
   672
%
wenzelm@2658
   673
wenzelm@2658
   674
\def\rail@nextalt#1#2{
wenzelm@2658
   675
\global\rail@gx=\rail@x
wenzelm@2658
   676
\global\rail@gy=\rail@y
wenzelm@2658
   677
\global\rail@gex=\rail@ex
wenzelm@2658
   678
\global\rail@grx=\rail@rx
wenzelm@2658
   679
\endgroup
wenzelm@2658
   680
#1
wenzelm@2658
   681
\ifnum\rail@gx>\rail@mx\rail@mx=\rail@gx\fi
wenzelm@2658
   682
\ifnum\rail@grx>\rail@mx\rail@mx=\rail@grx\fi
wenzelm@2658
   683
\edef\rail@list{\rail@list\rail@comma\number\rail@gex:\number\rail@gy}
wenzelm@2658
   684
\def\rail@comma{,}
wenzelm@2658
   685
\rail@split
wenzelm@2658
   686
\let\rail@split=\@empty
wenzelm@2658
   687
\rail@sety{#2}
wenzelm@2658
   688
\rail@tmpa=\rail@jy
wenzelm@2658
   689
\advance\rail@tmpa by -\rail@y
wenzelm@2658
   690
\advance\rail@tmpa by -\rail@joinhsz
wenzelm@2658
   691
\rail@jput{\line(0,-1){\number\rail@tmpa}}
wenzelm@2658
   692
\rail@jy=\rail@y
wenzelm@2658
   693
\advance\rail@jy by \rail@joinhsz
wenzelm@2658
   694
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   695
\rail@joval[bl]
wenzelm@2658
   696
\advance\rail@jx by -\rail@joinhsz
wenzelm@2658
   697
\rail@ex=\rail@x
wenzelm@2658
   698
\begingroup
wenzelm@2658
   699
\rail@sx=\rail@x
wenzelm@2658
   700
\rail@rx=0
wenzelm@2658
   701
}
wenzelm@2658
   702
wenzelm@2658
   703
% \rail@barjoin : outgoing join for first '|' alternative
wenzelm@2658
   704
%
wenzelm@2658
   705
% \rail@plusjoin : outgoing join for first '+' alternative
wenzelm@2658
   706
%
wenzelm@2658
   707
% \rail@altjoin : join for subsequent alternative
wenzelm@2658
   708
%
wenzelm@2658
   709
wenzelm@2658
   710
\def\rail@barjoin{
wenzelm@2658
   711
\ifnum\rail@y<\rail@sy
wenzelm@2658
   712
\global\rail@gex=\rail@jx
wenzelm@2658
   713
\else
wenzelm@2658
   714
\global\rail@gex=\rail@ex
wenzelm@2658
   715
\fi
wenzelm@2658
   716
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   717
\rail@joval[tl]
wenzelm@2658
   718
\advance\rail@jx by -\rail@joinhsz
wenzelm@2658
   719
\ifnum\rail@y<\rail@sy
wenzelm@2658
   720
\rail@altjoin
wenzelm@2658
   721
\fi
wenzelm@2658
   722
}
wenzelm@2658
   723
wenzelm@2658
   724
\def\rail@plusjoin{
wenzelm@2658
   725
\global\rail@gex=\rail@ex
wenzelm@2658
   726
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   727
\advance\rail@jx by -\rail@joinsz
wenzelm@2658
   728
\rail@joval[tr]
wenzelm@2658
   729
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   730
}
wenzelm@2658
   731
wenzelm@2658
   732
\def\rail@altjoin{
wenzelm@2658
   733
\rail@eline
wenzelm@2658
   734
\rail@tmpa=\rail@jy
wenzelm@2658
   735
\advance\rail@tmpa by -\rail@y
wenzelm@2658
   736
\advance\rail@tmpa by -\rail@joinhsz
wenzelm@2658
   737
\rail@jput{\line(0,-1){\number\rail@tmpa}}
wenzelm@2658
   738
\rail@jy=\rail@y
wenzelm@2658
   739
\advance\rail@jy by \rail@joinhsz
wenzelm@2658
   740
\advance\rail@jx by -\rail@joinhsz
wenzelm@2658
   741
\rail@joval[br]
wenzelm@2658
   742
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   743
}
wenzelm@2658
   744
wenzelm@2658
   745
% \rail@eltsplit EX:Y; : split EX:Y into \rail@ex \rail@y
wenzelm@2658
   746
%
wenzelm@2658
   747
% \rail@endalt{JOIN} : end alternatives with outgoing join JOIN
wenzelm@2658
   748
wenzelm@2658
   749
\def\rail@eltsplit#1:#2;{\rail@ex=#1\rail@y=#2}
wenzelm@2658
   750
wenzelm@2658
   751
\def\rail@endalt#1{
wenzelm@2658
   752
\global\rail@gx=\rail@x
wenzelm@2658
   753
\global\rail@gy=\rail@y
wenzelm@2658
   754
\global\rail@gex=\rail@ex
wenzelm@2658
   755
\global\rail@grx=\rail@rx
wenzelm@2658
   756
\endgroup
wenzelm@2658
   757
\ifnum\rail@gx>\rail@mx\rail@mx=\rail@gx\fi
wenzelm@2658
   758
\ifnum\rail@grx>\rail@mx\rail@mx=\rail@grx\fi
wenzelm@2658
   759
\edef\rail@list{\rail@list\rail@comma\number\rail@gex:\number\rail@gy}
wenzelm@2658
   760
\rail@x=\rail@mx
wenzelm@2658
   761
\rail@jx=\rail@x
wenzelm@2658
   762
\rail@jy=\rail@sy
wenzelm@2658
   763
\advance\rail@jx by \rail@joinsz
wenzelm@2658
   764
\let\rail@join=#1
wenzelm@2658
   765
\@for\rail@elt:=\rail@list\do{
wenzelm@2658
   766
\expandafter\rail@eltsplit\rail@elt;
wenzelm@2658
   767
\rail@join
wenzelm@2658
   768
\let\rail@join=\rail@altjoin
wenzelm@2658
   769
}
wenzelm@2658
   770
\rail@x=\rail@mx
wenzelm@2658
   771
\rail@y=\rail@sy
wenzelm@2658
   772
\rail@ex=\rail@gex
wenzelm@2658
   773
\advance\rail@x by \rail@joinsz
wenzelm@2658
   774
}
wenzelm@2658
   775
wenzelm@2658
   776
% \rail@bar : start '|' alternatives
wenzelm@2658
   777
%
wenzelm@2658
   778
% \rail@nextbar : next '|' alternative
wenzelm@2658
   779
%
wenzelm@2658
   780
% \rail@endbar : end '|' alternatives
wenzelm@2658
   781
%
wenzelm@2658
   782
wenzelm@2658
   783
\def\rail@bar{
wenzelm@2658
   784
\rail@alt\rail@barsplit
wenzelm@2658
   785
}
wenzelm@2658
   786
wenzelm@2658
   787
\def\rail@nextbar{
wenzelm@2658
   788
\rail@nextalt\relax
wenzelm@2658
   789
}
wenzelm@2658
   790
wenzelm@2658
   791
\def\rail@endbar{
wenzelm@2658
   792
\rail@endalt\rail@barjoin
wenzelm@2658
   793
}
wenzelm@2658
   794
wenzelm@2658
   795
% \rail@plus : start '+' alternatives
wenzelm@2658
   796
%
wenzelm@2658
   797
% \rail@nextplus: next '+' alternative
wenzelm@2658
   798
%
wenzelm@2658
   799
% \rail@endplus : end '+' alternatives
wenzelm@2658
   800
%
wenzelm@2658
   801
wenzelm@2658
   802
\def\rail@plus{
wenzelm@2658
   803
\rail@alt\rail@plussplit
wenzelm@2658
   804
}
wenzelm@2658
   805
wenzelm@2658
   806
\def\rail@nextplus{
wenzelm@2658
   807
\rail@nextalt\rail@fixplus
wenzelm@2658
   808
}
wenzelm@2658
   809
wenzelm@2658
   810
\def\rail@fixplus{
wenzelm@2658
   811
\ifnum\rail@gy<\rail@sy
wenzelm@2658
   812
\begingroup
wenzelm@2658
   813
\rail@x=\rail@gx
wenzelm@2658
   814
\rail@y=\rail@gy
wenzelm@2658
   815
\rail@ex=\rail@gex
wenzelm@2658
   816
\rail@rx=\rail@grx
wenzelm@2658
   817
\ifnum\rail@x<\rail@rx
wenzelm@2658
   818
\rail@x=\rail@rx
wenzelm@2658
   819
\fi
wenzelm@2658
   820
\rail@eline
wenzelm@2658
   821
\rail@jx=\rail@x
wenzelm@2658
   822
\rail@jy=\rail@y
wenzelm@2658
   823
\advance\rail@jy by \rail@joinhsz
wenzelm@2658
   824
\rail@joval[br]
wenzelm@2658
   825
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   826
\rail@tmpa=\rail@sy
wenzelm@2658
   827
\advance\rail@tmpa by -\rail@joinhsz
wenzelm@2658
   828
\advance\rail@tmpa by -\rail@jy
wenzelm@2658
   829
\rail@jput{\line(0,1){\number\rail@tmpa}}
wenzelm@2658
   830
\rail@jy=\rail@sy
wenzelm@2658
   831
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   832
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   833
\rail@joval[tl]
wenzelm@2658
   834
\advance\rail@jy by \rail@joinhsz
wenzelm@2658
   835
\global\rail@gx=\rail@jx
wenzelm@2658
   836
\global\rail@gy=\rail@jy
wenzelm@2658
   837
\global\rail@gex=\rail@gx
wenzelm@2658
   838
\global\rail@grx=\rail@rx
wenzelm@2658
   839
\endgroup
wenzelm@2658
   840
\fi
wenzelm@2658
   841
}
wenzelm@2658
   842
wenzelm@2658
   843
\def\rail@endplus{
wenzelm@2658
   844
\rail@endalt\rail@plusjoin
wenzelm@2658
   845
}
wenzelm@2658
   846
wenzelm@2658
   847
% \rail@cr{Y} : carriage return to vertical position Y
wenzelm@2658
   848
wenzelm@2658
   849
\def\rail@cr#1{
wenzelm@2658
   850
\rail@tmpa=\rail@sx
wenzelm@2658
   851
\advance\rail@tmpa by \rail@joinsz
wenzelm@2658
   852
\ifnum\rail@x<\rail@tmpa\rail@x=\rail@tmpa\fi
wenzelm@2658
   853
\rail@eline
wenzelm@2658
   854
\rail@jx=\rail@x
wenzelm@2658
   855
\rail@jy=\rail@y
wenzelm@2658
   856
\advance\rail@x by \rail@joinsz
wenzelm@2658
   857
\ifnum\rail@x>\rail@rx\rail@rx=\rail@x\fi
wenzelm@2658
   858
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   859
\rail@joval[tr]
wenzelm@2658
   860
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   861
\rail@sety{#1}
wenzelm@2658
   862
\rail@tmpa=\rail@jy
wenzelm@2658
   863
\advance\rail@tmpa by -\rail@y
wenzelm@2658
   864
\advance\rail@tmpa by -\rail@boxsp
wenzelm@2658
   865
\advance\rail@tmpa by -\rail@joinhsz
wenzelm@2658
   866
\rail@jput{\line(0,-1){\number\rail@tmpa}}
wenzelm@2658
   867
\rail@jy=\rail@y
wenzelm@2658
   868
\advance\rail@jy by \rail@boxsp
wenzelm@2658
   869
\advance\rail@jy by \rail@joinhsz
wenzelm@2658
   870
\advance\rail@jx by -\rail@joinhsz
wenzelm@2658
   871
\rail@joval[br]
wenzelm@2658
   872
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   873
\rail@tmpa=\rail@jx
wenzelm@2658
   874
\advance\rail@tmpa by -\rail@sx
wenzelm@2658
   875
\advance\rail@tmpa by -\rail@joinhsz
wenzelm@2658
   876
\rail@jput{\line(-1,0){\number\rail@tmpa}}
wenzelm@2658
   877
\rail@jx=\rail@sx
wenzelm@2658
   878
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   879
\advance\rail@jy by -\rail@joinhsz
wenzelm@2658
   880
\rail@joval[tl]
wenzelm@2658
   881
\advance\rail@jx by -\rail@joinhsz
wenzelm@2658
   882
\rail@tmpa=\rail@boxsp
wenzelm@2658
   883
\advance\rail@tmpa by -\rail@joinsz
wenzelm@2658
   884
\rail@jput{\line(0,-1){\number\rail@tmpa}}
wenzelm@2658
   885
\advance\rail@jy by -\rail@tmpa
wenzelm@2658
   886
\advance\rail@jx by \rail@joinhsz
wenzelm@2658
   887
\rail@joval[bl]
wenzelm@2658
   888
\rail@x=\rail@jx
wenzelm@2658
   889
\rail@ex=\rail@x
wenzelm@2658
   890
}