| author | wenzelm | 
| Thu, 23 Jul 2015 14:20:51 +0200 | |
| changeset 60769 | cf7f3465eaf1 | 
| parent 42660 | e40648514b34 | 
| permissions | -rw-r--r-- | 
| 2658 | 1 | % rail.sty - style file to support railroad diagrams | 
| 2 | % | |
| 3 | % 09-Jul-90 L. Rooijakkers | |
| 13044 | 4 | % 08-Oct-90 L. Rooijakkers fixed centering bug when \rail@tmpc<0. | 
| 5 | % 07-Feb-91 L. Rooijakkers added \railoptions command, indexing | |
| 6 | % 08-Feb-91 L. Rooijakkers minor fixes | |
| 7 | % 28-Jun-94 K. Barthelmann turned into LaTeX2e package | |
| 8 | % 08-Dec-96 K. Barthelmann replaced \@writefile | |
| 9 | % 13-Dec-96 K. Barthelmann cleanup | |
| 10 | % 22-Feb-98 K. Barthelmann fixed catcodes of special characters | |
| 11 | % 18-Apr-98 K. Barthelmann fixed \par handling | |
| 12 | % 19-May-98 J. Olsson Added new macros to support arrow heads. | |
| 13 | % 26-Jul-98 K. Barthelmann changed \par to output newlines | |
| 42632 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 14 | % 02-May-11 M. Wenzel default setup for Isabelle | 
| 2658 | 15 | % | 
| 16 | % This style file needs to be used in conjunction with the 'rail' | |
| 17 | % program. Running LaTeX as 'latex file' produces file.rai, which should be | |
| 18 | % processed by Rail with 'rail file'. This produces file.rao, which will | |
| 19 | % be picked up by LaTeX on the next 'latex file' run. | |
| 20 | % | |
| 21 | % LaTeX will warn if there is no file.rao or it's out of date. | |
| 22 | % | |
| 23 | % The macros in this file thus consist of two parts: those that read and | |
| 24 | % write the .rai and .rao files, and those that do the actual formatting | |
| 25 | % of the railroad diagrams. | |
| 26 | ||
| 3097 | 27 | \NeedsTeXFormat{LaTeX2e}
 | 
| 13044 | 28 | \ProvidesPackage{rail}[1998/05/19]
 | 
| 2658 | 29 | |
| 30 | % railroad diagram formatting parameters (user level) | |
| 31 | % all of these are copied into their internal versions by \railinit | |
| 32 | % | |
| 33 | % \railunit : \unitlength within railroad diagrams | |
| 34 | % \railextra : extra length at outside of diagram | |
| 35 | % \railboxheight : height of ovals and frames | |
| 36 | % \railboxskip : vertical space between lines | |
| 37 | % \railboxleft : space to the left of a box | |
| 38 | % \railboxright : space to the right of a box | |
| 39 | % \railovalspace : extra space around contents of oval | |
| 40 | % \railframespace : extra space around contents of frame | |
| 41 | % \railtextleft : space to the left of text | |
| 42 | % \railtextright : space to the right of text | |
| 43 | % \railtextup : space to lift text up | |
| 44 | % \railjoinsize : circle size of join/split arcs | |
| 45 | % \railjoinadjust : space to adjust join | |
| 46 | % | |
| 47 | % \railnamesep : separator between name and rule body | |
| 48 | ||
| 3097 | 49 | \newlength\railunit | 
| 50 | \newlength\railextra | |
| 51 | \newlength\railboxheight | |
| 52 | \newlength\railboxskip | |
| 53 | \newlength\railboxleft | |
| 54 | \newlength\railboxright | |
| 55 | \newlength\railovalspace | |
| 56 | \newlength\railframespace | |
| 57 | \newlength\railtextleft | |
| 58 | \newlength\railtextright | |
| 59 | \newlength\railtextup | |
| 60 | \newlength\railjoinsize | |
| 61 | \newlength\railjoinadjust | |
| 62 | \newlength\railnamesep | |
| 63 | ||
| 64 | % initialize the parameters | |
| 65 | ||
| 66 | \setlength\railunit{1sp}
 | |
| 67 | \setlength\railextra{4ex}
 | |
| 68 | \setlength\railboxleft{1ex}
 | |
| 69 | \setlength\railboxright{1ex}
 | |
| 70 | \setlength\railovalspace{2ex}
 | |
| 71 | \setlength\railframespace{2ex}
 | |
| 72 | \setlength\railtextleft{1ex}
 | |
| 73 | \setlength\railtextright{1ex}
 | |
| 74 | \setlength\railjoinadjust{0pt}
 | |
| 75 | \setlength\railnamesep{1ex}
 | |
| 76 | ||
| 77 | \DeclareOption{10pt}{
 | |
| 78 |   \setlength\railboxheight{16pt}
 | |
| 79 |   \setlength\railboxskip{24pt}
 | |
| 80 |   \setlength\railtextup{5pt}
 | |
| 81 |   \setlength\railjoinsize{16pt}
 | |
| 82 | } | |
| 83 | \DeclareOption{11pt}{
 | |
| 84 |   \setlength\railboxheight{16pt}
 | |
| 85 |   \setlength\railboxskip{24pt}
 | |
| 86 |   \setlength\railtextup{5pt}
 | |
| 87 |   \setlength\railjoinsize{16pt}
 | |
| 88 | } | |
| 89 | \DeclareOption{12pt}{
 | |
| 90 |   \setlength\railboxheight{20pt}
 | |
| 91 |   \setlength\railboxskip{28pt}
 | |
| 92 |   \setlength\railtextup{6pt}
 | |
| 93 |   \setlength\railjoinsize{20pt}
 | |
| 94 | } | |
| 95 | ||
| 96 | \ExecuteOptions{10pt}
 | |
| 97 | \ProcessOptions | |
| 2658 | 98 | |
| 99 | % internal versions of the formatting parameters | |
| 100 | % | |
| 101 | % \rail@extra : \railextra | |
| 102 | % \rail@boxht : \railboxheight | |
| 103 | % \rail@boxsp : \railboxskip | |
| 104 | % \rail@boxlf : \railboxleft | |
| 105 | % \rail@boxrt : \railboxright | |
| 106 | % \rail@boxhht : \railboxheight / 2 | |
| 107 | % \rail@ovalsp : \railovalspace | |
| 108 | % \rail@framesp : \railframespace | |
| 8591 | 109 | % \rail@textlf : \railtextleft | 
| 110 | % \rail@textrt : \railtextright | |
| 111 | % \rail@textup : \railtextup | |
| 2658 | 112 | % \rail@joinsz : \railjoinsize | 
| 113 | % \rail@joinhsz : \railjoinsize / 2 | |
| 114 | % \rail@joinadj : \railjoinadjust | |
| 115 | % | |
| 116 | % \railinit : internalize all of the parameters. | |
| 117 | ||
| 118 | \newcount\rail@extra | |
| 119 | \newcount\rail@boxht | |
| 120 | \newcount\rail@boxsp | |
| 121 | \newcount\rail@boxlf | |
| 122 | \newcount\rail@boxrt | |
| 123 | \newcount\rail@boxhht | |
| 124 | \newcount\rail@ovalsp | |
| 125 | \newcount\rail@framesp | |
| 126 | \newcount\rail@textlf | |
| 127 | \newcount\rail@textrt | |
| 128 | \newcount\rail@textup | |
| 129 | \newcount\rail@joinsz | |
| 130 | \newcount\rail@joinhsz | |
| 131 | \newcount\rail@joinadj | |
| 132 | ||
| 3097 | 133 | \newcommand\railinit{
 | 
| 2658 | 134 | \rail@extra=\railextra | 
| 135 | \divide\rail@extra by \railunit | |
| 136 | \rail@boxht=\railboxheight | |
| 137 | \divide\rail@boxht by \railunit | |
| 138 | \rail@boxsp=\railboxskip | |
| 139 | \divide\rail@boxsp by \railunit | |
| 140 | \rail@boxlf=\railboxleft | |
| 141 | \divide\rail@boxlf by \railunit | |
| 142 | \rail@boxrt=\railboxright | |
| 143 | \divide\rail@boxrt by \railunit | |
| 144 | \rail@boxhht=\railboxheight | |
| 145 | \divide\rail@boxhht by \railunit | |
| 146 | \divide\rail@boxhht by 2 | |
| 147 | \rail@ovalsp=\railovalspace | |
| 148 | \divide\rail@ovalsp by \railunit | |
| 149 | \rail@framesp=\railframespace | |
| 150 | \divide\rail@framesp by \railunit | |
| 151 | \rail@textlf=\railtextleft | |
| 152 | \divide\rail@textlf by \railunit | |
| 153 | \rail@textrt=\railtextright | |
| 154 | \divide\rail@textrt by \railunit | |
| 155 | \rail@textup=\railtextup | |
| 156 | \divide\rail@textup by \railunit | |
| 157 | \rail@joinsz=\railjoinsize | |
| 158 | \divide\rail@joinsz by \railunit | |
| 159 | \rail@joinhsz=\railjoinsize | |
| 160 | \divide\rail@joinhsz by \railunit | |
| 161 | \divide\rail@joinhsz by 2 | |
| 162 | \rail@joinadj=\railjoinadjust | |
| 163 | \divide\rail@joinadj by \railunit | |
| 164 | } | |
| 165 | ||
| 3097 | 166 | \AtBeginDocument{\railinit}
 | 
| 167 | ||
| 168 | % \rail@param : declarations for list environment | |
| 169 | % | |
| 170 | % \railparam{TEXT} : sets \rail@param to TEXT
 | |
| 13044 | 171 | % | 
| 172 | % \rail@reserved : characters reserved for grammar | |
| 3097 | 173 | |
| 174 | \newcommand\railparam[1]{
 | |
| 13044 | 175 | \def\rail@param{
 | 
| 176 |   \setlength\leftmargin{0pt}\setlength\rightmargin{0pt}
 | |
| 177 |   \setlength\labelwidth{0pt}\setlength\labelsep{0pt}
 | |
| 178 |   \setlength\itemindent{0pt}\setlength\listparindent{0pt}
 | |
| 179 | #1 | |
| 3097 | 180 | } | 
| 13044 | 181 | } | 
| 182 | \railparam{}
 | |
| 2658 | 183 | |
| 13044 | 184 | \newtoks\rail@reserved | 
| 185 | \rail@reserved={:;|*+?[]()'"}
 | |
| 186 | ||
| 3097 | 187 | % \rail@termfont : format setup for terminals | 
| 188 | % | |
| 189 | % \rail@nontfont : format setup for nonterminals | |
| 190 | % | |
| 191 | % \rail@annofont : format setup for annotations | |
| 192 | % | |
| 193 | % \rail@rulefont : format setup for rule names | |
| 194 | % | |
| 195 | % \rail@indexfont : format setup for index entry | |
| 196 | % | |
| 197 | % \railtermfont{TEXT} : set terminal format setup to TEXT
 | |
| 198 | % | |
| 199 | % \railnontermfont{TEXT} : set nonterminal format setup to TEXT
 | |
| 200 | % | |
| 201 | % \railannotatefont{TEXT} : set annotation format setup to TEXT
 | |
| 202 | % | |
| 203 | % \railnamefont{TEXT} : set rule name format setup to TEXT
 | |
| 204 | % | |
| 205 | % \railindexfont{TEXT} : set index entry format setup to TEXT
 | |
| 206 | ||
| 207 | \def\rail@termfont{\ttfamily\upshape}
 | |
| 208 | \def\rail@nontfont{\rmfamily\upshape}
 | |
| 209 | \def\rail@annofont{\rmfamily\itshape}
 | |
| 210 | \def\rail@namefont{\rmfamily\itshape}
 | |
| 211 | \def\rail@indexfont{\rmfamily\itshape}
 | |
| 212 | ||
| 213 | \newcommand\railtermfont[1]{
 | |
| 214 | \def\rail@termfont{#1}
 | |
| 215 | } | |
| 216 | ||
| 217 | \newcommand\railnontermfont[1]{
 | |
| 218 | \def\rail@nontfont{#1}
 | |
| 219 | } | |
| 220 | ||
| 221 | \newcommand\railannotatefont[1]{
 | |
| 222 | \def\rail@annofont{#1}
 | |
| 223 | } | |
| 224 | ||
| 225 | \newcommand\railnamefont[1]{
 | |
| 226 | \def\rail@namefont{#1}
 | |
| 227 | } | |
| 228 | ||
| 229 | \newcommand\railindexfont[1]{
 | |
| 230 | \def\rail@indexfont{#1}
 | |
| 231 | } | |
| 2658 | 232 | |
| 3097 | 233 | % railroad read/write macros | 
| 234 | % | |
| 235 | % \begin{rail} TEXT \end{rail} : TEXT is written out to the .rai file,
 | |
| 236 | %                                as \rail@i{NR}{TEXT}. Then the matching
 | |
| 237 | %                                \rail@o{NR}{FMT} from the .rao file is
 | |
| 238 | % executed (if defined). | |
| 239 | % | |
| 240 | % \railoptions{OPTIONS} : OPTIONS are written out to the .rai file,
 | |
| 241 | %                         as \rail@p{OPTIONS}.
 | |
| 242 | % | |
| 243 | % \railterm{IDENT,IDENT,...} : format IDENT as terminals. writes out
 | |
| 244 | %                              \rail@t{IDENT} to the .rai file
 | |
| 245 | % | |
| 246 | % \railalias{IDENT}{TEXT} : format IDENT as TEXT. defines \rail@t@IDENT as
 | |
| 247 | % TEXT. | |
| 248 | % | |
| 13044 | 249 | % \railtoken{IDENT}{TEXT} : abbreviates \railalias{IDENT}{TEXT}\railterm{IDENT}
 | 
| 250 | % (for backward compatibility) | |
| 251 | % | |
| 252 | % \rail@setcodes : guards special characters | |
| 253 | % | |
| 254 | % \rail@makeother{CHARACTER} : sets \catcode of CHARACTER to "other"
 | |
| 255 | % used inside a loop for \rail@setcodes | |
| 256 | % | |
| 3097 | 257 | % \rail@nr : railroad diagram counter | 
| 258 | % | |
| 259 | % \ifrail@match : current \rail@i{NR}{TEXT} matches
 | |
| 260 | % | |
| 8591 | 261 | % \rail@first : actions to be done first. read in .rao file, | 
| 3097 | 262 | % open .rai file if \@filesw true, undefine \rail@first. | 
| 13044 | 263 | %               executed from \begin{rail}, \railoptions and \railterm.
 | 
| 3097 | 264 | % | 
| 265 | % \rail@i{NR}{TEXT} : defines \rail@i@NR as TEXT. written to the .rai
 | |
| 266 | % file by \rail, read from the .rao file by | |
| 267 | % \rail@first | |
| 268 | % | |
| 269 | % \rail@t{IDENT} : tells Rail that IDENT is to be custom formatted,
 | |
| 270 | % written to the .rai file by \railterm. | |
| 271 | % | |
| 272 | % \rail@o{NR}{TEXT} : defines \rail@o@NR as TEXT, read from the .rao
 | |
| 273 | % file by \rail@first. | |
| 274 | % | |
| 275 | % \rail@p{OPTIONS} : pass options to rail, written to the .rai file by
 | |
| 276 | % \railoptions | |
| 277 | % | |
| 278 | % \rail@write{TEXT} : write TEXT to the .rai file
 | |
| 279 | % | |
| 280 | % \rail@warn : warn user for mismatching diagrams | |
| 281 | % | |
| 282 | % \rail@endwarn : either \relax or \rail@warn | |
| 283 | % | |
| 284 | % \ifrail@all : checked at the end of the document | |
| 285 | ||
| 13044 | 286 | \def\rail@makeother#1{
 | 
| 287 | \expandafter\catcode\expandafter`\csname\string #1\endcsname=12 | |
| 288 | } | |
| 289 | ||
| 290 | \def\rail@setcodes{
 | |
| 291 | \let\par=\relax | |
| 292 | \let\\=\relax | |
| 293 | \expandafter\@tfor\expandafter\rail@symbol\expandafter:\expandafter=% | |
| 294 | \the\rail@reserved | |
| 295 | \do{\expandafter\rail@makeother\rail@symbol}
 | |
| 296 | } | |
| 297 | ||
| 3097 | 298 | \newcount\rail@nr | 
| 299 | ||
| 300 | \newif\ifrail@all | |
| 301 | \rail@alltrue | |
| 302 | ||
| 303 | \newif\ifrail@match | |
| 304 | ||
| 305 | \def\rail@first{
 | |
| 13044 | 306 | \begingroup | 
| 3097 | 307 | \makeatletter | 
| 13044 | 308 | \rail@setcodes | 
| 3097 | 309 | \InputIfFileExists{\jobname.rao}{}{\PackageInfo{rail}{No file \jobname.rao}}
 | 
| 310 | \makeatother | |
| 13044 | 311 | \endgroup | 
| 3097 | 312 | \if@filesw | 
| 313 | \newwrite\tf@rai | |
| 314 | \immediate\openout\tf@rai=\jobname.rai | |
| 2658 | 315 | \fi | 
| 3097 | 316 | \global\let\rail@first=\relax | 
| 317 | } | |
| 2658 | 318 | |
| 3097 | 319 | \long\def\rail@body#1\end{
 | 
| 13044 | 320 | {
 | 
| 321 | \newlinechar=`^^J | |
| 322 | \def\par{\string\par^^J}
 | |
| 323 | \rail@write{\string\rail@i{\number\rail@nr}{#1}}
 | |
| 324 | } | |
| 3097 | 325 | \xdef\rail@i@{#1}
 | 
| 326 | \end | |
| 327 | } | |
| 328 | ||
| 329 | \newenvironment{rail}{
 | |
| 330 | \global\advance\rail@nr by 1 | |
| 331 | \rail@first | |
| 13044 | 332 | \begingroup | 
| 333 | \rail@setcodes | |
| 3097 | 334 | \rail@body | 
| 335 | }{
 | |
| 13044 | 336 | \endgroup | 
| 3097 | 337 | \rail@matchtrue | 
| 338 | \@ifundefined{rail@o@\number\rail@nr}{\rail@matchfalse}{}
 | |
| 339 | \expandafter\ifx\csname rail@i@\number\rail@nr\endcsname\rail@i@ | |
| 340 | \else | |
| 341 | \rail@matchfalse | |
| 342 | \fi | |
| 343 | \ifrail@match | |
| 344 | \csname rail@o@\number\rail@nr\endcsname | |
| 345 | \else | |
| 346 | \PackageWarning{rail}{Railroad diagram {\number\rail@nr} doesn't match}
 | |
| 347 | \global\let\rail@endwarn=\rail@warn | |
| 348 | \begin{list}{}{\rail@param}
 | |
| 349 | \rail@begin{1}{}
 | |
| 350 | \rail@setbox{\bfseries ???}
 | |
| 351 | \rail@oval | |
| 352 | \rail@end | |
| 353 | \end{list}
 | |
| 354 | \fi | |
| 355 | } | |
| 356 | ||
| 357 | \newcommand\railoptions[1]{
 | |
| 358 | \rail@first | |
| 359 | \rail@write{\string\rail@p{#1}}
 | |
| 360 | } | |
| 361 | ||
| 362 | \newcommand\railterm[1]{
 | |
| 363 | \rail@first | |
| 364 | \@for\rail@@:=#1\do{
 | |
| 365 | \rail@write{\string\rail@t{\rail@@}}
 | |
| 366 | } | |
| 367 | } | |
| 368 | ||
| 369 | \newcommand\railalias[2]{
 | |
| 370 | \expandafter\def\csname rail@t@#1\endcsname{#2}
 | |
| 371 | } | |
| 372 | ||
| 13044 | 373 | \newcommand\railtoken[2]{\railalias{#1}{#2}\railterm{#1}}
 | 
| 374 | ||
| 3097 | 375 | \long\def\rail@i#1#2{
 | 
| 376 | \expandafter\gdef\csname rail@i@#1\endcsname{#2}
 | |
| 377 | } | |
| 378 | ||
| 379 | \def\rail@o#1#2{
 | |
| 380 | \expandafter\gdef\csname rail@o@#1\endcsname{
 | |
| 13044 | 381 | \begin{list}{}{\rail@param}
 | 
| 382 | #2 | |
| 383 | \end{list}
 | |
| 3097 | 384 | } | 
| 385 | } | |
| 386 | ||
| 387 | \def\rail@t#1{}
 | |
| 388 | ||
| 389 | \def\rail@p#1{}
 | |
| 390 | ||
| 13044 | 391 | \long\def\rail@write#1{\@ifundefined{tf@rai}{}{\immediate\write\tf@rai{#1}}}
 | 
| 3097 | 392 | |
| 393 | \def\rail@warn{
 | |
| 394 | \PackageWarningNoLine{rail}{Railroad diagram(s) may have changed.
 | |
| 395 | Use 'rail' and rerun} | |
| 396 | } | |
| 397 | ||
| 398 | \let\rail@endwarn=\relax | |
| 399 | ||
| 400 | \AtEndDocument{\rail@endwarn}
 | |
| 401 | ||
| 402 | % index entry macro | |
| 403 | % | |
| 404 | % \rail@index{IDENT} : add index entry for IDENT
 | |
| 405 | ||
| 406 | \def\rail@index#1{
 | |
| 407 | \index{\rail@indexfont#1}
 | |
| 408 | } | |
| 2658 | 409 | |
| 410 | % railroad formatting primitives | |
| 411 | % | |
| 412 | % \rail@x : current x | |
| 413 | % \rail@y : current y | |
| 414 | % \rail@ex : current end x | |
| 415 | % \rail@sx : starting x for \rail@cr | |
| 416 | % \rail@rx : rightmost previous x for \rail@cr | |
| 417 | % | |
| 418 | % \rail@tmpa : temporary count | |
| 419 | % \rail@tmpb : temporary count | |
| 420 | % \rail@tmpc : temporary count | |
| 421 | % | |
| 422 | % \rail@put : put at (\rail@x,\rail@y) | |
| 13044 | 423 | % \rail@vput : put vector at (\rail@x,\rail@y) | 
| 2658 | 424 | % | 
| 425 | % \rail@eline : end line by drawing from \rail@ex to \rail@x | |
| 426 | % | |
| 13044 | 427 | % \rail@vreline : end line by drawing a vector from \rail@x to \rail@ex | 
| 428 | % | |
| 429 | % \rail@vleline : end line by drawing a vector from \rail@ex to \rail@x | |
| 430 | % | |
| 2658 | 431 | % \rail@sety{LEVEL} : set \rail@y to level LEVEL
 | 
| 432 | ||
| 433 | \newcount\rail@x | |
| 434 | \newcount\rail@y | |
| 435 | \newcount\rail@ex | |
| 436 | \newcount\rail@sx | |
| 437 | \newcount\rail@rx | |
| 438 | ||
| 439 | \newcount\rail@tmpa | |
| 440 | \newcount\rail@tmpb | |
| 441 | \newcount\rail@tmpc | |
| 442 | ||
| 443 | \def\rail@put{\put(\number\rail@x,\number\rail@y)}
 | |
| 444 | ||
| 13044 | 445 | \def\rail@vput{\put(\number\rail@ex,\number\rail@y)}
 | 
| 446 | ||
| 2658 | 447 | \def\rail@eline{
 | 
| 448 | \rail@tmpb=\rail@x | |
| 449 | \advance\rail@tmpb by -\rail@ex | |
| 450 | \rail@put{\line(-1,0){\number\rail@tmpb}}
 | |
| 451 | } | |
| 452 | ||
| 13044 | 453 | \def\rail@vreline{
 | 
| 454 | \rail@tmpb=\rail@x | |
| 455 | \advance\rail@tmpb by -\rail@ex | |
| 456 | \rail@vput{\vector(1,0){\number\rail@tmpb}}
 | |
| 457 | } | |
| 458 | ||
| 459 | \def\rail@vleline{
 | |
| 460 | \rail@tmpb=\rail@x | |
| 461 | \advance\rail@tmpb by -\rail@ex | |
| 462 | \rail@put{\vector(-1,0){\number\rail@tmpb}}
 | |
| 463 | } | |
| 464 | ||
| 2658 | 465 | \def\rail@sety#1{
 | 
| 466 | \rail@y=#1 | |
| 467 | \multiply\rail@y by -\rail@boxsp | |
| 468 | \advance\rail@y by -\rail@boxht | |
| 469 | } | |
| 470 | ||
| 471 | % \rail@begin{HEIGHT}{NAME} : begin a railroad diagram of height HEIGHT
 | |
| 472 | % | |
| 473 | % \rail@end : end a railroad diagram | |
| 3097 | 474 | % | 
| 475 | % \rail@expand{IDENT} : expand IDENT
 | |
| 2658 | 476 | |
| 477 | \def\rail@begin#1#2{
 | |
| 13044 | 478 | \item | 
| 3097 | 479 | \begin{minipage}[t]{\linewidth}
 | 
| 2658 | 480 | \ifx\@empty#2\else | 
| 3097 | 481 | {\rail@namefont \rail@expand{#2}}\\*[\railnamesep]
 | 
| 2658 | 482 | \fi | 
| 483 | \unitlength=\railunit | |
| 484 | \rail@tmpa=#1 | |
| 485 | \multiply\rail@tmpa by \rail@boxsp | |
| 486 | \begin{picture}(0,\number\rail@tmpa)(0,-\number\rail@tmpa)
 | |
| 487 | \rail@ex=0 | |
| 488 | \rail@rx=0 | |
| 489 | \rail@x=\rail@extra | |
| 490 | \rail@sx=\rail@x | |
| 491 | \rail@sety{0}
 | |
| 492 | } | |
| 493 | ||
| 494 | \def\rail@end{
 | |
| 495 | \advance\rail@x by \rail@extra | |
| 496 | \rail@eline | |
| 497 | \end{picture}
 | |
| 3097 | 498 | \end{minipage}
 | 
| 2658 | 499 | } | 
| 500 | ||
| 13044 | 501 | \def\rail@vend{
 | 
| 502 | \advance\rail@x by \rail@extra | |
| 503 | \rail@vreline | |
| 504 | \end{picture}
 | |
| 505 | \end{minipage}
 | |
| 506 | } | |
| 507 | ||
| 3097 | 508 | \def\rail@expand#1{\@ifundefined{rail@t@#1}{#1}{\csname rail@t@#1\endcsname}}
 | 
| 2658 | 509 | |
| 3097 | 510 | % \rail@token{TEXT}[ANNOT] : format token TEXT with annotation
 | 
| 13044 | 511 | % \rail@ltoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow left
 | 
| 512 | % \rail@rtoken{TEXT}[ANNOT] : format token TEXT with annotation, arrow right
 | |
| 2658 | 513 | % | 
| 3097 | 514 | % \rail@ctoken{TEXT}[ANNOT] : format token TEXT centered with annotation
 | 
| 13044 | 515 | % \rail@lctoken{TEXT}[ANNOT] : format token TEXT centered with annotation, arrow left
 | 
| 516 | % \rail@rctoken{TEXT}[ANNOT] : format token TEXT centered with annotation, arrow right
 | |
| 3097 | 517 | % | 
| 518 | % \rail@nont{TEXT}[ANNOT] : format nonterminal TEXT with annotation
 | |
| 13044 | 519 | % \rail@lnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation, arrow left
 | 
| 520 | % \rail@rnont{TEXT}[ANNOT] : format nonterminal TEXT with annotation. arrow right
 | |
| 2658 | 521 | % | 
| 3097 | 522 | % \rail@cnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation
 | 
| 13044 | 523 | % \rail@lcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation,
 | 
| 524 | % arrow left | |
| 525 | % \rail@rcnont{TEXT}[ANNOT] : format nonterminal TEXT centered with annotation,
 | |
| 526 | % arrow right | |
| 2658 | 527 | % | 
| 3097 | 528 | % \rail@term{TEXT}[ANNOT] : format terminal TEXT with annotation
 | 
| 13044 | 529 | % \rail@lterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow left
 | 
| 530 | % \rail@rterm{TEXT}[ANNOT] : format terminal TEXT with annotation, arrow right
 | |
| 2658 | 531 | % | 
| 3097 | 532 | % \rail@cterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation
 | 
| 13044 | 533 | % \rail@lcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation, arrow left
 | 
| 534 | % \rail@rcterm{TEXT}[ANNOT] : format terminal TEXT centered with annotation,
 | |
| 535 | % arrow right | |
| 2658 | 536 | % | 
| 537 | % \rail@annote[TEXT] : format TEXT as annotation | |
| 538 | ||
| 3097 | 539 | \def\rail@token#1[#2]{
 | 
| 540 | \rail@setbox{%
 | |
| 13044 | 541 | {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
| 2658 | 542 | } | 
| 543 | \rail@oval | |
| 544 | } | |
| 545 | ||
| 13044 | 546 | \def\rail@ltoken#1[#2]{
 | 
| 547 | \rail@setbox{%
 | |
| 548 | {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 549 | } | |
| 550 | \rail@vloval | |
| 551 | } | |
| 552 | ||
| 553 | \def\rail@rtoken#1[#2]{
 | |
| 554 | \rail@setbox{%
 | |
| 555 | {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 556 | } | |
| 557 | \rail@vroval | |
| 558 | } | |
| 559 | ||
| 3097 | 560 | \def\rail@ctoken#1[#2]{
 | 
| 561 | \rail@setbox{%
 | |
| 13044 | 562 | {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | 
| 3097 | 563 | } | 
| 2658 | 564 | \rail@coval | 
| 565 | } | |
| 566 | ||
| 13044 | 567 | \def\rail@lctoken#1[#2]{
 | 
| 568 | \rail@setbox{%
 | |
| 569 | {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 570 | } | |
| 571 | \rail@vlcoval | |
| 572 | } | |
| 573 | ||
| 574 | \def\rail@rctoken#1[#2]{
 | |
| 575 | \rail@setbox{%
 | |
| 576 | {\rail@termfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 577 | } | |
| 578 | \rail@vrcoval | |
| 579 | } | |
| 580 | ||
| 3097 | 581 | \def\rail@nont#1[#2]{
 | 
| 582 | \rail@setbox{%
 | |
| 583 | {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 584 | } | |
| 2658 | 585 | \rail@frame | 
| 586 | } | |
| 587 | ||
| 13044 | 588 | \def\rail@lnont#1[#2]{
 | 
| 589 | \rail@setbox{%
 | |
| 590 | {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 591 | } | |
| 592 | \rail@vlframe | |
| 593 | } | |
| 594 | ||
| 595 | \def\rail@rnont#1[#2]{
 | |
| 596 | \rail@setbox{%
 | |
| 597 | {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 598 | } | |
| 599 | \rail@vrframe | |
| 600 | } | |
| 601 | ||
| 3097 | 602 | \def\rail@cnont#1[#2]{
 | 
| 603 | \rail@setbox{%
 | |
| 604 | {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 605 | } | |
| 2658 | 606 | \rail@cframe | 
| 607 | } | |
| 608 | ||
| 13044 | 609 | \def\rail@lcnont#1[#2]{
 | 
| 610 | \rail@setbox{%
 | |
| 611 | {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 612 | } | |
| 613 | \rail@vlcframe | |
| 614 | } | |
| 615 | ||
| 616 | \def\rail@rcnont#1[#2]{
 | |
| 617 | \rail@setbox{%
 | |
| 618 | {\rail@nontfont \rail@expand{#1}}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 619 | } | |
| 620 | \rail@vrcframe | |
| 621 | } | |
| 622 | ||
| 3097 | 623 | \def\rail@term#1[#2]{
 | 
| 624 | \rail@setbox{%
 | |
| 625 | {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 626 | } | |
| 2658 | 627 | \rail@oval | 
| 628 | } | |
| 629 | ||
| 13044 | 630 | \def\rail@lterm#1[#2]{
 | 
| 631 | \rail@setbox{%
 | |
| 632 | {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 633 | } | |
| 634 | \rail@vloval | |
| 635 | } | |
| 636 | ||
| 637 | \def\rail@rterm#1[#2]{
 | |
| 638 | \rail@setbox{%
 | |
| 639 | {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 640 | } | |
| 641 | \rail@vroval | |
| 642 | } | |
| 643 | ||
| 3097 | 644 | \def\rail@cterm#1[#2]{
 | 
| 645 | \rail@setbox{%
 | |
| 646 | {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 647 | } | |
| 2658 | 648 | \rail@coval | 
| 649 | } | |
| 650 | ||
| 13044 | 651 | \def\rail@lcterm#1[#2]{
 | 
| 652 | \rail@setbox{%
 | |
| 653 | {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 654 | } | |
| 655 | \rail@vlcoval | |
| 656 | } | |
| 657 | ||
| 658 | \def\rail@rcterm#1[#2]{
 | |
| 659 | \rail@setbox{%
 | |
| 660 | {\rail@termfont #1}\ifx\@empty#2\else\ {\rail@annofont #2}\fi
 | |
| 661 | } | |
| 662 | \rail@vrcoval | |
| 663 | } | |
| 664 | ||
| 2658 | 665 | \def\rail@annote[#1]{
 | 
| 666 | \rail@setbox{\rail@annofont #1}
 | |
| 667 | \rail@text | |
| 668 | } | |
| 669 | ||
| 670 | % \rail@box : temporary box for \rail@oval and \rail@frame | |
| 671 | % | |
| 672 | % \rail@setbox{TEXT} : set \rail@box to TEXT, set \rail@tmpa to width
 | |
| 673 | % | |
| 674 | % \rail@oval : format \rail@box of width \rail@tmpa inside an oval | |
| 13044 | 675 | % \rail@vloval : format \rail@box of width \rail@tmpa inside an oval, vector left | 
| 676 | % \rail@vroval : format \rail@box of width \rail@tmpa inside an oval, vector right | |
| 2658 | 677 | % | 
| 678 | % \rail@coval : same as \rail@oval, but centered between \rail@x and | |
| 679 | % \rail@mx | |
| 13044 | 680 | % \rail@vlcoval : same as \rail@oval, but centered between \rail@x and | 
| 681 | % \rail@mx, vector left | |
| 682 | % \rail@vrcoval : same as \rail@oval, but centered between \rail@x and | |
| 683 | % \rail@mx, vector right | |
| 2658 | 684 | % | 
| 685 | % \rail@frame : format \rail@box of width \rail@tmpa inside a frame | |
| 13044 | 686 | % \rail@vlframe : format \rail@box of width \rail@tmpa inside a frame, vector left | 
| 687 | % \rail@vrframe : format \rail@box of width \rail@tmpa inside a frame, vector right | |
| 2658 | 688 | % | 
| 689 | % \rail@cframe : same as \rail@frame, but centered between \rail@x and | |
| 690 | % \rail@mx | |
| 13044 | 691 | % \rail@vlcframe : same as \rail@frame, but centered between \rail@x and | 
| 692 | % \rail@mx, vector left | |
| 693 | % \rail@vrcframe : same as \rail@frame, but centered between \rail@x and | |
| 694 | % \rail@mx, vector right | |
| 2658 | 695 | % | 
| 696 | % \rail@text : format \rail@box of width \rail@tmpa above the line | |
| 697 | ||
| 698 | \newbox\rail@box | |
| 699 | ||
| 700 | \def\rail@setbox#1{
 | |
| 701 | \setbox\rail@box\hbox{\strut#1}
 | |
| 702 | \rail@tmpa=\wd\rail@box | |
| 703 | \divide\rail@tmpa by \railunit | |
| 704 | } | |
| 705 | ||
| 706 | \def\rail@oval{
 | |
| 707 | \advance\rail@x by \rail@boxlf | |
| 708 | \rail@eline | |
| 709 | \advance\rail@tmpa by \rail@ovalsp | |
| 710 | \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi | |
| 711 | \rail@tmpb=\rail@tmpa | |
| 712 | \divide\rail@tmpb by 2 | |
| 713 | \advance\rail@y by -\rail@boxhht | |
| 714 | \rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | |
| 715 | \advance\rail@y by \rail@boxhht | |
| 716 | \advance\rail@x by \rail@tmpb | |
| 717 | \rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
 | |
| 718 | \advance\rail@x by \rail@tmpb | |
| 719 | \rail@ex=\rail@x | |
| 720 | \advance\rail@x by \rail@boxrt | |
| 721 | } | |
| 722 | ||
| 13044 | 723 | \def\rail@vloval{
 | 
| 724 | \advance\rail@x by \rail@boxlf | |
| 725 | \rail@eline | |
| 726 | \advance\rail@tmpa by \rail@ovalsp | |
| 727 | \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi | |
| 728 | \rail@tmpb=\rail@tmpa | |
| 729 | \divide\rail@tmpb by 2 | |
| 730 | \advance\rail@y by -\rail@boxhht | |
| 731 | \rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | |
| 732 | \advance\rail@y by \rail@boxhht | |
| 733 | \advance\rail@x by \rail@tmpb | |
| 734 | \rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
 | |
| 735 | \advance\rail@x by \rail@tmpb | |
| 736 | \rail@ex=\rail@x | |
| 737 | \advance\rail@x by \rail@boxrt | |
| 738 | \rail@vleline | |
| 739 | } | |
| 740 | ||
| 741 | \def\rail@vroval{
 | |
| 742 | \advance\rail@x by \rail@boxlf | |
| 743 | \rail@vreline | |
| 744 | \advance\rail@tmpa by \rail@ovalsp | |
| 745 | \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi | |
| 746 | \rail@tmpb=\rail@tmpa | |
| 747 | \divide\rail@tmpb by 2 | |
| 748 | \advance\rail@y by -\rail@boxhht | |
| 749 | \rail@put{\makebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | |
| 750 | \advance\rail@y by \rail@boxhht | |
| 751 | \advance\rail@x by \rail@tmpb | |
| 752 | \rail@put{\oval(\number\rail@tmpa,\number\rail@boxht)}
 | |
| 753 | \advance\rail@x by \rail@tmpb | |
| 754 | \rail@ex=\rail@x | |
| 755 | \advance\rail@x by \rail@boxrt | |
| 756 | } | |
| 757 | ||
| 2658 | 758 | \def\rail@coval{
 | 
| 759 | \rail@tmpb=\rail@tmpa | |
| 760 | \advance\rail@tmpb by \rail@ovalsp | |
| 761 | \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi | |
| 762 | \advance\rail@tmpb by \rail@boxlf | |
| 763 | \advance\rail@tmpb by \rail@boxrt | |
| 764 | \rail@tmpc=\rail@mx | |
| 765 | \advance\rail@tmpc by -\rail@x | |
| 766 | \advance\rail@tmpc by -\rail@tmpb | |
| 767 | \divide\rail@tmpc by 2 | |
| 768 | \ifnum\rail@tmpc>0 | |
| 769 | \advance\rail@x by \rail@tmpc | |
| 770 | \fi | |
| 771 | \rail@oval | |
| 772 | } | |
| 773 | ||
| 13044 | 774 | \def\rail@vlcoval{
 | 
| 775 | \rail@tmpb=\rail@tmpa | |
| 776 | \advance\rail@tmpb by \rail@ovalsp | |
| 777 | \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi | |
| 778 | \advance\rail@tmpb by \rail@boxlf | |
| 779 | \advance\rail@tmpb by \rail@boxrt | |
| 780 | \rail@tmpc=\rail@mx | |
| 781 | \advance\rail@tmpc by -\rail@x | |
| 782 | \advance\rail@tmpc by -\rail@tmpb | |
| 783 | \divide\rail@tmpc by 2 | |
| 784 | \ifnum\rail@tmpc>0 | |
| 785 | \advance\rail@x by \rail@tmpc | |
| 786 | \fi | |
| 787 | \rail@vloval | |
| 788 | } | |
| 789 | ||
| 790 | \def\rail@vrcoval{
 | |
| 791 | \rail@tmpb=\rail@tmpa | |
| 792 | \advance\rail@tmpb by \rail@ovalsp | |
| 793 | \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi | |
| 794 | \advance\rail@tmpb by \rail@boxlf | |
| 795 | \advance\rail@tmpb by \rail@boxrt | |
| 796 | \rail@tmpc=\rail@mx | |
| 797 | \advance\rail@tmpc by -\rail@x | |
| 798 | \advance\rail@tmpc by -\rail@tmpb | |
| 799 | \divide\rail@tmpc by 2 | |
| 800 | \ifnum\rail@tmpc>0 | |
| 801 | \advance\rail@x by \rail@tmpc | |
| 802 | \fi | |
| 803 | \rail@vroval | |
| 804 | } | |
| 805 | ||
| 2658 | 806 | \def\rail@frame{
 | 
| 807 | \advance\rail@x by \rail@boxlf | |
| 808 | \rail@eline | |
| 809 | \advance\rail@tmpa by \rail@framesp | |
| 810 | \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi | |
| 811 | \advance\rail@y by -\rail@boxhht | |
| 812 | \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | |
| 813 | \advance\rail@y by \rail@boxhht | |
| 814 | \advance\rail@x by \rail@tmpa | |
| 815 | \rail@ex=\rail@x | |
| 816 | \advance\rail@x by \rail@boxrt | |
| 817 | } | |
| 818 | ||
| 13044 | 819 | \def\rail@vlframe{
 | 
| 820 | \advance\rail@x by \rail@boxlf | |
| 821 | \rail@eline | |
| 822 | \advance\rail@tmpa by \rail@framesp | |
| 823 | \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi | |
| 824 | \advance\rail@y by -\rail@boxhht | |
| 825 | \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | |
| 826 | \advance\rail@y by \rail@boxhht | |
| 827 | \advance\rail@x by \rail@tmpa | |
| 828 | \rail@ex=\rail@x | |
| 829 | \advance\rail@x by \rail@boxrt | |
| 830 | \rail@vleline | |
| 831 | } | |
| 832 | ||
| 833 | \def\rail@vrframe{
 | |
| 834 | \advance\rail@x by \rail@boxlf | |
| 835 | \rail@vreline | |
| 836 | \advance\rail@tmpa by \rail@framesp | |
| 837 | \ifnum\rail@tmpa<\rail@boxht\rail@tmpa=\rail@boxht\fi | |
| 838 | \advance\rail@y by -\rail@boxhht | |
| 839 | \rail@put{\framebox(\number\rail@tmpa,\number\rail@boxht){\box\rail@box}}
 | |
| 840 | \advance\rail@y by \rail@boxhht | |
| 841 | \advance\rail@x by \rail@tmpa | |
| 842 | \rail@ex=\rail@x | |
| 843 | \advance\rail@x by \rail@boxrt | |
| 844 | } | |
| 845 | ||
| 2658 | 846 | \def\rail@cframe{
 | 
| 847 | \rail@tmpb=\rail@tmpa | |
| 848 | \advance\rail@tmpb by \rail@framesp | |
| 849 | \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi | |
| 850 | \advance\rail@tmpb by \rail@boxlf | |
| 851 | \advance\rail@tmpb by \rail@boxrt | |
| 852 | \rail@tmpc=\rail@mx | |
| 853 | \advance\rail@tmpc by -\rail@x | |
| 854 | \advance\rail@tmpc by -\rail@tmpb | |
| 855 | \divide\rail@tmpc by 2 | |
| 856 | \ifnum\rail@tmpc>0 | |
| 857 | \advance\rail@x by \rail@tmpc | |
| 858 | \fi | |
| 859 | \rail@frame | |
| 860 | } | |
| 861 | ||
| 13044 | 862 | \def\rail@vlcframe{
 | 
| 863 | \rail@tmpb=\rail@tmpa | |
| 864 | \advance\rail@tmpb by \rail@framesp | |
| 865 | \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi | |
| 866 | \advance\rail@tmpb by \rail@boxlf | |
| 867 | \advance\rail@tmpb by \rail@boxrt | |
| 868 | \rail@tmpc=\rail@mx | |
| 869 | \advance\rail@tmpc by -\rail@x | |
| 870 | \advance\rail@tmpc by -\rail@tmpb | |
| 871 | \divide\rail@tmpc by 2 | |
| 872 | \ifnum\rail@tmpc>0 | |
| 873 | \advance\rail@x by \rail@tmpc | |
| 874 | \fi | |
| 875 | \rail@vlframe | |
| 876 | } | |
| 877 | ||
| 878 | \def\rail@vrcframe{
 | |
| 879 | \rail@tmpb=\rail@tmpa | |
| 880 | \advance\rail@tmpb by \rail@framesp | |
| 881 | \ifnum\rail@tmpb<\rail@boxht\rail@tmpb=\rail@boxht\fi | |
| 882 | \advance\rail@tmpb by \rail@boxlf | |
| 883 | \advance\rail@tmpb by \rail@boxrt | |
| 884 | \rail@tmpc=\rail@mx | |
| 885 | \advance\rail@tmpc by -\rail@x | |
| 886 | \advance\rail@tmpc by -\rail@tmpb | |
| 887 | \divide\rail@tmpc by 2 | |
| 888 | \ifnum\rail@tmpc>0 | |
| 889 | \advance\rail@x by \rail@tmpc | |
| 890 | \fi | |
| 891 | \rail@vrframe | |
| 892 | } | |
| 893 | ||
| 2658 | 894 | \def\rail@text{
 | 
| 895 | \advance\rail@x by \rail@textlf | |
| 896 | \advance\rail@y by \rail@textup | |
| 897 | \rail@put{\box\rail@box}
 | |
| 898 | \advance\rail@y by -\rail@textup | |
| 899 | \advance\rail@x by \rail@tmpa | |
| 900 | \advance\rail@x by \rail@textrt | |
| 901 | } | |
| 902 | ||
| 903 | % alternatives | |
| 904 | % | |
| 905 | % \rail@jx \rail@jy : current join point | |
| 906 | % | |
| 907 | % \rail@gx \rail@gy \rail@gex \rail@grx : global versions of \rail@x etc, | |
| 908 | % to pass values over group closings | |
| 909 | % | |
| 910 | % \rail@mx : maximum x so far | |
| 911 | % | |
| 912 | % \rail@sy : starting \rail@y for alternatives | |
| 913 | % | |
| 914 | % \rail@jput : put at (\rail@jx,\rail@jy) | |
| 915 | % | |
| 916 | % \rail@joval[PART] : put \oval[PART] with adjust | |
| 917 | ||
| 918 | \newcount\rail@jx | |
| 919 | \newcount\rail@jy | |
| 920 | ||
| 921 | \newcount\rail@gx | |
| 922 | \newcount\rail@gy | |
| 923 | \newcount\rail@gex | |
| 924 | \newcount\rail@grx | |
| 925 | ||
| 926 | \newcount\rail@sy | |
| 927 | \newcount\rail@mx | |
| 928 | ||
| 929 | \def\rail@jput{
 | |
| 930 | \put(\number\rail@jx,\number\rail@jy) | |
| 931 | } | |
| 932 | ||
| 933 | \def\rail@joval[#1]{
 | |
| 934 | \advance\rail@jx by \rail@joinadj | |
| 935 | \rail@jput{\oval(\number\rail@joinsz,\number\rail@joinsz)[#1]}
 | |
| 936 | \advance\rail@jx by -\rail@joinadj | |
| 937 | } | |
| 938 | ||
| 939 | % \rail@barsplit : incoming split for '|' | |
| 940 | % | |
| 941 | % \rail@plussplit : incoming split for '+' | |
| 942 | % | |
| 943 | ||
| 944 | \def\rail@barsplit{
 | |
| 945 | \advance\rail@jy by -\rail@joinhsz | |
| 946 | \rail@joval[tr] | |
| 947 | \advance\rail@jx by \rail@joinhsz | |
| 948 | } | |
| 949 | ||
| 950 | \def\rail@plussplit{
 | |
| 951 | \advance\rail@jy by -\rail@joinhsz | |
| 952 | \advance\rail@jx by \rail@joinsz | |
| 953 | \rail@joval[tl] | |
| 954 | \advance\rail@jx by -\rail@joinhsz | |
| 955 | } | |
| 956 | ||
| 957 | % \rail@alt{SPLIT} : start alternatives with incoming split SPLIT
 | |
| 958 | % | |
| 959 | ||
| 960 | \def\rail@alt#1{
 | |
| 961 | \rail@sy=\rail@y | |
| 962 | \rail@jx=\rail@x | |
| 963 | \rail@jy=\rail@y | |
| 964 | \advance\rail@x by \rail@joinsz | |
| 965 | \rail@mx=0 | |
| 966 | \let\rail@list=\@empty | |
| 967 | \let\rail@comma=\@empty | |
| 968 | \let\rail@split=#1 | |
| 969 | \begingroup | |
| 970 | \rail@sx=\rail@x | |
| 971 | \rail@rx=0 | |
| 972 | } | |
| 973 | ||
| 974 | % \rail@nextalt{FIX}{Y} : start next alternative at vertical position Y
 | |
| 975 | % and fix-up FIX | |
| 976 | % | |
| 977 | ||
| 978 | \def\rail@nextalt#1#2{
 | |
| 979 | \global\rail@gx=\rail@x | |
| 980 | \global\rail@gy=\rail@y | |
| 981 | \global\rail@gex=\rail@ex | |
| 982 | \global\rail@grx=\rail@rx | |
| 983 | \endgroup | |
| 984 | #1 | |
| 985 | \ifnum\rail@gx>\rail@mx\rail@mx=\rail@gx\fi | |
| 986 | \ifnum\rail@grx>\rail@mx\rail@mx=\rail@grx\fi | |
| 987 | \edef\rail@list{\rail@list\rail@comma\number\rail@gex:\number\rail@gy}
 | |
| 988 | \def\rail@comma{,}
 | |
| 989 | \rail@split | |
| 990 | \let\rail@split=\@empty | |
| 991 | \rail@sety{#2}
 | |
| 992 | \rail@tmpa=\rail@jy | |
| 993 | \advance\rail@tmpa by -\rail@y | |
| 994 | \advance\rail@tmpa by -\rail@joinhsz | |
| 995 | \rail@jput{\line(0,-1){\number\rail@tmpa}}
 | |
| 996 | \rail@jy=\rail@y | |
| 997 | \advance\rail@jy by \rail@joinhsz | |
| 998 | \advance\rail@jx by \rail@joinhsz | |
| 999 | \rail@joval[bl] | |
| 1000 | \advance\rail@jx by -\rail@joinhsz | |
| 1001 | \rail@ex=\rail@x | |
| 1002 | \begingroup | |
| 1003 | \rail@sx=\rail@x | |
| 1004 | \rail@rx=0 | |
| 1005 | } | |
| 1006 | ||
| 1007 | % \rail@barjoin : outgoing join for first '|' alternative | |
| 1008 | % | |
| 1009 | % \rail@plusjoin : outgoing join for first '+' alternative | |
| 1010 | % | |
| 1011 | % \rail@altjoin : join for subsequent alternative | |
| 1012 | % | |
| 1013 | ||
| 1014 | \def\rail@barjoin{
 | |
| 1015 | \ifnum\rail@y<\rail@sy | |
| 1016 | \global\rail@gex=\rail@jx | |
| 1017 | \else | |
| 1018 | \global\rail@gex=\rail@ex | |
| 1019 | \fi | |
| 1020 | \advance\rail@jy by -\rail@joinhsz | |
| 1021 | \rail@joval[tl] | |
| 1022 | \advance\rail@jx by -\rail@joinhsz | |
| 1023 | \ifnum\rail@y<\rail@sy | |
| 1024 | \rail@altjoin | |
| 1025 | \fi | |
| 1026 | } | |
| 1027 | ||
| 1028 | \def\rail@plusjoin{
 | |
| 1029 | \global\rail@gex=\rail@ex | |
| 1030 | \advance\rail@jy by -\rail@joinhsz | |
| 1031 | \advance\rail@jx by -\rail@joinsz | |
| 1032 | \rail@joval[tr] | |
| 1033 | \advance\rail@jx by \rail@joinhsz | |
| 1034 | } | |
| 1035 | ||
| 1036 | \def\rail@altjoin{
 | |
| 1037 | \rail@eline | |
| 1038 | \rail@tmpa=\rail@jy | |
| 1039 | \advance\rail@tmpa by -\rail@y | |
| 1040 | \advance\rail@tmpa by -\rail@joinhsz | |
| 1041 | \rail@jput{\line(0,-1){\number\rail@tmpa}}
 | |
| 1042 | \rail@jy=\rail@y | |
| 1043 | \advance\rail@jy by \rail@joinhsz | |
| 1044 | \advance\rail@jx by -\rail@joinhsz | |
| 1045 | \rail@joval[br] | |
| 1046 | \advance\rail@jx by \rail@joinhsz | |
| 1047 | } | |
| 1048 | ||
| 1049 | % \rail@eltsplit EX:Y; : split EX:Y into \rail@ex \rail@y | |
| 1050 | % | |
| 1051 | % \rail@endalt{JOIN} : end alternatives with outgoing join JOIN
 | |
| 1052 | ||
| 1053 | \def\rail@eltsplit#1:#2;{\rail@ex=#1\rail@y=#2}
 | |
| 1054 | ||
| 1055 | \def\rail@endalt#1{
 | |
| 1056 | \global\rail@gx=\rail@x | |
| 1057 | \global\rail@gy=\rail@y | |
| 1058 | \global\rail@gex=\rail@ex | |
| 1059 | \global\rail@grx=\rail@rx | |
| 1060 | \endgroup | |
| 1061 | \ifnum\rail@gx>\rail@mx\rail@mx=\rail@gx\fi | |
| 1062 | \ifnum\rail@grx>\rail@mx\rail@mx=\rail@grx\fi | |
| 1063 | \edef\rail@list{\rail@list\rail@comma\number\rail@gex:\number\rail@gy}
 | |
| 1064 | \rail@x=\rail@mx | |
| 1065 | \rail@jx=\rail@x | |
| 1066 | \rail@jy=\rail@sy | |
| 1067 | \advance\rail@jx by \rail@joinsz | |
| 1068 | \let\rail@join=#1 | |
| 1069 | \@for\rail@elt:=\rail@list\do{
 | |
| 1070 | \expandafter\rail@eltsplit\rail@elt; | |
| 1071 | \rail@join | |
| 1072 | \let\rail@join=\rail@altjoin | |
| 1073 | } | |
| 1074 | \rail@x=\rail@mx | |
| 1075 | \rail@y=\rail@sy | |
| 1076 | \rail@ex=\rail@gex | |
| 1077 | \advance\rail@x by \rail@joinsz | |
| 1078 | } | |
| 1079 | ||
| 1080 | % \rail@bar : start '|' alternatives | |
| 1081 | % | |
| 1082 | % \rail@nextbar : next '|' alternative | |
| 1083 | % | |
| 1084 | % \rail@endbar : end '|' alternatives | |
| 1085 | % | |
| 1086 | ||
| 1087 | \def\rail@bar{
 | |
| 1088 | \rail@alt\rail@barsplit | |
| 1089 | } | |
| 1090 | ||
| 1091 | \def\rail@nextbar{
 | |
| 1092 | \rail@nextalt\relax | |
| 1093 | } | |
| 1094 | ||
| 1095 | \def\rail@endbar{
 | |
| 1096 | \rail@endalt\rail@barjoin | |
| 1097 | } | |
| 1098 | ||
| 1099 | % \rail@plus : start '+' alternatives | |
| 1100 | % | |
| 1101 | % \rail@nextplus: next '+' alternative | |
| 1102 | % | |
| 1103 | % \rail@endplus : end '+' alternatives | |
| 1104 | % | |
| 1105 | ||
| 1106 | \def\rail@plus{
 | |
| 1107 | \rail@alt\rail@plussplit | |
| 1108 | } | |
| 1109 | ||
| 1110 | \def\rail@nextplus{
 | |
| 1111 | \rail@nextalt\rail@fixplus | |
| 1112 | } | |
| 1113 | ||
| 1114 | \def\rail@fixplus{
 | |
| 1115 | \ifnum\rail@gy<\rail@sy | |
| 1116 | \begingroup | |
| 1117 | \rail@x=\rail@gx | |
| 1118 | \rail@y=\rail@gy | |
| 1119 | \rail@ex=\rail@gex | |
| 1120 | \rail@rx=\rail@grx | |
| 1121 | \ifnum\rail@x<\rail@rx | |
| 1122 | \rail@x=\rail@rx | |
| 1123 | \fi | |
| 1124 | \rail@eline | |
| 1125 | \rail@jx=\rail@x | |
| 1126 | \rail@jy=\rail@y | |
| 1127 | \advance\rail@jy by \rail@joinhsz | |
| 1128 | \rail@joval[br] | |
| 1129 | \advance\rail@jx by \rail@joinhsz | |
| 1130 | \rail@tmpa=\rail@sy | |
| 1131 | \advance\rail@tmpa by -\rail@joinhsz | |
| 1132 | \advance\rail@tmpa by -\rail@jy | |
| 1133 | \rail@jput{\line(0,1){\number\rail@tmpa}}
 | |
| 1134 | \rail@jy=\rail@sy | |
| 1135 | \advance\rail@jy by -\rail@joinhsz | |
| 1136 | \advance\rail@jx by \rail@joinhsz | |
| 1137 | \rail@joval[tl] | |
| 1138 | \advance\rail@jy by \rail@joinhsz | |
| 1139 | \global\rail@gx=\rail@jx | |
| 1140 | \global\rail@gy=\rail@jy | |
| 1141 | \global\rail@gex=\rail@gx | |
| 1142 | \global\rail@grx=\rail@rx | |
| 1143 | \endgroup | |
| 1144 | \fi | |
| 1145 | } | |
| 1146 | ||
| 1147 | \def\rail@endplus{
 | |
| 1148 | \rail@endalt\rail@plusjoin | |
| 1149 | } | |
| 1150 | ||
| 1151 | % \rail@cr{Y} : carriage return to vertical position Y
 | |
| 1152 | ||
| 1153 | \def\rail@cr#1{
 | |
| 1154 | \rail@tmpa=\rail@sx | |
| 1155 | \advance\rail@tmpa by \rail@joinsz | |
| 1156 | \ifnum\rail@x<\rail@tmpa\rail@x=\rail@tmpa\fi | |
| 1157 | \rail@eline | |
| 1158 | \rail@jx=\rail@x | |
| 1159 | \rail@jy=\rail@y | |
| 1160 | \advance\rail@x by \rail@joinsz | |
| 1161 | \ifnum\rail@x>\rail@rx\rail@rx=\rail@x\fi | |
| 1162 | \advance\rail@jy by -\rail@joinhsz | |
| 1163 | \rail@joval[tr] | |
| 1164 | \advance\rail@jx by \rail@joinhsz | |
| 1165 | \rail@sety{#1}
 | |
| 1166 | \rail@tmpa=\rail@jy | |
| 1167 | \advance\rail@tmpa by -\rail@y | |
| 1168 | \advance\rail@tmpa by -\rail@boxsp | |
| 1169 | \advance\rail@tmpa by -\rail@joinhsz | |
| 1170 | \rail@jput{\line(0,-1){\number\rail@tmpa}}
 | |
| 1171 | \rail@jy=\rail@y | |
| 1172 | \advance\rail@jy by \rail@boxsp | |
| 1173 | \advance\rail@jy by \rail@joinhsz | |
| 1174 | \advance\rail@jx by -\rail@joinhsz | |
| 1175 | \rail@joval[br] | |
| 1176 | \advance\rail@jy by -\rail@joinhsz | |
| 1177 | \rail@tmpa=\rail@jx | |
| 1178 | \advance\rail@tmpa by -\rail@sx | |
| 1179 | \advance\rail@tmpa by -\rail@joinhsz | |
| 1180 | \rail@jput{\line(-1,0){\number\rail@tmpa}}
 | |
| 1181 | \rail@jx=\rail@sx | |
| 1182 | \advance\rail@jx by \rail@joinhsz | |
| 1183 | \advance\rail@jy by -\rail@joinhsz | |
| 1184 | \rail@joval[tl] | |
| 1185 | \advance\rail@jx by -\rail@joinhsz | |
| 1186 | \rail@tmpa=\rail@boxsp | |
| 1187 | \advance\rail@tmpa by -\rail@joinsz | |
| 1188 | \rail@jput{\line(0,-1){\number\rail@tmpa}}
 | |
| 1189 | \advance\rail@jy by -\rail@tmpa | |
| 1190 | \advance\rail@jx by \rail@joinhsz | |
| 1191 | \rail@joval[bl] | |
| 1192 | \rail@x=\rail@jx | |
| 1193 | \rail@ex=\rail@x | |
| 1194 | } | |
| 42632 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1195 | |
| 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1196 | % default setup for Isabelle | 
| 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1197 | \newenvironment{railoutput}%
 | 
| 42660 
e40648514b34
final \makeatother -- catcodes appear to be global;
 wenzelm parents: 
42632diff
changeset | 1198 | {\begin{list}{}{\rail@param}\def\rail@expand{\relax}\makeatletter}{\makeatother\end{list}}
 | 
| 42632 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1199 | |
| 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1200 | \def\rail@termfont{\isabellestyle{tt}}
 | 
| 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1201 | \def\rail@nontfont{\isabellestyle{it}}
 | 
| 
ebec0c1a5984
just one railsetup.sty which is shipped with the official distribution to accompany @{rail} in Pure;
 wenzelm parents: 
13044diff
changeset | 1202 | \def\rail@namefont{\isabellestyle{it}}
 |