1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892
|
%% e-TeX V2.1;0
%% Revision-date: 01-FEB-1999 22:36:22 /PB
%% Revision-history: (at-end)
% The version number in the first line is compared with the corresponding
% element in e-TeX, and an error reported if incompatibility is detected.
% The cycle and revision numbers (that is, the element(s) following the
% period) are not used in this comparison, allowing enhancements to be made to
% this module and recorded in its header without introducing a risk of conflict.
%
% This allows to use this file with e-TeX versions 2.0 and 2.1!
%
% Other files whose headers must be kept in synch include "etexdefs.lib" and
% "language.def".
% This is "etex.src", the (e-TeX) source file for the "etex" format file.
% To build the format from it, use one of the following commands or the
% local equivalent:
% Generic: einitex *etex.src \dump
% emTeX: etex -i *etex.src \dump
% VMS: etex /init /noformat *"etex.src \dump"
% Assume a purely IniTeX environment and set up a minimal \catcode r\'egime
\catcode `\{=1
\catcode `\}=2
\catcode `\#=6
\catcode `\^=7
\catcode `\@=\catcode `\A
% Define the basic error-reporting and abort mechanisms:
\def \et@xmsg #1#2%
{\begingroup
\def \n {^^J}%
\def \ { }%
\newlinechar=\expandafter `\n
\if E#1%
\errorcontextlines=0
\errmessage {e-TeX error: #2}%
\else
\message {\n ! e-TeX \if I#1 message%
\else \if W#1 warning%
\else \if F#1 fatal error%
\else
\ unknown (#1)%
\fi
\fi
\fi: #2%
}%
\fi
\endgroup
}
% Note: a future version may report errors in the %<fac>-<s>-<code>[, <text>]
% format, allowing the more verbose <text>s to be read from file rather than
% stored in the format.
\def \et@xabort #1%
{\et@xmsg {F}{#1}%
\batchmode
\end
}
% Make sure this file is being read by e-TeX in extended mode;
% If it is, prepare to check version/revision compatibility, otherwise abort.
\ifx \undefined \eTeXversion
\et@xabort {this file can be processed only in extended mode;\n
\ \ did you perhaps forget the asterisk?%
}%
\else
\begingroup
\catcode `\%=12
\catcode `\?=14
\xdef \et@xfilehdr
{\detokenize {%% e-TeX V}\the \eTeXversion \eTeXrevision}?
\xdef \et@xlibhdr
{\detokenize {%% e-TeXlib V}\the \eTeXversion \eTeXrevision}?
\endgroup
\fi
% Assume extended mode, but no additional \catcodes/\defs yet;
% set up a simple e-TeX condition-reporting system:
\def \et@xinf #1{\et@xmsg {I}{#1}} %%% not currently used
\def \et@xwarn #1{\et@xmsg {W}{#1}}
\def \et@xerr #1#2{{\errhelp={#2}\et@xmsg {E}{#1}}}
% deactivate the processing of patterns and exceptions; these will be
% reinstated later, after the \uselanguage mechanism has been defined.
\let \et@xpatterns=\patterns
\def \patterns
{\begingroup
\everyeof={\fi \endgroup}%
\message {[skipping from \noexpand \patterns to end-of-file...]}%
\iffalse
}
% Read "plain.tex" (\patterns & \hyphenation will be skipped)
\input plain
% restore the catcode of commercial-at (@), which will just have been clobbered
\catcode `\@=\catcode `\A
% Assume an extended Plain environment (i.e. there are no longer any
% restrictions on the coding techniques we can use). First prepare to
% carry out consistency checks on the file headers and the current e-TeX
% version/revision levels:
\newread \et@xinput
\def \etexhdrchk #1#2%
{\openin \et@xinput=#2
\ifeof \et@xinput
\chardef \etexstatus=0 % V1.0-1
\else
\begingroup
\endlinechar=-1
\readline \et@xinput to \et@xbuf
\closein \et@xinput
\def \p@rtition ##1.##2\endp@rtition {##1}% V2.1%0
\xdef \et@xbuf
{\expandafter \p@rtition \et@xbuf .\endp@rtition}% V2.1;0
\xdef \et@xtmp {\csname et@x#1hdr\endcsname}%
\xdef \et@xtmp
{\expandafter \p@rtition \et@xtmp .\endp@rtition}% V2.1;0
\endgroup
\ifx \et@xtmp \et@xbuf
\chardef \etexstatus=2 % V1.1;4
\else
\chardef \etexstatus=1 % V1.1;4
\fi
\fi
}
% Check the version number of this file:
\def \et@xfmtsrc {etex.src}
\etexhdrchk {file} {\et@xfmtsrc}
\ifcase \etexstatus
\et@xerr {unable to open format source file "\et@xfmtsrc";}
{This should not happen; please ensure that your system
allows a file to be opened for reading more than once
concurrently.%
}%
\or
\et@xwarn {format source file "\et@xfmtsrc" has wrong header;\n
\ \ expected: "\et@xfilehdr"; found: "\et@xbuf";%
}%
{You are using a version of e-TeX which may be incompatible
with the source for the format file you are trying to
compile; please ensure that you have the most recent
version of each. I will proceed, but you should treat
the results with caution...%
}%
\fi
% Module handling now implemented (V1.0-2)
\def \module #1{\iftrue}
\let \endmodule=\fi
\newtoks \et@xtoks
\def \et@xl@@d #1 #2\endl@ad %%% the "#1 #2" code avoids trailing spaces
{\ifcsname module:#1\endcsname
\et@xwarn {duplicate module name "#1"}%
\else
\csname module:#1\endcsname %%% we exploit the side-effect explicitly
\et@xtoks=\expandafter
{\the \et@xtoks
\expandafter \let \csname module:#1\endcsname=\undefined
}%
\fi
}
\def \et@xl@ad #1#2,#3\endl@ad %%% the #1#2 code avoids spurious leading spaces
{\et@xl@@d #1#2 \endl@ad
\if *#3*
\let \n@xt=\relax
\else
\def \n@xt {\et@xl@ad #3\endl@ad}%
\fi
\n@xt
}
\def \et@xload #1 %%% needed because of the embedded \ifs...
{\def \module ##1%
{\unless
\ifcsname module:##1\endcsname
\message {Skipping module "##1";}%
\else
\message {Loading module "##1";}%
}%
\input #1
\def \module ##1{\iftrue}%
}
\def \load #1 from #2 %%% selective module loading from an e-TeX library file
{\etexhdrchk {lib} {#2}%
\ifcase \etexstatus
\et@xerr {unable to open library file "#2"; load aborted.}
{I got an <eof> on trying to open your library file;
please make sure it exists, is readable and is not locked.%
}%
\or
\et@xerr {library file "#2" has wrong header;\n
\ \ expected: "\et@xlibhdr"; found: "\et@xbuf";\n
\ \ load aborted.%
}%
{The first line of your library does not start with
the correct e-TeX header; you may need to update the
file to be compatible with the current version of
e-TeX, or you may simply have specified the wrong file.%
}%
\else
\et@xtoks={\et@xtoks={}}%
\et@xl@ad #1,\endl@ad
\et@xload {#2}
\the \et@xtoks
\fi
}
\load interactionmodes from etexdefs.lib %%% \load <foo>[, <bar>...] from <baz>
\def \@sk #1#2#3%
{\ifnum \interactionmode=\interactionmodes {errorstop} %%% V2.0;15
\def \pr@mpt {\csname #1 \endcsname}%
\edef \pr@mptloop {{\escapechar=-1 \global \readline 16 to \pr@mpt}}%
\loop \pr@mptloop
\ch@ckforyn \pr@mpt {#2}%
\ifb@dresponse
\message {Please answer Y[es] or N[o]}%
\repeat
\else
\def \pr@mpt {#3}%
\ch@ckforyn \pr@mpt {#2}%
\fi
}
\def \ch@ckforyn #1#2% Bernd Raichle's improved version, V1.0-1
{\edef \@nswer {#1}%
\def \p@rse ##1##2\endp@rse
{\lowercase {\if y##1}\b@dresponsefalse \csname #2true\endcsname
\else \lowercase {\if n##1}\b@dresponsefalse \csname #2false\endcsname
\else
\b@dresponsetrue
\fi
\fi
}%
\expandafter \p@rse \@nswer \endp@rse
}
\def \usef@llback %%% V1.0-3
{\message {Using fallback mode (USenglish)}%
\addlanguage {USenglish}{hyphen}{}{2}{3}%
}
% OK, that's all the utilities defined; on with the real work:
% First, re-instate \patterns:
\let \patterns=\et@xpatterns
% Define the language-handling commands
\def \et@xlang {\csname newlanguage\endcsname}
\def \uselanguage #1%
{\ifcsname lang@#1\endcsname
\language=\csname lang@#1\endcsname
\lefthyphenmin=\csname lhm@#1\endcsname
\righthyphenmin=\csname rhm@#1\endcsname
\ifdefined \uselanguage@hook % V1.0-1
\uselanguage@hook {#1}% % V1.0-1
\fi
\else
\et@xerr {language #1 undefined.}%
{You are trying to use a language which has not previously
been defined; remember that any language you want to use
will need to have been specified at the time the format
was created.%
}%
\fi
}
\def \addlanguage #1#2#3#4#5% language patterns exceptions lhm rhm
{\expandafter \et@xlang \csname lang@#1\endcsname
\expandafter \chardef \csname lhm@#1\endcsname=#4 % V1.0-1
\expandafter \chardef \csname rhm@#1\endcsname=#5 % V1.0-1
\uselanguage {#1}%
\input #2
\if *#3*\else \input #3 \fi
\ifdefined \addlanguage@hook % V1.0-4
\addlanguage@hook {#1}% % V1.0-4
\fi
\edef \fmtversion {\fmtversion/#1}%
}
% Decrement \count 19, because \newlanguage will increment it again
\advance \count 19 by -1
% We are about to try to process a user/site-specific file "language.def",
% which establishes a Babel-like language selection environment. Since
% there is always a risk of a spurious file of that name being found,
% we look for an e-TeX header in the first line. If the file can be opened,
% but doesn't have the right header, we interrogate the user as to whether
% to use fallback mode; in this mode, we simply establish USenglish as the
% sole language, with the et@x patterns, exceptions and left- and right-
% hyphen minima for TeX. If we can't interrogate the user (e.g. not in
% \errorstopmode), or if the user elects not to use fallback, we abort;
% if the file can't be found/opened, we use fallback unconditionally.
\newif \ifb@dresponse
\newif \ifusef@llback
\def \l@ngdefnfile {language.def}
\etexhdrchk {file} {\l@ngdefnfile}
\ifcase \etexstatus
\et@xwarn {unable to open file "\l@ngdefnfile";}%
\usef@llback % unable to open "language.def"
\or
\et@xwarn {file "\l@ngdefnfile" has wrong header;\n
\ \ expected: "\et@xfilehdr"; found: "\et@xbuf";%
}%
\@sk {Use fallback?} {usef@llback} {y}%
\ifusef@llback
\usef@llback
\else
\input \l@ngdefnfile % use "language.def" after warning
\fi
\else
\input \l@ngdefnfile % "language.def" open & valid
\fi
% All that was just to set up natural language handling...
% The "real" work of "etex.src", however, is to augment the non-primitives
% of Plain.TeX to incorporate e-TeX specific features, and to add new
% non-primitives to simplify access to new e-TeX specific primitives.
\message {Augmenting the Plain TeX definitions:}
\message {\string \tracingall;}
\def \tracingall
{\tracingonline=\@ne
\tracingcommands=\thr@@ % plain.tex has \tw@
\tracingstats=\tw@
\tracingpages=\@ne
\tracingoutput=\@ne
\tracinglostchars=\tw@ % plain.tex has \@ne
\tracingmacros=\tw@
\tracingparagraphs=\@ne
\tracingrestores=\@ne
\showboxbreadth=\maxdimen
\showboxdepth=\maxdimen
\errorstopmode
\tracinggroups=\@ne
\tracingifs=\@ne
\tracingscantokens=\@ne
\tracingnesting=\@ne
\tracingassigns=\tw@
}
\message {Adding new e-TeX definitions:}
\message {\string \eTeX,}
\def \eTeX {$\varepsilon$-\TeX} %%% the simple version, not suitable for maths;
%%% a more sophisticated one may find its way
%%% into "etexdefs.lib" in due course.
\message {\string \loggingall,}
\def \loggingall {\tracingall \tracingonline=\z@}
\message {\string \tracingnone,}
\def \tracingnone
{\tracingassigns=\z@
\tracingnesting=\z@
\tracingscantokens=\z@
\tracingifs=\z@
\tracinggroups=\z@
\showboxdepth=\thr@@
\showboxbreadth=5
\tracingrestores=\z@
\tracingparagraphs=\z@
\tracingmacros=\z@
\tracinglostchars=\@ne
\tracingoutput=\z@
\tracingpages=\z@
\tracingstats=\z@
\tracingcommands=\z@
\tracingonline=\z@
}
\message {register allocation;}
\newcount \et@xins % our insertion counter (\insc@unt is used differently)
% We have to adjust the Plain TeX register allocation counts for our
% slightly modified book-keeping:
\advance \count 10 by 1 % \count 10=23 % allocates \count registers 23, 24, ...
\advance \count 11 by 1 % \count 11=10 % allocates \dimen registers 10, 11, ...
\advance \count 12 by 1 % \count 12=10 % allocates \skip registers 10, 11, ...
\advance \count 13 by 1 % \count 13=10 % allocates \muskip registers 10, 11, ...
\advance \count 14 by 1 % \count 14=10 % allocates \box registers 10, 11, ...
\advance \count 15 by 1 % \count 15=10 % allocates \toks registers 10, 11, ...
\advance \count 16 by 1 % \count 16=0 % allocates input streams 0, 1, ...
\advance \count 17 by 1 % \count 17=0 % allocates output streams 0, 1, ...
\advance \count 18 by 1 % \count 18=4 % allocates math families 4, 5, ...
\advance \count 19 by 1 % \count 19=0 % allocates \language codes 0, 1, ...
\et@xins=\insc@unt % \et@xins=255 % allocates insertions 254, 253, ...
% We don't change the Plain TeX definitions of \newcount, etc., but the
% \alloc@ macro doing the actual work is redefined.
% When the normal register pool for \count, \dimen, \skip, \muskip,
% \box, or \toks registers is exhausted, we switch to the extended pool.
\def \alloc@ #1#2#3#4#5%
{\ifnum \count 1#1 < #4% make sure there's still room
\allocationnumber=\count 1#1
\global \advance \count 1#1 by \@ne
\global #3#5=\allocationnumber
\wlog {\string #5=\string #2\the \allocationnumber}%
\else \ifnum #1 < 6
\begingroup \escapechar=\m@ne
\expandafter \alloc@@ \expandafter {\string #2}#5%
\else
\errmessage {No room for a new #2}%
\fi
\fi
}
% The \expandafter construction used here allows the generation of
% \newcount and \globcount from #1=count. Moreover (and more important)
% this construction avoids the appearance of \outer macros inside
% macro definitions or conditionals.
\def \alloc@@ #1#2%
{\endgroup % restore \escapechar
\message {Normal \csname#1\endcsname register pool exhausted,
switching to extended pool.}%
\global \expandafter
\let \csname new#1\expandafter \endcsname \csname glob#1\endcsname
\csname new#1\endcsname#2%
}
% We do change the Plain TeX definition of \newinsert
\outer \def \newinsert #1%make sure there's still room for ...
{\ch@ck 0 \et@xins \count % ... a \count, ...
{\ch@ck 1 \et@xins \dimen % ... \dimen, ...
{\ch@ck 2 \et@xins \skip % ... \skip, ...
{\ch@ck 4 \et@xins \box % ... and \box register
{\global \advance \et@xins by \m@ne
\unless
\ifnum \insc@unt < \et@xins
\global \insc@unt=\et@xins
\fi
\allocationnumber=\et@xins
\global \chardef #1=\allocationnumber
\wlog {\string #1=\string \insert \the \allocationnumber}%
}%
}%
}%
}%
}
\def \ch@ck #1#2#3#4%
{\ifnum \count 1#1 < #2#4\else \errmessage {No room for a new #3}\fi}
% And we define \reserveinserts, so that you can say \reserveinserts{17}
% in order to reserve room for up to 17 additional insertion classes that will
% not be taken away by \newcount, \newdimen, \newskip, or \newbox.
\outer \def \reserveinserts#1%
{\global \insc@unt=\numexpr \et@xins \ifnum #1 > \z@ -#1\fi \relax}
\message {extended register allocation;}
% Now, we define \globcount, \globbox, etc., so that you can say
% \globcount\foo and \foo will be defined (with \countdef) to be the
% next count register from the vastly larger but somewhat less efficient
% extended register pool. We also define \loccount, etc., but these
% register definitions are local to the current group.
\count 260=277 % globally allocates \count registers 277, 278, ...
\count 261=\@cclvi % globally allocates \dimen registers 256, 257, ...
\count 262=\@cclvi % globally allocates \skip registers 256, 257, ...
\count 263=\@cclvi % globally allocates \muskip registers 256, 257, ...
\count 264=\@cclvi % globally allocates \box registers 256, 257, ...
\count 265=\@cclvi % globally allocates \toks registers 256, 257, ...
\count 266=\@ne % globally allocates \marks classes 1, 2, ...
\def \et@xmaxregs {32768}
\count 270=\et@xmaxregs % locally allocates \count registers 32767, 32766, ...
\count 271=\et@xmaxregs % ditto for \dimen registers
\count 272=\et@xmaxregs % ditto for \skip registers
\count 273=\et@xmaxregs % ditto for \muskip registers
\count 274=\et@xmaxregs % ditto for \box registers
\count 275=\et@xmaxregs % ditto for \toks registers
\count 276=\et@xmaxregs % ditto for \marks classes
% \count registers 256-259 and 267-269 are not (yet) used
\outer \def \globcount {\et@xglob 0 \count \countdef}
\def \loccount {\et@xloc 0 \count \countdef}
\outer \def \globdimen {\et@xglob 1 \dimen \dimendef}
\def \locdimen {\et@xloc 1 \dimen \dimendef}
\outer \def \globskip {\et@xglob 2 \skip \skipdef}
\def \locskip {\et@xloc 2 \skip \skipdef}
\outer \def \globmuskip {\et@xglob 3 \muskip \muskipdef}
\def \locmuskip {\et@xloc 3 \muskip \muskipdef}
\outer \def \globbox {\et@xglob 4 \box \mathchardef}
\def \locbox {\et@xloc 4 \box \mathchardef}
\outer \def \globtoks {\et@xglob 5 \toks \toksdef}
\def \loctoks {\et@xloc 5 \toks \toksdef}
\outer \def \globmarks {\et@xglob 6 \marks \mathchardef}
\def \locmarks {\et@xloc 6 \marks \mathchardef}
\let\newmark=\globmarks %%% 2.0;14
\let\newmarks=\globmarks
\def \et@xglob #1#2#3#4%
{\et@xchk #1#2% make sure there's still room
{\allocationnumber=\count 26#1
\global \advance \count 26#1 by \@ne
\global #3#4=\allocationnumber
\wlog {\string #4=\string #2\the \allocationnumber}%
}%
}
\def \et@xloc#1#2#3#4%
{\et@xchk #1#2% make sure there's still room
{\advance \count 27#1 by \m@ne
\allocationnumber=\count 27#1
#3#4=\allocationnumber
\wlog {\string #4=\string #2\the \allocationnumber \space (local)}%
}%
}
\def \et@xchk #1#2#3%
{\ifnum \count 26#1 < \count 27#1
#3%
\else
\errmessage {No room for a new #2}%
\fi
}
% Next we define \globcountblk, \loccountblk, etc., so that one can
% write \globcountblk\foo{17} and \foo will be defined (with \mathchardef)
% as the first (the zeroth?) of a block of 17 consecutive registers.
% Thus the user is intended to reference elements <\foo+0> to <\foo+n-1>,
% where n is the length of the block allocated.
\outer \def \globcountblk {\et@xgblk 0 \count}
\def \loccountblk {\et@xlblk 0 \count}
\outer \def \globdimenblk {\et@xgblk 1 \dimen}
\def \locdimenblk {\et@xlblk 1 \dimen}
\outer \def \globskipblk {\et@xgblk 2 \skip}
\def \locskipblk {\et@xlblk 2 \skip}
\outer \def \globmuskipblk {\et@xgblk 3 \muskip}
\def \locmuskipblk {\et@xlblk 3 \muskip}
\outer \def \globboxblk {\et@xgblk 4 \box}
\def \locboxblk {\et@xlblk 4 \box}
\outer \def \globtoksblk {\et@xgblk 5 \toks}
\def \loctoksblk {\et@xlblk 5 \toks}
\outer \def \globmarksblk {\et@xgblk 6 \marks}
\def \locmarksblk {\et@xlblk 6 \marks}
% And, both to provide a higher-level interface to the block allocation
% scheme, and to demonstrate possible applications of the new \...expr
% primitives, we also define \globcountvector and \loccountvector (etc)
% which allow the user to access elements with embedded arithmetic, as in
% \globcountvector \foo {12}
% \foo {\count 0 + 3} = \foo {\count 1 * 2}
\outer \def \globcountvector {\et@xgvec 0 \count}
\def \loccountvector {\et@xlvec 0 \count}
\outer \def \globdimenvector {\et@xgvec 1 \dimen}
\def \locdimenvector {\et@xlvec 1 \dimen}
\outer \def \globskipvector {\et@xgvec 2 \skip}
\def \locskipvector {\et@xlvec 2 \skip}
\outer \def \globmuskipvector {\et@xgvec 3 \muskip}
\def \locmuskipvector {\et@xlvec 3 \muskip}
\outer \def \globboxvector {\et@xgvec 4 \box}
\def \locboxvector {\et@xlvec 4 \box}
\outer \def \globtoksvector {\et@xgvec 5 \toks}
\def \loctoksvector {\et@xlvec 5 \toks}
\outer \def \globmarksvector {\et@xgvec 6 \marks}
\def \locmarksvector {\et@xlvec 6 \marks}
\def \et@xgblk #1#2#3#4%
{\et@xchkblk #1#2{#4}% make sure there's still room
{\allocationnumber=\count 26#1
\global \advance \count 26#1 by #4%
\global \mathchardef #3=\allocationnumber
\wlog {\string #3=\string #2blk{\number #4} at \the \allocationnumber}%
}%
}
\def \et@xlblk #1#2#3#4%
{\et@xchkblk #1#2{#4}% make sure there's still room
{\advance \count 27#1 by -#4%
\allocationnumber=\count 27#1
\mathchardef #3=\allocationnumber
\wlog {\string #3=\string #2blk{\number #4}
at \the \allocationnumber \space (local)%
}%
}%
}
\begingroup
\catcode `\# = 12
\gdef \et@xhash {#}
\endgroup
\def \et@xgvec #1#2#3#4%
{\et@xchkblk #1#2{#4}% make sure there's still room
{\allocationnumber=\count 26#1
\global \advance \count 26#1 by #4%
\ifx #2\box
\def \2{}%
\else \ifx #2\marks
\def \2{}%
\else
\def \2{\string #2}%
\fi
\fi
\xdef #3##1{\2 \noexpand \numexpr \the \allocationnumber+##1\relax}%
\wlog {\string #3 {\et@xhash 1} =
\2 {\the \allocationnumber+\et@xhash 1} (global #2 vector)%
}%
}%
}
\def \et@xlvec #1#2#3#4%
{\et@xchkblk #1#2{#4}% make sure there's still room
{\advance \count 27#1 by -#4%
\allocationnumber=\count27#1
\mathchardef #3=\allocationnumber
\ifx #2\box
\def \2{}%
\else \ifx #2\marks
\def \2{}%
\else
\def \2{\string #2}%
\fi
\fi
\edef #3##1{\2 \noexpand \numexpr \the \allocationnumber+##1\relax}%
\wlog {\string #3 {\et@xhash 1} =
\2 {\the \allocationnumber+\et@xhash 1} (local #2 vector)%
}%
}%
}
\def \et@xchkblk #1#2#3#4%
{\ifnum #3 < \z@
\errmessage {Negative register block size \number #3}%
\else \ifnum \numexpr \count 26#1+#3 > \count 27#1
\errmessage {No room for new #2block of size \number#3}%
\else
#4%
\fi
\fi
}
% In an attempt to reduce the overheads of e-TeX, we recycle all possible
% resources, including (as a penultimate step) the recycler itself...
% The user can circumvent (or force) this during format creation,
% by \letting \ifrecycle=\iffalse (or \iftrue, to force it).
% As this file has grown by accretion, it is possible that we are no
% longer recycling all the resources we could; this will be investigated.
\def \mayber@cycle {\expandafter \ifrecycle}
\def \forcer@cycle {\expandafter \iftrue}
\ifdefined \ifrecycle
\mayber@cycle
\else
\forcer@cycle
\fi
% There's a concealed \if... lurking here, which explains the
% strange indentation of the code that follows (V1.0-1)
\def \r@cycle #1%
{\ifdefined #1
\message {\string #1,}\let #1=\und@fined
\else
\message {\string #1 (not defined),}
\fi
}
{\newlinechar=`\! \message {!Recycling:}}
\r@cycle \addlanguage
\r@cycle \@nswer
\r@cycle \@sk
\r@cycle \b@dresponsetrue
\r@cycle \b@dresponsefalse
\r@cycle \ch@ckforyn
\r@cycle \mayber@cycle
\r@cycle \et@xabort
\r@cycle \et@xbuf
\r@cycle \et@xfmtsrc
\r@cycle \et@xfilehdr
\r@cycle \et@xinf
\r@cycle \et@xpatterns
% \r@cycle \ifb@dresponse
% \r@cycle \ifusef@llback
\r@cycle \l@ngdefnfile
\r@cycle \n@xt
\r@cycle \p@rse
\r@cycle \pr@mpt
\r@cycle \pr@mptloop
\r@cycle \forcer@cycle
\r@cycle \usef@llback
\r@cycle \usef@llbacktrue
\r@cycle \usef@llbackfalse
% The following are retained, since they may be needed by user code; with a few
% (regrettable) exceptions, all of these are given the \etex or \et@x prefix,
% to reduce as far as possible the risk of them clashing with other used-defined
% names.
% The e-TeX team are willing to change the names of the remaining, at-risk,
% control sequences if it is demonstrated that the current names cause problems
% or difficulties.
\def \r@tain #1%
{\ifdefined #1
\message {\string #1,}
\else
\message {\string #1 (not defined),}
\fi
}
{\newlinechar=`\! \message {!Retaining:}}
\r@tain \et@xerr
\r@tain \et@xinput
\r@tain \et@xlibhdr
\r@tain \et@xmsg
\r@tain \et@xtoks
\r@tain \et@xwarn
\r@tain \et@xl@@d
\r@tain \et@xl@ad
\r@tain \et@xload
\r@tain \et@xlang
\r@tain \et@xhash
\r@tain \eTeX
\r@tain \etexhdrchk
% \r@tain \endmodule
\r@tain \etexstatus
\r@tain \module
\r@tain \uselanguage
\r@cycle \r@tain
\r@cycle \r@cycle
\fi
% And finally re-catcode commercial-at
\catcode `\@=12
\endinput
%% Revision-history:
01-FEB-1999: 2.1;0 Allow file to be used with e-TeX versions 2.0 and 2.1
25-MAR-1998: 2.0;19 Improved log message for \{glob|loc}{marks|box}vector (PEB)
24-MAR-1998: 2.0;18 Optimisation of one section made (DC & PEB),
a couple of \if tests made more robust,
and spacing improved in one macro.
24-MAR-1998: 2.0;17 Coding styles unified and all references to Peter
Breitenlohner eliminated from main code
23-MAR-1998: 2.0;16 Continued from 2.0;15
20-MAR-1998: 2.0;15 Changes made here and in "etexdefs.lib" to
improve compatibility with LaTeX, and
\{glob,loc}{marks,box}vector re-thought.
11-MAR-1998: 2.0;14 \newmark made synonym for \newmarks / PT
10-MAR-1998: 2.0;13 Missing brace re-inserted in \...lvec /PT
10-MAR-1998: 2.0;12 Typo corrected in Peter's name /PT
10-MAR-1998: 2.0;11 "\...lvec" failed to use \et@xhash; fixed / PT
10-MAR-1998: 2.0;10 \h@sh -> \et@xhash /PT
06-MAR-1998: 2.0;9 Final tweaks by PEB !
05-MAR-1998: <missing version number> Final tweaks by PT
28-Feb-1998: 2.0;8 Major re-work by PEB
24-Feb-1998: 2.0;7 \tracingnesting -> \tw@
24-FEB-1998: 2.0;6 version-mismatch reduced in severity;
\tracingall and ...none improved;
aesthetic spaces around "=" removed
24-Jan-1998: 2.0;5: block allocation of registers added
21-Jan-1998: 2.0;4: released to e-TeX team for testing/comments
20-Jan-1998: \glob... implemented, and coding simplified by
the implementation and use of of \max@xpr
06-Jan-1998: Alpha-testing complete of extended and local register allocation.
29-Dec-1997: The "%!" convention replaced by a corresponding "%%":
this should avoid any inadvertent conflict with Adobe conventions.
\tracingall augmented with
\tracinglostchars=\tw@ %%% Q -- should this be default?
\tracingnesting=\@ne
\tracingnone augmented.
05-DEC-1997: A long-standing bug removed: left- and right- hyphenmin
were transposed in fallback mode :-(((((
24-APR-1997: An interim release, to provide compatibility with Peter's
naming conventions for beta-test versions of e-TeX V2.
Consistency checking is now restricted to \eTeXversion,
and \eTeXrevision is ignored.
01-NOV-1996: V1.1;5: Final stage? Checking that everything possible
is recycled whilst nothing that is needed is lost. Retained
names given \etex or \et@x prefix wherever possible. Some
potentially dangerous cs-names commented out of the recycle/retain
lists because they were synonyms of members of the if-else-fi set.
The definition of the e-TeX logo added: this had somehow slipped
through the net! Intended to be the final revision before public
release, but awaiting comments from other members of the team.
31-OCT-1996: V1.1;4: errors noticed while proof-reading corrected; far
greater use made of concealed control sequences with
commercial-at (@); library file headers differentiated
from ordinary file headers; return-values for header-check
altered to allow fall-thru' if ok; fallback-use algorithm
significantly modified (major semantic shift).
29-OCT-1996: V1.1;3: tidying up prior to release; careful check on
which control words can be re-cycled; \recycle made more
robust, to check whether one is trying to re-cycle something
that was never 'cycled' in the first place (PEB suggestion);
\et@xmsg re-written to use \message or \errmessage as necessary;
\errhelps provided for all places they might be referenced.
27-OCT-1996: V1.1;2: minor version numbers re-introduced, using semi-colon
as delimiter and stopping pattern matching at the semi-colon;
\et@xfilehdr defined dynamically, based in \eTeXversion and
\eTeXrevision; \load now uses \etexhdrchk, so library
files are required to start with an e-TeX header; this will
have implications when e-TeX -> V2+, so this code should be
re-considered at this point.
17-OCT-1996: V1.1: minor version numbers eliminated, to reduce the
need for users to update their "language.def" files.
17-OCT-1996: V1.0-4: \addlanguage@hook added, version history moved to end.
17-OCT-1996: Version 1.0-3 does away with the "fallback" file.
16-OCT-1996: Version 1.0-2 implements module handling, so constant "3"
no longer used (see below).
13-Oct-1996: Replaced \def by \chardef where possible;
eliminated dependency on "etexdefs.def", hard-coding
in the constant "3" (with comment) instead;
used Bernd's \ch@ckforyn;
re-catcoded `\@ earlier, to reduce number of \[if]csnames;
commented the strange indentation of the \recycles at end.
11-Oct-1996: language handling commands modified (V1.0): PT/BR
|