doc-src/rail.sty
changeset 13044 c049910774cb
parent 8591 9d660fc42916
equal deleted inserted replaced
13043:ad1828b479b7 13044:c049910774cb
     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
   190 %
   201 %
   191 % \railnamefont{TEXT} : set rule name format setup to TEXT
   202 % \railnamefont{TEXT} : set rule name format setup to TEXT
   192 %
   203 %
   193 % \railindexfont{TEXT} : set index entry format setup to TEXT
   204 % \railindexfont{TEXT} : set index entry format setup to TEXT
   194 
   205 
   195 \def\rail@tokenfont{\ttfamily\upshape}
       
   196 \def\rail@termfont{\ttfamily\upshape}
   206 \def\rail@termfont{\ttfamily\upshape}
   197 \def\rail@nontfont{\rmfamily\upshape}
   207 \def\rail@nontfont{\rmfamily\upshape}
   198 \def\rail@annofont{\rmfamily\itshape}
   208 \def\rail@annofont{\rmfamily\itshape}
   199 \def\rail@namefont{\rmfamily\itshape}
   209 \def\rail@namefont{\rmfamily\itshape}
   200 \def\rail@indexfont{\rmfamily\itshape}
   210 \def\rail@indexfont{\rmfamily\itshape}
   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 }
   376 % \rail@tmpa : temporary count
   417 % \rail@tmpa : temporary count
   377 % \rail@tmpb : temporary count
   418 % \rail@tmpb : temporary count
   378 % \rail@tmpc : temporary count
   419 % \rail@tmpc : temporary count
   379 %
   420 %
   380 % \rail@put : put at (\rail@x,\rail@y)
   421 % \rail@put : put at (\rail@x,\rail@y)
       
   422 % \rail@vput : put vector at (\rail@x,\rail@y)
   381 %
   423 %
   382 % \rail@eline : end line by drawing from \rail@ex to \rail@x
   424 % \rail@eline : end line by drawing from \rail@ex to \rail@x
       
   425 %
       
   426 % \rail@vreline : end line by drawing a vector from \rail@x to \rail@ex
       
   427 %
       
   428 % \rail@vleline : end line by drawing a vector from \rail@ex to \rail@x
   383 %
   429 %
   384 % \rail@sety{LEVEL} : set \rail@y to level LEVEL
   430 % \rail@sety{LEVEL} : set \rail@y to level LEVEL
   385 
   431 
   386 \newcount\rail@x
   432 \newcount\rail@x
   387 \newcount\rail@y
   433 \newcount\rail@y
   393 \newcount\rail@tmpb
   439 \newcount\rail@tmpb
   394 \newcount\rail@tmpc
   440 \newcount\rail@tmpc
   395 
   441 
   396 \def\rail@put{\put(\number\rail@x,\number\rail@y)}
   442 \def\rail@put{\put(\number\rail@x,\number\rail@y)}
   397 
   443 
       
   444 \def\rail@vput{\put(\number\rail@ex,\number\rail@y)}
       
   445 
   398 \def\rail@eline{
   446 \def\rail@eline{
   399 \rail@tmpb=\rail@x
   447 \rail@tmpb=\rail@x
   400 \advance\rail@tmpb by -\rail@ex
   448 \advance\rail@tmpb by -\rail@ex
   401 \rail@put{\line(-1,0){\number\rail@tmpb}}
   449 \rail@put{\line(-1,0){\number\rail@tmpb}}
   402 }
   450 }
   403 
   451 
       
   452 \def\rail@vreline{
       
   453 \rail@tmpb=\rail@x
       
   454 \advance\rail@tmpb by -\rail@ex
       
   455 \rail@vput{\vector(1,0){\number\rail@tmpb}}
       
   456 }
       
   457 
       
   458 \def\rail@vleline{
       
   459 \rail@tmpb=\rail@x
       
   460 \advance\rail@tmpb by -\rail@ex
       
   461 \rail@put{\vector(-1,0){\number\rail@tmpb}}
       
   462 }
       
   463 
   404 \def\rail@sety#1{
   464 \def\rail@sety#1{
   405 \rail@y=#1
   465 \rail@y=#1
   406 \multiply\rail@y by -\rail@boxsp
   466 \multiply\rail@y by -\rail@boxsp
   407 \advance\rail@y by -\rail@boxht
   467 \advance\rail@y by -\rail@boxht
   408 }
   468 }
   412 % \rail@end : end a railroad diagram
   472 % \rail@end : end a railroad diagram
   413 %
   473 %
   414 % \rail@expand{IDENT} : expand IDENT
   474 % \rail@expand{IDENT} : expand IDENT
   415 
   475 
   416 \def\rail@begin#1#2{
   476 \def\rail@begin#1#2{
   417 \item[]
   477 \item
   418 \begin{minipage}[t]{\linewidth}
   478 \begin{minipage}[t]{\linewidth}
   419 \ifx\@empty#2\else
   479 \ifx\@empty#2\else
   420 {\rail@namefont \rail@expand{#2}}\\*[\railnamesep]
   480 {\rail@namefont \rail@expand{#2}}\\*[\railnamesep]
   421 \fi
   481 \fi
   422 \unitlength=\railunit
   482 \unitlength=\railunit
   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