diff options
Diffstat (limited to 'Build/source/texk/web2c/etexdir')
26 files changed, 14811 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/etexdir/ChangeLog b/Build/source/texk/web2c/etexdir/ChangeLog new file mode 100644 index 00000000000..eb53fb8052c --- /dev/null +++ b/Build/source/texk/web2c/etexdir/ChangeLog @@ -0,0 +1,271 @@ +2005-08-03 Olaf Weber <olaf@infovore.xs4all.nl> + + * tex.ech: Implement -etex switch. + +2004-12-19 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk (etexextra.c): Depends on etexdir/etexextra.h. + + * etex.mk (etex-check): Add TEXMFCNF=../kpathsea to the mltex + test, so the right files are found when the installation is not + yet done. From Peter Breitenlohner <peb@mppmu.mpg.de>. + +2004-10-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Fixed a bug in the revised glue rounding code + (detected by Tigran Aivazian <tigran@aivazian.fsnet.co.uk>). + Version 2.2, dated October 12, 2004. + +2004-09-15 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Fixed a typo in TeX text, found by Giuseppe + Bilotta <bilotta78@hotpop.com>. + +2004-09-06 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Incorporated register recycling bug fix from Bernd + Raichle <bernd@dante.de>. + Final Version 2.2 (hopefully). + + * etrip/etrip.{fot,log,tex,typ}, etrip/etripin.log: + Updated for current version. + + * etex.mk: Modified rule for etex.version. + +2004-08-26 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.mk (etrip): Use etex with "--progname=einitex --ini" or + "--progname=etex". + +2004-08-26 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.fix: Include fix for register recycling bug from Bernd + Raichle <bernd@dante.de>. + +2004-08-25 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etrip/etripman.tex: Updated to Version 2.2 + +2004-08-21 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Version 2.2. + +2004-08-20 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etexextra.in: Peter holds copyright now. + +2004-08-26 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.version: Is from now on a generated file. + + * etexextra.in: renamed from etexextra.h. The current e-TeX + version is substituted from etex.version. Variant of code + supplied by Peter Breitenlohner <peb@mppmu.mpg.de>. + + * etex.mk: Added rules to extract current e-TeX version from + etex.ch and insert into etex.version and etexextra.h. Variant of + code supplied by Peter Breitenlohner <peb@mppmu.mpg.de>. + +2004-08-17 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk, etex.fix: Resurrected etex.fix, there is again a need + to include late-breaking changes. + +2004-07-29 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Somewhat rearrange mixed direction typesetting code + in order to reduce interference between eTeX and pdfTeX change + files. + +2004-07-25 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Reorganize additional command codes for convert + and last_item in order to reduce interference between eTeX and + pdfTeX change files. + +2004-07-23 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch, tex.ch[01], tex.ech: Reorganize handling of banner + string in order to reduce interference between eTeX, pdfTeX, + and web2c change files. + +2004-07-22 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Reorganize handling of additional token types. + This also fixed a bug in error context for additional token list + parameters, introduced by their reorganization. + +2004-07-21 Olaf Weber <olaf@infovore.xs4all.nl> + + * etrip/etripin.log: Update from Preter Breitenlohner. + + * etrip/etrip.tex: Update from Peter Breitenlohner. + + * etrip/etrip.fot: Update from Peter Breitenlohner. + +2004-07-19 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch, tex.ch[01]: Reorganize handling of additional token + list and integer parameters and e-TeX's additional penalties in + order to reduce interference between eTeX, pdfTeX, and web2c + change files. + + * etex.ch: Add a note that this file not only defines etex.web + in terms of changes to be applies to tex.web, but in addition + is used to define pdfetex.web. + + * tex.ech: Add a note that this file is used to construct the + web2c change files for both e-TeX and pdfeTeX. + +2004-07-17 Peter Breitenlohner <peb@mppmu.mpg.de> + + * etex.ch: Towards etex-2.2: Adapt to TeX 3.141592; this is still + somewhat preliminary; do_glue still needs to be adapted to the new + glue rounding algorithm of TeX 3.141592. + Incorporate bug fixes from etex.fix. + + * etex.ch0, etrip/etrip.{fot,tex}, etrip/etripin.log: Adapted + to TeX 3.141592. + + * tex.ch1, tex.ech: Change the xmalloc_array calls to the `new' + interface (from 2001-11-10). + + * etex.ch0, etex.ch1, etex.fix, tex.ch2: Removed. + + * etex.mk: Rewrite build rules for etex.{web,ch}, add + etexdir/etex.mk and remove etex.{ch0,ch1,fix}, tex.ch2. + + * etex.version: add newline. + + * etrip/etrip.log, etrip.diffs: changed due to bug fix. + +2004-07-14 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.fix: Add fix for typo on line 2737 of etex.ch. From Peter + Breitenlohner. + + * etexextra.h: Add BUG_ADDRESS. + +2004-07-04 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk: Move the creation of the format-related links to + format-related install rules; this seems to be a better place for + them, as the links are pointless without the corresponding + formats. Make the install-*-pool rules depend on the pool file in + question. + +2004-07-03 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk: Set up the make rules so that if etex isn't built (by + default) we do not forward from the general to the etex-specific + rules. But the etex-specific rules can be used. + + * etex.mk: Use $(TANGLE), $(TIE) instead ./tangle, ./tie to + support cross-compiling. + +2004-05-10 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk (install-etex-programs): Typo resulted in no etex binary + being installed. + +2004-05-08 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk (install-etex-programs): This rule didn't have a command + attached, so etex didn't get installed. + (install-etex-links): Dont install einitex, evirtex links. + + * etex.mk: Formats are now parked in a subdirectory of + $(web2cdir). + + * etex.mk: Change the .efmt extension to .fmt. One consequence is + that we don't want to build tex.fmt, where we could safely build + tex.efmt. + + * etexextra.h: .efmt -> .fmt. + + * tex.ech: .efmt -> .fmt. + +2004-01-27 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.fix: The assignment to cur_val instead of cur_val_level + would result in \lastnodetype getting confused about what type of + value it was supposed to be. Reported by Hartmut Henkel + <hartmut_henkel@gmx.de>, fix found by Fabrice Popineau + <Fabrice.Popineau@supelec.fr>. + +2003-02-19 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk: Installation of formats is no longer done via + install-data in this file, but just from the install-data -> + install-dumps -> install-fmts in the main Makefile. That way we + can prevent automatic installation with a single change in that + Makefile. + (etex.p): Depend on tangle. + (triptrap): Depend on etrip. + (install-etex-data): Double-colon rule. + (install-data): Combine with install-etex-data. + +2003-02-17 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.ch1: Reduce to banner changes. + + * etex.ch0: Slightly extend the reverted bits here, so they can be + cleared out of etex.ch1 and are now all in one file. + +2003-02-16 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.ch1: Correct the banners, and revert a final few bits of + TeX that use a variable that doesn't exist in e-TeX. + + * etex.ch0: TeX 3.141592 and e-TeX 2.1 require reconciliation. + Revert some of TeX's code to 3.14159 to get e-TeX 2.1 to tangle. + + * etexextra.h: Update banner for 3.141592-2.1. + + * etex.mk (etex.web): Add etex.ch0 and etex.ch1 to build rules. + +2003-02-15 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk: From klibtool to libtool. Based on patches from Albert + Chin-A-Young <china@thewrittenword.com>. + + * etex.mk: Changes to make e-TeX, in extended mode, the engine + under LaTeX2e. + +2003-02-07 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk: Reorganized to match the new Makefile.in. + +2003-01-15 Olaf Weber <olaf@infovore.xs4all.nl> + + * etex.mk (etestenv): Add LC_ALL=C to the etrip environment. + +2002-10-11 Olaf Weber <olaf@infovore.xs4all.nl> + + * tex.ch1: Settle on a text for the not-TeX banner. + +2002-06-02 Olaf Weber <olaf@infovore.xs4all.nl> + + * tex.ch0, tex.ch1: Changes to account for the banner changing + when certain options are specified that make the program + not-strictly TeX. + + * tex.ch2: Commented-out changes deleted. These changes became + active in tex.ch1. + +Mon Feb 01 18:35:30 1999 Peter Breitenlohner <peb@mppmu.mpg.de> + + * Version 2.1 for Web2c Version 7.2 + +Thu Feb 19 18:03:12 1998 Peter Breitenlohner <peb@mppmu.mpg.de> + + * Version 2.0 for Web2c Version 7.2 + +Sat Aug 23 14:14:12 1997 Peter Breitenlohner <peb@mppmu.mpg.de> + + * Integrated e-TeX Version 1.1 into Web2c Version 7.0 + (by Karl Berry, as of Feb 7 1997. + + All e-TeX (and e-TRIP) source files as well as a Makefile fragment + are in a separate directory: web2c/etexdir. This will certainly make + it easier to switch to e-TeX Version 2. diff --git a/Build/source/texk/web2c/etexdir/INSTALL b/Build/source/texk/web2c/etexdir/INSTALL new file mode 100644 index 00000000000..71579017187 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/INSTALL @@ -0,0 +1,98 @@ +Contents: + +Installation + Additional `configure' options + Additional targets + Trip, etrip, trap, and mptrap: Torture tests + + +Installation +************ + + Installing e-TeX requires that you have already installed the Web2c +source tree (either `web-7.2.tar.gz' and `web2c-7.2.tar.gz' with +`web2c-7.2' as top-level directory, or `texk-7.2.tar.gz' with `texk-7.2'). +See web2c/INSTALL for details. + +Unpack the distribution file `web2c-7.2-etex-2.0.tar.gz' in the parent of +the top-level directory. If necessary move the directory +`<top_level>/web2c/etexdir' containing all e-TeX files into your source +tree. Then (re-)configure the whole source tree. + +You will also need some e-TeX specific files in the TDS tree. Change to +to the TDS root (`<texmf>') and unpack the distribution file +`etexlib-2.0.tar.gz'. If you have already installed an earlier version, +first remove the directory `<texmf>/etex' containing all the old files. + +Additional `configure' options +============================== + + This section describes only the e-TeX specific `configure' options, +for the general Web2c `configure' options see `../INSTALL'. + +`--without-etex' +`--with-etex=no' + Do not automatically generate and install e-TeX and e-TeX formats + (as part of `make' resp. `make install'). + +`--with-etex=yes' +`--with-etex=etex' + Automatically generate and install e-TeX and e-TeX formats (in + extended mode) in addition to TeX and TeX formats. This is the default. + +`--with-etex=tex' + Automatically generate e-TeX and e-TeX formats (in compatibility as + well as extended mode) and install them, using e-TeX instead of TeX. + Do not install TeX and TeX formats. + +Additional targets +================== + + e-TeX adds some new Web2c Make targets and the e-TeX specific `configure' +options described above influence the behaviour of some other targets. + +`formats' +`install-formats' + Make or install all the memory dumps (*note Memory dumps::.). By + default, the standard plain formats plus `latex.fmt' or `latex.efmt' + plus possibly `elatex.efmt' are made. The `latex.efmt' is in e-TeX + compatibility mode, to be used when e-TeX is installed instead of TeX; + the `elatex.efmt' is in extended mode. You can add other formats by + redefining the `fmts', `cfmts', `efmts', `bases', and `mems' variables. + See the top of `web2c/Makefile' for the possibilities. + +`triptrap' +`trip' +`etrip' +`trap' +`mptrap' + To run the torture tests for TeX, e-TeX, Metafont, and MetaPost + (respectively). See the next section. + +Trip, etrip, trap, and mptrap: Torture tests +============================================ + + To validate your TeX and/or e-TeX, Metafont, and MetaPost executables, +run `make triptrap'. This runs the trip and/or etrip, trap, and mptrap +"torture tests". See the files `triptrap/tripman.tex', +`etexdir/etrip/etripman.tex', `triptrap/trapman.tex', and +`triptrap/mptrap.readme' for detailed information and background on the +tests. + + The differences between your executables' behavior and the standard +values will show up on your terminal. See the file `./INSTALL' for the +acceptable differences. + + The files `trip.diffs', `mftrap.diffs', and `mptrap.diffs' in the +`triptrap' directory and `etexdir/etrip/etrip.diffs' show the standard diffs +against the original output. If you diff your diffs against these files, +you should come up clean. For example + make etrip >&myetrip.diffs + diff etexdir/etrip/etrip.diffs myetrip.diffs + + To run the tests separately, use the targets `trip', `etrip', `trap', and +`mptrap'. Warning: with the `configure' option `--without-etex' the target +`etrip' will cause Make to first generate the e-TeX executable; similarly +with the `configure' option `--with-etex=tex' the target `trip' will cause +Make to first generate the TeX executable. + diff --git a/Build/source/texk/web2c/etexdir/README b/Build/source/texk/web2c/etexdir/README new file mode 100644 index 00000000000..87864b2aa1c --- /dev/null +++ b/Build/source/texk/web2c/etexdir/README @@ -0,0 +1,16 @@ +This directory contains the Web2c implementation of e-TeX (Version 2.0). + +See `NEWS' for major changes by release, `ChangeLog` for all changes. +See `INSTALL' for installation instructions. +See `../../kpathsea/BUGS' for details on reporting bugs. + +e-TeX is copyright (C) 1994,97 by the NTS team; all rights are reserved. + +You can get the original e-TeX from http://www.rhbnc.ac.uk/e-TeX/ or +from ftp://www.rhbnc.ac.uk/e-TeX/ (these URLs map to the identical fileset). +Current information on e-TeX is also available at the same location. + +The original Web2c files can be obtained from +ftp://ftpth.mppmu.mpg.de/e-TeX/latest + +Peter Breitenlohner <peb@mppmu.mpg.de> diff --git a/Build/source/texk/web2c/etexdir/etex.ch b/Build/source/texk/web2c/etexdir/etex.ch new file mode 100644 index 00000000000..74c19e79057 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etex.ch @@ -0,0 +1,6181 @@ +% This is etex.ch in text format, as of October 12, 2004. +% WEB change file containing code for various features extending TeX; +% to be applied to tex.web (Version 3.141592) in order to define the +% e-TeX program. + +% Note: This file defines etex.web in terms of changes to be applied to +% tex.web; in terms of a program such as TIE (or equivalent), directories +% may vary: +% +% tex.web ) +% + ) => tie -m ... => etex.web +% etexdir/etex.ch ) +% +% In addition, this file is used to define pdfetex.web, a combination +% of e-TeX and pdfTeX as follows: +% +% tex.web ) +% + ) +% etexdir/etex.ch ) +% + ) +% pdfetexdir/pdfetex.ch1 ) => tie -m ... => pdfetex.web +% + ) +% pdftexdir/pdftex.ch ) +% + ) +% pdfetexdir/pdfetex.ch2 ) +% +% where the two (small) files pdfetexdir/pdfetex.ch[12] take care of +% interferences between e-Tex changes (etexdir/etex.ch) and pdfTeX changes +% (pdftexdir/pdftex.ch). Consequently, changes in these files have to be +% coordinated. + +% e-TeX is copyright (C) 1999-2004 by P. Breitenlohner (1994,98 by the NTS +% team); all rights are reserved. Copying of this file is authorized only if +% (1) you are P. Breitenlohner, or if (2) you make absolutely no changes to +% your copy. (Programs such as TIE allow the application of several change +% files to tex.web; the master files tex.web and etex.ch should stay intact.) + +% See etex_gen.tex for hints on how to install this program. +% And see etripman.tex for details about how to validate it. + +% The TeX program is copyright (C) 1982 by D. E. Knuth. +% TeX is a trademark of the American Mathematical Society. +% e-TeX and NTS are trademarks of the NTS group. + +% All line numbers refer to tex.web 3.141592 as of December 21, 2002. + +@x limbo l.1 - this is e-TeX +% This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved. +% Copying of this file is authorized only if (1) you are D. E. Knuth, or if +% (2) you make absolutely no changes to your copy. (The WEB system provides +% for alterations via an auxiliary file; the master file should stay intact.) +% See Appendix H of the WEB manual for hints on how to install this program. +% And see Appendix A of the TRIP manual for details about how to validate it. + +% TeX is a trademark of the American Mathematical Society. +% METAFONT is a trademark of Addison-Wesley Publishing Company. +@y +% e-TeX is copyright (C) 1994,98 by the NTS team; all rights are reserved. +% Copying of this file is authorized only if (1) you are a member of the +% NTS team, or if (2) you make absolutely no changes to your copy. +% (Programs such as PATCHWEB, TIE, or WEBMERGE allow the application of +% several change files to tex.web; the master files tex.web and etex.ch +% should stay intact.) + +% See etex_gen.tex for hints on how to install this program. +% And see etripman.tex for details about how to validate it. + +% e-TeX and NTS are trademarks of the NTS group. +% TeX is a trademark of the American Mathematical Society. +% METAFONT is a trademark of Addison-Wesley Publishing Company. + +% This program is directly derived from Donald E. Knuth's TeX; +% the change history which follows and the reward offered for finders of +% bugs refer specifically to TeX; they should not be taken as referring +% to e-TeX, although the change history is relevant in that it +% demonstrates the evolutionary path followed. This program is not TeX; +% that name is reserved strictly for the program which is the creation +% and sole responsibility of Professor Knuth. +@z +%--------------------------------------- +@x limbo l.50 - e-TeX history +% Although considerable effort has been expended to make the TeX program +% correct and reliable, no warranty is implied; the author disclaims any +% obligation or liability for damages, including but not limited to +% special, indirect, or consequential damages arising out of or in +% connection with the use or performance of this software. This work has +% been a ``labor of love'' and the author hopes that users enjoy it. +@y +% A preliminary version of TeX--XeT was released in April 1992. +% TeX--XeT version 1.0 was released in June 1992, +% version 1.1 prevented arith overflow in glue computation (Oct 1992). +% A preliminary e-TeX version 0.95 was operational in March 1994. +% Version 1.0beta was released in May 1995. +% Version 1.01beta fixed bugs in just_copy and every_eof (December 1995). +% Version 1.02beta allowed 256 mark classes (March 1996). +% Version 1.1 changed \group{type,level} -> \currentgroup{type,level}, +% first public release (October 1996). +% Version 2.0 development was started in March 1997; +% fixed a ligature-\beginR bug in January 1998; +% was released in March 1998. +% Version 2.1 fixed a \marks bug (when min_halfword<>0) (January 1999). +% Version 2.2 development was started in Feb 2003; released in Oct 2004. +% fixed a bug in sparse array handling (0=>null), Jun 2002; +% fixed a bug in \lastnodetype (cur_val=>cur_val_level) +% reported by Hartmut Henkel <hartmut_henkel@@gmx.de>, +% fix by Fabrice Popineau <Fabrice.Popineau@@supelec.fr>, +% Jan 2004; +% another bug in sparse array handling (cur_ptr=>cur_chr) +% reported by Taco Hoekwater <taco@@elvenkind.com>, Jul 2004; +% fixed a sparse array reference count bug (\let,\futurelet), +% fix by Bernd Raichle <berd@@dante.de>, Aug 2004; +% reorganized handling of banner, additional token list and +% integer parameters, and similar in order to reduce the +% interference between eTeX, pdfTeX, and web2c change files. +% adapted to tex.web 3.141592, revised glue rounding for mixed +% direction typesetting; +% fixed a bug in the revised glue rounding code, detected by +% Tigran Aivazian <tigran@@aivazian.fsnet.co.uk>, Oct 2004. + +% Although considerable effort has been expended to make the e-TeX program +% correct and reliable, no warranty is implied; the author disclaims any +% obligation or liability for damages, including but not limited to +% special, indirect, or consequential damages arising out of or in +% connection with the use or performance of this software. This work has +% been a ``labor of love'' and the author hopes that users enjoy it. +@z +%--------------------------------------- +@x limbo l.62 - e-TeX logo, TeXXeT +\let\mc=\ninerm % medium caps for names like SAIL +@y +\let\mc=\ninerm % medium caps for names like SAIL +\def\eTeX{$\varepsilon$-\TeX} +\font\revrm=xbmc10 % for right-to-left text +% to generate xbmc10 (i.e., reflected cmbx10) use a file +% xbmc10.mf containing: +%+++++++++++++++++++++++++++++++++++++++++++++++++ +% if unknown cmbase: input cmbase fi +% extra_endchar := extra_endchar & +% "currentpicture:=currentpicture " & +% "reflectedabout((.5[l,r],0),(.5[l,r],1));"; +% input cmbx10 +%+++++++++++++++++++++++++++++++++++++++++++++++++ +\ifx\beginL\undefined % this is TeX + \def\XeT{X\kern-.125em\lower.5ex\hbox{E}\kern-.1667emT} + \def\TeXeT{\TeX-\hbox{\revrm \XeT}} % for TeX-XeT + \def\TeXXeT{\TeX-\hbox{\revrm -\XeT}} % for TeX--XeT +\else + \ifx\eTeXversion\undefined % this is \TeXeT + \def\TeXeT{\TeX-{\revrm\beginR\TeX\endR}} % for TeX-XeT + \def\TeXXeT{\TeX-{\revrm\beginR\TeX-\endR}} % for TeX--XeT + \else % this is \eTeX + \def\TeXeT{\TeX-{\TeXXeTstate=1\revrm\beginR\TeX\endR}} % for TeX-XeT + \def\TeXXeT{\TeX-{\TeXXeTstate=1\revrm\beginR\TeX-\endR}} % for TeX--XeT + \fi +\fi +@z +%--------------------------------------- +@x limbo l.65 - bug fix (print only changed modules) +\def\pct!{{\char`\%}} % percent sign in ordinary text +@y +\def\pct!{{\char`\%}} % percent sign in ordinary text +\def\grp{\.{\char'173...\char'175}} +@z +%--------------------------------------- +@x limbo l.81 - e-TeX basic +\def\title{\TeX82} +@y +\def\title{\eTeX} +% system dependent redefinitions of \title should come later +% and should use: +% \toks0=\expandafter{\title} +% \edef\title{...\the\toks0...} +\let\maybe=\iffalse % print only changed modules +@z +%--------------------------------------- +@x [1] m.1 l.92 - this is e-TeX +This is \TeX, a document compiler intended to produce typesetting of high +@y +This is \eTeX, a program derived from and extending the capabilities of +\TeX, a document compiler intended to produce typesetting of high +@z +%--------------------------------------- +@x [1] m.2 l.180 - e-TeX basic +If this program is changed, the resulting system should not be called +@y +This program contains code for various features extending \TeX, +therefore this program is called `\eTeX' and not +@z +%--------------------------------------- +@x [1] m.2 l.186 - e-TeX basic +November 1984]. +@y +November 1984]. + +A similar test suite called the ``\.{e-TRIP} test'' is available for +helping to determine whether a particular implementation deserves to be +known as `\eTeX'. +@z +%--------------------------------------- +@x [1] m.2 l.188 - e-TeX basic +@d banner=='This is TeX, Version 3.141592' {printed when \TeX\ starts} +@y +@d eTeX_version=2 { \.{\\eTeXversion} } +@d eTeX_revision==".2" { \.{\\eTeXrevision} } +@d eTeX_version_string=='-2.2' {current \eTeX\ version} +@# +@d eTeX_banner=='This is e-TeX, Version 3.141592',eTeX_version_string + {printed when \eTeX\ starts} +@# +@d TeX_banner=='This is TeX, Version 3.141592' {printed when \TeX\ starts} +@# +@d banner==eTeX_banner +@# +@d TEX==ETEX {change program name into |ETEX|} +@# +@d TeXXeT_code=0 {the \TeXXeT\ feature is optional} +@# +@d eTeX_states=1 {number of \eTeX\ state variables in |eqtb|} +@z +%--------------------------------------- +@x [1] m.3 l.207 - e-TeX basic +scalar types; there are no `\&{var}' parameters, except in the case of files; +@y +scalar types; there are no `\&{var}' parameters, except in the case of files +--- \eTeX, however, does use `\&{var}' parameters for the |reverse| function; +@z +%--------------------------------------- +@x [1] m.15 l.499 - e-TeX basic +@d not_found=45 {go here when you've found nothing} +@y +@d not_found=45 {go here when you've found nothing} +@d not_found1=46 {like |not_found|, when there's more than one} +@d not_found2=47 {like |not_found|, when there's more than two} +@d not_found3=48 {like |not_found|, when there's more than three} +@d not_found4=49 {like |not_found|, when there's more than four} +@z +%--------------------------------------- +@x [10] m.141 l.2971 - e-TeX marks +This field occupies a full word instead of a halfword, because +there's nothing to put in the other halfword; it is easier in \PASCAL\ to +use the full word than to risk leaving garbage in the unused half. +@y +In addition there is a |mark_class| field that contains the mark class. +@z +%--------------------------------------- +@x [10] m.141 l.2977 - e-TeX marks +@d mark_ptr(#)==mem[#+1].int {head of the token list for a mark} +@y +@d mark_ptr(#)==link(#+1) {head of the token list for a mark} +@d mark_class(#)==info(#+1) {the mark class} +@z +%--------------------------------------- +@x [10] m.142 l.2986 - e-TeX marks +@d adjust_ptr==mark_ptr {vertical list to be moved out of horizontal list} +@y +@d adjust_ptr(#)==mem[#+1].int + {vertical list to be moved out of horizontal list} +@z +%--------------------------------------- +@x [10] m.147 l.3075 - e-TeX TeXXeT +the amount of surrounding space inserted by \.{\\mathsurround}. +@y +the amount of surrounding space inserted by \.{\\mathsurround}. + +In addition a |math_node| with |subtype>after| and |width=0| will be +(ab)used to record a regular |math_node| reinserted after being +discarded at a line break or one of the text direction primitives ( +\.{\\beginL}, \.{\\endL}, \.{\\beginR}, and \.{\\endR} ). +@z +%--------------------------------------- +@x [10] m.147 l.3079 - e-TeX TeXXeT +@d after=1 {|subtype| for math node that winds up a formula} +@y +@d after=1 {|subtype| for math node that winds up a formula} +@# +@d M_code=2 +@d begin_M_code=M_code+before {|subtype| for \.{\\beginM} node} +@d end_M_code=M_code+after {|subtype| for \.{\\endM} node} +@d L_code=4 +@d begin_L_code=L_code+begin_M_code {|subtype| for \.{\\beginL} node} +@d end_L_code=L_code+end_M_code {|subtype| for \.{\\endL} node} +@d R_code=L_code+L_code +@d begin_R_code=R_code+begin_M_code {|subtype| for \.{\\beginR} node} +@d end_R_code=R_code+end_M_code {|subtype| for \.{\\endR} node} +@# +@d end_LR(#)==odd(subtype(#)) +@d end_LR_type(#)==(L_code*(subtype(#) div L_code)+end_M_code) +@d begin_LR_type(#)==(#-after+before) +@z +%--------------------------------------- +@x [12] m.175 l.3552 - e-TeX TeXXeT +math_node: print_char("$"); +@y +math_node: if subtype(p)>=L_code then print("[]") + else print_char("$"); +@z +%--------------------------------------- +@x [12] m.184 l.3719 - e-TeX TeXXeT + begin print(", shifted "); print_scaled(shift_amount(p)); + end; +@y + begin print(", shifted "); print_scaled(shift_amount(p)); + end; + if eTeX_ex then @<Display if this box is never to be reversed@>; +@z +%--------------------------------------- +@x [12] m.192 l.3817 - e-TeX TeXXeT +begin print_esc("math"); +@y +if subtype(p)>after then + begin if end_LR(p) then print_esc("end") + else print_esc("begin"); + if subtype(p)>R_code then print_char("R") + else if subtype(p)>L_code then print_char("L") + else print_char("M"); + end else +begin print_esc("math"); +@z +%--------------------------------------- +@x [12] m.196 l.3850 - e-TeX marks +begin print_esc("mark"); print_mark(mark_ptr(p)); +@y +begin print_esc("mark"); +if mark_class(p)<>0 then + begin print_char("s"); print_int(mark_class(p)); + end; +print_mark(mark_ptr(p)); +@z +%--------------------------------------- +@x [15] m.208 l.4087 - e-TeX saved_items +@d un_vbox=24 {unglue a box ( \.{\\unvbox}, \.{\\unvcopy} )} +@y +@d un_vbox=24 {unglue a box ( \.{\\unvbox}, \.{\\unvcopy} )} + {( or \.{\\pagediscards}, \.{\\splitdiscards} )} +@z +%--------------------------------------- +@x [15] m.208 l.4097 - e-TeX TeXXeT +@d valign=33 {vertical table alignment ( \.{\\valign} )} +@y +@d valign=33 {vertical table alignment ( \.{\\valign} )} + {or text direction directives ( \.{\\beginL}, etc.~)} +@z +%--------------------------------------- +@x [15] m.208 l.4113 - e-TeX middle +@d left_right=49 {variable delimiter ( \.{\\left}, \.{\\right} )} +@y +@d left_right=49 {variable delimiter ( \.{\\left}, \.{\\right} )} + {( or \.{\\middle} )} +@z +%--------------------------------------- +@x [15] m.209 l.4157 - e-TeX basic + \.{\\insertpenalties} )} +@y + \.{\\insertpenalties} )} + {( or \.{\\interactionmode} )} +@z +%--------------------------------------- +@x [15] m.209 l.4159 - e-TeX penalties +@d set_shape=84 {specify fancy paragraph shape ( \.{\\parshape} )} +@y +@d set_shape=84 {specify fancy paragraph shape ( \.{\\parshape} )} + {(or \.{\\interlinepenalties}, etc.~)} +@z +%--------------------------------------- +@x [15] m.209 l.4169 - e-TeX protected +@d prefix=93 {qualify a definition ( \.{\\global}, \.{\\long}, \.{\\outer} )} +@y +@d prefix=93 {qualify a definition ( \.{\\global}, \.{\\long}, \.{\\outer} )} + {( or \.{\\protected} )} +@z +%--------------------------------------- +@x [15] m.209 l.4172 - e-TeX read_line +@d read_to_cs=96 {read into a control sequence ( \.{\\read} )} +@y +@d read_to_cs=96 {read into a control sequence ( \.{\\read} )} + {( or \.{\\readline} )} +@z +%--------------------------------------- +@x [15] m.210 l.4187 - e-TeX scan_tokens +@d input=max_command+4 {input a source file ( \.{\\input}, \.{\\endinput} )} +@y +@d input=max_command+4 {input a source file ( \.{\\input}, \.{\\endinput} )} + {( or \.{\\scantokens} )} +@z +%--------------------------------------- +@x [15] m.210 l.4192 - e-TeX unexpanded +@d the=max_command+9 {expand an internal quantity ( \.{\\the} )} +@y +@d the=max_command+9 {expand an internal quantity ( \.{\\the} )} + {( or \.{\\unexpanded}, \.{\\detokenize} )} +@z +%--------------------------------------- +@x [16] m.212 l.4295 - e-TeX basic +user's output routine. +@y +user's output routine. + +A seventh quantity, |eTeX_aux|, is used by the extended features \eTeX. +In vertical modes it is known as |LR_save| and holds the LR stack when a +paragraph is interrupted by a displayed formula. In display math mode +it is known as |LR_box| and holds a pointer to a prototype box for the +display. In math mode it is known as |delim_ptr| and points to the most +recent |left_noad| or |middle_noad| of a |math_left_group|. +@z +%--------------------------------------- +@x [16] m.212 l.4310 - e-TeX basic + @!head_field,@!tail_field: pointer; +@y + @!head_field,@!tail_field: pointer; + @!eTeX_aux_field: pointer; +@z +%--------------------------------------- +@x [16] m.213 l.4317 - e-TeX basic +@d tail==cur_list.tail_field {final node on current list} +@y +@d tail==cur_list.tail_field {final node on current list} +@d eTeX_aux==cur_list.eTeX_aux_field {auxiliary data for \eTeX} +@d LR_save==eTeX_aux {LR stack when a paragraph is interrupted} +@d LR_box==eTeX_aux {prototype box for display} +@d delim_ptr==eTeX_aux {most recent left or right noad of a math left group} +@z +%--------------------------------------- +@x [16] m.215 l.4348 - e-TeX basic +mode:=vmode; head:=contrib_head; tail:=contrib_head; +@y +mode:=vmode; head:=contrib_head; tail:=contrib_head; +eTeX_aux:=null; +@z +%--------------------------------------- +@x [16] m.216 l.4364 push_nest - e-TeX basic +incr(nest_ptr); head:=get_avail; tail:=head; prev_graf:=0; mode_line:=line; +@y +incr(nest_ptr); head:=get_avail; tail:=head; prev_graf:=0; mode_line:=line; +eTeX_aux:=null; +@z +%--------------------------------------- +@x [17] m.230 l.4727 - e-TeX basic, every_eof +@d toks_base=local_base+10 {table of 256 token list registers} +@y +@d tex_toks=local_base+10 {end of \TeX's token list parameters} +@# +@d etex_toks_base=tex_toks {base for \eTeX's token list parameters} +@d every_eof_loc=etex_toks_base {points to token list for \.{\\everyeof}} +@d etex_toks=etex_toks_base+1 {end of \eTeX's token list parameters} +@# +@d toks_base=etex_toks {table of 256 token list registers} +@z +%--------------------------------------- +@x [17] m.230 l.4728 - e-TeX basic, penalties +@d box_base=toks_base+256 {table of 256 box registers} +@y +@# +@d etex_pen_base=toks_base+256 {start of table of \eTeX's penalties} +@d inter_line_penalties_loc=etex_pen_base {additional penalties between lines} +@d club_penalties_loc=etex_pen_base+1 {penalties for creating club lines} +@d widow_penalties_loc=etex_pen_base+2 {penalties for creating widow lines} +@d display_widow_penalties_loc=etex_pen_base+3 {ditto, just before a display} +@d etex_pens=etex_pen_base+4 {end of table of \eTeX's penalties} +@# +@d box_base=etex_pens {table of 256 box registers} +@z +%--------------------------------------- +@x [17] m.231 l.4793 - e-TeX basic + othercases print_esc("errhelp") +@y + @/@<Cases of |assign_toks| for |print_cmd_chr|@>@/ + othercases print_esc("errhelp") +@z +%--------------------------------------- +@x [17] m.232 l.4811 - e-TeX penalties +eq_level(par_shape_loc):=level_one;@/ +@y +eq_level(par_shape_loc):=level_one;@/ +for k:=etex_pen_base to etex_pens-1 do + eqtb[k]:=eqtb[par_shape_loc]; +@z +%--------------------------------------- +@x [17] m.233 l.4839 - e-TeX penalties +if n=par_shape_loc then + begin print_esc("parshape"); print_char("="); + if par_shape_ptr=null then print_char("0") +@y +if (n=par_shape_loc) or ((n>=etex_pen_base) and (n<etex_pens)) then + begin print_cmd_chr(set_shape,n); print_char("="); + if equiv(n)=null then print_char("0") + else if n>par_shape_loc then + begin print_int(penalty(equiv(n))); print_char(" "); + print_int(penalty(equiv(n)+1)); + if penalty(equiv(n))>1 then print_esc("ETC."); + end +@z +%--------------------------------------- +@x [17] m.236 l.4960 - e-TeX basic +@d int_pars=55 {total number of integer parameters} +@y +@d tex_int_pars=55 {total number of \TeX's integer parameters} +@# +@d etex_int_base=tex_int_pars {base for \eTeX's integer parameters} +@d tracing_assigns_code=etex_int_base {show assignments} +@d tracing_groups_code=etex_int_base+1 {show save/restore groups} +@d tracing_ifs_code=etex_int_base+2 {show conditionals} +@d tracing_scan_tokens_code=etex_int_base+3 {show pseudo file open and close} +@d tracing_nesting_code=etex_int_base+4 {show incomplete groups and ifs within files} +@d pre_display_direction_code=etex_int_base+5 {text direction preceding a display} +@d last_line_fit_code=etex_int_base+6 {adjustment for last line of paragraph} +@d saving_vdiscards_code=etex_int_base+7 {save items discarded from vlists} +@d saving_hyph_codes_code=etex_int_base+8 {save hyphenation codes for languages} +@d eTeX_state_code=etex_int_base+9 {\eTeX\ state variables} +@d etex_int_pars=eTeX_state_code+eTeX_states {total number of \eTeX's integer parameters} +@# +@d int_pars=etex_int_pars {total number of integer parameters} +@z +%--------------------------------------- +@x [17] m.236 l.5022 - e-TeX basic +@d error_context_lines==int_par(error_context_lines_code) +@y +@d error_context_lines==int_par(error_context_lines_code) +@# +@d tracing_assigns==int_par(tracing_assigns_code) +@d tracing_groups==int_par(tracing_groups_code) +@d tracing_ifs==int_par(tracing_ifs_code) +@d tracing_scan_tokens==int_par(tracing_scan_tokens_code) +@d tracing_nesting==int_par(tracing_nesting_code) +@d pre_display_direction==int_par(pre_display_direction_code) +@d last_line_fit==int_par(last_line_fit_code) +@d saving_vdiscards==int_par(saving_vdiscards_code) +@d saving_hyph_codes==int_par(saving_hyph_codes_code) +@z +%--------------------------------------- +@x [17] m.237 l.5087 print_param - e-TeX basic +othercases print("[unknown integer parameter!]") +@y +@/@<Cases for |print_param|@>@/ +othercases print("[unknown integer parameter!]") +@z +%--------------------------------------- +@x [18] m.264 l.5618 primitive - e-TeX basic +@!j:small_number; {index into |buffer|} +@y +@!j:0..buf_size; {index into |buffer|} +@z +%--------------------------------------- +@x [18] m.264 l.5622 primitive - e-TeX basic + {we will move |s| into the (empty) |buffer|} + for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]); + cur_val:=id_lookup(0,l); {|no_new_control_sequence| is |false|} +@y + {we will move |s| into the (possibly non-empty) |buffer|} + if first+l>buf_size+1 then + overflow("buffer size",buf_size); +@:TeX capacity exceeded buffer size}{\quad buffer size@> + for j:=0 to l-1 do buffer[first+j]:=so(str_pool[k+j]); + cur_val:=id_lookup(first,l); {|no_new_control_sequence| is |false|} +@z +%--------------------------------------- +@x [18] m.265 l.5697 - e-TeX penalties +primitive("parshape",set_shape,0);@/ +@y +primitive("parshape",set_shape,par_shape_loc);@/ +@z +%--------------------------------------- +@x [18] m.265 l.5714 - e-TeX sparse arrays +primitive("toks",toks_register,0);@/ +@y +primitive("toks",toks_register,mem_bot);@/ +@z +%--------------------------------------- +@x [18] m.266 l.5747 - e-TeX cond +expand_after: print_esc("expandafter"); +@y +expand_after: if chr_code=0 then print_esc("expandafter") + @<Cases of |expandafter| for |print_cmd_chr|@>; +@z +%--------------------------------------- +@x [18] m.266 l.5753 - e-TeX marks +mark: print_esc("mark"); +@y +mark: begin print_esc("mark"); + if chr_code>0 then print_char("s"); + end; +@z +%--------------------------------------- +@x [18] m.266 l.5764 - e-TeX read_line +read_to_cs: print_esc("read"); +@y +read_to_cs: if chr_code=0 then print_esc("read") + @<Cases of |read| for |print_cmd_chr|@>; +@z +%--------------------------------------- +@x [18] m.266 l.5768 - e-TeX penalties +set_shape: print_esc("parshape"); +@y +set_shape: case chr_code of + par_shape_loc: print_esc("parshape"); + @<Cases of |set_shape| for |print_cmd_chr|@>@;@/ + end; {there are no other cases} +@z +%--------------------------------------- +@x [18] m.266 l.5769 - e-TeX unexpanded +the: print_esc("the"); +@y +the: if chr_code=0 then print_esc("the") + @<Cases of |the| for |print_cmd_chr|@>; +@z +%--------------------------------------- +@x [18] m.266 l.5770 - e-TeX sparse arrays +toks_register: print_esc("toks"); +@y +toks_register: @<Cases of |toks_register| for |print_cmd_chr|@>; +@z +%--------------------------------------- +@x [18] m.266 l.5772 - e-TeX TeXXeT +valign: print_esc("valign"); +@y +valign: if chr_code=0 then print_esc("valign")@/ + @<Cases of |valign| for |print_cmd_chr|@>; +@z +%--------------------------------------- +@x [19] m.268 l.5806 - e-TeX sparse arrays +interpreted in one of four ways: +@y +interpreted in one of five ways: +@z +%--------------------------------------- +@x [19] m.268 l.5826 - e-TeX tracing +the entries for that group. +@y +the entries for that group. +Furthermore, in extended \eTeX\ mode, |save_stack[p-1]| contains the +source line number at which the current level of grouping was entered. + +\yskip\hang 5) If |save_type(p)=restore_sa|, then |sa_chain| points to a +chain of sparse array entries to be restored at the end of the current +group. Furthermore |save_index(p)| and |save_level(p)| should replace +the values of |sa_chain| and |sa_level| respectively. +@z +%--------------------------------------- +@x [19] m.268 l.5836 - e-TeX basic +@d level_boundary=3 {|save_type| corresponding to beginning of group} +@y +@d level_boundary=3 {|save_type| corresponding to beginning of group} +@d restore_sa=4 {|save_type| when sparse array entries should be restored} + +@p@t\4@>@<Declare \eTeX\ procedures for tracing and input@> +@z +%--------------------------------------- +@x [19] m.273 l.5894 - e-TeX tracing +@ The following macro is used to test if there is room for up to six more +@y +@ The following macro is used to test if there is room for up to seven more +@z +%--------------------------------------- +@x [19] m.273 l.5900 check_full_save_stack - e-TeX tracing + if max_save_stack>save_size-6 then overflow("save size",save_size); +@y + if max_save_stack>save_size-7 then overflow("save size",save_size); +@z +%--------------------------------------- +@x [19] m.274 l.5922 new_save_level - e-TeX tracing +begin check_full_save_stack; +@y +begin check_full_save_stack; +if eTeX_ex then + begin saved(0):=line; incr(save_ptr); + end; +@z +%--------------------------------------- +@x [19] m.274 l.5929 new_save_level - e-TeX tracing +cur_boundary:=save_ptr; incr(cur_level); incr(save_ptr); cur_group:=c; +@y +cur_boundary:=save_ptr; cur_group:=c; +@!stat if tracing_groups>0 then group_trace(false);@+tats@;@/ +incr(cur_level); incr(save_ptr); +@z +%--------------------------------------- +@x [19] m.275 l.5947 eq_destroy - e-TeX sparse arrays +othercases do_nothing +@y +@/@<Cases for |eq_destroy|@>@/ +othercases do_nothing +@z +%--------------------------------------- +@x [19] m.277 l.5969 - e-TeX tracing +the call, since |eq_save| makes the necessary test. +@y +the call, since |eq_save| makes the necessary test. + +@d assign_trace(#)==@!stat if tracing_assigns>0 then restore_trace(#); + tats +@z +%--------------------------------------- +@x [19] m.277 l.5973 eq_define - e-TeX tracing +begin if eq_level(p)=cur_level then eq_destroy(eqtb[p]) +@y +label exit; +begin if eTeX_ex and(eq_type(p)=t)and(equiv(p)=e) then + begin assign_trace(p,"reassigning")@;@/ + eq_destroy(eqtb[p]); return; + end; +assign_trace(p,"changing")@;@/ +if eq_level(p)=cur_level then eq_destroy(eqtb[p]) +@z +%--------------------------------------- +@x [19] m.277 l.5976 eq_define - e-TeX tracing +end; +@y +assign_trace(p,"into")@;@/ +exit:end; +@z +%--------------------------------------- +@x [19] m.278 l.5983 eq_word_define - e-TeX tracing +begin if xeq_level[p]<>cur_level then +@y +label exit; +begin if eTeX_ex and(eqtb[p].int=w) then + begin assign_trace(p,"reassigning")@;@/ + return; + end; +assign_trace(p,"changing")@;@/ +if xeq_level[p]<>cur_level then +@z +%--------------------------------------- +@x [19] m.278 l.5987 eq_word_define - e-TeX tracing +end; +@y +assign_trace(p,"into")@;@/ +exit:end; +@z +%--------------------------------------- +@x [19] m.279 l.5996 geq_define - e-TeX tracing +begin eq_destroy(eqtb[p]); +eq_level(p):=level_one; eq_type(p):=t; equiv(p):=e; +@y +begin assign_trace(p,"globally changing")@;@/ +begin eq_destroy(eqtb[p]); +eq_level(p):=level_one; eq_type(p):=t; equiv(p):=e; +end; +assign_trace(p,"into")@;@/ +@z +%--------------------------------------- +@x [19] m.279 l.6001 geq_word_define - e-TeX tracing +begin eqtb[p].int:=w; xeq_level[p]:=level_one; +@y +begin assign_trace(p,"globally changing")@;@/ +begin eqtb[p].int:=w; xeq_level[p]:=level_one; +end; +assign_trace(p,"into")@;@/ +@z +%--------------------------------------- +@x [19] m.281 l.6018 - e-TeX tracing +@p@t\4@>@<Declare the procedure called |restore_trace|@>@;@/ +@y +@p +@z +%--------------------------------------- +@x [19] m.281 l.6025 unsave - e-TeX optimized \aftergroup +begin if cur_level>level_one then +@y +@!a:boolean; {have we already processed an \.{\\aftergroup} ?} +begin a:=false; +if cur_level>level_one then +@z +%--------------------------------------- +@x [19] m.282 l.6039 - e-TeX sparse arrays + else begin if save_type(save_ptr)=restore_old_value then +@y + else if save_type(save_ptr)=restore_sa then + begin sa_restore; sa_chain:=p; sa_level:=save_level(save_ptr); + end + else begin if save_type(save_ptr)=restore_old_value then +@z +%--------------------------------------- +@x [19] m.282 l.6047 - e-TeX tracing +done: cur_group:=save_level(save_ptr); cur_boundary:=save_index(save_ptr) +@y +done: @!stat if tracing_groups>0 then group_trace(true);@+tats@;@/ +if grp_stack[in_open]=cur_boundary then group_warning; + {groups possibly not properly nested with files} +cur_group:=save_level(save_ptr); cur_boundary:=save_index(save_ptr); +if eTeX_ex then decr(save_ptr) +@z +%--------------------------------------- +@x [19] m.284 l.6073 - e-TeX tracing +@ @<Declare the procedure called |restore_trace|@>= +@y +@ @<Declare \eTeX\ procedures for tr...@>= +@z +%--------------------------------------- +@x [20] m.289 l.6161 - e-TeX protected +@d end_match_token=@'7000 {$2^8\cdot|end_match|$} +@y +@d end_match_token=@'7000 {$2^8\cdot|end_match|$} +@d protected_token=@'7001 {$2^8\cdot|end_match|+1$} +@z +%--------------------------------------- +@x [20] m.294 l.6286 - e-TeX protected +end_match: print("->"); +@y +end_match: if c=0 then print("->"); +@z +%--------------------------------------- +@x [20] m.296 l.6307 print_meaning - e-TeX marks +else if cur_cmd=top_bot_mark then +@y +else if (cur_cmd=top_bot_mark)and(cur_chr<marks_code) then +@z +%--------------------------------------- +@x [21] m.298 l.6381 print_cmd_chr - e-TeX protected +procedure print_cmd_chr(@!cmd:quarterword;@!chr_code:halfword); +@y +procedure print_cmd_chr(@!cmd:quarterword;@!chr_code:halfword); +var n:integer; {temp variable} +@z +%--------------------------------------- +@x [21] m.299 l.6400 show_cur_cmd_chr - e-TeX tracing +@p procedure show_cur_cmd_chr; +@y +@p procedure show_cur_cmd_chr; +var n:integer; {level of \.{\\if...\\fi} nesting} +@!l:integer; {line where \.{\\if} started} +@!p:pointer; +@z +%--------------------------------------- +@x [21] m.299 l.6405 show_cur_cmd_chr - e-TeX tracing +print_cmd_chr(cur_cmd,cur_chr); print_char("}"); +@y +print_cmd_chr(cur_cmd,cur_chr); +if tracing_ifs>0 then + if cur_cmd>=if_test then if cur_cmd<=fi_or_else then + begin print(": "); + if cur_cmd=fi_or_else then + begin print_cmd_chr(if_test,cur_if); print_char(" "); + n:=0; l:=if_line; + end + else begin n:=1; l:=line; + end; + p:=cond_ptr; + while p<>null do + begin incr(n); p:=link(p); + end; + print("(level "); print_int(n); print_char(")"); print_if_line(l); + end; +print_char("}"); +@z +%--------------------------------------- +@x [22] m.303 l.6481 show_context - e-TeX scan_tokens +the terminal, under control of the procedure |read_toks|.) +@y +the terminal, under control of the procedure |read_toks|.) +Finally |18<=name<=19| indicates that we are reading a pseudo file +created by the \.{\\scantokens} command. +@z +%--------------------------------------- +@x [22] m.307 l.6678 - e-TeX basic, every_eof +only if |token_type>=macro|. +@^reference counts@> +@y +only if |token_type>=macro|. +@^reference counts@> + +Since \eTeX's additional token list parameters precede |toks_base|, the +corresponding token types must precede |write_text|. +@z +%--------------------------------------- +@x [22] m.307 l.6699 - e-TeX basic +@d write_text=15 {|token_type| code for \.{\\write}} +@y +@# +@d eTeX_text_offset=output_routine_loc-output_text +@d every_eof_text=every_eof_loc-eTeX_text_offset + {|token_type| code for \.{\\everyeof}} +@# +@d write_text=toks_base-eTeX_text_offset {|token_type| code for \.{\\write}} +@z +%--------------------------------------- +@x [22] m.311 l.6755 show_context - e-TeX scan_tokens + if (name>17) or (base_ptr=0) then bottom_line:=true; +@y + if (name>19) or (base_ptr=0) then bottom_line:=true; +@z +%--------------------------------------- +@x [22] m.313 l.6800 - e-TeX scan_tokens +else begin print_nl("l."); print_int(line); +@y +else if index<>in_open then {input from a pseudo file} + begin print_nl("l."); print_int(line_stack[index+1]); + end +else begin print_nl("l."); print_int(line); +@z +%--------------------------------------- +@x [22] m.314 l.6822 - e-TeX basic +write_text: print_nl("<write> "); +@y +every_eof_text: print_nl("<everyeof> "); +write_text: print_nl("<write> "); +@z +%--------------------------------------- +@x [23] m.326 l.7015 - e-TeX optimized \aftergroup +begin t:=cur_tok; cur_tok:=p; back_input; cur_tok:=t; +@y +begin t:=cur_tok; cur_tok:=p; +if a then + begin p:=get_avail; info(p):=cur_tok; link(p):=loc; loc:=p; start:=p; + if cur_tok<right_brace_limit then + if cur_tok<left_brace_limit then decr(align_state) + else incr(align_state); + end +else begin back_input; a:=eTeX_ex; + end; +cur_tok:=t; +@z +%--------------------------------------- +@x [23] m.328 l.7043 begin_file_reading - e-TeX every_eof, tracing_nesting +incr(in_open); push_input; index:=in_open; +@y +incr(in_open); push_input; index:=in_open; +eof_seen[index]:=false; +grp_stack[index]:=cur_boundary; if_stack[index]:=cond_ptr; +@z +%--------------------------------------- +@x [23] m.329 l.7053 end_file_reading - e-TeX scan_tokens +if name>17 then a_close(cur_file); {forget it} +@y +if (name=18)or(name=19) then pseudo_close else +if name>17 then a_close(cur_file); {forget it} +@z +%--------------------------------------- +@x [23] m.331 l.7072 - e-TeX tracing_nesting +in_open:=0; open_parens:=0; max_buf_stack:=0; +@y +in_open:=0; open_parens:=0; max_buf_stack:=0; +grp_stack[0]:=0; if_stack[0]:=null; +@z +%--------------------------------------- +@x [24] m.362 l.7544 - e-TeX scan_tokens, every_eof +if not force_eof then +@y +if not force_eof then + if name<=19 then + begin if pseudo_input then {not end of file} + firm_up_the_line {this sets |limit|} + else if (every_eof<>null)and not eof_seen[index] then + begin limit:=first-1; eof_seen[index]:=true; {fake one empty line} + begin_token_list(every_eof,every_eof_text); goto restart; + end + else force_eof:=true; + end + else +@z +%--------------------------------------- +@x [24] m.362 l.7547 - e-TeX every_eof + else force_eof:=true; +@y + else if (every_eof<>null)and not eof_seen[index] then + begin limit:=first-1; eof_seen[index]:=true; {fake one empty line} + begin_token_list(every_eof,every_eof_text); goto restart; + end + else force_eof:=true; +@z +%--------------------------------------- +@x [24] m.362 l.7550 - e-TeX scan_tokens + begin print_char(")"); decr(open_parens); + update_terminal; {show user that file has been read} +@y + begin if tracing_nesting>0 then + if (grp_stack[in_open]<>cur_boundary)or@| + (if_stack[in_open]<>cond_ptr) then file_warning; + {give warning for some unfinished groups and/or conditionals} + if name>=19 then + begin print_char(")"); decr(open_parens); + update_terminal; {show user that file has been read} + end; +@z +%--------------------------------------- +@x [25] m.366 l.7636 - e-TeX basic +@t\4@>@<Declare the procedure called |insert_relax|@>@;@/ +@y +@t\4@>@<Declare the procedure called |insert_relax|@>@;@/ +@t\4@>@<Declare \eTeX\ procedures for expanding@>@;@/ +@z +%--------------------------------------- +@x [25] m.366 l.7643 expand - e-TeX cond +procedure expand; +@y +procedure expand; +label reswitch; +@z +%--------------------------------------- +@x [25] m.366 l.7654 expand - e-TeX cond +if cur_cmd<call then @<Expand a nonmacro@> +@y +reswitch: +if cur_cmd<call then @<Expand a nonmacro@> +@z +%--------------------------------------- +@x [25] m.367 l.7665 - e-TeX cond +expand_after:@<Expand the token after the next token@>; +@y +expand_after:if cur_chr=0 then @<Expand the token after the next token@> + else @<Negate a boolean conditional and |goto reswitch|@>; +@z +%--------------------------------------- +@x [25] m.377 l.7785 - e-TeX scan_tokens +input: if chr_code=0 then print_esc("input")@+else print_esc("endinput"); +@y +input: if chr_code=0 then print_esc("input") + @/@<Cases of |input| for |print_cmd_chr|@>@/ + else print_esc("endinput"); +@z +%--------------------------------------- +@x [25] m.378 l.7788 - e-TeX scan_tokens +if cur_chr>0 then force_eof:=true +@y +if cur_chr=1 then force_eof:=true +@/@<Cases for |input|@>@/ +@z +%--------------------------------------- +@x [25] m.382 l.7844 - e-TeX marks +@d top_mark_code=0 {the mark in effect at the previous page break} +@y +@d marks_code==5 {add this for \.{\\topmarks} etc.} +@# +@d top_mark_code=0 {the mark in effect at the previous page break} +@z +%--------------------------------------- +@x [25] m.385 l.7876 - e-TeX marks +top_bot_mark: case chr_code of +@y +top_bot_mark: begin case (chr_code mod marks_code) of +@z +%--------------------------------------- +@x [25] m.385 l.7882 - e-TeX marks + endcases; +@y + endcases; + if chr_code>=marks_code then print_char("s"); + end; +@z +%--------------------------------------- +@x [25] m.386 l.7888 - e-TeX marks +begin if cur_mark[cur_chr]<>null then + begin_token_list(cur_mark[cur_chr],mark_text); +@y +begin t:=cur_chr mod marks_code; +if cur_chr>=marks_code then scan_register_num@+else cur_val:=0; +if cur_val=0 then cur_ptr:=cur_mark[t] +else @<Compute the mark pointer for mark type |t| and class |cur_val|@>; +if cur_ptr<>null then begin_token_list(cur_ptr,mark_text); +@z +%--------------------------------------- +@x [25] m.389 l.7951 macro_call - e-TeX protected +if info(r)<>end_match_token then +@y +if info(r)=protected_token then r:=link(r); +if info(r)<>end_match_token then +@z +%--------------------------------------- +@x [26] m.409 l.8262 - e-TeX basic +@t\4\4@>@<Declare procedures that scan font-related stuff@> +@y +@t\4\4@>@<Declare \eTeX\ procedures for scanning@>@; +@t\4\4@>@<Declare procedures that scan font-related stuff@> +@z +%--------------------------------------- +@x [26] m.411 l.8306 - e-TeX sparse arrays +|glue_val|, or |mu_val|. +@y +|glue_val|, or |mu_val| more than |mem_bot| (dynamic variable-size nodes +cannot have these values) +@z +%--------------------------------------- +@x [26] m.411 l.8309 - e-TeX sparse arrays +primitive("count",register,int_val); +@!@:count_}{\.{\\count} primitive@> +primitive("dimen",register,dimen_val); +@!@:dimen_}{\.{\\dimen} primitive@> +primitive("skip",register,glue_val); +@!@:skip_}{\.{\\skip} primitive@> +primitive("muskip",register,mu_val); +@y +primitive("count",register,mem_bot+int_val); +@!@:count_}{\.{\\count} primitive@> +primitive("dimen",register,mem_bot+dimen_val); +@!@:dimen_}{\.{\\dimen} primitive@> +primitive("skip",register,mem_bot+glue_val); +@!@:skip_}{\.{\\skip} primitive@> +primitive("muskip",register,mem_bot+mu_val); +@z +%--------------------------------------- +@x [26] m.412 l.8319 - e-TeX sparse arrays +register: if chr_code=int_val then print_esc("count") + else if chr_code=dimen_val then print_esc("dimen") + else if chr_code=glue_val then print_esc("skip") + else print_esc("muskip"); +@y +register: @<Cases of |register| for |print_cmd_chr|@>; +@z +%--------------------------------------- +@x [26] m.413 l.8335 scan_something_internal - e-TeX basic +var m:halfword; {|chr_code| part of the operand token} +@y +label exit; +var m:halfword; {|chr_code| part of the operand token} +@!q:halfword; {general purpose index} +@!i:four_quarters; {character info} +@z +%--------------------------------------- +@x [26] m.413 l.8361 scan_something_internal - e-TeX basic +end; +@y +exit:end; +@z +%--------------------------------------- +@x [26] m.415 l.8382 - e-TeX sparse arrays + begin scan_eight_bit_int; m:=toks_base+cur_val; + end; + scanned_result(equiv(m))(tok_val); +@y + if m=mem_bot then + begin scan_register_num; + if cur_val<256 then cur_val:=equiv(toks_base+cur_val) + else begin find_sa_element(tok_val,cur_val,false); + if cur_ptr=null then cur_val:=null + else cur_val:=sa_ptr(cur_ptr); + end; + end + else cur_val:=sa_ptr(m) + else cur_val:=equiv(m); + cur_val_level:=tok_val; +@z +%--------------------------------------- +@x [26] m.416 l.8397 - e-TeX basic +|glue_val|, |input_line_no_code|, or |badness_code|. +@y +|glue_val|, |input_line_no_code|, or |badness_code|. +\eTeX\ inserts |last_node_type_code| after |glue_val| and adds +the codes for its extensions: |eTeX_version_code|, \dots\ . +@z +%--------------------------------------- +@x [26] m.416 l.8399 - e-TeX basic +@d input_line_no_code=glue_val+1 {code for \.{\\inputlineno}} +@d badness_code=glue_val+2 {code for \.{\\badness}} +@y +@d last_node_type_code=glue_val+1 {code for \.{\\lastnodetype}} +@d input_line_no_code=glue_val+2 {code for \.{\\inputlineno}} +@d badness_code=input_line_no_code+1 {code for \.{\\badness}} +@# +@d eTeX_int=badness_code+1 {first of \eTeX\ codes for integers} +@d eTeX_dim=eTeX_int+8 {first of \eTeX\ codes for dimensions} +@d eTeX_glue=eTeX_dim+9 {first of \eTeX\ codes for glue} +@d eTeX_mu=eTeX_glue+1 {first of \eTeX\ codes for muglue} +@d eTeX_expr=eTeX_mu+1 {first of \eTeX\ codes for expressions} +@z +%--------------------------------------- +@x [26] m.417 l.8432 - e-TeX interaction_mode +@+else print_esc("insertpenalties"); +@y +@/@<Cases of |set_page_int| for |print_cmd_chr|@>@/ +@+else print_esc("insertpenalties"); +@z +%--------------------------------------- +@x [26] m.417 l.8441 - e-TeX basic + othercases print_esc("badness") +@y + @/@<Cases of |last_item| for |print_cmd_chr|@>@/ + othercases print_esc("badness") +@z +%--------------------------------------- +@x [26] m.419 l.8464 - e-TeX interaction_mode +begin if m=0 then cur_val:=dead_cycles@+else cur_val:=insert_penalties; +@y +begin if m=0 then cur_val:=dead_cycles +@/@<Cases for `Fetch the |dead_cycles| or the |insert_penalties|'@>@/ +else cur_val:=insert_penalties; +@z +%--------------------------------------- +@x [26] m.420 l.8469 - e-TeX sparse arrays +begin scan_eight_bit_int; +if box(cur_val)=null then cur_val:=0 @+else cur_val:=mem[box(cur_val)+m].sc; +@y +begin scan_register_num; fetch_box(q); +if q=null then cur_val:=0 @+else cur_val:=mem[q+m].sc; +@z +%--------------------------------------- +@x [26] m.423 l.8494 - e-TeX penalties +begin if par_shape_ptr=null then cur_val:=0 +@y +begin if m>par_shape_loc then @<Fetch a penalties array element@> +else if par_shape_ptr=null then cur_val:=0 +@z +%--------------------------------------- +@x [26] m.424 l.8500 - e-TeX TeXXeT +implemented. The reference count for \.{\\lastskip} will be updated later. +@y +implemented. The reference count for \.{\\lastskip} will be updated later. +A final \.{\\endM} node is temporarily removed. +@z +%--------------------------------------- +@x [26] m.424 l.8506 - e-TeX basic +if cur_chr>glue_val then +@y +if m>=input_line_no_code then +@z +%--------------------------------------- +@x [26] m.424 l.8507 - e-TeX basic + begin if cur_chr=input_line_no_code then cur_val:=line + else cur_val:=last_badness; {|cur_chr=badness_code|} +@y + if m>=eTeX_glue then @<Process an expression and |return|@>@; + else if m>=eTeX_dim then + begin case m of + @/@<Cases for fetching a dimension value@>@/ + end; {there are no other cases} + cur_val_level:=dimen_val; + end + else begin case m of + input_line_no_code: cur_val:=line; + badness_code: cur_val:=last_badness; + @/@<Cases for fetching an integer value@>@/ + end; {there are no other cases} +@z +%--------------------------------------- +@x [26] m.424 l.8512 - e-TeX last_node_type + cur_val_level:=cur_chr; +@y + if cur_chr=last_node_type_code then + begin cur_val_level:=int_val; + if (tail=head)or(mode=0) then cur_val:=-1; + end + else cur_val_level:=cur_chr; +@z +%--------------------------------------- +@x [26] m.424 l.8514 - e-TeX TeXXeT + case cur_chr of +@y + begin if (type(tail)=math_node)and(subtype(tail)=end_M_code) then + remove_end_M; + case cur_chr of +@z +%--------------------------------------- +@x [26] m.424 l.8520 - e-TeX last_node_type + end; +@y + end; + last_node_type_code: + if (type(tail)<>math_node)or(subtype(tail)<>end_M_code) then + if type(tail)<=unset_node then cur_val:=type(tail)+1 + else cur_val:=unset_node+2; +@z +%--------------------------------------- +@x [26] m.424 l.8521 - e-TeX TeXXeT + end {there are no other cases} +@y + end; {there are no other cases} + if LR_temp<>null then insert_end_M; + end +@z +%--------------------------------------- +@x [26] m.424 l.8526 - e-TeX last_node_type + glue_val: if last_glue<>max_halfword then cur_val:=last_glue; +@y + glue_val: if last_glue<>max_halfword then cur_val:=last_glue; + last_node_type_code: cur_val:=last_node_type; +@z +%--------------------------------------- +@x [26] m.427 l.8542 - e-TeX sparse arrays +begin scan_eight_bit_int; +case m of +@y +begin if (m<mem_bot)or(m>lo_mem_stat_max) then + begin cur_val_level:=sa_type(m); + if cur_val_level<glue_val then cur_val:=sa_int(m) + else cur_val:=sa_ptr(m); + end +else begin scan_register_num; cur_val_level:=m-mem_bot; + if cur_val>255 then + begin find_sa_element(cur_val_level,cur_val,false); + if cur_ptr=null then + if cur_val_level<glue_val then cur_val:=0 + else cur_val:=zero_glue + else if cur_val_level<glue_val then cur_val:=sa_int(cur_ptr) + else cur_val:=sa_ptr(cur_ptr); + end + else + case cur_val_level of +@z +%--------------------------------------- +@x [26] m.427 l.8549 - e-TeX sparse arrays +cur_val_level:=m; +@y + end; +@z +%--------------------------------------- +@x [26] m.461 l.9077 - e-TeX expr +exit:end; +@y +exit:end; +@# +@<Declare procedures needed for expressions@>@; +@z +%--------------------------------------- +@x [27] m.464 l.9136 - e-TeX basic +@p function str_toks(@!b:pool_pointer):pointer; +@y +@p @t\4@>@<Declare \eTeX\ procedures for token lists@>@;@/ +function str_toks(@!b:pool_pointer):pointer; +@z +%--------------------------------------- +@x [27] m.465 l.9161 the_toks - e-TeX unexpanded +@p function the_toks:pointer; +@y +@p function the_toks:pointer; +label exit; +@z +%--------------------------------------- +@x [27] m.465 l.9165 the_toks - e-TeX unexpanded +begin get_x_token; scan_something_internal(tok_val,false); +@y +@!c:small_number; {value of |cur_chr|} +begin @<Handle \.{\\unexpanded} or \.{\\detokenize} and |return|@>;@/ +get_x_token; scan_something_internal(tok_val,false); +@z +%--------------------------------------- +@x [27] m.465 l.9179 the_toks - e-TeX unexpanded +end; +@y +exit:end; +@z +%--------------------------------------- +@x [27] m.468 l.9202 - e-TeX basic +@d number_code=0 {command code for \.{\\number}} +@y +\eTeX\ adds \.{\\eTeXrevision} such that |job_name_code| remains last. + +@d number_code=0 {command code for \.{\\number}} +@z +%--------------------------------------- +@x [27] m.468 l.9207 - e-TeX basic +@d job_name_code=5 {command code for \.{\\jobname}} +@y +@d etex_convert_base=5 {base for \eTeX's command codes} +@d eTeX_revision_code=etex_convert_base {command code for \.{\\eTeXrevision}} +@d etex_convert_codes=etex_convert_base+1 {end of \eTeX's command codes} +@d job_name_code=etex_convert_codes {command code for \.{\\jobname}} +@z +%--------------------------------------- +@x [27] m.469 l.9230 - e-TeX basic + othercases print_esc("jobname") +@y + eTeX_revision_code: print_esc("eTeXrevision"); + othercases print_esc("jobname") +@z +%--------------------------------------- +@x [27] m.471 l.9255 - e-TeX basic +job_name_code: if job_name=0 then open_log_file; +@y +eTeX_revision_code: do_nothing; +job_name_code: if job_name=0 then open_log_file; +@z +%--------------------------------------- +@x [27] m.472 l.9271 - e-TeX basic +job_name_code: print(job_name); +@y +eTeX_revision_code: print(eTeX_revision); +job_name_code: print(job_name); +@z +%--------------------------------------- +@x [27] m.478 l.9381 - e-TeX protected + if cur_cmd<=max_command then goto done2; +@y + if cur_cmd>=call then + if info(link(cur_chr))=protected_token then + begin cur_cmd:=relax; cur_chr:=no_expand_flag; + end; + if cur_cmd<=max_command then goto done2; +@z +%--------------------------------------- +@x [27] m.482 l.9429 read_toks - e-TeX read_line +@p procedure read_toks(@!n:integer;@!r:pointer); +@y +@p procedure read_toks(@!n:integer;@!r:pointer;@!j:halfword); +@z +%--------------------------------------- +@x [27] m.483 l.9455 - e-TeX read_line +loop@+ begin get_token; +@y +@<Handle \.{\\readline} and |goto done|@>;@/ +loop@+ begin get_token; +@z +%--------------------------------------- +@x [28] m.487 l.9507 - e-TeX cond +@d if_char_code=0 { `\.{\\if}' } +@y +@d unless_code=32 {amount added for `\.{\\unless}' prefix} +@# +@d if_char_code=0 { `\.{\\if}' } +@z +%--------------------------------------- +@x [28] m.488 l.9562 - e-TeX cond +if_test: case chr_code of +@y +if_test: begin if chr_code>=unless_code then print_esc("unless"); +case chr_code mod unless_code of +@z +%--------------------------------------- +@x [28] m.488 l.9579 - e-TeX cond + othercases print_esc("if") + endcases; +@y + @/@<Cases of |if_test| for |print_cmd_chr|@>@/ + othercases print_esc("if") + endcases; +end; +@z +%--------------------------------------- +@x [28] m.494 l.9653 pass_text - e-TeX tracing +done: scanner_status:=save_scanner_status; +@y +done: scanner_status:=save_scanner_status; +if tracing_ifs>0 then show_cur_cmd_chr; +@z +%--------------------------------------- +@x [28] m.496 l.9669 - e-TeX tracing_nesting +begin p:=cond_ptr; if_line:=if_line_field(p); +@y +begin if if_stack[in_open]=cond_ptr then if_warning; + {conditionals possibly not properly nested with files} +p:=cond_ptr; if_line:=if_line_field(p); +@z +%--------------------------------------- +@x [28] m.498 l.9706 conditional - e-TeX cond +begin @<Push the condition stack@>;@+save_cond_ptr:=cond_ptr;this_if:=cur_chr;@/ +@<Either process \.{\\ifcase} or set |b| to the value of a boolean condition@>; +@y +@!is_unless:boolean; {was this if preceded by `\.{\\unless}' ?} +begin if tracing_ifs>0 then if tracing_commands<=1 then show_cur_cmd_chr; +@<Push the condition stack@>;@+save_cond_ptr:=cond_ptr; +is_unless:=(cur_chr>=unless_code); this_if:=cur_chr mod unless_code;@/ +@<Either process \.{\\ifcase} or set |b| to the value of a boolean condition@>; +if is_unless then b:=not b; +@z +%--------------------------------------- +@x [28] m.501 l.9749 - e-TeX cond +if_false_code: b:=false; +@y +if_false_code: b:=false; +@/@<Cases for |conditional|@>@/ +@z +%--------------------------------------- +@x [28] m.505 l.9788 - e-TeX sparse arrays +begin scan_eight_bit_int; p:=box(cur_val); +@y +begin scan_register_num; fetch_box(p); +@z +%--------------------------------------- +@x [28] m.510 l.9878 - e-TeX cond +if cur_chr>if_limit then +@y +begin if tracing_ifs>0 then if tracing_commands<=1 then show_cur_cmd_chr; +if cur_chr>if_limit then +@z +%--------------------------------------- +@x [28] m.510 l.9889 - e-TeX cond + end +@y + end; +end +@z +%--------------------------------------- +@x [29] m.536 l.10343 - e-TeX basic +print_two(time div 60); print_char(":"); print_two(time mod 60); +@y +print_two(time div 60); print_char(":"); print_two(time mod 60); +if eTeX_ex then + begin; wlog_cr; wlog('entering extended mode'); + end; +@z +%--------------------------------------- +@x [30] m.581 l.11276 char_warning - e-TeX tracing +begin if tracing_lost_chars>0 then +@y +var old_setting: integer; {saved value of |tracing_online|} +begin if tracing_lost_chars>0 then + begin old_setting:=tracing_online; + if eTeX_ex and(tracing_lost_chars>1) then tracing_online:=1; +@z +%--------------------------------------- +@x [30] m.581 l.11283 char_warning - e-TeX tracing +end; +@y + tracing_online:=old_setting; + end; +end; +@z +%--------------------------------------- +@x [32] m.616 l.12251 - e-TeX TeXXeT +this is essentially the depth of |push| commands in the \.{DVI} output. +@y +this is essentially the depth of |push| commands in the \.{DVI} output. + +For mixed direction text (\TeXXeT) the current text direction is called +|cur_dir|. As the box being shipped out will never be used again and +soon be recycled, we can simply reverse any R-text (i.e., right-to-left) +segments of hlist nodes as well as complete hlist nodes embedded in such +segments. Moreover this can be done iteratively rather than recursively. +There are, however, two complications related to leaders that require +some additional bookkeeping: (1)~One and the same hlist node might be +used more than once (but never inside both L- and R-text); and +(2)~leader boxes inside hlists must be aligned with respect to the left +edge of the original hlist. + +A math node is changed into a kern node whenever the text direction +remains the same, it is replaced by an |edge_node| if the text direction +changes; the subtype of an an |hlist_node| inside R-text is changed to +|reversed| once its hlist has been reversed. +@!@^data structure assumptions@> +@z +%--------------------------------------- +@x [32] m.616 l.12253 - e-TeX TeXXeT +@d synch_h==if cur_h<>dvi_h then +@y +@d reversed=min_quarterword+1 {subtype for an |hlist_node| whose hlist + has been reversed} +@d dlist=min_quarterword+2 {subtype for an |hlist_node| from display math mode} +@d left_to_right=0 +@d right_to_left=1 +@d reflected==1-cur_dir {the opposite of |cur_dir|} +@# +@d synch_h==if cur_h<>dvi_h then +@z +%--------------------------------------- +@x [32] m.619 l.12321 hlist_out - e-TeX TeXXeT +@!edge:scaled; {left edge of sub-box, or right edge of leader space} +@y +@!edge:scaled; {right edge of sub-box or leader space} +@!prev_p:pointer; {one step behind |p|} +@z +%--------------------------------------- +@x [32] m.619 l.12331 hlist_out - e-TeX TeXXeT +save_loc:=dvi_offset+dvi_ptr; base_line:=cur_v; left_edge:=cur_h; +@y +save_loc:=dvi_offset+dvi_ptr; base_line:=cur_v; +prev_p:=this_box+list_offset; +@<Initialize |hlist_out| for mixed direction typesetting@>; +left_edge:=cur_h; +@z +%--------------------------------------- +@x [32] m.619 l.12334 hlist_out - e-TeX TeXXeT +prune_movements(save_loc); +@y +@<Finish |hlist_out| for mixed direction typesetting@>; +prune_movements(save_loc); +@z +%--------------------------------------- +@x [32] m.620 l.12353 - e-TeX TeXXeT + p:=link(p); +@y + prev_p:=link(prev_p); {N.B.: not |prev_p:=p|, |p| might be |lig_trick|} + p:=link(p); +@z +%--------------------------------------- +@x [32] m.622 l.12378 - e-TeX TeXXeT +kern_node,math_node:cur_h:=cur_h+width(p); +@y +kern_node:cur_h:=cur_h+width(p); +math_node: @<Handle a math node in |hlist_out|@>; +@z +%--------------------------------------- +@x [32] m.622 l.12380 - e-TeX TeXXeT +othercases do_nothing +@y +@/@<Cases of |hlist_out| that arise in mixed direction text only@>@; +othercases do_nothing +@z +%--------------------------------------- +@x [32] m.622 l.12385 - e-TeX TeXXeT +next_p:p:=link(p); +@y +next_p:prev_p:=p; p:=link(p); +@z +%--------------------------------------- +@x [32] m.623 l.12392 - e-TeX TeXXeT + temp_ptr:=p; edge:=cur_h; +@y + temp_ptr:=p; edge:=cur_h+width(p); + if cur_dir=right_to_left then cur_h:=edge; +@z +%--------------------------------------- +@x [32] m.623 l.12395 - e-TeX TeXXeT + cur_h:=edge+width(p); cur_v:=base_line; +@y + cur_h:=edge; cur_v:=base_line; +@z +%--------------------------------------- +@x [32] m.625 l.12413 - e-TeX TeXXeT + glue_temp:=-billion + +@<Move right or output leaders@>= +begin g:=glue_ptr(p); rule_wd:=width(g)-cur_g; +@y + glue_temp:=-billion +@# +@d round_glue==g:=glue_ptr(p); rule_wd:=width(g)-cur_g; +@z +%--------------------------------------- +@x [32] m.625 l.12432 - e-TeX TeXXeT +rule_wd:=rule_wd+cur_g; +@y +rule_wd:=rule_wd+cur_g + +@<Move right or output leaders@>= +begin round_glue; +if eTeX_ex then @<Handle a glue node for mixed direction typesetting@>; +@z +%--------------------------------------- +@x [32] m.626 l.12448 - e-TeX TeXXeT + edge:=cur_h+rule_wd; lx:=0; +@y + if cur_dir=right_to_left then cur_h:=cur_h-10; + edge:=cur_h+rule_wd; lx:=0; +@z +%--------------------------------------- +@x [32] m.626 l.12454 - e-TeX TeXXeT + cur_h:=edge-10; goto next_p; +@y + if cur_dir=right_to_left then cur_h:=edge + else cur_h:=edge-10; + goto next_p; +@z +%--------------------------------------- +@x [32] m.628 l.12493 - e-TeX TeXXeT +synch_h; save_h:=dvi_h; temp_ptr:=leader_box; +@y +synch_h; save_h:=dvi_h; temp_ptr:=leader_box; +if cur_dir=right_to_left then cur_h:=cur_h+leader_wd; +@z +%--------------------------------------- +@x [32] m.632 l.12567 - e-TeX TeXXeT + cur_h:=left_edge+shift_amount(p); {shift the box right} +@y + if cur_dir=right_to_left then cur_h:=left_edge-shift_amount(p) + else cur_h:=left_edge+shift_amount(p); {shift the box right} +@z +%--------------------------------------- +@x [32] m.633 l.12579 - e-TeX TeXXeT + begin synch_h; synch_v; + dvi_out(put_rule); dvi_four(rule_ht); dvi_four(rule_wd); +@y + begin if cur_dir=right_to_left then cur_h:=cur_h-rule_wd; + synch_h; synch_v; + dvi_out(put_rule); dvi_four(rule_ht); dvi_four(rule_wd); + cur_h:=left_edge; +@z +%--------------------------------------- +@x [32] m.637 l.12645 - e-TeX TeXXeT +begin cur_h:=left_edge+shift_amount(leader_box); synch_h; save_h:=dvi_h;@/ +@y +begin if cur_dir=right_to_left then + cur_h:=left_edge-shift_amount(leader_box) + else cur_h:=left_edge+shift_amount(leader_box); +synch_h; save_h:=dvi_h;@/ +@z +%--------------------------------------- +@x [32] m.638 l.12682 ship_out - e-TeX TeXXeT +@<Ship box |p| out@>; +@y +@<Ship box |p| out@>; +if eTeX_ex then @<Check for LR anomalies at the end of |ship_out|@>; +@z +%--------------------------------------- +@x [33] m.649 l.12902 hpack - e-TeX TeXXeT +h:=0; @<Clear dimensions to zero@>; +@y +h:=0; @<Clear dimensions to zero@>; +if TeXXeT_en then @<Initialize the LR stack@>; +@z +%--------------------------------------- +@x [33] m.649 l.12912 hpack - e-TeX TeXXeT +exit: hpack:=r; +@y +exit: if TeXXeT_en then @<Check for LR anomalies at the end of |hpack|@>; +hpack:=r; +@z +%--------------------------------------- +@x [33] m.651 l.12936 - e-TeX TeXXeT + kern_node,math_node: x:=x+width(p); +@y + kern_node: x:=x+width(p); + math_node: begin x:=x+width(p); + if TeXXeT_en then @<Adjust \(t)the LR stack for the |hpack| routine@>; + end; +@z +%--------------------------------------- +@x [34] m.687 l.13507 - e-TeX middle +\TeX's \.{\\left} and \.{\\right}. The |nucleus| of such noads is +@y +\TeX's \.{\\left} and \.{\\right} as well as \eTeX's \.{\\middle}. +The |nucleus| of such noads is +@z +%--------------------------------------- +@x [34] m.687 l.13524 - e-TeX middle +@d delimiter==nucleus {|delimiter| field in left and right noads} +@y +@d delimiter==nucleus {|delimiter| field in left and right noads} +@d middle_noad==1 {|subtype| of right noad representing \.{\\middle}} +@z +%--------------------------------------- +@x [34] m.696 l.13697 - e-TeX middle +right_noad: begin print_esc("right"); print_delimiter(nucleus(p)); + end; +end; +if subtype(p)<>normal then + if subtype(p)=limits then print_esc("limits") + else print_esc("nolimits"); +if type(p)<left_noad then print_subsidiary_data(nucleus(p),"."); +@y +right_noad: begin if subtype(p)=normal then print_esc("right") + else print_esc("middle"); + print_delimiter(nucleus(p)); + end; +end; +if type(p)<left_noad then + begin if subtype(p)<>normal then + if subtype(p)=limits then print_esc("limits") + else print_esc("nolimits"); + print_subsidiary_data(nucleus(p),"."); + end; +@z +%--------------------------------------- +@x [36] m.727 l.14295 - e-TeX middle +done_with_noad: r:=q; r_type:=type(r); +@y +done_with_noad: r:=q; r_type:=type(r); +if r_type=right_noad then + begin r_type:=left_noad; cur_style:=style; @<Set up the values...@>; + end; +@z +%--------------------------------------- +@x [36] m.760 l.14956 - e-TeX middle + r_type:=t; +@y + if type(q)=right_noad then t:=open_noad; + r_type:=t; +@z +%--------------------------------------- +@x [36] m.762 l.14997 make_left_right - e-TeX middle +begin if style<script_style then cur_size:=text_size +else cur_size:=16*((style-text_style) div 2); +@y +begin cur_style:=style; @<Set up the values...@>; +@z +%--------------------------------------- +@x [37] m.785 l.15488 align_peek - e-TeX protected +begin restart: align_state:=1000000; @<Get the next non-blank non-call token@>; +@y +begin restart: align_state:=1000000; +repeat get_x_or_protected; +until cur_cmd<>spacer; +@z +%--------------------------------------- +@x [37] m.791 l.15599 fin_col - e-TeX protected +align_state:=1000000; @<Get the next non-blank non-call token@>; +@y +align_state:=1000000; +repeat get_x_or_protected; +until cur_cmd<>spacer; +@z +%--------------------------------------- +@x [37] m.807 l.15861 - e-TeX TeXXeT + begin type(q):=hlist_node; width(q):=width(p); +@y + begin type(q):=hlist_node; width(q):=width(p); + if nest[nest_ptr-1].mode_field=mmode then subtype(q):=dlist; {for |ship_out|} +@z +%--------------------------------------- +@x [37] m.808 l.15879 - e-TeX TeXXeT +n:=span_count(r); t:=width(s); w:=t; u:=hold_head; +@y +n:=span_count(r); t:=width(s); w:=t; u:=hold_head; +subtype(r):=min_quarterword; {for |ship_out|} +@z +%--------------------------------------- +@x [38] m.814 l.16002 - e-TeX penalties +There is one explicit parameter: |final_widow_penalty| is the amount of +additional penalty to be inserted before the final line of the paragraph. +@y +There is one explicit parameter: |d| is true for partial paragraphs +preceding display math mode; in this case the amount of additional +penalty inserted before the final line is |display_widow_penalty| +instead of |widow_penalty|. +@z +%--------------------------------------- +@x [38] m.815 l.16029 line_break - e-TeX penalties +procedure line_break(@!final_widow_penalty:integer); +@y +procedure line_break(@!d:boolean); +@z +%--------------------------------------- +@x [38] m.815 l.16039 - e-TeX basic +end; +@y +end; +@# +@t\4@>@<Declare \eTeX\ procedures for use by |main_control|@> +@z +%--------------------------------------- +@x [38] m.816 l.16059 - e-TeX last_line_fit +link(tail):=new_param_glue(par_fill_skip_code); +@y +link(tail):=new_param_glue(par_fill_skip_code); +last_line_fill:=link(tail); +@z +%--------------------------------------- +@x [38] m.819 l.16124 - e-TeX last_line_fit +@d active_node_size=3 {number of words in active nodes} +@y +@d active_node_size_normal=3 {number of words in normal active nodes} +@z +%--------------------------------------- +@x [38] m.827 l.16287 - e-TeX last_line_fit +background[6]:=shrink(q)+shrink(r); +@y +background[6]:=shrink(q)+shrink(r); +@<Check for special treatment of last line of paragraph@>; +@z +%--------------------------------------- +@x [38] m.829 l.16338 try_break - e-TeX last_line_fit +label exit,done,done1,continue,deactivate; +@y +label exit,done,done1,continue,deactivate,found,not_found; +@z +%--------------------------------------- +@x [38] m.845 l.16630 - e-TeX last_line_fit +total_demerits(q):=minimal_demerits[fit_class]; +@y +total_demerits(q):=minimal_demerits[fit_class]; +if do_last_line_fit then + @<Store \(a)additional data in the new active node@>; +@z +%--------------------------------------- +@x [38] m.846 l.16643 - e-TeX last_line_fit +print(" t="); print_int(total_demerits(q)); +@y +print(" t="); print_int(total_demerits(q)); +if do_last_line_fit then @<Print additional data in the new active node@>; +@z +%--------------------------------------- +@x [38] m.851 l.16742 - e-TeX last_line_fit +if (b>inf_bad)or(pi=eject_penalty) then +@y +if do_last_line_fit then @<Adjust \(t)the additional data for last line@>; +found: +if (b>inf_bad)or(pi=eject_penalty) then +@z +%--------------------------------------- +@x [38] m.852 l.16766 - e-TeX last_line_fit + begin b:=0; fit_class:=decent_fit; {infinite stretch} +@y + begin if do_last_line_fit then + begin if cur_p=null then {the last line of a paragraph} + @<Perform computations for last line and |goto found|@>; + shortfall:=0; + end; + b:=0; fit_class:=decent_fit; {infinite stretch} +@z +%--------------------------------------- +@x [38] m.855 l.16823 - e-TeX last_line_fit + best_place[fit_class]:=break_node(r); best_pl_line[fit_class]:=l; +@y + best_place[fit_class]:=break_node(r); best_pl_line[fit_class]:=l; + if do_last_line_fit then + @<Store \(a)additional data for this feasible break@>; +@z +%--------------------------------------- +@x [39] m.863 l.16996 - e-TeX last_line_fit + end;@+tats@/ +@y + end;@+tats@/ +if do_last_line_fit then @<Adjust \(t)the final line of the paragraph@>; +@z +%--------------------------------------- +@x [39] m.864 l.17007 - e-TeX last_line_fit +line_number(q):=prev_graf+1; total_demerits(q):=0; link(active):=q; +@y +line_number(q):=prev_graf+1; total_demerits(q):=0; link(active):=q; +if do_last_line_fit then + @<Initialize additional fields of the first active node@>; +@z +%--------------------------------------- +@x [39] m.866 l.17057 - e-TeX TeXXeT +math_node: begin auto_breaking:=(subtype(cur_p)=after); kern_break; +@y +math_node: begin if subtype(cur_p)<L_code then auto_breaking:=end_LR(cur_p); + kern_break; +@z +%--------------------------------------- +@x [39] m.876 l.17219 - e-TeX penalties +post_line_break(final_widow_penalty) +@y +post_line_break(d) +@z +%--------------------------------------- +@x [39] m.877 l.17233 post_line_break - e-TeX penalties +procedure post_line_break(@!final_widow_penalty:integer); +@y +procedure post_line_break(@!d:boolean); +@z +%--------------------------------------- +@x [39] m.877 l.17243 post_line_break - e-TeX TeXXeT +begin @<Reverse the links of the relevant passive nodes, setting |cur_p| to the +@y +@!LR_ptr:pointer; {stack of LR codes} +begin LR_ptr:=LR_save; +@<Reverse the links of the relevant passive nodes, setting |cur_p| to the +@z +%--------------------------------------- +@x [39] m.877 l.17256 post_line_break - e-TeX TeXXeT +prev_graf:=best_line-1; +@y +prev_graf:=best_line-1; +LR_save:=LR_ptr; +@z +%--------------------------------------- +@x [39] m.879 l.17286 - e-TeX TeXXeT + r:=q; {now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|} +@y + r:=q; {now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|} + if type(q)=math_node then if TeXXeT_en then + @<Adjust \(t)the LR stack for the |post_line_break| routine@>; +@z +%--------------------------------------- +@x [39] m.880 l.17303 - e-TeX TeXXeT +@<Modify the end of the line to reflect the nature of the break and to include + \.{\\rightskip}; also set the proper value of |disc_break|@>; +@y +if TeXXeT_en then + @<Insert LR nodes at the beginning of the current line and adjust + the LR stack based on LR nodes in this line@>; +@<Modify the end of the line to reflect the nature of the break and to include + \.{\\rightskip}; also set the proper value of |disc_break|@>; +if TeXXeT_en then @<Insert LR nodes at the end of the current line@>; +@z +%--------------------------------------- +@x [39] m.881 l.17326 - e-TeX TeXXeT + else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; +@y + else if type(q)=kern_node then width(q):=0 + else if type(q)=math_node then + begin width(q):=0; + if TeXXeT_en then @<Adjust \(t)the LR stack for the |p...@>; + end; +@z +%--------------------------------------- +@x [39] m.890 l.17420 - e-TeX penalties + begin pen:=inter_line_penalty; + if cur_line=prev_graf+1 then pen:=pen+club_penalty; + if cur_line+2=best_line then pen:=pen+final_widow_penalty; +@y + begin q:=inter_line_penalties_ptr; + if q<>null then + begin r:=cur_line; + if r>penalty(q) then r:=penalty(q); + pen:=penalty(q+r); + end + else pen:=inter_line_penalty; + q:=club_penalties_ptr; + if q<>null then + begin r:=cur_line-prev_graf; + if r>penalty(q) then r:=penalty(q); + pen:=pen+penalty(q+r); + end + else if cur_line=prev_graf+1 then pen:=pen+club_penalty; + if d then q:=display_widow_penalties_ptr + else q:=widow_penalties_ptr; + if q<>null then + begin r:=best_line-cur_line-1; + if r>penalty(q) then r:=penalty(q); + pen:=pen+penalty(q+r); + end + else if cur_line+2=best_line then + if d then pen:=pen+display_widow_penalty + else pen:=pen+widow_penalty; +@z +%--------------------------------------- +@x [40] m.891 l.17487 - e-TeX hyph_codes +cur_lang:=init_cur_lang; l_hyf:=init_l_hyf; r_hyf:=init_r_hyf; +@y +cur_lang:=init_cur_lang; l_hyf:=init_l_hyf; r_hyf:=init_r_hyf; +set_hyph_index; +@z +%--------------------------------------- +@x [40] m.896 l.17556 - e-TeX hyph_codes + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@y + set_lc_code(c); + if hc[0]<>0 then + if (hc[0]=c)or(uc_hyph>0) then goto done2 +@z +%--------------------------------------- +@x [40] m.897 l.17573 - e-TeX hyph_codes + if lc_code(c)=0 then goto done3; + if hn=63 then goto done3; + hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c); hyf_bchar:=non_char; +@y + set_lc_code(c); + if hc[0]=0 then goto done3; + if hn=63 then goto done3; + hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=hc[0]; hyf_bchar:=non_char; +@z +%--------------------------------------- +@x [40] m.898 l.17599 - e-TeX hyph_codes + if lc_code(c)=0 then goto done3; + if j=63 then goto done3; + incr(j); hu[j]:=c; hc[j]:=lc_code(c);@/ +@y + set_lc_code(c); + if hc[0]=0 then goto done3; + if j=63 then goto done3; + incr(j); hu[j]:=c; hc[j]:=hc[0];@/ +@z +%--------------------------------------- +@x [42] m.934 l.18238 new_hyph_exceptions - e-TeX hyph_codes +label reswitch, exit, found, not_found; +@y +label reswitch, exit, found, not_found, not_found1; +@z +%--------------------------------------- +@x [42] m.934 l.18248 new_hyph_exceptions - e-TeX hyph_codes +set_cur_lang; +@y +set_cur_lang; +@!init if trie_not_ready then + begin hyph_index:=0; goto not_found1; + end; +tini@/ +set_hyph_index; +not_found1: +@z +%--------------------------------------- +@x [42] m.937 l.18280 - e-TeX hyph_codes +else begin if lc_code(cur_chr)=0 then +@y +else begin set_lc_code(cur_chr); + if hc[0]=0 then +@z +%--------------------------------------- +@x [42] m.937 l.18288 - e-TeX hyph_codes + begin incr(n); hc[n]:=lc_code(cur_chr); +@y + begin incr(n); hc[n]:=hc[0]; +@z +%--------------------------------------- +@x [43] m.952 l.18576 - e-TeX hyph_codes +trie_root:=compress_trie(trie_root); {identify equivalent subtries} +@y +hyph_root:=compress_trie(hyph_root); +trie_root:=compress_trie(trie_root); {identify equivalent subtries} +@z +%--------------------------------------- +@x [43] m.958 l.18664 - e-TeX hyph_codes +if trie_root=0 then {no patterns were given} +@y +if trie_max=0 then {no patterns were given} +@z +%--------------------------------------- +@x [43] m.958 l.18668 - e-TeX hyph_codes +else begin trie_fix(trie_root); {this fixes the non-holes in |trie|} +@y +else begin if hyph_root>0 then trie_fix(hyph_root); + if trie_root>0 then trie_fix(trie_root); {this fixes the non-holes in |trie|} +@z +%--------------------------------------- +@x [43] m.960 l.18711 new_patterns - e-TeX hyph_codes + brace@>; +@y + brace@>; + if saving_hyph_codes>0 then + @<Store hyphenation codes for current language@>; +@z +%--------------------------------------- +@x [43] m.966 l.18818 init_trie - e-TeX hyph_codes +@<Move the data into |trie|@>; +@y +if hyph_root<>0 then @<Pack all stored |hyph_codes|@>; +@<Move the data into |trie|@>; +@z +%--------------------------------------- +@x [44] m.968 l.18834 - e-TeX saved_items +whenever this is possible without backspacing. +@y +whenever this is possible without backspacing. + +When the second argument |s| is |false| the deleted nodes are destroyed, +otherwise they are collected in a list starting at |split_disc|. +@z +%--------------------------------------- +@x [44] m.968 l.18841 prune_page_top - e-TeX saved_items +@p function prune_page_top(@!p:pointer):pointer; {adjust top after page break} +var prev_p:pointer; {lags one step behind |p|} +@!q:pointer; {temporary variable for list manipulation} +@y +@p function prune_page_top(@!p:pointer;@!s:boolean):pointer; + {adjust top after page break} +var prev_p:pointer; {lags one step behind |p|} +@!q,@!r:pointer; {temporary variables for list manipulation} +@z +%--------------------------------------- +@x [44] m.968 l.18852 prune_page_top - e-TeX saved_items + link(prev_p):=p; flush_node_list(q); +@y + link(prev_p):=p; + if s then + begin if split_disc=null then split_disc:=q@+else link(r):=q; + r:=q; + end + else flush_node_list(q); +@z +%--------------------------------------- +@x [44] m.977 l.19019 vsplit - e-TeX marks, sparse arrays +@p function vsplit(@!n:eight_bits; @!h:scaled):pointer; +@y +@p @t\4@>@<Declare the function called |do_marks|@>@; +function vsplit(@!n:halfword; @!h:scaled):pointer; +@z +%--------------------------------------- +@x [44] m.977 l.19025 vsplit - e-TeX sparse arrays +begin v:=box(n); +@y +begin cur_val:=n; fetch_box(v); +@z +%--------------------------------------- +@x [44] m.977 l.19026 vsplit - e-TeX marks, saved_items +if split_first_mark<>null then +@y +flush_node_list(split_disc); split_disc:=null; +if sa_mark<>null then + if do_marks(vsplit_init,0,sa_mark) then sa_mark:=null; +if split_first_mark<>null then +@z +%--------------------------------------- +@x [44] m.977 l.19034 vsplit - e-TeX saved_items +q:=prune_page_top(q); p:=list_ptr(v); free_node(v,box_node_size); +@y +q:=prune_page_top(q,saving_vdiscards>0); +p:=list_ptr(v); free_node(v,box_node_size); +@z +%--------------------------------------- +@x [44] m.977 l.19035 vsplit - e-TeX sparse arrays +if q=null then box(n):=null {the |eq_level| of the box stays the same} +else box(n):=vpack(q,natural); +@y +if q<>null then q:=vpack(q,natural); +change_box(q); {the |eq_level| of the box stays the same} +@z +%--------------------------------------- +@x [44] m.979 l.19060 - e-TeX marks + if split_first_mark=null then +@y + if mark_class(p)<>0 then @<Update the current marks for |vsplit|@> + else if split_first_mark=null then +@z +%--------------------------------------- +@x [45] m.982 l.19194 - e-TeX last_node_type +The variables |last_penalty| and |last_kern| are similar. And +@y +The variables |last_penalty|, |last_kern|, and |last_node_type| +are similar. And +@z +%--------------------------------------- +@x [45] m.982 l.19207 - e-TeX last_node_type +@!last_kern:scaled; {used to implement \.{\\lastkern}} +@y +@!last_kern:scaled; {used to implement \.{\\lastkern}} +@!last_node_type:integer; {used to implement \.{\\lastnodetype}} +@z +%--------------------------------------- +@x [45] m.991 l.19344 - e-TeX last_node_type +last_glue:=max_halfword; last_penalty:=0; last_kern:=0; +@y +last_glue:=max_halfword; last_penalty:=0; last_kern:=0; +last_node_type:=-1; +@z +%--------------------------------------- +@x [45] m.996 l.19411 - e-TeX last_node_type +last_penalty:=0; last_kern:=0; +@y +last_penalty:=0; last_kern:=0; +last_node_type:=type(p)+1; +@z +%--------------------------------------- +@x [45] m.999 l.19448 - e-TeX saved_items +link(contrib_head):=link(p); link(p):=null; flush_node_list(p) +@y +link(contrib_head):=link(p); link(p):=null; +if saving_vdiscards>0 then + begin if page_disc=null then page_disc:=p@+else link(tail_page_disc):=p; + tail_page_disc:=p; + end +else flush_node_list(p) +@z +%--------------------------------------- +@x [45] m.1012 l.19688 fire_up - e-TeX marks +if bot_mark<>null then +@y +if sa_mark<>null then + if do_marks(fire_up_init,0,sa_mark) then sa_mark:=null; +if bot_mark<>null then +@z +%--------------------------------------- +@x [45] m.1012 l.19696 fire_up - e-TeX marks +if (top_mark<>null)and(first_mark=null) then +@y +if sa_mark<>null then + if do_marks(fire_up_done,0,sa_mark) then sa_mark:=null; +if (top_mark<>null)and(first_mark=null) then +@z +%--------------------------------------- +@x [45] m.1014 l.19733 - e-TeX marks + else if type(p)=mark_node then @<Update the values of +@y + else if type(p)=mark_node then + if mark_class(p)<>0 then @<Update the current marks for |fire_up|@> + else @<Update the values of +@z +%--------------------------------------- +@x [45] m.1021 l.19845 - e-TeX saved_items + ins_ptr(p):=prune_page_top(broken_ptr(r)); +@y + ins_ptr(p):=prune_page_top(broken_ptr(r),false); +@z +%--------------------------------------- +@x [45] m.1023 l.19881 - e-TeX saved_items +ship_out(box(255)); box(255):=null; +@y +flush_node_list(page_disc); page_disc:=null; +ship_out(box(255)); box(255):=null; +@z +%--------------------------------------- +@x [45] m.1026 l.19923 - e-TeX saved_items +pop_nest; build_page; +@y +flush_node_list(page_disc); page_disc:=null; +pop_nest; build_page; +@z +%--------------------------------------- +@x [47] m.1070 l.20727 normal_paragraph - e-TeX penalties +if par_shape_ptr<>null then eq_define(par_shape_loc,shape_ref,null); +@y +if par_shape_ptr<>null then eq_define(par_shape_loc,shape_ref,null); +if inter_line_penalties_ptr<>null then + eq_define(inter_line_penalties_loc,shape_ref,null); +@z +%--------------------------------------- +@x [47] m.1071 l.20748 - e-TeX sparse arrays +|box_flag+255| represent `\.{\\setbox0}' through `\.{\\setbox255}'; +codes |box_flag+256| through |box_flag+511| represent `\.{\\global\\setbox0}' +through `\.{\\global\\setbox255}'; +code |box_flag+512| represents `\.{\\shipout}'; and codes |box_flag+513| +through |box_flag+515| represent `\.{\\leaders}', `\.{\\cleaders}', +@y +|global_box_flag-1| represent `\.{\\setbox0}' through `\.{\\setbox32767}'; +codes |global_box_flag| through |ship_out_flag-1| represent +`\.{\\global\\setbox0}' through `\.{\\global\\setbox32767}'; +code |ship_out_flag| represents `\.{\\shipout}'; and codes |leader_flag| +through |leader_flag+2| represent `\.{\\leaders}', `\.{\\cleaders}', +@z +%--------------------------------------- +@x [47] m.1071 l.20762 - e-TeX sparse arrays +@d ship_out_flag==box_flag+512 {context code for `\.{\\shipout}'} +@d leader_flag==box_flag+513 {context code for `\.{\\leaders}'} +@y +@d global_box_flag==@'10000100000 {context code for `\.{\\global\\setbox0}'} +@d ship_out_flag==@'10000200000 {context code for `\.{\\shipout}'} +@d leader_flag==@'10000200001 {context code for `\.{\\leaders}'} +@z +%--------------------------------------- +@x [47] m.1075 l.20845 box_end - e-TeX sparse arrays +var p:pointer; {|ord_noad| for new box in math mode} +@y +var p:pointer; {|ord_noad| for new box in math mode} +@!a:small_number; {global prefix} +@z +%--------------------------------------- +@x [47] m.1077 l.20883 - e-TeX sparse arrays +if box_context<box_flag+256 then + eq_define(box_base-box_flag+box_context,box_ref,cur_box) +else geq_define(box_base-box_flag-256+box_context,box_ref,cur_box) +@y +begin if box_context<global_box_flag then + begin cur_val:=box_context-box_flag; a:=0; + end +else begin cur_val:=box_context-global_box_flag; a:=4; + end; +if cur_val<256 then define(box_base+cur_val,box_ref,cur_box) +else sa_def_box; +end +@z +%--------------------------------------- +@x [47] m.1079 l.20915 begin_box - e-TeX sparse arrays +@!n:eight_bits; {a box number} +begin case cur_chr of +box_code: begin scan_eight_bit_int; cur_box:=box(cur_val); + box(cur_val):=null; {the box becomes void, at the same level} + end; +copy_code: begin scan_eight_bit_int; cur_box:=copy_node_list(box(cur_val)); +@y +@!n:halfword; {a box number} +begin case cur_chr of +box_code: begin scan_register_num; fetch_box(cur_box); + change_box(null); {the box becomes void, at the same level} + end; +copy_code: begin scan_register_num; fetch_box(q); cur_box:=copy_node_list(q); +@z +%--------------------------------------- +@x [47] m.1080 l.20931 - e-TeX TeXXeT +since |head| is a one-word node. +@y +since |head| is a one-word node. +A final \.{\\endM} node is temporarily removed. +@z +%--------------------------------------- +@x [47] m.1080 l.20944 - e-TeX TeXXeT + if (type(tail)=hlist_node)or(type(tail)=vlist_node) then + @<Remove the last box, unless it's part of a discretionary@>; +@y + begin if (type(tail)=math_node)and(subtype(tail)=end_M_code) then + remove_end_M; + if (type(tail)=hlist_node)or(type(tail)=vlist_node) then + @<Remove the last box, unless it's part of a discretionary@>; + if LR_temp<>null then insert_end_M; + end; +@z +%--------------------------------------- +@x [47] m.1082 l.20965 - e-TeX sparse arrays +begin scan_eight_bit_int; n:=cur_val; +@y +begin scan_register_num; n:=cur_val; +@z +%--------------------------------------- +@x [47] m.1096 l.21149 - e-TeX penalties, TeXXeT + else line_break(widow_penalty); +@y + else line_break(false); + if LR_save<>null then + begin flush_list(LR_save); LR_save:=null; + end; +@z +%--------------------------------------- +@x [47] m.1101 l.21205 make_mark - e-TeX marks +begin p:=scan_toks(false,true); p:=get_node(small_node_size); +@y +@!c:halfword; {the mark class} +begin if cur_chr=0 then c:=0 +else begin scan_register_num; c:=cur_val; + end; +p:=scan_toks(false,true); p:=get_node(small_node_size); +mark_class(p):=c; +@z +%--------------------------------------- +@x [47] m.1105 l.21233 - e-TeX TeXXeT +will be deleted, if present. +@y +will be deleted, if present. +A final \.{\\endM} node is temporarily removed. +@z +%--------------------------------------- +@x [47] m.1105 l.21243 delete_last - e-TeX TeXXeT +else begin if not is_char_node(tail) then if type(tail)=cur_chr then +@y +else begin if not is_char_node(tail) then + begin if (type(tail)=math_node)and(subtype(tail)=end_M_code) then + remove_end_M; + if type(tail)=cur_chr then +@z +%--------------------------------------- +@x [47] m.1105 l.21254 delete_last - e-TeX TeXXeT + end; +@y + if LR_temp<>null then insert_end_M; + end; + end; +@z +%--------------------------------------- +@x [47] m.1108 l.21292 - e-TeX saved_items +un_vbox: if chr_code=copy_code then print_esc("unvcopy") +@y +un_vbox: if chr_code=copy_code then print_esc("unvcopy") + @<Cases of |un_vbox| for |print_cmd_chr|@>@/ +@z +%--------------------------------------- +@x [47] m.1110 l.21302 unpackage - e-TeX saved_items +label exit; +@y +label done, exit; +@z +%--------------------------------------- +@x [47] m.1110 l.21305 unpackage - e-TeX saved_items, sparse arrays +begin c:=cur_chr; scan_eight_bit_int; p:=box(cur_val); +@y +begin if cur_chr>copy_code then @<Handle saved items and |goto done|@>; +c:=cur_chr; scan_register_num; fetch_box(p); +@z +%--------------------------------------- +@x [47] m.1110 l.21317 unpackage - e-TeX sparse arrays +else begin link(tail):=list_ptr(p); box(cur_val):=null; +@y +else begin link(tail):=list_ptr(p); change_box(null); +@z +%--------------------------------------- +@x [47] m.1110 l.21320 unpackage - e-TeX saved_items +while link(tail)<>null do tail:=link(tail); +@y +done: +while link(tail)<>null do tail:=link(tail); +@z +%--------------------------------------- +@x [47] m.1130 l.21592 - e-TeX TeXXeT +vmode+halign,hmode+valign:init_align; +@y +vmode+halign:init_align; +hmode+valign:@<Cases of |main_control| for |hmode+valign|@>@; init_align; +@z +%--------------------------------------- +@x [48] m.1138 l.21671 init_math - e-TeX TeXXeT +procedure init_math; +label reswitch,found,not_found,done; +var w:scaled; {new or partial |pre_display_size|} +@y +@t\4@>@<Declare subprocedures for |init_math|@>@; +procedure init_math; +label reswitch,found,not_found,done; +var w:scaled; {new or partial |pre_display_size|} +@!j:pointer; {prototype box for display} +@!x:integer; {new |pre_display_direction|} +@z +%--------------------------------------- +@x [48] m.1145 l.21729 - e-TeX TeXXeT, penalties +begin if head=tail then {`\.{\\noindent\$\$}' or `\.{\$\${ }\$\$}'} + begin pop_nest; w:=-max_dimen; + end +else begin line_break(display_widow_penalty);@/ +@y +begin j:=null; w:=-max_dimen; +if head=tail then {`\.{\\noindent\$\$}' or `\.{\$\${ }\$\$}'} + @<Prepare for display after an empty paragraph@> +else begin line_break(true);@/ +@z +%--------------------------------------- +@x [48] m.1145 l.21742 - e-TeX TeXXeT +eq_word_define(dimen_base+pre_display_size_code,w); +@y +eq_word_define(dimen_base+pre_display_size_code,w); +LR_box:=j; +if eTeX_ex then eq_word_define(int_base+pre_display_direction_code,x); +@z +%--------------------------------------- +@x [48] m.1146 l.21750 - e-TeX TeXXeT +v:=shift_amount(just_box)+2*quad(cur_font); w:=-max_dimen; +p:=list_ptr(just_box); +@y +@<Prepare for display after a non-empty paragraph@>; +@z +%--------------------------------------- +@x [48] m.1146 l.21765 - e-TeX TeXXeT +done: +@y +done: +@<Finish the natural width computation@> +@z +%--------------------------------------- +@x [48] m.1147 l.21776 - e-TeX TeXXeT +kern_node,math_node: d:=width(p); +@y +kern_node: d:=width(p); +@t\4@>@<Cases of `Let |d| be the natural width' that need special treatment@>@; +@z +%--------------------------------------- +@x [48] m.1185 l.22285 - e-TeX middle + if type(q)<>left_noad then confusion("right"); +@:this can't happen right}{\quad right@> + info(numerator(incompleat_noad)):=link(q); + link(q):=incompleat_noad; link(incompleat_noad):=p; +@y + if (type(q)<>left_noad)or(delim_ptr=null) then confusion("right"); +@:this can't happen right}{\quad right@> + info(numerator(incompleat_noad)):=link(delim_ptr); + link(delim_ptr):=incompleat_noad; link(incompleat_noad):=p; +@z +%--------------------------------------- +@x [48] m.1189 l.22300 - e-TeX middle +else print_esc("right"); +@y +@/@<Cases of |left_right| for |print_cmd_chr|@>@/ +else print_esc("right"); +@z +%--------------------------------------- +@x [48] m.1191 l.22339 math_left_right - e-TeX middle +begin t:=cur_chr; +if (t=right_noad)and(cur_group<>math_left_group) then +@y +@!q:pointer; {resulting mlist} +begin t:=cur_chr; +if (t<>left_noad)and(cur_group<>math_left_group) then +@z +%--------------------------------------- +@x [48] m.1191 l.22344 math_left_right - e-TeX middle + if t=left_noad then + begin push_math(math_left_group); link(head):=p; tail:=p; + end + else begin p:=fin_mlist(p); unsave; {end of |math_left_group|} +@y + if t=middle_noad then + begin type(p):=right_noad; subtype(p):=middle_noad; + end; + if t=left_noad then q:=p + else begin q:=fin_mlist(p); unsave; {end of |math_left_group|} + end; + if t<>right_noad then + begin push_math(math_left_group); link(head):=q; tail:=p; + delim_ptr:=p; + end + else begin +@z +%--------------------------------------- +@x [48] m.1191 l.22350 math_left_right - e-TeX middle + info(nucleus(tail)):=p; +@y + info(nucleus(tail)):=q; +@z +%--------------------------------------- +@x [48] m.1192 l.22358 - e-TeX middle + print_err("Extra "); print_esc("right"); +@.Extra \\right.@> + help1("I'm ignoring a \right that had no matching \left."); +@y + print_err("Extra "); + if t=middle_noad then + begin print_esc("middle"); +@.Extra \\middle.@> + help1("I'm ignoring a \middle that had no matching \left."); + end + else begin print_esc("right"); +@.Extra \\right.@> + help1("I'm ignoring a \right that had no matching \left."); + end; +@z +%--------------------------------------- +@x [48] m.1194 l.22373 after_math - e-TeX TeXXeT +procedure after_math; +@y +@t\4@>@<Declare subprocedures for |after_math|@>@; +procedure after_math; +@z +%--------------------------------------- +@x [48] m.1194 l.22380 after_math - e-TeX TeXXeT +begin danger:=false; +@y +begin danger:=false; +@<Retrieve the prototype box@>; +@z +%--------------------------------------- +@x [48] m.1194 l.22387 after_math - e-TeX TeXXeT + mlist_to_hlist; a:=hpack(link(temp_head),natural); +@y + mlist_to_hlist; a:=hpack(link(temp_head),natural); + subtype(a):=dlist; +@z +%--------------------------------------- +@x [48] m.1194 l.22390 after_math - e-TeX TeXXeT + danger:=false; +@y + danger:=false; + @<Retrieve the prototype box@>; +@z +%--------------------------------------- +@x [48] m.1199 l.22477 - e-TeX TeXXeT +w:=width(b); z:=display_width; s:=display_indent; +@y +w:=width(b); z:=display_width; s:=display_indent; +if pre_display_direction<0 then s:=-s-z; +@z +%--------------------------------------- +@x [48] m.1199 l.22492 - e-TeX TeXXeT +resume_after_display +@y +@<Flush the prototype box@>; +resume_after_display +@z +%--------------------------------------- +@x [48] m.1202 l.22534 - e-TeX TeXXeT +d:=half(z-w); +@y +subtype(b):=dlist; +d:=half(z-w); +@z +%--------------------------------------- +@x [48] m.1203 l.22555 - e-TeX TeXXeT + begin shift_amount(a):=s; append_to_vlist(a); +@y + begin app_display(j,a,0); +@z +%--------------------------------------- +@x [48] m.1204 l.22570 - e-TeX TeXXeT +shift_amount(b):=s+d; append_to_vlist(b) +@y +app_display(j,b,d) +@z +%--------------------------------------- +@x [48] m.1205 l.22575 - e-TeX TeXXeT + shift_amount(a):=s+z-width(a); + append_to_vlist(a); +@y + app_display(j,a,z-width(a)); +@z +%--------------------------------------- +@x [48] m.1206 l.22594 - e-TeX TeXXeT +pop_nest; +@y +flush_node_list(LR_box); +pop_nest; +@z +%--------------------------------------- +@x [49] m.1208 l.22619 - e-TeX protected +control sequence can be defined to be `\.{\\long}' or `\.{\\outer}', and +it might or might not be expanded. The prefixes `\.{\\global}', `\.{\\long}', +@y +control sequence can be defined to be `\.{\\long}', `\.{\\protected}', +or `\.{\\outer}', and it might or might not be expanded. The prefixes +`\.{\\global}', `\.{\\long}', `\.{\\protected}', +@z +%--------------------------------------- +@x [49] m.1209 l.22645 - e-TeX protected + else print_esc("global"); +@y + @/@<Cases of |prefix| for |print_cmd_chr|@>@/ + else print_esc("global"); +@z +%--------------------------------------- +@x [49] m.1211 l.22707 prefixed_command - e-TeX tracing + @<Discard erroneous prefixes and |return|@>; +@y + @<Discard erroneous prefixes and |return|@>; + if tracing_commands>2 then if eTeX_ex then show_cur_cmd_chr; +@z +%--------------------------------------- +@x [49] m.1213 l.22728 - e-TeX protected +if (cur_cmd<>def)and(a mod 4<>0) then +@y +if a>=8 then + begin j:=protected_token; a:=a-8; + end +else j:=0; +if (cur_cmd<>def)and((a mod 4<>0)or(j<>0)) then +@z +%--------------------------------------- +@x [49] m.1218 l.22791 - e-TeX protected + q:=scan_toks(true,e); define(p,call+(a mod 4),def_ref); +@y + q:=scan_toks(true,e); + if j<>0 then + begin q:=get_avail; info(q):=j; link(q):=link(def_ref); + link(def_ref):=q; + end; + define(p,call+(a mod 4),def_ref); +@z +%--------------------------------------- +@x [49] m.1221 l.22819 - e-TeX sparse arrays + if cur_cmd>=call then add_token_ref(cur_chr); +@y + if cur_cmd>=call then add_token_ref(cur_chr) + else if (cur_cmd=register)or(cur_cmd=toks_register) then + if (cur_chr<mem_bot)or(cur_chr>lo_mem_stat_max) then + add_sa_ref(cur_chr); +@z +%--------------------------------------- +@x [49] m.1224 l.22882 - e-TeX sparse arrays + othercases begin scan_eight_bit_int; +@y + othercases begin scan_register_num; + if cur_val>255 then + begin j:=n-count_def_code; {|int_val..box_val|} + if j>mu_val then j:=tok_val; {|int_val..mu_val| or |tok_val|} + find_sa_element(j,cur_val,true); add_sa_ref(cur_ptr); + if j=tok_val then j:=toks_register@+else j:=register; + define(p,j,cur_ptr); + end + else +@z +%--------------------------------------- +@x [49] m.1225 l.22895 - e-TeX read_line +read_to_cs: begin scan_int; n:=cur_val; +@y +read_to_cs: begin j:=cur_chr; scan_int; n:=cur_val; +@z +%--------------------------------------- +@x [49] m.1225 l.22903 - e-TeX read_line + p:=cur_cs; read_toks(n,p); define(p,call,cur_val); +@y + p:=cur_cs; read_toks(n,p,j); define(p,call,cur_val); +@z +%--------------------------------------- +@x [49] m.1226 l.22912 - e-TeX sparse arrays + if cur_cmd=toks_register then + begin scan_eight_bit_int; p:=toks_base+cur_val; + end + else p:=cur_chr; {|p=every_par_loc| or |output_routine_loc| or \dots} +@y + e:=false; {just in case, will be set |true| for sparse array elements} + if cur_cmd=toks_register then + if cur_chr=mem_bot then + begin scan_register_num; + if cur_val>255 then + begin find_sa_element(tok_val,cur_val,true); + cur_chr:=cur_ptr; e:=true; + end + else cur_chr:=toks_base+cur_val; + end + else e:=true; + p:=cur_chr; {|p=every_par_loc| or |output_routine_loc| or \dots} +@z +%--------------------------------------- +@x [49] m.1226 l.22922 - e-TeX sparse arrays + begin define(p,undefined_cs,null); free_avail(def_ref); + end + else begin if p=output_routine_loc then {enclose in curlies} +@y + begin sa_define(p,null)(p,undefined_cs,null); free_avail(def_ref); + end + else begin if (p=output_routine_loc)and not e then {enclose in curlies} +@z +%--------------------------------------- +@x [49] m.1226 l.22930 - e-TeX sparse arrays + define(p,call,def_ref); +@y + sa_define(p,def_ref)(p,call,def_ref); +@z +%--------------------------------------- +@x [49] m.1227 l.22935 - e-TeX sparse arrays +begin if cur_cmd=toks_register then + begin scan_eight_bit_int; cur_cmd:=assign_toks; cur_chr:=toks_base+cur_val; + end; +if cur_cmd=assign_toks then + begin q:=equiv(cur_chr); + if q=null then define(p,undefined_cs,null) + else begin add_token_ref(q); define(p,call,q); + end; + goto done; + end; +end +@y +if (cur_cmd=toks_register)or(cur_cmd=assign_toks) then + begin if cur_cmd=toks_register then + if cur_chr=mem_bot then + begin scan_register_num; + if cur_val<256 then q:=equiv(toks_base+cur_val) + else begin find_sa_element(tok_val,cur_val,false); + if cur_ptr=null then q:=null + else q:=sa_ptr(cur_ptr); + end; + end + else q:=sa_ptr(cur_chr) + else q:=equiv(cur_chr); + if q=null then sa_define(p,null)(p,undefined_cs,null) + else begin add_token_ref(q); sa_define(p,q)(p,call,q); + end; + goto done; + end +@z +%--------------------------------------- +@x [49] m.1236 l.23051 do_register_command - e-TeX sparse arrays +begin q:=cur_cmd; +@y +@!e:boolean; {does |l| refer to a sparse array element?} +@!w:integer; {integer or dimen value of |l|} +begin q:=cur_cmd; +e:=false; {just in case, will be set |true| for sparse array elements} +@z +%--------------------------------------- +@x [49] m.1236 l.23066 do_register_command - e-TeX sparse arrays +if p<glue_val then word_define(l,cur_val) +else begin trap_zero_glue; define(l,glue_ref,cur_val); +@y +if p<glue_val then sa_word_define(l,cur_val) +else begin trap_zero_glue; sa_define(l,cur_val)(l,glue_ref,cur_val); +@z +%--------------------------------------- +@x [49] m.1237 l.23088 - e-TeX sparse arrays +p:=cur_chr; scan_eight_bit_int; +@y +if (cur_chr<mem_bot)or(cur_chr>lo_mem_stat_max) then + begin l:=cur_chr; p:=sa_type(l); e:=true; + end +else begin p:=cur_chr-mem_bot; scan_register_num; + if cur_val>255 then + begin find_sa_element(p,cur_val,true); l:=cur_ptr; e:=true; + end + else +@z +%--------------------------------------- +@x [49] m.1237 l.23095 - e-TeX sparse arrays +end; +found: +@y + end; +end; +found: if p<glue_val then@+if e then w:=sa_int(l)@+else w:=eqtb[l].int +else if e then s:=sa_ptr(l)@+else s:=equiv(l) +@z +%--------------------------------------- +@x [49] m.1238 l.23101 - e-TeX sparse arrays + if q=advance then cur_val:=cur_val+eqtb[l].int; +@y + if q=advance then cur_val:=cur_val+w; +@z +%--------------------------------------- +@x [49] m.1239 l.23108 - e-TeX sparse arrays +begin q:=new_spec(cur_val); r:=equiv(l); +@y +begin q:=new_spec(cur_val); r:=s; +@z +%--------------------------------------- +@x [49] m.1240 l.23128 - e-TeX sparse arrays + if p=int_val then cur_val:=mult_integers(eqtb[l].int,cur_val) + else cur_val:=nx_plus_y(eqtb[l].int,cur_val,0) + else cur_val:=x_over_n(eqtb[l].int,cur_val) +else begin s:=equiv(l); r:=new_spec(s); +@y + if p=int_val then cur_val:=mult_integers(w,cur_val) + else cur_val:=nx_plus_y(w,cur_val,0) + else cur_val:=x_over_n(w,cur_val) +else begin r:=new_spec(s); +@z +%--------------------------------------- +@x [49] m.1241 l.23150 - e-TeX sparse arrays +set_box: begin scan_eight_bit_int; + if global then n:=256+cur_val@+else n:=cur_val; + scan_optional_equals; + if set_box_allowed then scan_box(box_flag+n) +@y +set_box: begin scan_register_num; + if global then n:=global_box_flag+cur_val@+else n:=box_flag+cur_val; + scan_optional_equals; + if set_box_allowed then scan_box(n) +@z +%--------------------------------------- +@x [49] m.1246 l.23221 alter_integer - e-TeX interaction_mode +var c:0..1; {0 for \.{\\deadcycles}, 1 for \.{\\insertpenalties}} +begin c:=cur_chr; scan_optional_equals; scan_int; +if c=0 then dead_cycles:=cur_val +@y +var c:small_number; + {0 for \.{\\deadcycles}, 1 for \.{\\insertpenalties}, etc.} +begin c:=cur_chr; scan_optional_equals; scan_int; +if c=0 then dead_cycles:=cur_val +@/@<Cases for |alter_integer|@>@/ +@z +%--------------------------------------- +@x [49] m.1247 l.23230 alter_box_dimen - e-TeX sparse arrays +@!b:eight_bits; {box number} +begin c:=cur_chr; scan_eight_bit_int; b:=cur_val; scan_optional_equals; +scan_normal_dimen; +if box(b)<>null then mem[box(b)+c].sc:=cur_val; +@y +@!b:pointer; {box register} +begin c:=cur_chr; scan_register_num; fetch_box(b); scan_optional_equals; +scan_normal_dimen; +if b<>null then mem[b+c].sc:=cur_val; +@z +%--------------------------------------- +@x [49] m.1248 l.23239 - e-TeX penalties +set_shape: begin scan_optional_equals; scan_int; n:=cur_val; + if n<=0 then p:=null +@y +set_shape: begin q:=cur_chr; scan_optional_equals; scan_int; n:=cur_val; + if n<=0 then p:=null + else if q>par_shape_loc then + begin n:=(cur_val div 2)+1; p:=get_node(2*n+1); info(p):=n; + n:=cur_val; mem[p+1].int:=n; {number of penalties} + for j:=p+2 to p+n+1 do + begin scan_int; mem[j].int:=cur_val; {penalty values} + end; + if not odd(n) then mem[p+n+2].int:=0; {unused} + end +@z +%--------------------------------------- +@x [49] m.1248 l.23249 - e-TeX penalties + define(par_shape_loc,shape_ref,p); +@y + define(q,shape_ref,p); +@z +%--------------------------------------- +@x [49] m.1292 l.23623 - e-TeX show_groups + show_lists:print_esc("showlists"); +@y + show_lists:print_esc("showlists"); + @<Cases of |xray| for |print_cmd_chr|@>@;@/ +@z +%--------------------------------------- +@x [49] m.1293 l.23630 show_whatever - e-TeX show_ifs +var p:pointer; {tail of a token list to show} +@y +var p:pointer; {tail of a token list to show} +@!t:small_number; {type of conditional being shown} +@!m:normal..or_code; {upper bound on |fi_or_else| codes} +@!l:integer; {line where that conditional began} +@!n:integer; {level of \.{\\if...\\fi} nesting} +@z +%--------------------------------------- +@x [49] m.1293 l.23636 show_whatever - e-TeX show_groups +othercases @<Show the current value of some parameter or register, +@y +@<Cases for |show_whatever|@>@;@/ +othercases @<Show the current value of some parameter or register, +@z +%--------------------------------------- +@x [49] m.1295 l.23671 - e-TeX protected +call: print("macro"); +long_call: print_esc("long macro"); +outer_call: print_esc("outer macro"); +long_outer_call: begin print_esc("long"); print_esc("outer macro"); +@y +call,long_call,outer_call,long_outer_call: begin n:=cmd-call; + if info(link(chr_code))=protected_token then n:=n+4; + if odd(n div 4) then print_esc("protected"); + if odd(n) then print_esc("long"); + if odd(n div 2) then print_esc("outer"); + if n>0 then print_char(" "); + print("macro"); +@z +%--------------------------------------- +@x [49] m.1296 l.23679 - e-TeX sparse arrays +begin scan_eight_bit_int; begin_diagnostic; +print_nl("> \box"); print_int(cur_val); print_char("="); +if box(cur_val)=null then print("void") +else show_box(box(cur_val)); +@y +begin scan_register_num; fetch_box(p); begin_diagnostic; +print_nl("> \box"); print_int(cur_val); print_char("="); +if p=null then print("void")@+else show_box(p); +@z +%--------------------------------------- +@x [50] m.1307 l.23821 - e-TeX basic +dump_int(@$);@/ +@y +dump_int(@$);@/ +@<Dump the \eTeX\ state@>@/ +@z +%--------------------------------------- +@x [50] m.1308 l.23836 - e-TeX basic +if x<>@$ then goto bad_fmt; {check that strings are the same} +@y +if x<>@$ then goto bad_fmt; {check that strings are the same} +@/@<Undump the \eTeX\ state@>@/ +@z +%--------------------------------------- +@x [50] m.1311 l.23890 - e-TeX sparse arrays +dump_int(lo_mem_max); dump_int(rover); +@y +dump_int(lo_mem_max); dump_int(rover); +if eTeX_ex then for k:=int_val to tok_val do dump_int(sa_root[k]); +@z +%--------------------------------------- +@x [50] m.1312 l.23913 - e-TeX sparse arrays +undump(lo_mem_stat_max+1)(lo_mem_max)(rover); +@y +undump(lo_mem_stat_max+1)(lo_mem_max)(rover); +if eTeX_ex then for k:=int_val to tok_val do + undump(null)(lo_mem_max)(sa_root[k]); +@z +%--------------------------------------- +@x [50] m.1324 l.24107 - e-TeX hyph_codes +dump_int(trie_max); +@y +dump_int(trie_max); +dump_int(hyph_start); +@z +%--------------------------------------- +@x [50] m.1325 l.24135 - e-TeX hyph_codes +undump_size(0)(trie_size)('trie size')(j); @+init trie_max:=j;@+tini +@y +undump_size(0)(trie_size)('trie size')(j); @+init trie_max:=j;@+tini +undump(0)(j)(hyph_start); +@z +%--------------------------------------- +@x [51] m.1335 l.24355 final_cleanup - tracing + print_int(cur_level-level_one); print_char(")"); +@y + print_int(cur_level-level_one); print_char(")"); + if eTeX_ex then show_save_groups; +@z +%--------------------------------------- +@x [51] m.1335 l.24378 final_cleanup - e-TeX marks, saved_items + if cur_mark[c]<>null then delete_token_ref(cur_mark[c]); +@y + if cur_mark[c]<>null then delete_token_ref(cur_mark[c]); + if sa_mark<>null then + if do_marks(destroy_marks,0,sa_mark) then sa_mark:=null; + for c:=last_box_code to vsplit_code do flush_node_list(disc_ptr[c]); +@z +%--------------------------------------- +@x [51] m.1336 l.24387 init_prim - e-TeX basic +begin no_new_control_sequence:=false; +@y +begin no_new_control_sequence:=false; +first:=0; +@z +%--------------------------------------- +@x [51] m.1337 l.24402 - e-TeX basic +if (format_ident=0)or(buffer[loc]="&") then +@y +@<Enable \eTeX, if requested@>@;@/ +if (format_ident=0)or(buffer[loc]="&") then +@z +%--------------------------------------- +@x [51] m.1337 l.24410 - e-TeX basic + end; +@y + end; +if eTeX_ex then wterm_ln('entering extended mode'); +@z +%--------------------------------------- +@x [53] m.1363 l.24757 - e-TeX hyph_codes +adv_past(s) +@y +if subtype(s)=language_node then + begin cur_lang:=what_lang(s); l_hyf:=what_lhm(s); r_hyf:=what_rhm(s); + set_hyph_index; + end +@z +%--------------------------------------- +@x [54] m.1379 l.24945 - e-TeX additions +@* \[54] System-dependent changes. +@y +@* \[53a] The extended features of \eTeX. +The program has two modes of operation: (1)~In \TeX\ compatibility mode +it fully deserves the name \TeX\ and there are neither extended features +nor additional primitive commands. There are, however, a few +modifications that would be legitimate in any implementation of \TeX\ +such as, e.g., preventing inadequate results of the glue to \.{DVI} +unit conversion during |ship_out|. (2)~In extended mode there are +additional primitive commands and the extended features of \eTeX\ are +available. + +The distinction between these two modes of operation initially takes +place when a `virgin' \.{eINITEX} starts without reading a format file. +Later on the values of all \eTeX\ state variables are inherited when +\.{eVIRTEX} (or \.{eINITEX}) reads a format file. + +The code below is designed to work for cases where `$|init|\ldots|tini|$' +is a run-time switch. + +@<Enable \eTeX, if requested@>= +@!init if (buffer[loc]="*")and(format_ident=" (INITEX)") then + begin no_new_control_sequence:=false; + @<Generate all \eTeX\ primitives@>@; + incr(loc); eTeX_mode:=1; {enter extended mode} + @<Initialize variables for \eTeX\ extended mode@>@; + end; +tini@;@/ +if not no_new_control_sequence then {just entered extended mode ?} + no_new_control_sequence:=true@+else + +@ The \eTeX\ features available in extended mode are grouped into two +categories: (1)~Some of them are permanently enabled and have no +semantic effect as long as none of the additional primitives are +executed. (2)~The remaining \eTeX\ features are optional and can be +individually enabled and disabled. For each optional feature there is +an \eTeX\ state variable named \.{\\...state}; the feature is enabled, +resp.\ disabled by assigning a positive, resp.\ non-positive value to +that integer. + +@d eTeX_state_base=int_base+eTeX_state_code +@d eTeX_state(#)==eqtb[eTeX_state_base+#].int {an \eTeX\ state variable} +@# +@d eTeX_version_code=eTeX_int {code for \.{\\eTeXversion}} + +@<Generate all \eTeX...@>= +primitive("lastnodetype",last_item,last_node_type_code); +@!@:last_node_type_}{\.{\\lastnodetype} primitive@> +primitive("eTeXversion",last_item,eTeX_version_code); +@!@:eTeX_version_}{\.{\\eTeXversion} primitive@> +primitive("eTeXrevision",convert,eTeX_revision_code);@/ +@!@:eTeX_revision_}{\.{\\eTeXrevision} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +last_node_type_code: print_esc("lastnodetype"); +eTeX_version_code: print_esc("eTeXversion"); + +@ @<Cases for fetching an integer value@>= +eTeX_version_code: cur_val:=eTeX_version; + +@ @d eTeX_ex==(eTeX_mode=1) {is this extended mode?} + +@<Glob...@>= +@!eTeX_mode: 0..1; {identifies compatibility and extended mode} + +@ @<Initialize table entries...@>= +eTeX_mode:=0; {initially we are in compatibility mode} +@<Initialize variables for \eTeX\ compatibility mode@>@; + +@ @<Dump the \eTeX\ state@>= +dump_int(eTeX_mode); +for j:=0 to eTeX_states-1 do eTeX_state(j):=0; {disable all enhancements} + +@ @<Undump the \eTeX\ state@>= +undump(0)(1)(eTeX_mode); +if eTeX_ex then + begin @<Initialize variables for \eTeX\ extended mode@>@; + end +else begin @<Initialize variables for \eTeX\ compatibility mode@>@; + end; + +@ The |eTeX_enabled| function simply returns its first argument as +result. This argument is |true| if an optional \eTeX\ feature is +currently enabled; otherwise, if the argument is |false|, the function +gives an error message. + +@<Declare \eTeX\ procedures for use...@>= +function eTeX_enabled(@!b:boolean;@!j:quarterword;@!k:halfword):boolean; +begin if not b then + begin print_err("Improper "); print_cmd_chr(j,k); + help1("Sorry, this optional e-TeX feature has been disabled."); error; + end; +eTeX_enabled:=b; +end; + +@ First we implement the additional \eTeX\ parameters in the table of +equivalents. + +@<Generate all \eTeX...@>= +primitive("everyeof",assign_toks,every_eof_loc); +@!@:every_eof_}{\.{\\everyeof} primitive@> +primitive("tracingassigns",assign_int,int_base+tracing_assigns_code);@/ +@!@:tracing_assigns_}{\.{\\tracingassigns} primitive@> +primitive("tracinggroups",assign_int,int_base+tracing_groups_code);@/ +@!@:tracing_groups_}{\.{\\tracinggroups} primitive@> +primitive("tracingifs",assign_int,int_base+tracing_ifs_code);@/ +@!@:tracing_ifs_}{\.{\\tracingifs} primitive@> +primitive("tracingscantokens",assign_int,int_base+tracing_scan_tokens_code);@/ +@!@:tracing_scan_tokens_}{\.{\\tracingscantokens} primitive@> +primitive("tracingnesting",assign_int,int_base+tracing_nesting_code);@/ +@!@:tracing_nesting_}{\.{\\tracingnesting} primitive@> +primitive("predisplaydirection", + assign_int,int_base+pre_display_direction_code);@/ +@!@:pre_display_direction_}{\.{\\predisplaydirection} primitive@> +primitive("lastlinefit",assign_int,int_base+last_line_fit_code);@/ +@!@:last_line_fit_}{\.{\\lastlinefit} primitive@> +primitive("savingvdiscards",assign_int,int_base+saving_vdiscards_code);@/ +@!@:saving_vdiscards_}{\.{\\savingvdiscards} primitive@> +primitive("savinghyphcodes",assign_int,int_base+saving_hyph_codes_code);@/ +@!@:saving_hyph_codes_}{\.{\\savinghyphcodes} primitive@> + +@ @d every_eof==equiv(every_eof_loc) + +@<Cases of |assign_toks| for |print_cmd_chr|@>= +every_eof_loc: print_esc("everyeof"); + +@ @<Cases for |print_param|@>= +tracing_assigns_code:print_esc("tracingassigns"); +tracing_groups_code:print_esc("tracinggroups"); +tracing_ifs_code:print_esc("tracingifs"); +tracing_scan_tokens_code:print_esc("tracingscantokens"); +tracing_nesting_code:print_esc("tracingnesting"); +pre_display_direction_code:print_esc("predisplaydirection"); +last_line_fit_code:print_esc("lastlinefit"); +saving_vdiscards_code:print_esc("savingvdiscards"); +saving_hyph_codes_code:print_esc("savinghyphcodes"); + +@ In order to handle \.{\\everyeof} we need an array |eof_seen| of +boolean variables. + +@<Glob...@>= +@!eof_seen : array[1..max_in_open] of boolean; {has eof been seen?} + +@ The |print_group| procedure prints the current level of grouping and +the name corresponding to |cur_group|. + +@<Declare \eTeX\ procedures for tr...@>= +procedure print_group(@!e:boolean); +label exit; +begin case cur_group of + bottom_level: begin print("bottom level"); return; + end; + simple_group,semi_simple_group: + begin if cur_group=semi_simple_group then print("semi "); + print("simple"); + end; + hbox_group,adjusted_hbox_group: + begin if cur_group=adjusted_hbox_group then print("adjusted "); + print("hbox"); + end; + vbox_group: print("vbox"); + vtop_group: print("vtop"); + align_group,no_align_group: + begin if cur_group=no_align_group then print("no "); + print("align"); + end; + output_group: print("output"); + disc_group: print("disc"); + insert_group: print("insert"); + vcenter_group: print("vcenter"); + math_group,math_choice_group,math_shift_group,math_left_group: + begin print("math"); + if cur_group=math_choice_group then print(" choice") + else if cur_group=math_shift_group then print(" shift") + else if cur_group=math_left_group then print(" left"); + end; + end; {there are no other cases} +print(" group (level "); print_int(qo(cur_level)); print_char(")"); +if saved(-1)<>0 then + begin if e then print(" entered at line ") else print(" at line "); + print_int(saved(-1)); + end; +exit:end; + +@ The |group_trace| procedure is called when a new level of grouping +begins (|e=false|) or ends (|e=true|) with |saved(-1)| containing the +line number. + +@<Declare \eTeX\ procedures for tr...@>= +@!stat procedure group_trace(@!e:boolean); +begin begin_diagnostic; print_char("{"); +if e then print("leaving ") else print("entering "); +print_group(e); print_char("}"); end_diagnostic(false); +end; +tats + +@ The \.{\\currentgrouplevel} and \.{\\currentgrouptype} commands return +the current level of grouping and the type of the current group +respectively. + +@d current_group_level_code=eTeX_int+1 {code for \.{\\currentgrouplevel}} +@d current_group_type_code=eTeX_int+2 {code for \.{\\currentgrouptype}} + +@<Generate all \eTeX...@>= +primitive("currentgrouplevel",last_item,current_group_level_code); +@!@:current_group_level_}{\.{\\currentgrouplevel} primitive@> +primitive("currentgrouptype",last_item,current_group_type_code); +@!@:current_group_type_}{\.{\\currentgrouptype} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +current_group_level_code: print_esc("currentgrouplevel"); +current_group_type_code: print_esc("currentgrouptype"); + +@ @<Cases for fetching an integer value@>= +current_group_level_code: cur_val:=cur_level-level_one; +current_group_type_code: cur_val:=cur_group; + +@ The \.{\\currentiflevel}, \.{\\currentiftype}, and +\.{\\currentifbranch} commands return the current level of conditionals +and the type and branch of the current conditional. + +@d current_if_level_code=eTeX_int+3 {code for \.{\\currentiflevel}} +@d current_if_type_code=eTeX_int+4 {code for \.{\\currentiftype}} +@d current_if_branch_code=eTeX_int+5 {code for \.{\\currentifbranch}} + +@<Generate all \eTeX...@>= +primitive("currentiflevel",last_item,current_if_level_code); +@!@:current_if_level_}{\.{\\currentiflevel} primitive@> +primitive("currentiftype",last_item,current_if_type_code); +@!@:current_if_type_}{\.{\\currentiftype} primitive@> +primitive("currentifbranch",last_item,current_if_branch_code); +@!@:current_if_branch_}{\.{\\currentifbranch} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +current_if_level_code: print_esc("currentiflevel"); +current_if_type_code: print_esc("currentiftype"); +current_if_branch_code: print_esc("currentifbranch"); + +@ @<Cases for fetching an integer value@>= +current_if_level_code: begin q:=cond_ptr; cur_val:=0; + while q<>null do + begin incr(cur_val); q:=link(q); + end; + end; +current_if_type_code: if cond_ptr=null then cur_val:=0 + else if cur_if<unless_code then cur_val:=cur_if+1 + else cur_val:=-(cur_if-unless_code+1); +current_if_branch_code: + if (if_limit=or_code)or(if_limit=else_code) then cur_val:=1 + else if if_limit=fi_code then cur_val:=-1 + else cur_val:=0; + +@ The \.{\\fontcharwd}, \.{\\fontcharht}, \.{\\fontchardp}, and +\.{\\fontcharic} commands return information about a character in a +font. + +@d font_char_wd_code=eTeX_dim {code for \.{\\fontcharwd}} +@d font_char_ht_code=eTeX_dim+1 {code for \.{\\fontcharht}} +@d font_char_dp_code=eTeX_dim+2 {code for \.{\\fontchardp}} +@d font_char_ic_code=eTeX_dim+3 {code for \.{\\fontcharic}} + +@<Generate all \eTeX...@>= +primitive("fontcharwd",last_item,font_char_wd_code); +@!@:font_char_wd_}{\.{\\fontcharwd} primitive@> +primitive("fontcharht",last_item,font_char_ht_code); +@!@:font_char_ht_}{\.{\\fontcharht} primitive@> +primitive("fontchardp",last_item,font_char_dp_code); +@!@:font_char_dp_}{\.{\\fontchardp} primitive@> +primitive("fontcharic",last_item,font_char_ic_code); +@!@:font_char_ic_}{\.{\\fontcharic} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +font_char_wd_code: print_esc("fontcharwd"); +font_char_ht_code: print_esc("fontcharht"); +font_char_dp_code: print_esc("fontchardp"); +font_char_ic_code: print_esc("fontcharic"); + +@ @<Cases for fetching a dimension value@>= +font_char_wd_code, +font_char_ht_code, +font_char_dp_code, +font_char_ic_code: begin scan_font_ident; q:=cur_val; scan_char_num; + if (font_bc[q]<=cur_val)and(font_ec[q]>=cur_val) then + begin i:=char_info(q)(qi(cur_val)); + case m of + font_char_wd_code: cur_val:=char_width(q)(i); + font_char_ht_code: cur_val:=char_height(q)(height_depth(i)); + font_char_dp_code: cur_val:=char_depth(q)(height_depth(i)); + font_char_ic_code: cur_val:=char_italic(q)(i); + end; {there are no other cases} + end + else cur_val:=0; + end; + +@ The \.{\\parshapedimen}, \.{\\parshapeindent}, and \.{\\parshapelength} +commands return the indent and length parameters of the current +\.{\\parshape} specification. + +@d par_shape_length_code=eTeX_dim+4 {code for \.{\\parshapelength}} +@d par_shape_indent_code=eTeX_dim+5 {code for \.{\\parshapeindent}} +@d par_shape_dimen_code=eTeX_dim+6 {code for \.{\\parshapedimen}} + +@<Generate all \eTeX...@>= +primitive("parshapelength",last_item,par_shape_length_code); +@!@:par_shape_length_}{\.{\\parshapelength} primitive@> +primitive("parshapeindent",last_item,par_shape_indent_code); +@!@:par_shape_indent_}{\.{\\parshapeindent} primitive@> +primitive("parshapedimen",last_item,par_shape_dimen_code); +@!@:par_shape_dimen_}{\.{\\parshapedimen} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +par_shape_length_code: print_esc("parshapelength"); +par_shape_indent_code: print_esc("parshapeindent"); +par_shape_dimen_code: print_esc("parshapedimen"); + +@ @<Cases for fetching a dimension value@>= +par_shape_length_code, +par_shape_indent_code, +par_shape_dimen_code: begin q:=cur_chr-par_shape_length_code; scan_int; + if (par_shape_ptr=null)or(cur_val<=0) then cur_val:=0 + else begin if q=2 then + begin q:=cur_val mod 2; cur_val:=(cur_val+q)div 2; + end; + if cur_val>info(par_shape_ptr) then cur_val:=info(par_shape_ptr); + cur_val:=mem[par_shape_ptr+2*cur_val-q].sc; + end; + cur_val_level:=dimen_val; + end; + +@ The \.{\\showgroups} command displays all currently active grouping +levels. + +@d show_groups=4 { \.{\\showgroups} } + +@<Generate all \eTeX...@>= +primitive("showgroups",xray,show_groups); +@!@:show_groups_}{\.{\\showgroups} primitive@> + +@ @<Cases of |xray| for |print_cmd_chr|@>= +show_groups:print_esc("showgroups"); + +@ @<Cases for |show_whatever|@>= +show_groups: begin begin_diagnostic; show_save_groups; + end; + +@ @<Types...@>= +@!save_pointer=0..save_size; {index into |save_stack|} + +@ The modifications of \TeX\ required for the display produced by the +|show_save_groups| procedure were first discussed by Donald~E. Knuth in +{\sl TUGboat\/} {\bf 11}, 165--170 and 499--511, 1990. +@^Knuth, Donald Ervin@> + +In order to understand a group type we also have to know its mode. +Since unrestricted horizontal modes are not associated with grouping, +they are skipped when traversing the semantic nest. + +@<Declare \eTeX\ procedures for use...@>= +procedure show_save_groups; +label found1,found2,found,done; +var p:0..nest_size; {index into |nest|} +@!m:-mmode..mmode; {mode} +@!v:save_pointer; {saved value of |save_ptr|} +@!l:quarterword; {saved value of |cur_level|} +@!c:group_code; {saved value of |cur_group|} +@!a:-1..1; {to keep track of alignments} +@!i:integer; +@!j:quarterword; +@!s:str_number; +begin p:=nest_ptr; nest[p]:=cur_list; {put the top level into the array} +v:=save_ptr; l:=cur_level; c:=cur_group; +save_ptr:=cur_boundary; decr(cur_level);@/ +a:=1; +print_nl(""); print_ln; +loop@+begin print_nl("### "); print_group(true); + if cur_group=bottom_level then goto done; + repeat m:=nest[p].mode_field; + if p>0 then decr(p) else m:=vmode; + until m<>hmode; + print(" ("); + case cur_group of + simple_group: begin incr(p); goto found2; + end; + hbox_group,adjusted_hbox_group: s:="hbox"; + vbox_group: s:="vbox"; + vtop_group: s:="vtop"; + align_group: if a=0 then + begin if m=-vmode then s:="halign" else s:="valign"; + a:=1; goto found1; + end + else begin if a=1 then print("align entry") else print_esc("cr"); + if p>=a then p:=p-a; + a:=0; goto found; + end; + no_align_group: + begin incr(p); a:=-1; print_esc("noalign"); goto found2; + end; + output_group: + begin print_esc("output"); goto found; + end; + math_group: goto found2; + disc_group,math_choice_group: + begin if cur_group=disc_group then print_esc("discretionary") + else print_esc("mathchoice"); + for i:=1 to 3 do if i<=saved(-2) then print("{}"); + goto found2; + end; + insert_group: + begin if saved(-2)=255 then print_esc("vadjust") + else begin print_esc("insert"); print_int(saved(-2)); + end; + goto found2; + end; + vcenter_group: begin s:="vcenter"; goto found1; + end; + semi_simple_group: begin incr(p); print_esc("begingroup"); goto found; + end; + math_shift_group: + begin if m=mmode then print_char("$") + else if nest[p].mode_field=mmode then + begin print_cmd_chr(eq_no,saved(-2)); goto found; + end; + print_char("$"); goto found; + end; + math_left_group: + begin if type(nest[p+1].eTeX_aux_field)=left_noad then print_esc("left") + else print_esc("middle"); + goto found; + end; + end; {there are no other cases} + @<Show the box context@>; + found1: print_esc(s); @<Show the box packaging info@>; + found2: print_char("{"); + found: print_char(")"); decr(cur_level); + cur_group:=save_level(save_ptr); save_ptr:=save_index(save_ptr) + end; +done: save_ptr:=v; cur_level:=l; cur_group:=c; +end; + +@ @<Show the box packaging info@>= +if saved(-2)<>0 then + begin print_char(" "); + if saved(-3)=exactly then print("to") else print("spread"); + print_scaled(saved(-2)); print("pt"); + end + +@ @<Show the box context@>= +i:=saved(-4); +if i<>0 then + if i<box_flag then + begin if abs(nest[p].mode_field)=vmode then j:=hmove else j:=vmove; + if i>0 then print_cmd_chr(j,0) else print_cmd_chr(j,1); + print_scaled(abs(i)); print("pt"); + end + else if i<ship_out_flag then + begin if i>=global_box_flag then + begin print_esc("global"); i:=i-(global_box_flag-box_flag); + end; + print_esc("setbox"); print_int(i-box_flag); print_char("="); + end + else print_cmd_chr(leader_ship,i-(leader_flag-a_leaders)) + +@ The |scan_general_text| procedure is much like |scan_toks(false,false)|, +but will be invoked via |expand|, i.e., recursively. +@^recursion@> + +@<Declare \eTeX\ procedures for sc...@>= +procedure@?scan_general_text; forward;@t\2@> + +@ The token list (balanced text) created by |scan_general_text| begins +at |link(temp_head)| and ends at |cur_val|. (If |cur_val=temp_head|, +the list is empty.) + +@<Declare \eTeX\ procedures for tok...@>= +procedure scan_general_text; +label found; +var s:normal..absorbing; {to save |scanner_status|} +@!w:pointer; {to save |warning_index|} +@!d:pointer; {to save |def_ref|} +@!p:pointer; {tail of the token list being built} +@!q:pointer; {new node being added to the token list via |store_new_token|} +@!unbalance:halfword; {number of unmatched left braces} +begin s:=scanner_status; w:=warning_index; d:=def_ref; +scanner_status:=absorbing; warning_index:=cur_cs; +def_ref:=get_avail; token_ref_count(def_ref):=null; p:=def_ref; +scan_left_brace; {remove the compulsory left brace} +unbalance:=1; +loop@+ begin get_token; + if cur_tok<right_brace_limit then + if cur_cmd<right_brace then incr(unbalance) + else begin decr(unbalance); + if unbalance=0 then goto found; + end; + store_new_token(cur_tok); + end; +found: q:=link(def_ref); free_avail(def_ref); {discard reference count} +if q=null then cur_val:=temp_head @+ else cur_val:=p; +link(temp_head):=q; +scanner_status:=s; warning_index:=w; def_ref:=d; +end; + +@ The \.{\\showtokens} command displays a token list. + +@d show_tokens=5 { \.{\\showtokens} , must be odd! } + +@<Generate all \eTeX...@>= +primitive("showtokens",xray,show_tokens); +@!@:show_tokens_}{\.{\\showtokens} primitive@> + +@ @<Cases of |xray| for |print_cmd_chr|@>= +show_tokens:print_esc("showtokens"); + +@ The \.{\\unexpanded} primitive prevents expansion of tokens much as +the result from \.{\\the} applied to a token variable. The +\.{\\detokenize} primitive converts a token list into a list of +character tokens much as if the token list were written to a file. We +use the fact that the command modifiers for \.{\\unexpanded} and +\.{\\detokenize} are odd whereas those for \.{\\the} and \.{\\showthe} +are even. + +@<Generate all \eTeX...@>= +primitive("unexpanded",the,1);@/ +@!@:unexpanded_}{\.{\\unexpanded} primitive@> +primitive("detokenize",the,show_tokens);@/ +@!@:detokenize_}{\.{\\detokenize} primitive@> + +@ @<Cases of |the| for |print_cmd_chr|@>= +else if chr_code=1 then print_esc("unexpanded") +else print_esc("detokenize") + +@ @<Handle \.{\\unexpanded} or \.{\\detokenize} and |return|@>= +if odd(cur_chr) then + begin c:=cur_chr; scan_general_text; + if c=1 then the_toks:=cur_val + else begin old_setting:=selector; selector:=new_string; b:=pool_ptr; + p:=get_avail; link(p):=link(temp_head); + token_show(p); flush_list(p); + selector:=old_setting; the_toks:=str_toks(b); + end; + return; + end + +@ The \.{\\showifs} command displays all currently active conditionals. + +@d show_ifs=6 { \.{\\showifs} } + +@<Generate all \eTeX...@>= +primitive("showifs",xray,show_ifs); +@!@:show_ifs_}{\.{\\showifs} primitive@> + +@ @<Cases of |xray| for |print_cmd_chr|@>= +show_ifs:print_esc("showifs"); + +@ +@d print_if_line(#)==if #<>0 then + begin print(" entered on line "); print_int(#); + end + +@<Cases for |show_whatever|@>= +show_ifs: begin begin_diagnostic; print_nl(""); print_ln; + if cond_ptr=null then + begin print_nl("### "); print("no active conditionals"); + end + else begin p:=cond_ptr; n:=0; + repeat incr(n); p:=link(p);@+until p=null; + p:=cond_ptr; t:=cur_if; l:=if_line; m:=if_limit; + repeat print_nl("### level "); print_int(n); print(": "); + print_cmd_chr(if_test,t); + if m=fi_code then print_esc("else"); + print_if_line(l); + decr(n); t:=subtype(p); l:=if_line_field(p); m:=type(p); p:=link(p); + until p=null; + end; + end; + +@ The \.{\\interactionmode} primitive allows to query and set the +interaction mode. + +@<Generate all \eTeX...@>= +primitive("interactionmode",set_page_int,2); +@!@:interaction_mode_}{\.{\\interactionmode} primitive@> + +@ @<Cases of |set_page_int| for |print_cmd_chr|@>= +else if chr_code=2 then print_esc("interactionmode") + +@ @<Cases for `Fetch the |dead_cycles| or the |insert_penalties|'@>= +else if m=2 then cur_val:=interaction + +@ @<Declare \eTeX\ procedures for use...@>= +procedure@?new_interaction; forward;@t\2@> + +@ @<Cases for |alter_integer|@>= +else if c=2 then + begin if (cur_val<batch_mode)or(cur_val>error_stop_mode) then + begin print_err("Bad interaction mode"); +@.Bad interaction mode@> + help2("Modes are 0=batch, 1=nonstop, 2=scroll, and")@/ + ("3=errorstop. Proceed, and I'll ignore this case."); + int_error(cur_val); + end + else begin cur_chr:=cur_val; new_interaction; + end; + end + +@ The |middle| feature of \eTeX\ allows one ore several \.{\\middle} +delimiters to appear between \.{\\left} and \.{\\right}. + +@<Generate all \eTeX...@>= +primitive("middle",left_right,middle_noad); +@!@:middle_}{\.{\\middle} primitive@> + +@ @<Cases of |left_right| for |print_cmd_chr|@>= +else if chr_code=middle_noad then print_esc("middle") + +@ In constructions such as +$$\vbox{\halign{\.{#}\hfil\cr +{}\\hbox to \\hsize\{\cr +\hskip 25pt \\hskip 0pt plus 0.0001fil\cr +\hskip 25pt ...\cr +\hskip 25pt \\hfil\\penalty-200\\hfilneg\cr +\hskip 25pt ...\}\cr}}$$ +the stretch components of \.{\\hfil} and \.{\\hfilneg} compensate; they may, +however, get modified in order to prevent arithmetic overflow during +|hlist_out| when each of them is multiplied by a large |glue_set| value. + +Since this ``glue rounding'' depends on state variables |cur_g| and +|cur_glue| and \TeXXeT\ is supposed to emulate the behaviour of \TeXeT\ +(plus a suitable postprocessor) as close as possible the glue rounding +cannot be postponed until (segments of) an hlist has been reversed. + +The code below is invoked after the effective width, |rule_wd|, of a glue +node has been computed. The glue node is either converted into a kern node +or, for leaders, the glue specification is replaced by an equivalent rigid +one; the subtype of the glue node remains unchanged. + +@<Handle a glue node for mixed...@>= +if (((g_sign=stretching) and (stretch_order(g)=g_order)) or + ((g_sign=shrinking) and (shrink_order(g)=g_order))) then + begin fast_delete_glue_ref(g); + if subtype(p)<a_leaders then + begin type(p):=kern_node; width(p):=rule_wd; + end + else begin g:=get_node(glue_spec_size);@/ + stretch_order(g):=filll+1; shrink_order(g):=filll+1; {will never match} + width(g):=rule_wd; stretch(g):=0; shrink(g):=0; glue_ptr(p):=g; + end; + end + +@ The optional |TeXXeT| feature of \eTeX\ contains the code for mixed +left-to-right and right-to-left typesetting. This code is inspired by +but different from \TeXeT\ as presented by Donald~E. Knuth and Pierre +MacKay in {\sl TUGboat\/} {\bf 8}, 14--25, 1987. +@^Knuth, Donald Ervin@> +@^MacKay, Pierre@> + +In order to avoid confusion with \TeXeT\ the present implementation of +mixed direction typesetting is called \TeXXeT. It differs from \TeXeT\ +in several important aspects: (1)~Right-to-left text is reversed +explicitely by the |ship_out| routine and is written to a normal \.{DVI} +file without any |begin_reflect| or |end_reflect| commands; (2)~a +|math_node| is (ab)used instead of a |whatsit_node| to record the +\.{\\beginL}, \.{\\endL}, \.{\\beginR}, and \.{\\endR} text direction +primitives in order to keep the influence on the line breaking algorithm +for pure left-to-right text as small as possible; (3)~right-to-left text +interrupted by a displayed equation is automatically resumed after that +equation; and (4)~the |valign| command code with a non-zero command +modifier is (ab)used for the text direction primitives. + +Nevertheless there is a subtle difference between \TeX\ and \TeXXeT\ +that may influence the line breaking algorithm for pure left-to-right +text. When a paragraph containing math mode material is broken into +lines \TeX\ may generate lines where math mode material is not enclosed +by properly nested \.{\\mathon} and \.{\\mathoff} nodes. Unboxing such +lines as part of a new paragraph may have the effect that hyphenation is +attempted for `words' originating from math mode or that hyphenation is +inhibited for words originating from horizontal mode. + +In \TeXXeT\ additional \.{\\beginM}, resp.\ \.{\\endM} math nodes are +supplied at the start, resp.\ end of lines such that math mode material +inside a horizontal list always starts with either \.{\\mathon} or +\.{\\beginM} and ends with \.{\\mathoff} or \.{\\endM}. These +additional nodes are transparent to operations such as \.{\\unskip}, +\.{\\lastpenalty}, or \.{\\lastbox} but they do have the effect that +hyphenation is never attempted for `words' originating from math mode +and is never inhibited for words originating from horizontal mode. + +@d TeXXeT_state==eTeX_state(TeXXeT_code) +@d TeXXeT_en==(TeXXeT_state>0) {is \TeXXeT\ enabled?} + +@<Cases for |print_param|@>= +eTeX_state_code+TeXXeT_code:print_esc("TeXXeTstate"); + +@ @<Generate all \eTeX...@>= +primitive("TeXXeTstate",assign_int,eTeX_state_base+TeXXeT_code); +@!@:TeXXeT_state_}{\.{\\TeXXeT_state} primitive@> +primitive("beginL",valign,begin_L_code); +@!@:beginL_}{\.{\\beginL} primitive@> +primitive("endL",valign,end_L_code); +@!@:endL_}{\.{\\endL} primitive@> +primitive("beginR",valign,begin_R_code); +@!@:beginR_}{\.{\\beginR} primitive@> +primitive("endR",valign,end_R_code); +@!@:endR_}{\.{\\endR} primitive@> + +@ @<Cases of |valign| for |print_cmd_chr|@>= +else case chr_code of + begin_L_code: print_esc("beginL"); + end_L_code: print_esc("endL"); + begin_R_code: print_esc("beginR"); + othercases print_esc("endR") + endcases + +@ @<Cases of |main_control| for |hmode+valign|@>= +if cur_chr>0 then + begin if eTeX_enabled(TeXXeT_en,cur_cmd,cur_chr) then +@.Improper \\beginL@> +@.Improper \\endL@> +@.Improper \\beginR@> +@.Improper \\endR@> + tail_append(new_math(0,cur_chr)); + end +else + +@ An hbox with subtype dlist will never be reversed, even when embedded +in right-to-left text. + +@<Display if this box is never to be reversed@>= +if (type(p)=hlist_node)and(subtype(p)=dlist) then print(", display") + +@ A number of routines are based on a stack of one-word nodes whose +|info| fields contain |end_M_code|, |end_L_code|, or |end_R_code|. The +top of the stack is pointed to by |LR_ptr|. + +When the stack manipulation macros of this section are used below, +variable |LR_ptr| might be the global variable declared here for |hpack| +and |ship_out|, or might be local to |post_line_break|. + +@d put_LR(#)==begin temp_ptr:=get_avail; info(temp_ptr):=#; + link(temp_ptr):=LR_ptr; LR_ptr:=temp_ptr; + end +@# +@d push_LR(#)==put_LR(end_LR_type(#)) +@# +@d pop_LR==begin temp_ptr:=LR_ptr; LR_ptr:=link(temp_ptr); + free_avail(temp_ptr); + end + +@<Glob...@>= +@!LR_temp:pointer; {holds a temporarily removed \.{\\endM} node} +@!LR_ptr:pointer; {stack of LR codes for |hpack|, |ship_out|, and |init_math|} +@!LR_problems:integer; {counts missing begins and ends} +@!cur_dir:small_number; {current text direction} + +@ @<Set init...@>= +LR_temp:=null; LR_ptr:=null; LR_problems:=0; cur_dir:=left_to_right; + +@ @<Insert LR nodes at the beg...@>= +begin q:=link(temp_head); +if LR_ptr<>null then + begin temp_ptr:=LR_ptr; r:=q; + repeat s:=new_math(0,begin_LR_type(info(temp_ptr))); link(s):=r; r:=s; + temp_ptr:=link(temp_ptr); + until temp_ptr=null; + link(temp_head):=r; + end; +while q<>cur_break(cur_p) do + begin if not is_char_node(q) then + if type(q)=math_node then @<Adjust \(t)the LR stack for the |p...@>; + q:=link(q); + end; +end + +@ @<Adjust \(t)the LR stack for the |p...@>= +if end_LR(q) then + begin if LR_ptr<>null then if info(LR_ptr)=end_LR_type(q) then pop_LR; + end +else push_LR(q) + +@ We use the fact that |q| now points to the node with \.{\\rightskip} glue. + +@<Insert LR nodes at the end...@>= +if LR_ptr<>null then + begin s:=temp_head; r:=link(s); + while r<>q do + begin s:=r; r:=link(s); + end; + r:=LR_ptr; + while r<>null do + begin temp_ptr:=new_math(0,info(r)); + link(s):=temp_ptr; s:=temp_ptr; r:=link(r); + end; + link(s):=q; + end + +@ Special \.{\\beginM} and \.{\\endM} nodes are inserted in cases where +math nodes are discarded during line breaking or end up in different +lines. When the current lists ends with an \.{\\endM} node that node is +temporarily removed and later reinserted when the last node is to be +inspected or removed. A final \.{\\endM} preceded by a |char_node| will +not be removed. + +@<Declare \eTeX\ procedures for sc...@>= +procedure remove_end_M; +var @!p:pointer; {runs through the current list} +begin p:=head; +while link(p)<>tail do p:=link(p); +if not is_char_node(p) then + begin LR_temp:=tail; link(p):=null; tail:=p; + end; +end; + +@ @<Declare \eTeX\ procedures for sc...@>= +procedure insert_end_M; +label done; +var @!p:pointer; {runs through the current list} +begin if not is_char_node(tail) then + if (type(tail)=math_node)and(subtype(tail)=begin_M_code) then + begin free_node(LR_temp,small_node_size); p:=head; + while link(p)<>tail do p:=link(p); + free_node(tail,small_node_size); link(p):=null; tail:=p; goto done; + end; +link(tail):=LR_temp; tail:=LR_temp; +done: LR_temp:=null; +end; + +@ @<Initialize the LR stack@>= +put_LR(before) {this will never match} + +@ @<Adjust \(t)the LR stack for the |hp...@>= +if end_LR(p) then + if info(LR_ptr)=end_LR_type(p) then pop_LR + else begin incr(LR_problems); type(p):=kern_node; subtype(p):=explicit; + end +else push_LR(p) + +@ @<Check for LR anomalies at the end of |hp...@>= +begin if info(LR_ptr)<>before then + begin while link(q)<>null do q:=link(q); + repeat temp_ptr:=q; q:=new_math(0,info(LR_ptr)); link(temp_ptr):=q; + LR_problems:=LR_problems+10000; pop_LR; + until info(LR_ptr)=before; + end; +if LR_problems>0 then + begin @<Report LR problems@>; goto common_ending; + end; +pop_LR; +if LR_ptr<>null then confusion("LR1"); +@:this can't happen LR1}{\quad LR1@> +end + +@ @<Report LR problems@>= +begin print_ln; print_nl("\endL or \endR problem (");@/ +print_int(LR_problems div 10000); print(" missing, ");@/ +print_int(LR_problems mod 10000); print(" extra");@/ +LR_problems:=0; +end + +@ @<Initialize |hlist_out| for mixed...@>= +if eTeX_ex then + begin @<Initialize the LR stack@>; + if subtype(this_box)=dlist then + if cur_dir=right_to_left then + begin cur_dir:=left_to_right; cur_h:=cur_h-width(this_box); + end + else subtype(this_box):=min_quarterword; + if (cur_dir=right_to_left)and(subtype(this_box)<>reversed) then + @<Reverse the complete hlist and set the subtype to |reversed|@>; + end + +@ @<Finish |hlist_out| for mixed...@>= +if eTeX_ex then + begin @<Check for LR anomalies at the end of |hlist_out|@>; + if subtype(this_box)=dlist then cur_dir:=right_to_left; + end + +@ @<Handle a math node in |hlist_out|@>= +begin if eTeX_ex then + @<Adjust \(t)the LR stack for the |hlist_out| routine; if necessary + reverse an hlist segment and |goto reswitch|@>; + cur_h:=cur_h+width(p); + end + +@ Breaking a paragraph into lines while \TeXXeT\ is disabled may result +in lines whith unpaired math nodes. Such hlists are silently accepted +in the absence of text direction directives. + +@d LR_dir(#)==(subtype(#) div R_code) {text direction of a `math node'} + +@<Adjust \(t)the LR stack for the |hl...@>= +begin if end_LR(p) then + if info(LR_ptr)=end_LR_type(p) then pop_LR + else begin if subtype(p)>L_code then incr(LR_problems); + end +else begin push_LR(p); + if LR_dir(p)<>cur_dir then + @<Reverse an hlist segment and |goto reswitch|@>; + end; +type(p):=kern_node; +end + +@ @<Check for LR anomalies at the end of |hl...@>= +begin while info(LR_ptr)<>before do + begin if info(LR_ptr)>L_code then LR_problems:=LR_problems+10000; + pop_LR; + end; +pop_LR; +end + +@ @d edge_node=style_node {a |style_node| does not occur in hlists} +@d edge_node_size=style_node_size {number of words in an edge node} +@d edge_dist(#)==depth(#) {new |left_edge| position relative to |cur_h| + (after |width| has been taken into account)} + +@<Declare procedures needed in |hlist_out|, |vlist_out|@>= +function new_edge(@!s:small_number;@!w:scaled):pointer; + {create an edge node} +var p:pointer; {the new node} +begin p:=get_node(edge_node_size); type(p):=edge_node; subtype(p):=s; +width(p):=w; edge_dist(p):=0; {the |edge_dist| field will be set later} +new_edge:=p; +end; + +@ @<Cases of |hlist_out| that arise...@>= +edge_node: begin cur_h:=cur_h+width(p); + left_edge:=cur_h+edge_dist(p); cur_dir:=subtype(p); + end; + +@ We detach the hlist, start a new one consisting of just one kern node, +append the reversed list, and set the width of the kern node. + +@<Reverse the complete hlist...@>= +begin save_h:=cur_h; temp_ptr:=p; p:=new_kern(0); link(prev_p):=p; +cur_h:=0; link(p):=reverse(this_box,null,cur_g,cur_glue); width(p):=-cur_h; +cur_h:=save_h; subtype(this_box):=reversed; +end + +@ We detach the remainder of the hlist, replace the math node by +an edge node, and append the reversed hlist segment to it; the tail of +the reversed segment is another edge node and the remainder of the +original list is attached to it. + +@<Reverse an hlist segment...@>= +begin save_h:=cur_h; temp_ptr:=link(p); rule_wd:=width(p); +free_node(p,small_node_size); +cur_dir:=reflected; p:=new_edge(cur_dir,rule_wd); link(prev_p):=p; +cur_h:=cur_h-left_edge+rule_wd; +link(p):=reverse(this_box,new_edge(reflected,0),cur_g,cur_glue); +edge_dist(p):=cur_h; cur_dir:=reflected; cur_h:=save_h; +goto reswitch; +end + +@ The |reverse| function defined here is responsible to reverse the +nodes of an hlist (segment). The first parameter |this_box| is the enclosing +hlist node, the second parameter |t| is to become the tail of the reversed +list, and the global variable |temp_ptr| is the head of the list to be +reversed. Finally |cur_g| and |cur_glue| are the current glue rounding state +variables, to be updated by this function. We remove nodes from the original +list and add them to the head of the new one. + +@<Declare procedures needed in |hlist_out|, |vlist_out|@>= +function reverse(@!this_box,@!t:pointer; var cur_g:scaled; + var cur_glue:real):pointer; +label reswitch,next_p,done; +var l:pointer; {the new list} +@!p:pointer; {the current node} +@!q:pointer; {the next node} +@!g_order: glue_ord; {applicable order of infinity for glue} +@!g_sign: normal..shrinking; {selects type of glue} +@!glue_temp:real; {glue value before rounding} +@!m,@!n:halfword; {count of unmatched math nodes} +begin g_order:=glue_order(this_box); g_sign:=glue_sign(this_box); +l:=t; p:=temp_ptr; m:=min_halfword; n:=min_halfword; +loop@+ begin while p<>null do + @<Move node |p| to the new list and go to the next node; + or |goto done| if the end of the reflected segment has been reached@>; + if (t=null)and(m=min_halfword)and(n=min_halfword) then goto done; + p:=new_math(0,info(LR_ptr)); LR_problems:=LR_problems+10000; + {manufacture one missing math node} + end; +done:reverse:=l; +end; + +@ @<Move node |p| to the new list...@>= +reswitch: if is_char_node(p) then + repeat f:=font(p); c:=character(p); + cur_h:=cur_h+char_width(f)(char_info(f)(c)); + q:=link(p); link(p):=l; l:=p; p:=q; + until not is_char_node(p) +else @<Move the non-|char_node| |p| to the new list@> + +@ @<Move the non-|char_node| |p| to the new list@>= +begin q:=link(p); +case type(p) of +hlist_node,vlist_node,rule_node,kern_node: rule_wd:=width(p); +@t\4@>@<Cases of |reverse| that need special treatment@>@; +edge_node: confusion("LR2"); +@:this can't happen LR2}{\quad LR2@> +othercases goto next_p +endcases;@/ +cur_h:=cur_h+rule_wd; +next_p: link(p):=l; +if type(p)=kern_node then if (rule_wd=0)or(l=null) then + begin free_node(p,small_node_size); p:=l; + end; +l:=p; p:=q; +end + +@ Here we compute the effective width of a glue node as in |hlist_out|. + +@<Cases of |reverse|...@>= +glue_node: begin round_glue; + @<Handle a glue node for mixed...@>; + end; + +@ A ligature node is replaced by a char node. + +@<Cases of |reverse|...@>= +ligature_node: begin flush_node_list(lig_ptr(p)); + temp_ptr:=p; p:=get_avail; mem[p]:=mem[lig_char(temp_ptr)]; link(p):=q; + free_node(temp_ptr,small_node_size); goto reswitch; + end; + +@ Math nodes in an inner reflected segment are modified, those at the +outer level are changed into kern nodes. + +@<Cases of |reverse|...@>= +math_node: begin rule_wd:=width(p); +if end_LR(p) then + if info(LR_ptr)<>end_LR_type(p) then + begin type(p):=kern_node; incr(LR_problems); + end + else begin pop_LR; + if n>min_halfword then + begin decr(n); decr(subtype(p)); {change |after| into |before|} + end + else begin type(p):=kern_node; + if m>min_halfword then decr(m) + else @<Finish the reversed hlist segment and |goto done|@>; + end; + end +else begin push_LR(p); + if (n>min_halfword)or(LR_dir(p)<>cur_dir) then + begin incr(n); incr(subtype(p)); {change |before| into |after|} + end + else begin type(p):=kern_node; incr(m); + end; + end; +end; + +@ Finally we have found the end of the hlist segment to be reversed; the +final math node is released and the remaining list attached to the +edge node terminating the reversed segment. + +@<Finish the reversed...@>= +begin free_node(p,small_node_size); +link(t):=q; width(t):=rule_wd; edge_dist(t):=-cur_h-rule_wd; goto done; +end + +@ @<Check for LR anomalies at the end of |s...@>= +begin if LR_problems>0 then + begin @<Report LR problems@>; print_char(")"); print_ln; + end; +if (LR_ptr<>null)or(cur_dir<>left_to_right) then confusion("LR3"); +@:this can't happen LR3}{\quad LR3@> +end + +@ Some special actions are required for displayed equation in paragraphs +with mixed direction texts. First of all we have to set the text +direction preceding the display. + +@<Set the value of |x| to the text direction before the display@>= +if LR_save=null then x:=0 +else if info(LR_save)>=R_code then x:=-1@+else x:=1 + +@ @<Prepare for display after an empty...@>= +begin pop_nest; @<Set the value of |x|...@>; +end + +@ When calculating the natural width, |w|, of the final line preceding +the display, we may have to copy all or part of its hlist. We copy, +however, only those parts of the original list that are relevant for the +computation of |pre_display_size|. +@^data structure assumptions@> + +@<Declare subprocedures for |init_math|@>= +procedure just_copy(@!p,@!h,@!t:pointer); +label found,not_found; +var @!r:pointer; {current node being fabricated for new list} +@!words:0..5; {number of words remaining to be copied} +begin while p<>null do + begin words:=1; {this setting occurs in more branches than any other} + if is_char_node(p) then r:=get_avail + else case type(p) of + hlist_node,vlist_node: begin r:=get_node(box_node_size); + mem[r+6]:=mem[p+6]; mem[r+5]:=mem[p+5]; {copy the last two words} + words:=5; list_ptr(r):=null; {this affects |mem[r+5]|} + end; + rule_node: begin r:=get_node(rule_node_size); words:=rule_node_size; + end; + ligature_node: begin r:=get_avail; {only |font| and |character| are needed} + mem[r]:=mem[lig_char(p)]; goto found; + end; + kern_node,math_node: begin r:=get_node(small_node_size); + words:=small_node_size; + end; + glue_node: begin r:=get_node(small_node_size); add_glue_ref(glue_ptr(p)); + glue_ptr(r):=glue_ptr(p); leader_ptr(r):=null; + end; + whatsit_node:@<Make a partial copy of the whatsit...@>; + othercases goto not_found + endcases; + while words>0 do + begin decr(words); mem[r+words]:=mem[p+words]; + end; + found: link(h):=r; h:=r; + not_found: p:=link(p); + end; +link(h):=t; +end; + +@ When the final line ends with R-text, the value |w| refers to the line +reflected with respect to the left edge of the enclosing vertical list. + +@<Prepare for display after a non-empty...@>= +if eTeX_ex then @<Let |j| be the prototype box for the display@>; +v:=shift_amount(just_box); +@<Set the value of |x|...@>; +if x>=0 then + begin p:=list_ptr(just_box); link(temp_head):=null; + end +else begin v:=-v-width(just_box); + p:=new_math(0,begin_L_code); link(temp_head):=p; + just_copy(list_ptr(just_box),p,new_math(0,end_L_code)); + cur_dir:=right_to_left; + end; +v:=v+2*quad(cur_font); +if TeXXeT_en then @<Initialize the LR stack@> + +@ @<Finish the natural width computation@>= +if TeXXeT_en then + begin while LR_ptr<>null do pop_LR; + if LR_problems<>0 then + begin w:=max_dimen; LR_problems:=0; + end; + end; +cur_dir:=left_to_right; flush_node_list(link(temp_head)) + +@ In the presence of text direction directives we assume that any LR +problems have been fixed by the |hpack| routine. If the final line +contains, however, text direction directives while \TeXXeT\ is disabled, +then we set |w:=max_dimen|. + +@<Cases of `Let |d| be the natural...@>= +math_node: begin d:=width(p); + if TeXXeT_en then @<Adjust \(t)the LR stack for the |init_math| routine@> + else if subtype(p)>=L_code then + begin w:=max_dimen; goto done; + end; + end; +edge_node: begin d:=width(p); cur_dir:=subtype(p); + end; + +@ @<Adjust \(t)the LR stack for the |i...@>= +if end_LR(p) then + begin if info(LR_ptr)=end_LR_type(p) then pop_LR + else if subtype(p)>L_code then + begin w:=max_dimen; goto done; + end + end +else begin push_LR(p); + if LR_dir(p)<>cur_dir then + begin just_reverse(p); p:=temp_head; + end; + end + +@ @<Declare subprocedures for |init_math|@>= +procedure just_reverse(@!p:pointer); +label found,done; +var l:pointer; {the new list} +@!t:pointer; {tail of reversed segment} +@!q:pointer; {the next node} +@!m,@!n:halfword; {count of unmatched math nodes} +begin m:=min_halfword; n:=min_halfword; +if link(temp_head)=null then + begin just_copy(link(p),temp_head,null); q:=link(temp_head); + end +else begin q:=link(p); link(p):=null; flush_node_list(link(temp_head)); + end; +t:=new_edge(cur_dir,0); l:=t; cur_dir:=reflected; +while q<>null do + if is_char_node(q) then + repeat p:=q; q:=link(p); link(p):=l; l:=p; + until not is_char_node(q) + else begin p:=q; q:=link(p); + if type(p)=math_node then + @<Adjust \(t)the LR stack for the |just_reverse| routine@>; + link(p):=l; l:=p; + end; +goto done; +found:width(t):=width(p); link(t):=q; free_node(p,small_node_size); +done:link(temp_head):=l; +end; + +@ @<Adjust \(t)the LR stack for the |j...@>= +if end_LR(p) then + if info(LR_ptr)<>end_LR_type(p) then + begin type(p):=kern_node; incr(LR_problems); + end + else begin pop_LR; + if n>min_halfword then + begin decr(n); decr(subtype(p)); {change |after| into |before|} + end + else begin if m>min_halfword then decr(m)@+else goto found; + type(p):=kern_node; + end; + end +else begin push_LR(p); + if (n>min_halfword)or(LR_dir(p)<>cur_dir) then + begin incr(n); incr(subtype(p)); {change |before| into |after|} + end + else begin type(p):=kern_node; incr(m); + end; + end + +@ The prototype box is an hlist node with the width, glue set, and shift +amount of |just_box|, i.e., the last line preceding the display. Its +hlist reflects the current \.{\\leftskip} and \.{\\rightskip}. + +@<Let |j| be the prototype box for the display@>= +begin if right_skip=zero_glue then j:=new_kern(0) +else j:=new_param_glue(right_skip_code); +if left_skip=zero_glue then p:=new_kern(0) +else p:=new_param_glue(left_skip_code); +link(p):=j; j:=new_null_box; width(j):=width(just_box); +shift_amount(j):=shift_amount(just_box); list_ptr(j):=p; +glue_order(j):=glue_order(just_box); glue_sign(j):=glue_sign(just_box); +glue_set(j):=glue_set(just_box); +end + +@ At the end of a displayed equation we retrieve the prototype box. + +@<Local variables for finishing...@>= +@!j:pointer; {prototype box} + +@ @<Retrieve the prototype box@>= +if mode=mmode then j:=LR_box + +@ @<Flush the prototype box@>= +flush_node_list(j) + +@ The |app_display| procedure used to append the displayed equation +and\slash or equation number to the current vertical list has three +parameters: the prototype box, the hbox to be appended, and the +displacement of the hbox in the display line. + +@<Declare subprocedures for |after_math|@>= +procedure app_display(@!j,@!b:pointer;@!d:scaled); +var z:scaled; {width of the line} +@!s:scaled; {move the line right this much} +@!e:scaled; {distance from right edge of box to end of line} +@!x:integer; {|pre_display_direction|} +@!p,@!q,@!r,@!t,@!u:pointer; {for list manipulation} +begin s:=display_indent; x:=pre_display_direction; +if x=0 then shift_amount(b):=s+d +else begin z:=display_width; p:=b; + @<Set up the hlist for the display line@>; + @<Package the display line@>; + end; +append_to_vlist(b); +end; + +@ Here we construct the hlist for the display, starting with node |p| +and ending with node |q|. We also set |d| and |e| to the amount of +kerning to be added before and after the hlist (adjusted for the +prototype box). + +@<Set up the hlist for the display line@>= +if x>0 then e:=z-d-width(p) +else begin e:=d; d:=z-e-width(p); + end; +if j<>null then + begin b:=copy_node_list(j); height(b):=height(p); depth(b):=depth(p); + s:=s-shift_amount(b); d:=d+s; e:=e+width(b)-z-s; + end; +if subtype(p)=dlist then q:=p {display or equation number} +else begin {display and equation number} + r:=list_ptr(p); free_node(p,box_node_size); + if r=null then confusion("LR4"); + if x>0 then + begin p:=r; + repeat q:=r; r:=link(r); {find tail of list} + until r=null; + end + else begin p:=null; q:=r; + repeat t:=link(r); link(r):=p; p:=r; r:=t; {reverse list} + until r=null; + end; + end + +@ In the presence of a prototype box we use its shift amount and width +to adjust the values of kerning and add these values to the glue nodes +inserted to cancel the \.{\\leftskip} and \.{\\rightskip}. If there is +no prototype box (because the display is preceded by an empty +paragraph), or if the skip parameters are zero, we just add kerns. + +The |cancel_glue| macro creates and links a glue node that is, together +with another glue node, equivalent to a given amount of kerning. We can +use |j| as temporary pointer, since all we need is |j<>null|. + +@d cancel_glue(#)==j:=new_skip_param(#); cancel_glue_cont +@d cancel_glue_cont(#)==link(#):=j; cancel_glue_cont_cont +@d cancel_glue_cont_cont(#)==link(j):=#; cancel_glue_end +@d cancel_glue_end(#)==j:=glue_ptr(#); cancel_glue_end_end +@d cancel_glue_end_end(#)== +stretch_order(temp_ptr):=stretch_order(j); +shrink_order(temp_ptr):=shrink_order(j); width(temp_ptr):=#-width(j); +stretch(temp_ptr):=-stretch(j); shrink(temp_ptr):=-shrink(j) + +@<Package the display line@>= +if j=null then + begin r:=new_kern(0); t:=new_kern(0); {the widths will be set later} + end +else begin r:=list_ptr(b); t:=link(r); + end; +u:=new_math(0,end_M_code); +if type(t)=glue_node then {|t| is \.{\\rightskip} glue} + begin cancel_glue(right_skip_code)(q)(u)(t)(e); link(u):=t; + end +else begin width(t):=e; link(t):=u; link(q):=t; + end; +u:=new_math(0,begin_M_code); +if type(r)=glue_node then {|r| is \.{\\leftskip} glue} + begin cancel_glue(left_skip_code)(u)(p)(r)(d); link(r):=u; + end +else begin width(r):=d; link(r):=p; link(u):=r; + if j=null then + begin b:=hpack(u,natural); shift_amount(b):=s; + end + else list_ptr(b):=u; + end + +@ The |scan_tokens| feature of \eTeX\ defines the \.{\\scantokens} +primitive. + +@<Generate all \eTeX...@>= +primitive("scantokens",input,2); +@!@:scan_tokens_}{\.{\\scantokens} primitive@> + +@ @<Cases of |input| for |print_cmd_chr|@>= +else if chr_code=2 then print_esc("scantokens") + +@ @<Cases for |input|@>= +else if cur_chr=2 then pseudo_start + +@ The global variable |pseudo_files| is used to maintain a stack of +pseudo files. The |info| field of each pseudo file points to a linked +list of variable size nodes representing lines not yet processed: the +|info| field of the first word contains the size of this node, all the +following words contain ASCII codes. + +@<Glob...@>= +@!pseudo_files:pointer; {stack of pseudo files} + +@ @<Set init...@>= +pseudo_files:=null; + +@ The |pseudo_start| procedure initiates reading from a pseudo file. + +@<Declare \eTeX\ procedures for ex...@>= +procedure@?pseudo_start; forward;@t\2@> + +@ @<Declare \eTeX\ procedures for tok...@>= +procedure pseudo_start; +var old_setting:0..max_selector; {holds |selector| setting} +@!s:str_number; {string to be converted into a pseudo file} +@!l,@!m:pool_pointer; {indices into |str_pool|} +@!p,@!q,@!r:pointer; {for list construction} +@!w: four_quarters; {four ASCII codes} +@!nl,@!sz:integer; +begin scan_general_text; +old_setting:=selector; selector:=new_string; +token_show(temp_head); selector:=old_setting; +flush_list(link(temp_head)); +str_room(1); s:=make_string; +@<Convert string |s| into a new pseudo file@>; +flush_string; +@<Initiate input from new pseudo file@>; +end; + +@ @<Convert string |s| into a new pseudo file@>= +str_pool[pool_ptr]:=si(" "); l:=str_start[s]; +nl:=si(new_line_char); +p:=get_avail; q:=p; +while l<pool_ptr do + begin m:=l; + while (l<pool_ptr)and(str_pool[l]<>nl) do incr(l); + sz:=(l-m+7)div 4; + if sz=1 then sz:=2; + r:=get_node(sz); link(q):=r; q:=r; info(q):=hi(sz); + while sz>2 do + begin decr(sz); incr(r); + w.b0:=qi(so(str_pool[m])); w.b1:=qi(so(str_pool[m+1])); + w.b2:=qi(so(str_pool[m+2])); w.b3:=qi(so(str_pool[m+3])); + mem[r].qqqq:=w; m:=m+4; + end; + w.b0:=qi(" "); w.b1:=qi(" "); w.b2:=qi(" "); w.b3:=qi(" "); + if l>m then + begin w.b0:=qi(so(str_pool[m])); + if l>m+1 then + begin w.b1:=qi(so(str_pool[m+1])); + if l>m+2 then + begin w.b2:=qi(so(str_pool[m+2])); + if l>m+3 then w.b3:=qi(so(str_pool[m+3])); + end; + end; + end; + mem[r+1].qqqq:=w; + if str_pool[l]=nl then incr(l); + end; +info(p):=link(p); link(p):=pseudo_files; pseudo_files:=p + +@ @<Initiate input from new pseudo file@>= +begin_file_reading; {set up |cur_file| and new level of input} +line:=0; limit:=start; loc:=limit+1; {force line read} +if tracing_scan_tokens>0 then + begin if term_offset>max_print_line-3 then print_ln + else if (term_offset>0)or(file_offset>0) then print_char(" "); + name:=19; print("( "); incr(open_parens); update_terminal; + end +else name:=18 + +@ Here we read a line from the current pseudo file into |buffer|. + +@<Declare \eTeX\ procedures for tr...@>= +function pseudo_input: boolean; {inputs the next line or returns |false|} +var p:pointer; {current line from pseudo file} +@!sz:integer; {size of node |p|} +@!w:four_quarters; {four ASCII codes} +@!r:pointer; {loop index} +begin last:=first; {cf.\ Matthew 19\thinspace:\thinspace30} +p:=info(pseudo_files); +if p=null then pseudo_input:=false +else begin info(pseudo_files):=link(p); sz:=ho(info(p)); + if 4*sz-3>=buf_size-last then + @<Report overflow of the input buffer, and abort@>; + last:=first; + for r:=p+1 to p+sz-1 do + begin w:=mem[r].qqqq; + buffer[last]:=w.b0; buffer[last+1]:=w.b1; + buffer[last+2]:=w.b2; buffer[last+3]:=w.b3; + last:=last+4; + end; + if last>=max_buf_stack then max_buf_stack:=last+1; + while (last>first)and(buffer[last-1]=" ") do decr(last); + free_node(p,sz); + pseudo_input:=true; + end; +end; + +@ When we are done with a pseudo file we `close' it. + +@<Declare \eTeX\ procedures for tr...@>= +procedure pseudo_close; {close the top level pseudo file} +var p,@!q: pointer; +begin p:=link(pseudo_files); q:=info(pseudo_files); +free_avail(pseudo_files); pseudo_files:=p; +while q<>null do + begin p:=q; q:=link(p); free_node(p,ho(info(p))); + end; +end; + +@ @<Dump the \eTeX\ state@>= +while pseudo_files<>null do pseudo_close; {flush pseudo files} + +@ @<Generate all \eTeX...@>= +primitive("readline",read_to_cs,1);@/ +@!@:read_line_}{\.{\\readline} primitive@> + +@ @<Cases of |read| for |print_cmd_chr|@>= +else print_esc("readline") + +@ @<Handle \.{\\readline} and |goto done|@>= +if j=1 then + begin while loc<=limit do {current line not yet finished} + begin cur_chr:=buffer[loc]; incr(loc); + if cur_chr=" " then cur_tok:=space_token + @+else cur_tok:=cur_chr+other_token; + store_new_token(cur_tok); + end; + goto done; + end + +@ Here we define the additional conditionals of \eTeX\ as well as the +\.{\\unless} prefix. + +@d if_def_code=17 { `\.{\\ifdefined}' } +@d if_cs_code=18 { `\.{\\ifcsname}' } +@d if_font_char_code=19 { `\.{\\iffontchar}' } + +@<Generate all \eTeX...@>= +primitive("unless",expand_after,1);@/ +@!@:unless_}{\.{\\unless} primitive@> +primitive("ifdefined",if_test,if_def_code); +@!@:if_defined_}{\.{\\ifdefined} primitive@> +primitive("ifcsname",if_test,if_cs_code); +@!@:if_cs_name_}{\.{\\ifcsname} primitive@> +primitive("iffontchar",if_test,if_font_char_code); +@!@:if_font_char_}{\.{\\iffontchar} primitive@> + +@ @<Cases of |expandafter| for |print_cmd_chr|@>= +else print_esc("unless") + +@ @<Cases of |if_test| for |print_cmd_chr|@>= +if_def_code:print_esc("ifdefined"); +if_cs_code:print_esc("ifcsname"); +if_font_char_code:print_esc("iffontchar"); + +@ The result of a boolean condition is reversed when the conditional is +preceded by \.{\\unless}. + +@<Negate a boolean conditional and |goto reswitch|@>= +begin get_token; +if (cur_cmd=if_test)and(cur_chr<>if_case_code) then + begin cur_chr:=cur_chr+unless_code; goto reswitch; + end; +print_err("You can't use `"); print_esc("unless"); print("' before `"); +@.You can't use \\unless...@> +print_cmd_chr(cur_cmd,cur_chr); print_char("'"); +help1("Continue, and I'll forget that it ever happened."); +back_error; +end + +@ The conditional \.{\\ifdefined} tests if a control sequence is +defined. + +We need to reset |scanner_status|, since \.{\\outer} control sequences +are allowed, but we might be scanning a macro definition or preamble. + +@<Cases for |conditional|@>= +if_def_code:begin save_scanner_status:=scanner_status; + scanner_status:=normal; + get_next; b:=(cur_cmd<>undefined_cs); + scanner_status:=save_scanner_status; + end; + +@ The conditional \.{\\ifcsname} is equivalent to \.{\{\\expandafter} +\.{\}\\expandafter} \.{\\ifdefined} \.{\\csname}, except that no new +control sequence will be entered into the hash table (once all tokens +preceding the mandatory \.{\\endcsname} have been expanded). + +@<Cases for |conditional|@>= +if_cs_code:begin n:=get_avail; p:=n; {head of the list of characters} + repeat get_x_token; + if cur_cs=0 then store_new_token(cur_tok); + until cur_cs<>0; + if cur_cmd<>end_cs_name then @<Complain about missing \.{\\endcsname}@>; + @<Look up the characters of list |n| in the hash table, and set |cur_cs|@>; + flush_list(n); + b:=(eq_type(cur_cs)<>undefined_cs); + end; + +@ @<Look up the characters of list |n| in the hash table...@>= +m:=first; p:=link(n); +while p<>null do + begin if m>=max_buf_stack then + begin max_buf_stack:=m+1; + if max_buf_stack=buf_size then + overflow("buffer size",buf_size); +@:TeX capacity exceeded buffer size}{\quad buffer size@> + end; + buffer[m]:=info(p) mod @'400; incr(m); p:=link(p); + end; +if m>first+1 then + cur_cs:=id_lookup(first,m-first) {|no_new_control_sequence| is |true|} +else if m=first then cur_cs:=null_cs {the list is empty} +else cur_cs:=single_base+buffer[first] {the list has length one} + +@ The conditional \.{\\iffontchar} tests the existence of a character in +a font. + +@<Cases for |conditional|@>= +if_font_char_code:begin scan_font_ident; n:=cur_val; scan_char_num; + if (font_bc[n]<=cur_val)and(font_ec[n]>=cur_val) then + b:=char_exists(char_info(n)(qi(cur_val))) + else b:=false; + end; + +@ The |protected| feature of \eTeX\ defines the \.{\\protected} prefix +command for macro definitions. Such macros are protected against +expansions when lists of expanded tokens are built, e.g., for \.{\\edef} +or during \.{\\write}. + +@<Generate all \eTeX...@>= +primitive("protected",prefix,8); +@!@:protected_}{\.{\\protected} primitive@> + +@ @<Cases of |prefix| for |print_cmd_chr|@>= +else if chr_code=8 then print_esc("protected") + +@ The |get_x_or_protected| procedure is like |get_x_token| except that +protected macros are not expanded. + +@<Declare \eTeX\ procedures for sc...@>= +procedure get_x_or_protected; {sets |cur_cmd|, |cur_chr|, |cur_tok|, + and expands non-protected macros} +label exit; +begin loop@+begin get_token; + if cur_cmd<=max_command then return; + if (cur_cmd>=call)and(cur_cmd<end_template) then + if info(link(cur_chr))=protected_token then return; + expand; + end; +exit:end; + +@ A group entered (or a conditional started) in one file may end in a +different file. Such slight anomalies, although perfectly legitimate, +may cause errors that are difficult to locate. In order to be able to +give a warning message when such anomalies occur, \eTeX\ uses the +|grp_stack| and |if_stack| arrays to record the initial |cur_boundary| +and |cond_ptr| values for each input file. + +@<Glob...@>= +@!grp_stack : array[0..max_in_open] of save_pointer; {initial |cur_boundary|} +@!if_stack : array[0..max_in_open] of pointer; {initial |cond_ptr|} + +@ When a group ends that was apparently entered in a different input +file, the |group_warning| procedure is invoked in order to update the +|grp_stack|. If moreover \.{\\tracingnesting} is positive we want to +give a warning message. The situation is, however, somewhat complicated +by two facts: (1)~There may be |grp_stack| elements without a +corresponding \.{\\input} file or \.{\\scantokens} pseudo file (e.g., +error insertions from the terminal); and (2)~the relevant information is +recorded in the |name_field| of the |input_stack| only loosely +synchronized with the |in_open| variable indexing |grp_stack|. + +@<Declare \eTeX\ procedures for tr...@>= +procedure group_warning; +var i:0..max_in_open; {index into |grp_stack|} +@!w:boolean; {do we need a warning?} +begin base_ptr:=input_ptr; input_stack[base_ptr]:=cur_input; + {store current state} +i:=in_open; w:=false; +while (grp_stack[i]=cur_boundary)and(i>0) do + begin @<Set variable |w| to indicate if this case should be reported@>; + grp_stack[i]:=save_index(save_ptr); decr(i); + end; +if w then + begin print_nl("Warning: end of "); print_group(true); +@.Warning: end of...@> + print(" of a different file"); print_ln; + if tracing_nesting>1 then show_context; + if history=spotless then history:=warning_issued; + end; +end; + +@ This code scans the input stack in order to determine the type of the +current input file. + +@<Set variable |w| to...@>= +if tracing_nesting>0 then + begin while (input_stack[base_ptr].state_field=token_list)or@| + (input_stack[base_ptr].index_field>i) do decr(base_ptr); + if input_stack[base_ptr].name_field>17 then w:=true; + end + +@ When a conditional ends that was apparently started in a different +input file, the |if_warning| procedure is invoked in order to update the +|if_stack|. If moreover \.{\\tracingnesting} is positive we want to +give a warning message (with the same complications as above). + +@<Declare \eTeX\ procedures for tr...@>= +procedure if_warning; +var i:0..max_in_open; {index into |if_stack|} +@!w:boolean; {do we need a warning?} +begin base_ptr:=input_ptr; input_stack[base_ptr]:=cur_input; + {store current state} +i:=in_open; w:=false; +while if_stack[i]=cond_ptr do + begin @<Set variable |w| to...@>; + if_stack[i]:=link(cond_ptr); decr(i); + end; +if w then + begin print_nl("Warning: end of "); print_cmd_chr(if_test,cur_if); +@.Warning: end of...@> + print_if_line(if_line); print(" of a different file"); print_ln; + if tracing_nesting>1 then show_context; + if history=spotless then history:=warning_issued; + end; +end; + +@ Conversely, the |file_warning| procedure is invoked when a file ends +and some groups entered or conditionals started while reading from that +file are still incomplete. + +@<Declare \eTeX\ procedures for tr...@>= +procedure file_warning; +var p:pointer; {saved value of |save_ptr| or |cond_ptr|} +@!l:quarterword; {saved value of |cur_level| or |if_limit|} +@!c:quarterword; {saved value of |cur_group| or |cur_if|} +@!i:integer; {saved value of |if_line|} +begin p:=save_ptr; l:=cur_level; c:=cur_group; save_ptr:=cur_boundary; +while grp_stack[in_open]<>save_ptr do + begin decr(cur_level); + print_nl("Warning: end of file when "); +@.Warning: end of file when...@> + print_group(true); print(" is incomplete");@/ + cur_group:=save_level(save_ptr); save_ptr:=save_index(save_ptr) + end; +save_ptr:=p; cur_level:=l; cur_group:=c; {restore old values} +p:=cond_ptr; l:=if_limit; c:=cur_if; i:=if_line; +while if_stack[in_open]<>cond_ptr do + begin print_nl("Warning: end of file when "); +@.Warning: end of file when...@> + print_cmd_chr(if_test,cur_if); + if if_limit=fi_code then print_esc("else"); + print_if_line(if_line); print(" is incomplete");@/ + if_line:=if_line_field(cond_ptr); cur_if:=subtype(cond_ptr); + if_limit:=type(cond_ptr); cond_ptr:=link(cond_ptr); + end; +cond_ptr:=p; if_limit:=l; cur_if:=c; if_line:=i; {restore old values} +print_ln; +if tracing_nesting>1 then show_context; +if history=spotless then history:=warning_issued; +end; + +@ Here are the additional \eTeX\ primitives for expressions. + +@<Generate all \eTeX...@>= +primitive("numexpr",last_item,eTeX_expr-int_val+int_val); +@!@:num_expr_}{\.{\\numexpr} primitive@> +primitive("dimexpr",last_item,eTeX_expr-int_val+dimen_val); +@!@:dim_expr_}{\.{\\dimexpr} primitive@> +primitive("glueexpr",last_item,eTeX_expr-int_val+glue_val); +@!@:glue_expr_}{\.{\\glueexpr} primitive@> +primitive("muexpr",last_item,eTeX_expr-int_val+mu_val); +@!@:mu_expr_}{\.{\\muexpr} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +eTeX_expr-int_val+int_val: print_esc("numexpr"); +eTeX_expr-int_val+dimen_val: print_esc("dimexpr"); +eTeX_expr-int_val+glue_val: print_esc("glueexpr"); +eTeX_expr-int_val+mu_val: print_esc("muexpr"); + +@ This code for reducing |cur_val_level| and\slash or negating the +result is similar to the one for all the other cases of +|scan_something_internal|, with the difference that |scan_expr| has +already increased the reference count of a glue specification. + +@<Process an expression and |return|@>= +begin if m<eTeX_mu then + begin case m of + @/@<Cases for fetching a glue value@>@/ + end; {there are no other cases} + cur_val_level:=glue_val; + end +else if m<eTeX_expr then + begin case m of + @/@<Cases for fetching a mu value@>@/ + end; {there are no other cases} + cur_val_level:=mu_val; + end +else begin cur_val_level:=m-eTeX_expr+int_val; scan_expr; + end; +while cur_val_level>level do + begin if cur_val_level=glue_val then + begin m:=cur_val; cur_val:=width(m); delete_glue_ref(m); + end + else if cur_val_level=mu_val then mu_error; + decr(cur_val_level); + end; +if negative then + if cur_val_level>=glue_val then + begin m:=cur_val; cur_val:=new_spec(m); delete_glue_ref(m); + @<Negate all three glue components of |cur_val|@>; + end + else negate(cur_val); +return; +end + +@ @<Declare \eTeX\ procedures for sc...@>= +procedure@?scan_expr; forward;@t\2@> + +@ The |scan_expr| procedure scans and evaluates an expression. + +@<Declare procedures needed for expressions@>= +@t\4@>@<Declare subprocedures for |scan_expr|@> +procedure scan_expr; {scans and evaluates an expression} +label restart, continue, found; +var a,@!b:boolean; {saved values of |arith_error|} +@!l:small_number; {type of expression} +@!r:small_number; {state of expression so far} +@!s:small_number; {state of term so far} +@!o:small_number; {next operation or type of next factor} +@!e:integer; {expression so far} +@!t:integer; {term so far} +@!f:integer; {current factor} +@!n:integer; {numerator of combined multiplication and division} +@!p:pointer; {top of expression stack} +@!q:pointer; {for stack manipulations} +begin l:=cur_val_level; a:=arith_error; b:=false; p:=null; +@<Scan and evaluate an expression |e| of type |l|@>; +if b then + begin print_err("Arithmetic overflow"); +@.Arithmetic overflow@> + help2("I can't evaluate this expression,")@/ + ("since the result is out of range."); + error; + if l>=glue_val then + begin delete_glue_ref(e); e:=zero_glue; add_glue_ref(e); + end + else e:=0; + end; +arith_error:=a; cur_val:=e; cur_val_level:=l; +end; + +@ Evaluating an expression is a recursive process: When the left +parenthesis of a subexpression is scanned we descend to the next level +of recursion; the previous level is resumed with the matching right +parenthesis. + +@d expr_none=0 {\.( seen, or \.( $\langle\it expr\rangle$ \.) seen} +@d expr_add=1 {\.( $\langle\it expr\rangle$ \.+ seen} +@d expr_sub=2 {\.( $\langle\it expr\rangle$ \.- seen} +@d expr_mult=3 {$\langle\it term\rangle$ \.* seen} +@d expr_div=4 {$\langle\it term\rangle$ \./ seen} +@d expr_scale=5 {$\langle\it term\rangle$ \.* + $\langle\it factor\rangle$ \./ seen} + +@<Scan and eval...@>= +restart: r:=expr_none; e:=0; s:=expr_none; t:=0; n:=0; +continue: if s=expr_none then o:=l@+else o:=int_val; +@<Scan a factor |f| of type |o| or start a subexpression@>; +found: @<Scan the next operator and set |o|@>; +arith_error:=b; +@<Make sure that |f| is in the proper range@>; +case s of @<Cases for evaluation of the current term@>@; +end; {there are no other cases} +if o>expr_sub then s:=o@+else @<Evaluate the current expression@>; +b:=arith_error; +if o<>expr_none then goto continue; +if p<>null then @<Pop the expression stack and |goto found|@> + +@ @<Scan the next op...@>= +@<Get the next non-blank non-call token@>; +if cur_tok=other_token+"+" then o:=expr_add +else if cur_tok=other_token+"-" then o:=expr_sub +else if cur_tok=other_token+"*" then o:=expr_mult +else if cur_tok=other_token+"/" then o:=expr_div +else begin o:=expr_none; + if p=null then + begin if cur_cmd<>relax then back_input; + end + else if cur_tok<>other_token+")" then + begin print_err("Missing ) inserted for expression"); +@.Missing ) inserted@> + help1("I was expecting to see `+', `-', `*', `/', or `)'. Didn't."); + back_error; + end; + end + +@ @<Scan a factor...@>= +@<Get the next non-blank non-call token@>; +if cur_tok=other_token+"(" then + @<Push the expression stack and |goto restart|@>; +back_input; +if o=int_val then scan_int +else if o=dimen_val then scan_normal_dimen +else if o=glue_val then scan_normal_glue +else scan_mu_glue; +f:=cur_val + +@ @<Declare \eTeX\ procedures for sc...@>= +procedure@?scan_normal_glue; forward;@t\2@>@/ +procedure@?scan_mu_glue; forward;@t\2@> + +@ Here we declare to trivial procedures in order to avoid mutually +recursive procedures with parameters. + +@<Declare procedures needed for expressions@>= +procedure scan_normal_glue; +begin scan_glue(glue_val); +end; +@# +procedure scan_mu_glue; +begin scan_glue(mu_val); +end; + +@ Parenthesized subexpressions can be inside expressions, and this +nesting has a stack. Seven local variables represent the top of the +expression stack: |p| points to pushed-down entries, if any; |l| +specifies the type of expression currently beeing evaluated; |e| is the +expression so far and |r| is the state of its evaluation; |t| is the +term so far and |s| is the state of its evaluation; finally |n| is the +numerator for a combined multiplication and division, if any. + +@d expr_node_size=4 {number of words in stack entry for subexpressions} +@d expr_e_field(#)==mem[#+1].int {saved expression so far} +@d expr_t_field(#)==mem[#+2].int {saved term so far} +@d expr_n_field(#)==mem[#+3].int {saved numerator} + +@<Push the expression...@>= +begin q:=get_node(expr_node_size); link(q):=p; type(q):=l; +subtype(q):=4*s+r; +expr_e_field(q):=e; expr_t_field(q):=t; expr_n_field(q):=n; +p:=q; l:=o; goto restart; +end + +@ @<Pop the expression...@>= +begin f:=e; q:=p; +e:=expr_e_field(q); t:=expr_t_field(q); n:=expr_n_field(q); +s:=subtype(q) div 4; r:=subtype(q) mod 4; +l:=type(q); p:=link(q); free_node(q,expr_node_size); +goto found; +end + +@ We want to make sure that each term and (intermediate) result is in +the proper range. Integer values must not exceed |infinity| +($2^{31}-1$) in absolute value, dimensions must not exceed |max_dimen| +($2^{30}-1$). We avoid the absolute value of an integer, because this +might fail for the value $-2^{31}$ using 32-bit arithmetic. + +@d num_error(#)== {clear a number or dimension and set |arith_error|} + begin arith_error:=true; #:=0; + end +@d glue_error(#)== {clear a glue spec and set |arith_error|} + begin arith_error:=true; delete_glue_ref(#); #:=new_spec(zero_glue); + end + +@<Make sure that |f|...@>= +if (l=int_val)or(s>expr_sub) then + begin if (f>infinity)or(f<-infinity) then num_error(f); + end +else if l=dimen_val then + begin if abs(f)>max_dimen then num_error(f); + end +else begin if (abs(width(f))>max_dimen)or@| + (abs(stretch(f))>max_dimen)or@| + (abs(shrink(f))>max_dimen) then glue_error(f); + end + +@ Applying the factor |f| to the partial term |t| (with the operator +|s|) is delayed until the next operator |o| has been scanned. Here we +handle the first factor of a partial term. A glue spec has to be copied +unless the next operator is a right parenthesis; this allows us later on +to simply modify the glue components. + +@d normalize_glue(#)== + if stretch(#)=0 then stretch_order(#):=normal; + if shrink(#)=0 then shrink_order(#):=normal + +@<Cases for evaluation of the current term@>= +expr_none: if (l>=glue_val)and(o<>expr_none) then + begin t:=new_spec(f); delete_glue_ref(f); normalize_glue(t); + end + else t:=f; + +@ When a term |t| has been completed it is copied to, added to, or +subtracted from the expression |e|. + +@d expr_add_sub(#)==add_or_sub(#,r=expr_sub) +@d expr_a(#)==expr_add_sub(#,max_dimen) + +@<Evaluate the current expression@>= +begin s:=expr_none; +if r=expr_none then e:=t +else if l=int_val then e:=expr_add_sub(e,t,infinity) +else if l=dimen_val then e:=expr_a(e,t) +else @<Compute the sum or difference of two glue specs@>; +r:=o; +end + +@ The function |add_or_sub(x,y,max_answer,negative)| computes the sum +(for |negative=false|) or difference (for |negative=true|) of |x| and +|y|, provided the absolute value of the result does not exceed +|max_answer|. + +@<Declare subprocedures for |scan_expr|@>= +function add_or_sub(@!x,@!y,@!max_answer:integer;@!negative:boolean):integer; +var a:integer; {the answer} +begin if negative then negate(y); +if x>=0 then + if y<=max_answer-x then a:=x+y@+else num_error(a) +else if y>=-max_answer-x then a:=x+y@+else num_error(a); +add_or_sub:=a; +end; + +@ We know that |stretch_order(e)>normal| implies |stretch(e)<>0| and +|shrink_order(e)>normal| implies |shrink(e)<>0|. + +@<Compute the sum or diff...@>= +begin width(e):=expr_a(width(e),width(t)); +if stretch_order(e)=stretch_order(t) then + stretch(e):=expr_a(stretch(e),stretch(t)) +else if (stretch_order(e)<stretch_order(t))and(stretch(t)<>0) then + begin stretch(e):=stretch(t); stretch_order(e):=stretch_order(t); + end; +if shrink_order(e)=shrink_order(t) then + shrink(e):=expr_a(shrink(e),shrink(t)) +else if (shrink_order(e)<shrink_order(t))and(shrink(t)<>0) then + begin shrink(e):=shrink(t); shrink_order(e):=shrink_order(t); + end; +delete_glue_ref(t); normalize_glue(e); +end + +@ If a multiplication is followed by a division, the two operations are +combined into a `scaling' operation. Otherwise the term |t| is +multiplied by the factor |f|. + +@d expr_m(#)==#:=nx_plus_y(#,f,0) + +@<Cases for evaluation of the current term@>= +expr_mult: if o=expr_div then + begin n:=f; o:=expr_scale; + end + else if l=int_val then t:=mult_integers(t,f) + else if l=dimen_val then expr_m(t) + else begin expr_m(width(t)); expr_m(stretch(t)); expr_m(shrink(t)); + end; + +@ Here we divide the term |t| by the factor |f|. + +@d expr_d(#)==#:=quotient(#,f) + +@<Cases for evaluation of the current term@>= +expr_div: if l<glue_val then expr_d(t) + else begin expr_d(width(t)); expr_d(stretch(t)); expr_d(shrink(t)); + end; + +@ The function |quotient(n,d)| computes the rounded quotient +$q=\lfloor n/d+{1\over2}\rfloor$, when $n$ and $d$ are positive. + +@<Declare subprocedures for |scan_expr|@>= +function quotient(@!n,@!d:integer):integer; +var negative:boolean; {should the answer be negated?} +@!a:integer; {the answer} +begin if d=0 then num_error(a) +else begin if d>0 then negative:=false + else begin negate(d); negative:=true; + end; + if n<0 then + begin negate(n); negative:=not negative; + end; + a:=n div d; n:=n-a*d; d:=n-d; {avoid certain compiler optimizations!} + if d+n>=0 then incr(a); + if negative then negate(a); + end; +quotient:=a; +end; + +@ Here the term |t| is multiplied by the quotient $n/f$. + +@d expr_s(#)==#:=fract(#,n,f,max_dimen) + +@<Cases for evaluation of the current term@>= +expr_scale: if l=int_val then t:=fract(t,n,f,infinity) + else if l=dimen_val then expr_s(t) + else begin expr_s(width(t)); expr_s(stretch(t)); expr_s(shrink(t)); + end; + +@ Finally, the function |fract(x,n,d,max_answer)| computes the integer +$q=\lfloor xn/d+{1\over2}\rfloor$, when $x$, $n$, and $d$ are positive +and the result does not exceed |max_answer|. We can't use floating +point arithmetic since the routine must produce identical results in all +cases; and it would be too dangerous to multiply by~|n| and then divide +by~|d|, in separate operations, since overflow might well occur. Hence +this subroutine simulates double precision arithmetic, somewhat +analogous to \MF's |make_fraction| and |take_fraction| routines. + +@d too_big=88 {go here when the result is too big} + +@<Declare subprocedures for |scan_expr|@>= +function fract(@!x,@!n,@!d,@!max_answer:integer):integer; +label found, found1, too_big, done; +var negative:boolean; {should the answer be negated?} +@!a:integer; {the answer} +@!f:integer; {a proper fraction} +@!h:integer; {smallest integer such that |2*h>=d|} +@!r:integer; {intermediate remainder} +@!t:integer; {temp variable} +begin if d=0 then goto too_big; +a:=0; +if d>0 then negative:=false +else begin negate(d); negative:=true; + end; +if x<0 then + begin negate(x); negative:=not negative; + end +else if x=0 then goto done; +if n<0 then + begin negate(n); negative:=not negative; + end; +t:=n div d; +if t>max_answer div x then goto too_big; +a:=t*x; n:=n-t*d; +if n=0 then goto found; +t:=x div d; +if t>(max_answer-a) div n then goto too_big; +a:=a+t*n; x:=x-t*d; +if x=0 then goto found; +if x<n then + begin t:=x; x:=n; n:=t; + end; {now |0<n<=x<d|} +@<Compute \(f)$f=\lfloor xn/d+{1\over2}\rfloor$@>@; +if f>(max_answer-a) then goto too_big; +a:=a+f; +found: if negative then negate(a); +goto done; +too_big: num_error(a); +done: fract:=a; +end; + +@ The loop here preserves the following invariant relations +between |f|, |x|, |n|, and~|r|: +(i)~$f+\lfloor(xn+(r+d))/d\rfloor=\lfloor x_0n_0/d+{1\over2}\rfloor$; +(ii)~|-d<=r<0<n<=x<d|, where $x_0$, $n_0$ are the original values of~$x$ +and $n$. + +Notice that the computation specifies |(x-d)+x| instead of |(x+x)-d|, +because the latter could overflow. + +@<Compute \(f)$f=\lfloor xn/d+{1\over2}\rfloor$@>= +f:=0; r:=(d div 2)-d; h:=-r; +loop@+begin if odd(n) then + begin r:=r+x; + if r>=0 then + begin r:=r-d; incr(f); + end; + end; + n:=n div 2; + if n=0 then goto found1; + if x<h then x:=x+x + else begin t:=x-d; x:=t+x; f:=f+n; + if x<n then + begin if x=0 then goto found1; + t:=x; x:=n; n:=t; + end; + end; + end; +found1: + +@ The \.{\\gluestretch}, \.{\\glueshrink}, \.{\\gluestretchorder}, and +\.{\\glueshrinkorder} commands return the stretch and shrink components +and their orders of ``infinity'' of a glue specification. + +@d glue_stretch_order_code=eTeX_int+6 {code for \.{\\gluestretchorder}} +@d glue_shrink_order_code=eTeX_int+7 {code for \.{\\glueshrinkorder}} +@d glue_stretch_code=eTeX_dim+7 {code for \.{\\gluestretch}} +@d glue_shrink_code=eTeX_dim+8 {code for \.{\\glueshrink}} + +@<Generate all \eTeX...@>= +primitive("gluestretchorder",last_item,glue_stretch_order_code); +@!@:glue_stretch_order_}{\.{\\gluestretchorder} primitive@> +primitive("glueshrinkorder",last_item,glue_shrink_order_code); +@!@:glue_shrink_order_}{\.{\\glueshrinkorder} primitive@> +primitive("gluestretch",last_item,glue_stretch_code); +@!@:glue_stretch_}{\.{\\gluestretch} primitive@> +primitive("glueshrink",last_item,glue_shrink_code); +@!@:glue_shrink_}{\.{\\glueshrink} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +glue_stretch_order_code: print_esc("gluestretchorder"); +glue_shrink_order_code: print_esc("glueshrinkorder"); +glue_stretch_code: print_esc("gluestretch"); +glue_shrink_code: print_esc("glueshrink"); + +@ @<Cases for fetching an integer value@>= +glue_stretch_order_code, glue_shrink_order_code: + begin scan_normal_glue; q:=cur_val; + if m=glue_stretch_order_code then cur_val:=stretch_order(q) + else cur_val:=shrink_order(q); + delete_glue_ref(q); + end; + +@ @<Cases for fetching a dimension value@>= +glue_stretch_code, glue_shrink_code: + begin scan_normal_glue; q:=cur_val; + if m=glue_stretch_code then cur_val:=stretch(q) + else cur_val:=shrink(q); + delete_glue_ref(q); + end; + +@ The \.{\\mutoglue} and \.{\\gluetomu} commands convert ``math'' glue +into normal glue and vice versa; they allow to manipulate math glue with +\.{\\gluestretch} etc. + +@d mu_to_glue_code=eTeX_glue {code for \.{\\mutoglue}} +@d glue_to_mu_code=eTeX_mu {code for \.{\\gluetomu}} + +@<Generate all \eTeX...@>= +primitive("mutoglue",last_item,mu_to_glue_code); +@!@:mu_to_glue_}{\.{\\mutoglue} primitive@> +primitive("gluetomu",last_item,glue_to_mu_code); +@!@:glue_to_mu_}{\.{\\gluetomu} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +mu_to_glue_code: print_esc("mutoglue"); +glue_to_mu_code: print_esc("gluetomu"); + +@ @<Cases for fetching a glue value@>= +mu_to_glue_code: scan_mu_glue; + +@ @<Cases for fetching a mu value@>= +glue_to_mu_code: scan_normal_glue; + +@ \eTeX\ (in extended mode) supports 32768 (i.e., $2^{15}$) count, +dimen, skip, muskip, box, and token registers. As in \TeX\ the first +256 registers of each kind are realized as arrays in the table of +equivalents; the additional registers are realized as tree structures +built from variable-size nodes with individual registers existing only +when needed. Default values are used for nonexistent registers: zero +for count and dimen values, |zero_glue| for glue (skip and muskip) +values, void for boxes, and |null| for token lists (and current marks +discussed below). + +Similarly there are 32768 mark classes; the command \.{\\marks}|n| +creates a mark node for a given mark class |0<=n<=32767| (where +\.{\\marks0} is synonymous to \.{\\mark}). The page builder (actually +the |fire_up| routine) and the |vsplit| routine maintain the current +values of |top_mark|, |first_mark|, |bot_mark|, |split_first_mark|, and +|split_bot_mark| for each mark class. They are accessed as +\.{\\topmarks}|n| etc., and \.{\\topmarks0} is again synonymous to +\.{\\topmark}. As in \TeX\ the five current marks for mark class zero +are realized as |cur_mark| array. The additional current marks are +again realized as tree structure with individual mark classes existing +only when needed. + +@<Generate all \eTeX...@>= +primitive("marks",mark,marks_code); +@!@:marks_}{\.{\\marks} primitive@> +primitive("topmarks",top_bot_mark,top_mark_code+marks_code); +@!@:top_marks_}{\.{\\topmarks} primitive@> +primitive("firstmarks",top_bot_mark,first_mark_code+marks_code); +@!@:first_marks_}{\.{\\firstmarks} primitive@> +primitive("botmarks",top_bot_mark,bot_mark_code+marks_code); +@!@:bot_marks_}{\.{\\botmarks} primitive@> +primitive("splitfirstmarks",top_bot_mark,split_first_mark_code+marks_code); +@!@:split_first_marks_}{\.{\\splitfirstmarks} primitive@> +primitive("splitbotmarks",top_bot_mark,split_bot_mark_code+marks_code); +@!@:split_bot_marks_}{\.{\\splitbotmarks} primitive@> + +@ The |scan_register_num| procedure scans a register number that must +not exceed 255 in compatibility mode resp.\ 32767 in extended mode. + +@<Declare \eTeX\ procedures for ex...@>= +procedure@?scan_register_num; forward;@t\2@> + +@ @<Declare procedures that scan restricted classes of integers@>= +procedure scan_register_num; +begin scan_int; +if (cur_val<0)or(cur_val>max_reg_num) then + begin print_err("Bad register code"); +@.Bad register code@> + help2(max_reg_help_line)("I changed this one to zero."); + int_error(cur_val); cur_val:=0; + end; +end; + +@ @<Initialize variables for \eTeX\ comp...@>= +max_reg_num:=255; +max_reg_help_line:="A register number must be between 0 and 255."; + +@ @<Initialize variables for \eTeX\ ext...@>= +max_reg_num:=32767; +max_reg_help_line:="A register number must be between 0 and 32767."; + +@ @<Glob...@>= +@!max_reg_num: halfword; {largest allowed register number} +@!max_reg_help_line: str_number; {first line of help message} + +@ There are seven almost identical doubly linked trees, one for the +sparse array of the up to 32512 additional registers of each kind and +one for the sparse array of the up to 32767 additional mark classes. +The root of each such tree, if it exists, is an index node containing 16 +pointers to subtrees for 4096 consecutive array elements. Similar index +nodes are the starting points for all nonempty subtrees for 4096, 256, +and 16 consecutive array elements. These four levels of index nodes are +followed by a fifth level with nodes for the individual array elements. + +Each index node is nine words long. The pointers to the 16 possible +subtrees or are kept in the |info| and |link| fields of the last eight +words. (It would be both elegant and efficient to declare them as +array, unfortunately \PASCAL\ doesn't allow this.) + +The fields in the first word of each index node and in the nodes for the +array elements are closely related. The |link| field points to the next +lower index node and the |sa_index| field contains four bits (one +hexadecimal digit) of the register number or mark class. For the lowest +index node the |link| field is |null| and the |sa_index| field indicates +the type of quantity (|int_val|, |dimen_val|, |glue_val|, |mu_val|, +|box_val|, |tok_val|, or |mark_val|). The |sa_used| field in the index +nodes counts how many of the 16 pointers are non-null. + +The |sa_index| field in the nodes for array elements contains the four +bits plus 16 times the type. Therefore such a node represents a count +or dimen register if and only if |sa_index<dimen_val_limit|; it +represents a skip or muskip register if and only if +|dimen_val_limit<=sa_index<mu_val_limit|; it represents a box register +if and only if |mu_val_limit<=sa_index<box_val_limit|; it represents a +token list register if and only if +|box_val_limit<=sa_index<tok_val_limit|; finally it represents a mark +class if and only if |tok_val_limit<=sa_index|. + +The |new_index| procedure creates an index node (returned in |cur_ptr|) +having given contents of the |sa_index| and |link| fields. + +@d box_val==4 {the additional box registers} +@d mark_val=6 {the additional mark classes} +@# +@d dimen_val_limit=@"20 {$2^4\cdot(|dimen_val|+1)$} +@d mu_val_limit=@"40 {$2^4\cdot(|mu_val|+1)$} +@d box_val_limit=@"50 {$2^4\cdot(|box_val|+1)$} +@d tok_val_limit=@"60 {$2^4\cdot(|tok_val|+1)$} +@# +@d index_node_size=9 {size of an index node} +@d sa_index==type {a four-bit address or a type or both} +@d sa_used==subtype {count of non-null pointers} + +@<Declare \eTeX\ procedures for ex...@>= +procedure new_index(@!i:quarterword; @!q:pointer); +var k:small_number; {loop index} +begin cur_ptr:=get_node(index_node_size); sa_index(cur_ptr):=i; +sa_used(cur_ptr):=0; link(cur_ptr):=q; +for k:=1 to index_node_size-1 do {clear all 16 pointers} + mem[cur_ptr+k]:=sa_null; +end; + +@ The roots of the seven trees for the additional registers and mark +classes are kept in the |sa_root| array. The first six locations must +be dumped and undumped; the last one is also known as |sa_mark|. + +@d sa_mark==sa_root[mark_val] {root for mark classes} + +@<Glob...@>= +@!sa_root:array[int_val..mark_val] of pointer; {roots of sparse arrays} +@!cur_ptr:pointer; {value returned by |new_index| and |find_sa_element|} +@!sa_null:memory_word; {two |null| pointers} + +@ @<Set init...@>= +sa_mark:=null; sa_null.hh.lh:=null; sa_null.hh.rh:=null; + +@ @<Initialize table...@>= +for i:=int_val to tok_val do sa_root[i]:=null; + +@ Given a type |t| and a sixteen-bit number |n|, the |find_sa_element| +procedure returns (in |cur_ptr|) a pointer to the node for the +corresponding array element, or |null| when no such element exists. The +third parameter |w| is set |true| if the element must exist, e.g., +because it is about to be modified. The procedure has two main +branches: one follows the existing tree structure, the other (only used +when |w| is |true|) creates the missing nodes. + +We use macros to extract the four-bit pieces from a sixteen-bit register +number or mark class and to fetch or store one of the 16 pointers from +an index node. + +@d if_cur_ptr_is_null_then_return_or_goto(#)== {some tree element is missing} + begin if cur_ptr=null then + if w then goto #@+else return; + end +@# +@d hex_dig1(#)==# div 4096 {the fourth lowest hexadecimal digit} +@d hex_dig2(#)==(# div 256) mod 16 {the third lowest hexadecimal digit} +@d hex_dig3(#)==(# div 16) mod 16 {the second lowest hexadecimal digit} +@d hex_dig4(#)==# mod 16 {the lowest hexadecimal digit} +@# +@d get_sa_ptr==if odd(i) then cur_ptr:=link(q+(i div 2)+1) + else cur_ptr:=info(q+(i div 2)+1) + {set |cur_ptr| to the pointer indexed by |i| from index node |q|} +@d put_sa_ptr(#)==if odd(i) then link(q+(i div 2)+1):=# + else info(q+(i div 2)+1):=# + {store the pointer indexed by |i| in index node |q|} +@d add_sa_ptr==begin put_sa_ptr(cur_ptr); incr(sa_used(q)); + end {add |cur_ptr| as the pointer indexed by |i| in index node |q|} +@d delete_sa_ptr==begin put_sa_ptr(null); decr(sa_used(q)); + end {delete the pointer indexed by |i| in index node |q|} + +@<Declare \eTeX\ procedures for ex...@>= +procedure find_sa_element(@!t:small_number;@!n:halfword;@!w:boolean); + {sets |cur_val| to sparse array element location or |null|} +label not_found,not_found1,not_found2,not_found3,not_found4,exit; +var q:pointer; {for list manipulations} +@!i:small_number; {a four bit index} +begin cur_ptr:=sa_root[t]; +if_cur_ptr_is_null_then_return_or_goto(not_found);@/ +q:=cur_ptr; i:=hex_dig1(n); get_sa_ptr; +if_cur_ptr_is_null_then_return_or_goto(not_found1);@/ +q:=cur_ptr; i:=hex_dig2(n); get_sa_ptr; +if_cur_ptr_is_null_then_return_or_goto(not_found2);@/ +q:=cur_ptr; i:=hex_dig3(n); get_sa_ptr; +if_cur_ptr_is_null_then_return_or_goto(not_found3);@/ +q:=cur_ptr; i:=hex_dig4(n); get_sa_ptr; +if (cur_ptr=null)and w then goto not_found4; +return; +not_found: new_index(t,null); {create first level index node} +sa_root[t]:=cur_ptr; q:=cur_ptr; i:=hex_dig1(n); +not_found1: new_index(i,q); {create second level index node} +add_sa_ptr; q:=cur_ptr; i:=hex_dig2(n); +not_found2: new_index(i,q); {create third level index node} +add_sa_ptr; q:=cur_ptr; i:=hex_dig3(n); +not_found3: new_index(i,q); {create fourth level index node} +add_sa_ptr; q:=cur_ptr; i:=hex_dig4(n); +not_found4: @<Create a new array element of type |t| with index |i|@>; +link(cur_ptr):=q; add_sa_ptr; +exit:end; + +@ The array elements for registers are subject to grouping and have an +|sa_lev| field (quite analogous to |eq_level|) instead of |sa_used|. +Since saved values as well as shorthand definitions (created by e.g., +\.{\\countdef}) refer to the location of the respective array element, +we need a reference count that is kept in the |sa_ref| field. An array +element can be deleted (together with all references to it) when its +|sa_ref| value is |null| and its value is the default value. +@^reference counts@> + +Skip, muskip, box, and token registers use two word nodes, their values +are stored in the |sa_ptr| field. +Count and dimen registers use three word nodes, their +values are stored in the |sa_int| resp.\ |sa_dim| field in the third +word; the |sa_ptr| field is used under the name |sa_num| to store +the register number. Mark classes use four word nodes. The last three +words contain the five types of current marks + +@d sa_lev==sa_used {grouping level for the current value} +@d pointer_node_size=2 {size of an element with a pointer value} +@d sa_type(#)==(sa_index(#) div 16) {type part of combined type/index} +@d sa_ref(#)==info(#+1) {reference count of a sparse array element} +@d sa_ptr(#)==link(#+1) {a pointer value} +@# +@d word_node_size=3 {size of an element with a word value} +@d sa_num==sa_ptr {the register number} +@d sa_int(#)==mem[#+2].int {an integer} +@d sa_dim(#)==mem[#+2].sc {a dimension (a somewhat esotheric distinction)} +@# +@d mark_class_node_size=4 {size of an element for a mark class} +@# +@d fetch_box(#)== {fetch |box(cur_val)|} + if cur_val<256 then #:=box(cur_val) + else begin find_sa_element(box_val,cur_val,false); + if cur_ptr=null then #:=null@+else #:=sa_ptr(cur_ptr); + end + +@<Create a new array element...@>= +if t=mark_val then {a mark class} + begin cur_ptr:=get_node(mark_class_node_size); + mem[cur_ptr+1]:=sa_null; mem[cur_ptr+2]:=sa_null; mem[cur_ptr+3]:=sa_null; + end +else begin if t<=dimen_val then {a count or dimen register} + begin cur_ptr:=get_node(word_node_size); sa_int(cur_ptr):=0; + sa_num(cur_ptr):=n; + end + else begin cur_ptr:=get_node(pointer_node_size); + if t<=mu_val then {a skip or muskip register} + begin sa_ptr(cur_ptr):=zero_glue; add_glue_ref(zero_glue); + end + else sa_ptr(cur_ptr):=null; {a box or token list register} + end; + sa_ref(cur_ptr):=null; {all registers have a reference count} + end; +sa_index(cur_ptr):=16*t+i; sa_lev(cur_ptr):=level_one + +@ The |delete_sa_ref| procedure is called when a pointer to an array +element representing a register is being removed; this means that the +reference count should be decreased by one. If the reduced reference +count is |null| and the register has been (globally) assigned its +default value the array element should disappear, possibly together with +some index nodes. This procedure will never be used for mark class +nodes. +@^reference counts@> + +@d add_sa_ref(#)==incr(sa_ref(#)) {increase reference count} +@# +@d change_box(#)== {change |box(cur_val)|, the |eq_level| stays the same} + if cur_val<256 then box(cur_val):=#@+else set_sa_box(#) +@# +@d set_sa_box(#)==begin find_sa_element(box_val,cur_val,false); + if cur_ptr<>null then + begin sa_ptr(cur_ptr):=#; add_sa_ref(cur_ptr); delete_sa_ref(cur_ptr); + end; + end + +@<Declare \eTeX\ procedures for tr...@>= +procedure delete_sa_ref(@!q:pointer); {reduce reference count} +label exit; +var p:pointer; {for list manipulations} +@!i:small_number; {a four bit index} +@!s:small_number; {size of a node} +begin decr(sa_ref(q)); +if sa_ref(q)<>null then return; +if sa_index(q)<dimen_val_limit then + if sa_int(q)=0 then s:=word_node_size + else return +else begin if sa_index(q)<mu_val_limit then + if sa_ptr(q)=zero_glue then delete_glue_ref(zero_glue) + else return + else if sa_ptr(q)<>null then return; + s:=pointer_node_size; + end; +repeat i:=hex_dig4(sa_index(q)); p:=q; q:=link(p); free_node(p,s); +if q=null then {the whole tree has been freed} + begin sa_root[i]:=null; return; + end; +delete_sa_ptr; s:=index_node_size; {node |q| is an index node} +until sa_used(q)>0; +exit:end; + +@ The |print_sa_num| procedure prints the register number corresponding +to an array element. + +@<Basic print...@>= +procedure print_sa_num(@!q:pointer); {print register number} +var @!n:halfword; {the register number} +begin if sa_index(q)<dimen_val_limit then n:=sa_num(q) {the easy case} +else begin n:=hex_dig4(sa_index(q)); q:=link(q); n:=n+16*sa_index(q); + q:=link(q); n:=n+256*(sa_index(q)+16*sa_index(link(q))); + end; +print_int(n); +end; + +@ Here is a procedure that displays the contents of an array element +symbolically. It is used under similar circumstances as is +|restore_trace| (together with |show_eqtb|) for the quantities kept in +the |eqtb| array. + +@<Declare \eTeX\ procedures for tr...@>= +@!stat procedure show_sa(@!p:pointer;@!s:str_number); +var t:small_number; {the type of element} +begin begin_diagnostic; print_char("{"); print(s); print_char(" "); +if p=null then print_char("?") {this can't happen} +else begin t:=sa_type(p); + if t<box_val then print_cmd_chr(register,p) + else if t=box_val then + begin print_esc("box"); print_sa_num(p); + end + else if t=tok_val then print_cmd_chr(toks_register,p) + else print_char("?"); {this can't happen either} + print_char("="); + if t=int_val then print_int(sa_int(p)) + else if t=dimen_val then + begin print_scaled(sa_dim(p)); print("pt"); + end + else begin p:=sa_ptr(p); + if t=glue_val then print_spec(p,"pt") + else if t=mu_val then print_spec(p,"mu") + else if t=box_val then + if p=null then print("void") + else begin depth_threshold:=0; breadth_max:=1; show_node_list(p); + end + else if t=tok_val then + begin if p<>null then show_token_list(link(p),null,32); + end + else print_char("?"); {this can't happen either} + end; + end; +print_char("}"); end_diagnostic(false); +end; +tats + +@ Here we compute the pointer to the current mark of type |t| and mark +class |cur_val|. + +@<Compute the mark pointer...@>= +begin find_sa_element(mark_val,cur_val,false); +if cur_ptr<>null then + if odd(t) then cur_ptr:=link(cur_ptr+(t div 2)+1) + else cur_ptr:=info(cur_ptr+(t div 2)+1); +end + +@ The current marks for all mark classes are maintained by the |vsplit| +and |fire_up| routines and are finally destroyed (for \.{INITEX} only) +@.INITEX@> +by the |final_cleanup| routine. Apart from updating the current marks +when mark nodes are encountered, these routines perform certain actions +on all existing mark classes. The recursive |do_marks| procedure walks +through the whole tree or a subtree of existing mark class nodes and +preforms certain actions indicted by its first parameter |a|, the action +code. The second parameter |l| indicates the level of recursion (at +most four); the third parameter points to a nonempty tree or subtree. +The result is |true| if the complete tree or subtree has been deleted. + +@d vsplit_init==0 {action code for |vsplit| initialization} +@d fire_up_init==1 {action code for |fire_up| initialization} +@d fire_up_done==2 {action code for |fire_up| completion} +@d destroy_marks==3 {action code for |final_cleanup|} +@# +@d sa_top_mark(#)==info(#+1) {\.{\\topmarks}|n|} +@d sa_first_mark(#)==link(#+1) {\.{\\firstmarks}|n|} +@d sa_bot_mark(#)==info(#+2) {\.{\\botmarks}|n|} +@d sa_split_first_mark(#)==link(#+2) {\.{\\splitfirstmarks}|n|} +@d sa_split_bot_mark(#)==info(#+3) {\.{\\splitbotmarks}|n|} + +@<Declare the function called |do_marks|@>= +function do_marks(@!a,@!l:small_number;@!q:pointer):boolean; +var i:small_number; {a four bit index} +begin if l<4 then {|q| is an index node} + begin for i:=0 to 15 do + begin get_sa_ptr; + if cur_ptr<>null then if do_marks(a,l+1,cur_ptr) then delete_sa_ptr; + end; + if sa_used(q)=0 then + begin free_node(q,index_node_size); q:=null; + end; + end +else {|q| is the node for a mark class} + begin case a of + @<Cases for |do_marks|@>@; + end; {there are no other cases} + if sa_bot_mark(q)=null then if sa_split_bot_mark(q)=null then + begin free_node(q,mark_class_node_size); q:=null; + end; + end; +do_marks:=(q=null); +end; + +@ At the start of the |vsplit| routine the existing |split_fist_mark| +and |split_bot_mark| are discarded. + +@<Cases for |do_marks|@>= +vsplit_init: if sa_split_first_mark(q)<>null then + begin delete_token_ref(sa_split_first_mark(q)); sa_split_first_mark(q):=null; + delete_token_ref(sa_split_bot_mark(q)); sa_split_bot_mark(q):=null; + end; + +@ We use again the fact that |split_first_mark=null| if and only if +|split_bot_mark=null|. + +@<Update the current marks for |vsplit|@>= +begin find_sa_element(mark_val,mark_class(p),true); +if sa_split_first_mark(cur_ptr)=null then + begin sa_split_first_mark(cur_ptr):=mark_ptr(p); + add_token_ref(mark_ptr(p)); + end +else delete_token_ref(sa_split_bot_mark(cur_ptr)); +sa_split_bot_mark(cur_ptr):=mark_ptr(p); +add_token_ref(mark_ptr(p)); +end + +@ At the start of the |fire_up| routine the old |top_mark| and +|first_mark| are discarded, whereas the old |bot_mark| becomes the new +|top_mark|. An empty new |top_mark| token list is, however, discarded +as well in order that mark class nodes can eventually be released. We +use again the fact that |bot_mark<>null| implies |first_mark<>null|; it +also knows that |bot_mark=null| implies |top_mark=first_mark=null|. + +@<Cases for |do_marks|@>= +fire_up_init: if sa_bot_mark(q)<>null then + begin if sa_top_mark(q)<>null then delete_token_ref(sa_top_mark(q)); + delete_token_ref(sa_first_mark(q)); sa_first_mark(q):=null; + if link(sa_bot_mark(q))=null then {an empty token list} + begin delete_token_ref(sa_bot_mark(q)); sa_bot_mark(q):=null; + end + else add_token_ref(sa_bot_mark(q)); + sa_top_mark(q):=sa_bot_mark(q); + end; + +@ @<Cases for |do_marks|@>= +fire_up_done: if (sa_top_mark(q)<>null)and(sa_first_mark(q)=null) then + begin sa_first_mark(q):=sa_top_mark(q); add_token_ref(sa_top_mark(q)); + end; + +@ @<Update the current marks for |fire_up|@>= +begin find_sa_element(mark_val,mark_class(p),true); +if sa_first_mark(cur_ptr)=null then + begin sa_first_mark(cur_ptr):=mark_ptr(p); + add_token_ref(mark_ptr(p)); + end; +if sa_bot_mark(cur_ptr)<>null then delete_token_ref(sa_bot_mark(cur_ptr)); +sa_bot_mark(cur_ptr):=mark_ptr(p); add_token_ref(mark_ptr(p)); +end + +@ Here we use the fact that the five current mark pointers in a mark +class node occupy the same locations as the the first five pointers of +an index node. For systems using a run-time switch to distinguish +between \.{VIRTEX} and \.{INITEX}, the codewords `$|init|\ldots|tini|$' +surrounding the following piece of code should be removed. +@.INITEX@> +@^system dependencies@> + +@<Cases for |do_marks|@>= +@!init destroy_marks: for i:=top_mark_code to split_bot_mark_code do + begin get_sa_ptr; + if cur_ptr<>null then + begin delete_token_ref(cur_ptr); put_sa_ptr(null); + end; + end; +tini + +@ The command code |register| is used for `\.{\\count}', `\.{\\dimen}', +etc., as well as for references to sparse array elements defined by +`\.{\\countdef}', etc. + +@<Cases of |register| for |print_cmd_chr|@>= +begin if (chr_code<mem_bot)or(chr_code>lo_mem_stat_max) then + cmd:=sa_type(chr_code) +else begin cmd:=chr_code-mem_bot; chr_code:=null; + end; +if cmd=int_val then print_esc("count") +else if cmd=dimen_val then print_esc("dimen") +else if cmd=glue_val then print_esc("skip") +else print_esc("muskip"); +if chr_code<>null then print_sa_num(chr_code); +end + +@ Similarly the command code |toks_register| is used for `\.{\\toks}' as +well as for references to sparse array elements defined by +`\.{\\toksdef}'. + +@<Cases of |toks_register| for |print_cmd_chr|@>= +begin print_esc("toks"); +if chr_code<>mem_bot then print_sa_num(chr_code); +end + +@ When a shorthand definition for an element of one of the sparse arrays +is destroyed, we must reduce the reference count. + +@<Cases for |eq_destroy|@>= +toks_register,register: + if (equiv_field(w)<mem_bot)or(equiv_field(w)>lo_mem_stat_max) then + delete_sa_ref(equiv_field(w)); + +@ The task to maintain (change, save, and restore) register values is +essentially the same when the register is realized as sparse array +element or entry in |eqtb|. The global variable |sa_chain| is the head +of a linked list of entries saved at the topmost level |sa_level|; the +lists for lowel levels are kept in special save stack entries. + +@<Glob...@>= +@!sa_chain: pointer; {chain of saved sparse array entries} +@!sa_level: quarterword; {group level for |sa_chain|} + +@ @<Set init...@>= +sa_chain:=null; sa_level:=level_zero; + +@ The individual saved items are kept in pointer or word nodes similar +to those used for the array elements: a word node with value zero is, +however, saved as pointer node with the otherwise impossible |sa_index| +value |tok_val_limit|. + +@d sa_loc==sa_ref {location of saved item} + +@<Declare \eTeX\ procedures for tr...@>= +procedure sa_save(@!p:pointer); {saves value of |p|} +var q:pointer; {the new save node} +@!i:quarterword; {index field of node} +begin if cur_level<>sa_level then + begin check_full_save_stack; save_type(save_ptr):=restore_sa; + save_level(save_ptr):=sa_level; save_index(save_ptr):=sa_chain; + incr(save_ptr); sa_chain:=null; sa_level:=cur_level; + end; +i:=sa_index(p); +if i<dimen_val_limit then + begin if sa_int(p)=0 then + begin q:=get_node(pointer_node_size); i:=tok_val_limit; + end + else begin q:=get_node(word_node_size); sa_int(q):=sa_int(p); + end; + sa_ptr(q):=null; + end +else begin q:=get_node(pointer_node_size); sa_ptr(q):=sa_ptr(p); + end; +sa_loc(q):=p; sa_index(q):=i; sa_lev(q):=sa_lev(p); +link(q):=sa_chain; sa_chain:=q; add_sa_ref(p); +end; + +@ @<Declare \eTeX\ procedures for tr...@>= +procedure sa_destroy(@!p:pointer); {destroy value of |p|} +begin if sa_index(p)<mu_val_limit then delete_glue_ref(sa_ptr(p)) +else if sa_ptr(p)<>null then + if sa_index(p)<box_val_limit then flush_node_list(sa_ptr(p)) + else delete_token_ref(sa_ptr(p)); +end; + +@ The procedure |sa_def| assigns a new value to sparse array elements, +and saves the former value if appropriate. This procedure is used only +for skip, muskip, box, and token list registers. The counterpart of +|sa_def| for count and dimen registers is called |sa_w_def|. + +@d sa_define(#)==if e then + if global then gsa_def(#)@+else sa_def(#) + else define +@# +@d sa_def_box== {assign |cur_box| to |box(cur_val)|} + begin find_sa_element(box_val,cur_val,true); + if global then gsa_def(cur_ptr,cur_box)@+else sa_def(cur_ptr,cur_box); + end +@# +@d sa_word_define(#)==if e then + if global then gsa_w_def(#)@+else sa_w_def(#) + else word_define(#) + +@<Declare \eTeX\ procedures for tr...@>= +procedure sa_def(@!p:pointer;@!e:halfword); + {new data for sparse array elements} +begin add_sa_ref(p); +if sa_ptr(p)=e then + begin @!stat if tracing_assigns>0 then show_sa(p,"reassigning");@+tats@;@/ + sa_destroy(p); + end +else begin @!stat if tracing_assigns>0 then show_sa(p,"changing");@+tats@;@/ + if sa_lev(p)=cur_level then sa_destroy(p)@+else sa_save(p); + sa_lev(p):=cur_level; sa_ptr(p):=e; + @!stat if tracing_assigns>0 then show_sa(p,"into");@+tats@;@/ + end; +delete_sa_ref(p); +end; +@# +procedure sa_w_def(@!p:pointer;@!w:integer); +begin add_sa_ref(p); +if sa_int(p)=w then + begin @!stat if tracing_assigns>0 then show_sa(p,"reassigning");@+tats@;@/ + end +else begin @!stat if tracing_assigns>0 then show_sa(p,"changing");@+tats@;@/ + if sa_lev(p)<>cur_level then sa_save(p); + sa_lev(p):=cur_level; sa_int(p):=w; + @!stat if tracing_assigns>0 then show_sa(p,"into");@+tats@;@/ + end; +delete_sa_ref(p); +end; + +@ The |sa_def| and |sa_w_def| routines take care of local definitions. +@^global definitions@> +Global definitions are done in almost the same way, but there is no need +to save old values, and the new value is associated with |level_one|. + +@<Declare \eTeX\ procedures for tr...@>= +procedure gsa_def(@!p:pointer;@!e:halfword); {global |sa_def|} +begin add_sa_ref(p); +@!stat if tracing_assigns>0 then show_sa(p,"globally changing");@+tats@;@/ +sa_destroy(p); sa_lev(p):=level_one; sa_ptr(p):=e; +@!stat if tracing_assigns>0 then show_sa(p,"into");@+tats@;@/ +delete_sa_ref(p); +end; +@# +procedure gsa_w_def(@!p:pointer;@!w:integer); {global |sa_w_def|} +begin add_sa_ref(p); +@!stat if tracing_assigns>0 then show_sa(p,"globally changing");@+tats@;@/ +sa_lev(p):=level_one; sa_int(p):=w; +@!stat if tracing_assigns>0 then show_sa(p,"into");@+tats@;@/ +delete_sa_ref(p); +end; + +@ The |sa_restore| procedure restores the sparse array entries pointed +at by |sa_chain| + +@<Declare \eTeX\ procedures for tr...@>= +procedure sa_restore; +var p:pointer; {sparse array element} +begin repeat p:=sa_loc(sa_chain); +if sa_lev(p)=level_one then + begin if sa_index(p)>=dimen_val_limit then sa_destroy(sa_chain); + @!stat if tracing_restores>0 then show_sa(p,"retaining");@+tats@;@/ + end +else begin if sa_index(p)<dimen_val_limit then + if sa_index(sa_chain)<dimen_val_limit then sa_int(p):=sa_int(sa_chain) + else sa_int(p):=0 + else begin sa_destroy(p); sa_ptr(p):=sa_ptr(sa_chain); + end; + sa_lev(p):=sa_lev(sa_chain); + @!stat if tracing_restores>0 then show_sa(p,"restoring");@+tats@;@/ + end; +delete_sa_ref(p); +p:=sa_chain; sa_chain:=link(p); +if sa_index(p)<dimen_val_limit then free_node(p,word_node_size) +else free_node(p,pointer_node_size); +until sa_chain=null; +end; + +@ When the value of |last_line_fit| is positive, the last line of a +(partial) paragraph is treated in a special way and we need additional +fields in the active nodes. + +@d active_node_size_extended=5 {number of words in extended active nodes} +@d active_short(#)==mem[#+3].sc {|shortfall| of this line} +@d active_glue(#)==mem[#+4].sc {corresponding glue stretch or shrink} + +@<Glob...@>= +@!last_line_fill:pointer; {the |par_fill_skip| glue node of the new paragraph} +@!do_last_line_fit:boolean; {special algorithm for last line of paragraph?} +@!active_node_size:small_number; {number of words in active nodes} +@!fill_width:array[0..2] of scaled; {infinite stretch components of + |par_fill_skip|} +@!best_pl_short:array[very_loose_fit..tight_fit] of scaled; {|shortfall| + corresponding to |minimal_demerits|} +@!best_pl_glue:array[very_loose_fit..tight_fit] of scaled; {corresponding + glue stretch or shrink} + +@ The new algorithm for the last line requires that the stretchability +|par_fill_skip| is infinite and the stretchability of |left_skip| plus +|right_skip| is finite. + +@<Check for special...@>= +do_last_line_fit:=false; active_node_size:=active_node_size_normal; + {just in case} +if last_line_fit>0 then + begin q:=glue_ptr(last_line_fill); + if (stretch(q)>0)and(stretch_order(q)>normal) then + if (background[3]=0)and(background[4]=0)and(background[5]=0) then + begin do_last_line_fit:=true; + active_node_size:=active_node_size_extended; + fill_width[0]:=0; fill_width[1]:=0; fill_width[2]:=0; + fill_width[stretch_order(q)-1]:=stretch(q); + end; + end + +@ @<Other local variables for |try_break|@>= +@!g:scaled; {glue stretch or shrink of test line, adjustment for last line} + +@ Here we initialize the additional fields of the first active node +representing the beginning of the paragraph. + +@<Initialize additional fields of the first active node@>= +begin active_short(q):=0; active_glue(q):=0; +end + +@ Here we compute the adjustment |g| and badness |b| for a line from |r| +to the end of the paragraph. When any of the criteria for adjustment is +violated we fall through to the normal algorithm. + +The last line must be too short, and have infinite stretch entirely due +to |par_fill_skip|. + +@<Perform computations for last line and |goto found|@>= +begin if (active_short(r)=0)or(active_glue(r)<=0) then goto not_found; + {previous line was neither stretched nor shrunk, or was infinitely bad} +if (cur_active_width[3]<>fill_width[0])or@| + (cur_active_width[4]<>fill_width[1])or@| + (cur_active_width[5]<>fill_width[2]) then goto not_found; + {infinite stretch of this line not entirely due to |par_fill_skip|} +if active_short(r)>0 then g:=cur_active_width[2] +else g:=cur_active_width[6]; +if g<=0 then goto not_found; {no finite stretch resp.\ no shrink} +arith_error:=false; g:=fract(g,active_short(r),active_glue(r),max_dimen); +if last_line_fit<1000 then g:=fract(g,last_line_fit,1000,max_dimen); +if arith_error then + if active_short(r)>0 then g:=max_dimen@+else g:=-max_dimen; +if g>0 then + @<Set the value of |b| to the badness of the last line for stretching, + compute the corresponding |fit_class, and |goto found||@> +else if g<0 then + @<Set the value of |b| to the badness of the last line for shrinking, + compute the corresponding |fit_class, and |goto found||@>; +not_found:end + +@ These badness computations are rather similar to those of the standard +algorithm, with the adjustment amount |g| replacing the |shortfall|. + +@<Set the value of |b| to the badness of the last line for str...@>= +begin if g>shortfall then g:=shortfall; +if g>7230584 then if cur_active_width[2]<1663497 then + begin b:=inf_bad; fit_class:=very_loose_fit; goto found; + end; +b:=badness(g,cur_active_width[2]); +if b>12 then + if b>99 then fit_class:=very_loose_fit + else fit_class:=loose_fit +else fit_class:=decent_fit; +goto found; +end + +@ @<Set the value of |b| to the badness of the last line for shr...@>= +begin if -g>cur_active_width[6] then g:=-cur_active_width[6]; +b:=badness(-g,cur_active_width[6]); +if b>12 then fit_class:=tight_fit@+else fit_class:=decent_fit; +goto found; +end + +@ Vanishing values of |shortfall| and |g| indicate that the last line is +not adjusted. + +@<Adjust \(t)the additional data for last line@>= +begin if cur_p=null then shortfall:=0; +if shortfall>0 then g:=cur_active_width[2] +else if shortfall<0 then g:=cur_active_width[6] +else g:=0; +end + +@ For each feasible break we record the shortfall and glue stretch or +shrink (or adjustment). + +@<Store \(a)additional data for this feasible break@>= +begin best_pl_short[fit_class]:=shortfall; best_pl_glue[fit_class]:=g; +end + +@ Here we save these data in the active node representing a potential +line break. + +@<Store \(a)additional data in the new active node@>= +begin active_short(q):=best_pl_short[fit_class]; +active_glue(q):=best_pl_glue[fit_class]; +end + +@ @<Print additional data in the new active node@>= +begin print(" s="); print_scaled(active_short(q)); +if cur_p=null then print(" a=")@+else print(" g="); +print_scaled(active_glue(q)); +end + +@ Here we either reset |do_last_line_fit| or adjust the |par_fill_skip| +glue. + +@<Adjust \(t)the final line of the paragraph@>= +if active_short(best_bet)=0 then do_last_line_fit:=false +else begin q:=new_spec(glue_ptr(last_line_fill)); + delete_glue_ref(glue_ptr(last_line_fill)); + width(q):=width(q)+active_short(best_bet)-active_glue(best_bet); + stretch(q):=0; glue_ptr(last_line_fill):=q; + end + +@ When reading \.{\\patterns} while \.{\\savinghyphcodes} is positive +the current |lc_code| values are stored together with the hyphenation +patterns for the current language. They will later be used instead of +the |lc_code| values for hyphenation purposes. + +The |lc_code| values are stored in the linked trie analogous to patterns +$p_1$ of length~1, with |hyph_root=trie_r[0]| replacing |trie_root| and +|lc_code(p_1)| replacing the |trie_op| code. This allows to compress +and pack them together with the patterns with minimal changes to the +existing code. + +@d hyph_root==trie_r[0] {root of the linked trie for |hyph_codes|} + +@<Initialize table entries...@>= +hyph_root:=0; hyph_start:=0; + +@ @<Store hyphenation codes for current language@>= +begin c:=cur_lang; first_child:=false; p:=0; +repeat q:=p; p:=trie_r[q]; +until (p=0)or(c<=so(trie_c[p])); +if (p=0)or(c<so(trie_c[p])) then + @<Insert a new trie node between |q| and |p|, and + make |p| point to it@>; +q:=p; {now node |q| represents |cur_lang|} +@<Store all current |lc_code| values@>; +end + +@ We store all nonzero |lc_code| values, overwriting any previously +stored values (and possibly wasting a few trie nodes that were used +previously and are not needed now). We always store at least one +|lc_code| value such that |hyph_index| (defined below) will not be zero. + +@<Store all current |lc_code| values@>= +p:=trie_l[q]; first_child:=true; +for c:=0 to 255 do + if (lc_code(c)>0)or((c=255)and first_child) then + begin if p=0 then + @<Insert a new trie node between |q| and |p|, and + make |p| point to it@> + else trie_c[p]:=si(c); + trie_o[p]:=qi(lc_code(c)); + q:=p; p:=trie_r[q]; first_child:=false; + end; +if first_child then trie_l[q]:=0@+else trie_r[q]:=0 + +@ We must avoid to ``take'' location~1, in order to distinguish between +|lc_code| values and patterns. + +@<Pack all stored |hyph_codes|@>= +begin if trie_root=0 then for p:=0 to 255 do trie_min[p]:=p+2; +first_fit(hyph_root); trie_pack(hyph_root); +hyph_start:=trie_ref[hyph_root]; +end + +@ The global variable |hyph_index| will point to the hyphenation codes +for the current language. + +@d set_hyph_index== {set |hyph_index| for current language} + if trie_char(hyph_start+cur_lang)<>qi(cur_lang) + then hyph_index:=0 {no hyphenation codes for |cur_lang|} + else hyph_index:=trie_link(hyph_start+cur_lang) +@# +@d set_lc_code(#)== {set |hc[0]| to hyphenation or lc code for |#|} + if hyph_index=0 then hc[0]:=lc_code(#) + else if trie_char(hyph_index+#)<>qi(#) then hc[0]:=0 + else hc[0]:=qo(trie_op(hyph_index+#)) + +@<Glob...@>= +@!hyph_start:trie_pointer; {root of the packed trie for |hyph_codes|} +@!hyph_index:trie_pointer; {pointer to hyphenation codes for |cur_lang|} + +@ When |saving_vdiscards| is positive then the glue, kern, and penalty +nodes removed by the page builder or by \.{\\vsplit} from the top of a +vertical list are saved in special lists instead of being discarded. + +@d tail_page_disc==disc_ptr[copy_code] {last item removed by page builder} +@d page_disc==disc_ptr[last_box_code] {first item removed by page builder} +@d split_disc==disc_ptr[vsplit_code] {first item removed by \.{\\vsplit}} + +@<Glob...@>= +@!disc_ptr:array[copy_code..vsplit_code] of pointer; {list pointers} + +@ @<Set init...@>= +page_disc:=null; split_disc:=null; + +@ The \.{\\pagediscards} and \.{\\splitdiscards} commands share the +command code |un_vbox| with \.{\\unvbox} and \.{\\unvcopy}, they are +distinguished by their |chr_code| values |last_box_code| and +|vsplit_code|. These |chr_code| values are larger than |box_code| and +|copy_code|. + +@<Generate all \eTeX...@>= +primitive("pagediscards",un_vbox,last_box_code);@/ +@!@:page_discards_}{\.{\\pagediscards} primitive@> +primitive("splitdiscards",un_vbox,vsplit_code);@/ +@!@:split_discards_}{\.{\\splitdiscards} primitive@> + +@ @<Cases of |un_vbox| for |print_cmd_chr|@>= +else if chr_code=last_box_code then print_esc("pagediscards") +else if chr_code=vsplit_code then print_esc("splitdiscards") + +@ @<Handle saved items and |goto done|@>= +begin link(tail):=disc_ptr[cur_chr]; disc_ptr[cur_chr]:=null; +goto done; +end + +@ The \.{\\interlinepenalties}, \.{\\clubpenalties}, \.{\\widowpenalties}, +and \.{\\displaywidowpenalties} commands allow to define arrays of +penalty values to be used instead of the corresponding single values. + +@d inter_line_penalties_ptr==equiv(inter_line_penalties_loc) +@d club_penalties_ptr==equiv(club_penalties_loc) +@d widow_penalties_ptr==equiv(widow_penalties_loc) +@d display_widow_penalties_ptr==equiv(display_widow_penalties_loc) + +@<Generate all \eTeX...@>= +primitive("interlinepenalties",set_shape,inter_line_penalties_loc);@/ +@!@:inter_line_penalties_}{\.{\\interlinepenalties} primitive@> +primitive("clubpenalties",set_shape,club_penalties_loc);@/ +@!@:club_penalties_}{\.{\\clubpenalties} primitive@> +primitive("widowpenalties",set_shape,widow_penalties_loc);@/ +@!@:widow_penalties_}{\.{\\widowpenalties} primitive@> +primitive("displaywidowpenalties",set_shape,display_widow_penalties_loc);@/ +@!@:display_widow_penalties_}{\.{\\displaywidowpenalties} primitive@> + +@ @<Cases of |set_shape| for |print_cmd_chr|@>= +inter_line_penalties_loc: print_esc("interlinepenalties"); +club_penalties_loc: print_esc("clubpenalties"); +widow_penalties_loc: print_esc("widowpenalties"); +display_widow_penalties_loc: print_esc("displaywidowpenalties"); + +@ @<Fetch a penalties array element@>= +begin scan_int; +if (equiv(m)=null)or(cur_val<0) then cur_val:=0 +else begin if cur_val>penalty(equiv(m)) then cur_val:=penalty(equiv(m)); + cur_val:=penalty(equiv(m)+cur_val); + end; +end + +@* \[54] System-dependent changes. +@z +%--------------------------------------- diff --git a/Build/source/texk/web2c/etexdir/etex.fix b/Build/source/texk/web2c/etexdir/etex.fix new file mode 100644 index 00000000000..0dff442eb83 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etex.fix @@ -0,0 +1,2 @@ +% Late-breaking fixes for e-TeX. +% Public domain. diff --git a/Build/source/texk/web2c/etexdir/etex.mak b/Build/source/texk/web2c/etexdir/etex.mak new file mode 100644 index 00000000000..4f3cea32f41 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etex.mak @@ -0,0 +1,242 @@ +################################################################################ +# +# Makefile : eTeX, web2c win32.mak makefile fragment to build e-TeX +# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr> +# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources +# Time-stamp: <04/03/20 16:41:06 popineau> +# +################################################################################ + +etexver = + +# We build etex. +etex = $(objdir)\etex.exe +!ifdef TEX_DLL +etex = $(etex) $(objdir)\$(library_prefix)etex.dll +!endif + +# The C sources. +etex_c = etex.c +etex_o = $(objdir)\etex.obj + +!ifdef TEX_DLL +$(objdir)\$(library_prefix)etex.exp: $(objdir)\$(library_prefix)etex.lib + +$(objdir)\$(library_prefix)etex.lib: $(etex_o) + $(archive) /DEF $(etex_o) + +$(objdir)\$(library_prefix)etex.dll: $(etex_o) $(objdir)\$(library_prefix)etex.exp $(objdir)\etex.res $(kpathsealib) $(proglib) + $(link_dll) $(**) $(socketlibs) $(conlibs) + +$(objdir)\etex.exe: $(objdir)\win32main.obj $(objdir)\$(library_prefix)etex.lib $(proglib) + $(link) $(**) $(conlibs) +!else +$(objdir)\etex.exe: $(etex_o) $(objdir)\win32main.obj $(objdir)\etex.res $(kpathsealib) $(proglib) + $(link) $(**) $(conlibs) +!endif + +# C file dependencies +$(etex_c) etexcoerce.h etexd.h: etex.p $(web2c_texmf) + $(web2c) etex + +# Tangling +etex.p etex.pool: etex.web etex.ch + .\$(objdir)\tangle etex.web etex.ch + +# Generation of the web and ch file. +etex.web: $(objdir)\tie.exe tex.web etexdir/etex.ch0 etexdir/etex.ch etexdir/etex.fix etexdir/etex.ch1 + .\$(objdir)\tie -m etex.web \ + tex.web \ + etexdir/etex.ch0 \ + etexdir/etex.ch \ + etexdir/etex.fix \ + etexdir/etex.ch1 + +etex.ch: $(objdir)\tie.exe etex.web etexdir/tex.ch0 tex.ch tex-supp-w32.ch etexdir/tex.ch1 etexdir/tex.ech etexdir/tex.ch2 + .\$(objdir)\tie -c etex.ch etex.web \ + etexdir/tex.ch0 \ + tex.ch \ + tex-supp-w32.ch \ + etexdir/tex.ch1 \ + etexdir/tex.ech \ + etexdir/tex.ch2 + +# Tests... +check: etex-check +etex-check: etrip etex.efmt +# Test truncation (but don't bother showing the warning msg). + .\$(objdir)\etex --progname=etex --output-comment="$(outcom)" \ + $(srcdir)/tests/hello \ + && .\$(objdir)\dvitype hello.dvi | grep olaf@infovore.xs4all.nl >nul +# \openout should show up in \write's. + .\$(objdir)\etex --progname=etex $(srcdir)/tests/openout && grep xfoo openout.log +# one.two.tex -> one.two.log + .\$(objdir)\etex --progname=etex $(srcdir)/tests/one.two && dir /w one.two.log +# uno.dos -> uno.log + .\$(objdir)\etex --progname=etex $(srcdir)/tests/uno.dos && dir /w uno.log + .\$(objdir)\etex --progname=etex $(srcdir)/tests/just.texi && dir /w just.log + -.\$(objdir)\etex --progname=etex $(srcdir)/tests/batch.tex + .\$(objdir)\etex --progname=etex --shell $(srcdir)/tests/write18 | grep echo +# tcx files are a bad idea. +# .\$(objdir)\etex --translate-file=$(srcdir)/share/isol1-t1.tcx \ +# $(srcdir)/tests/eight && ./dvitype eight.dvi >eigh.typ + .\$(objdir)\etex --mltex --progname=einitex $(srcdir)/tests/mltextst + -.\$(objdir)\etex --progname=etex <nul +# -PATH=$(kpathsea_dir):$$PATH .\$(objdir)\etex '\nonstopmode\font\foo=nonesuch\end' + set PATH=$(kpathsea_dir);$(kpathsea_srcdir);$(PATH) + set WEB2C=$(kpathsea_srcdir) + set TMPDIR=.. + -.\$(objdir)\etex --progname=etex "\nonstopmode\font\foo=nonesuch\end" + + +# Cleaning up. +clean:: etex-clean +etex-clean: etrip-clean +# $(LIBTOOL) --mode=clean $(RM) etex + -@echo $(verbose) & ( \ + for %%i in ($(etex_o) $(etex_c) etexextra.c etexcoerce.h etexd.h \ + etex.p etex.pool etex.web etex.ch \ + etex.efmt etex.log \ + hello.dvi hello.log xfoo.out openout.log one.two.log uno.log \ + just.log batch.log write18.log mltextst.log texput.log \ + missfont.log) do $(del) %%i $(redir_stderr) \ + ) + -@$(deldir) tfm $(redir_stderr) + +#etrip +etestdir = $(srcdir)\etexdir\etrip + +etrip: $(objdir)\pltotf.exe $(objdir)\tftopl.exe $(objdir)\etex.exe $(objdir)\dvitype.exe etrip-clean + @echo ">>> See $(etestdir)\etrip.diffs for example of acceptable diffs." + @echo "*** TRIP test for e-TeX in compatibility mode ***." + .\$(objdir)\pltotf $(testdir)\trip.pl trip.tfm + .\$(objdir)\tftopl .\trip.tfm trip.pl + -$(diff) $(testdir)\trip.pl trip.pl + -$(del) \f trip.tex & $(copy) $(testdir)\trip.tex . # get same filename in log +# FIXME: this works only written on 2 lines !!! + set TEXMFCNFOLD=$(TEXMFCNF) + set TEXMFCNF=$(etestdir) + -.\$(objdir)\etex --progname=einitex <$(testdir)\trip1.in >ctripin.fot + $(copy) trip.log ctripin.log & $(del) trip.log + -$(diff) $(testdir)\tripin.log ctripin.log + -.\$(objdir)\etex <$(testdir)\trip2.in >ctrip.fot + $(copy) trip.log ctrip.log & $(del) trip.log + -$(diff) $(testdir)\trip.fot ctrip.fot + -$(diff) $(diffflags) $(testdir)\trip.log ctrip.log + .\$(objdir)\dvitype $(dvitype_args) trip.dvi >ctrip.typ + -$(diff) $(diffflags) $(testdir)\trip.typ ctrip.typ + @echo "*** TRIP test for e-TeX in extended mode ***." + -.\$(objdir)\etex -progname=einitex <$(etestdir)\etrip1.in >xtripin.fot + $(copy) trip.log xtripin.log & $(del) trip.log + -$(diff) ctripin.log xtripin.log + -.\$(objdir)\etex <$(etestdir)\trip2.in >xtrip.fot + $(copy) trip.log xtrip.log & $(del) trip.log + -$(diff) ctrip.fot xtrip.fot + -$(diff) $(diffflags) ctrip.log xtrip.log + .\$(objdir)\dvitype $(dvitype_args) trip.dvi >xtrip.typ + -$(diff) $(diffflags) ctrip.typ xtrip.typ + @echo "*** e-TeX specific part of e-TRIP test ***." + .\$(objdir)\pltotf $(etestdir)\etrip.pl etrip.tfm + .\$(objdir)\tftopl .\etrip.tfm etrip.pl + -$(diff) $(etestdir)\etrip.pl etrip.pl +# get same filename in log + -$(del) \f etrip.tex & $(copy) $(etestdir:/=\)\etrip.tex . + -.\$(objdir)\etex --progname=einitex <$(etestdir)\etrip2.in >etripin.fot + $(copy) etrip.log etripin.log & $(del) etrip.log + -$(diff) $(etestdir)\etripin.log etripin.log + -.\$(objdir)\etex <$(etestdir)\etrip3.in >etrip.fot + -$(diff) $(etestdir)\etrip.fot etrip.fot + -$(diff) $(diffflags) $(etestdir)\etrip.log etrip.log + set TEXMFCNF=$(TEXMFCNFOLD) + +# Cleaning up for the etrip. +etrip-clean: + -@echo $(verbose) & ( \ + for %%i in (trip.tfm trip.pl trip.tex trip.efmt ctripin.fot ctripin.log \ + ctrip.fot ctrip.log trip.dvi ctrip.typ \ + xtripin.fot xtripin.log \ + xtrip.fot xtrip.log xtrip.typ \ + etrip.tfm etrip.pl etrip.tex etrip.efmt etripin.fot etripin.log \ + etrip.fot etrip.log etrip.dvi etrip.out etrip.typ \ + tripos.tex 8terminal.tex) do $(del) %%i $(redir_stderr) \ + ) + -@$(deldir) tfm $(redir_stderr) + +# Distfiles ... +# triptrapdiffs: etexdir\etrip\etrip.diffs +# etexdir\etrip\etrip.diffs: etex +# $(make) etrip | tail +1 >etexdir\etrip\etrip.diffs + +# Dumps +# all_efmts = etex.efmt $(efmts) +# +# dumps: efmts +# efmts: $(all_efmts) +# +# etex.efmt: $(etex) +# $(dumpenv) $(make) progname=etex files="etex.src plain.tex cmr10.tfm" prereq-check +# $(dumpenv) .\$(objdir)\etex --progname=etex --jobname=etex --ini "*\input etex.src \dump" < nul +# +# elatex.efmt: $(etex) +# $(dumpenv) $(make) progname=elatex files="latex.ltx" prereq-check +# $(dumpenv) .\$(objdir)\etex --progname=elatex --jobname=elatex --ini "*\input latex.ltx" < nul +# +# latex.efmt: $(etex) +# $(dumpenv) $(make) progname=latex files="latex.ltx" prereq-check +# $(dumpenv) .\$(objdir)\etex --progname=latex --jobname=latex --ini "*\input latex.ltx" < nul +# +# tex.efmt: $(etex) +# $(dumpenv) $(make) progname=tex files="plain.tex cmr10.tfm" prereq-check +# $(dumpenv) .\$(objdir)\etex --progname=tex --jobname=tex --ini "\input plain \dump" < nul +# +# olatex.efmt: $(etex) +# $(dumpenv) $(make) progname=olatex files="latex.ltx" prereq-check +# $(dumpenv) .\$(objdir)\etex --progname=olatex --progname=olatex --ini "\input latex.ltx" < nul + +# Install +install-etex: install-etex-exec install-etex-data +install-etex-exec: install-etex-links +# install-etex-data: install-etex-dumps +install-etex-dumps: install-etex-fmts + +install-programs: install-etex-programs +install-etex-programs: $(etex) $(bindir) + -@echo $(verbose) & ( \ + for %%p in ($(etex)) do $(copy) %%p $(bindir) \ + ) $(redir_stdout) + +# install-links: install-etex-links +install-etex-links: install-etex-programs +# -@echo $(verbose) & ( \ +# pushd $(bindir) & \ +# $(del) .\einitex.exe .\evirtex.exe & \ +# $(lnexe) .\etex.exe $(bindir)\einitex.exe & \ +# $(lnexe) .\etex.exe $(bindir)\evirtex.exe & \ +# popd \ +# ) $(redir_stdout) + -@echo $(verbose) & ( \ + if NOT "$(efmts)"=="" \ + for %%i in ($(efmts)) do \ + pushd $(bindir) & \ + $(del) .\%%~ni.exe & \ + $(lnexe) .\etex.exe $(bindir)\%%~ni.exe & \ + popd \ + ) $(redir_stdout) + +# install-fmts: install-etex-fmts +install-etex-fmts: efmts $(fmtdir) + -@echo $(verbose) & ( \ + for %%f in ($(all_efmts)) \ + do $(copy) %%f $(fmtdir)\%%f \ + ) $(redir_stdout) + +install-data:: install-etex-data +install-etex-data: $(texpooldir) + @$(copy) etex.pool $(texpooldir)\etex.pool $(redir_stdout) + +# End of etex.mk. +# +# Local variables: +# page-delimiter: "" +# mode: Makefile +# End: diff --git a/Build/source/texk/web2c/etexdir/etex.mk b/Build/source/texk/web2c/etexdir/etex.mk new file mode 100644 index 00000000000..592094f7ff8 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etex.mk @@ -0,0 +1,213 @@ +# Makefile fragment for e-TeX and web2c. --infovore@xs4all.nl. Public domain. +# This fragment contains the parts of the makefile that are most likely to +# differ between releases of e-TeX. + +Makefile: etexdir/etex.mk + +# We build etex. +etex = @ETEX@ etex + +# Extract etex version +etexdir/etex.version: etexdir/etex.ch + grep '^@d eTeX_version_string==' $(srcdir)/etexdir/etex.ch \ + | sed "s/^.*'-//;s/'.*$$//" >etexdir/etex.version + +# The C sources. +etex_c = etexini.c etex0.c etex1.c etex2.c +etex_o = etexini.o etex0.o etex1.o etex2.o etexextra.o + +# Making etex. +etex: $(etex_o) + $(kpathsea_link) $(etex_o) $(socketlibs) $(LOADLIBES) + +# C file dependencies +$(etex_c) etexcoerce.h etexd.h: etex.p $(web2c_texmf) + $(web2c) etex +etexextra.c: etexdir/etexextra.h lib/texmfmp.c + sed s/TEX-OR-MF-OR-MP/etex/ $(srcdir)/lib/texmfmp.c >$@ +etexdir/etexextra.h: etexdir/etexextra.in etexdir/etex.version + test -d etexdir || mkdir etexdir + sed s/ETEX-VERSION/`cat etexdir/etex.version`/ \ + $(srcdir)/etexdir/etexextra.in >$@ + +# Tangling +etex.p etex.pool: tangle etex.web etex.ch + $(TANGLE) etex.web etex.ch + +# Generation of the web and ch file. +# Sources for etex.web: +etex_web_srcs = $(srcdir)/tex.web \ + $(srcdir)/etexdir/etex.ch \ + $(srcdir)/etexdir/etex.fix +# Sources for etex.ch: +etex_ch_srcs = etex.web \ + $(srcdir)/etexdir/tex.ch0 \ + $(srcdir)/tex.ch \ + $(srcdir)/etexdir/tex.ch1 \ + $(srcdir)/etexdir/tex.ech +# Rules: +etex.web: tie etexdir/etex.mk $(etex_web_srcs) + $(TIE) -m etex.web $(etex_web_srcs) +etex.ch: $(etex_ch_srcs) + $(TIE) -c etex.ch $(etex_ch_srcs) + +# Tests... +check: @ETEX@ etex-check +etex-check: etrip etex.fmt +# Test truncation (but don't bother showing the warning msg). + ./etex --progname=etex --output-comment="`cat $(srcdir)/PROJECTS`" \ + $(srcdir)/tests/hello 2>/dev/null \ + && ./dvitype hello.dvi | grep olaf@infovore.xs4all.nl >/dev/null +# \openout should show up in \write's. + ./etex --progname=etex $(srcdir)/tests/openout && grep xfoo openout.log +# one.two.tex -> one.two.log + ./etex --progname=etex $(srcdir)/tests/one.two && ls -l one.two.log +# uno.dos -> uno.log + ./etex --progname=etex $(srcdir)/tests/uno.dos && ls -l uno.log + ./etex --progname=etex $(srcdir)/tests/just.texi && ls -l just.log + -./etex --progname=etex $(srcdir)/tests/batch.tex + ./etex --progname=etex --shell $(srcdir)/tests/write18 | grep echo +# tcx files are a bad idea. +# ./etex --translate-file=$(srcdir)/share/isol1-t1.tcx \ +# $(srcdir)/tests/eight && ./dvitype eight.dvi >eigh.typ + TEXMFCNF=../kpathsea \ + ./etex --mltex --progname=einitex $(srcdir)/tests/mltextst + -./etex --progname=etex </dev/null + -PATH=`pwd`:$(kpathsea_dir):$(kpathsea_srcdir):$$PATH \ + WEB2C=$(kpathsea_srcdir) TMPDIR=.. \ + ./etex --progname=etex '\nonstopmode\font\foo=nonesuch\end' + +# Cleaning up. +clean:: etex-clean +etex-clean: etrip-clean + $(LIBTOOL) --mode=clean $(RM) etex + rm -f $(etex_o) $(etex_c) etexextra.c etexcoerce.h etexd.h + rm -f etexdir/etexextra.h etexdir/etex.version + rm -f etex.p etex.pool etex.web etex.ch + rm -f etex.fmt etex.log + rm -f hello.dvi hello.log xfoo.out openout.log one.two.log uno.log + rm -f just.log batch.log write18.log mltextst.log texput.log + rm -f missfont.log + rm -rf tfm + +# etrip +etestdir = $(srcdir)/etexdir/etrip +etestenv = TEXMFCNF=$(etestdir) + +triptrap: @ETEX@ etrip +etrip: pltotf tftopl etex dvitype etrip-clean + @echo ">>> See $(etestdir)/etrip.diffs for example of acceptable diffs." >&2 + @echo "*** TRIP test for e-TeX in compatibility mode ***." + ./pltotf $(testdir)/trip.pl trip.tfm + ./tftopl ./trip.tfm trip.pl + -diff $(testdir)/trip.pl trip.pl + $(LN) $(testdir)/trip.tex . # get same filename in log + -$(SHELL) -c '$(etestenv) ./etex --progname=einitex --ini <$(testdir)/trip1.in >ctripin.fot' + mv trip.log ctripin.log + -diff $(testdir)/tripin.log ctripin.log + -$(SHELL) -c '$(etestenv) ./etex --progname=etex <$(testdir)/trip2.in >ctrip.fot' + mv trip.log ctrip.log + -diff $(testdir)/trip.fot ctrip.fot + -$(DIFF) $(DIFFFLAGS) $(testdir)/trip.log ctrip.log + $(SHELL) -c '$(etestenv) ./dvitype $(dvitype_args) trip.dvi >ctrip.typ' + -$(DIFF) $(DIFFFLAGS) $(testdir)/trip.typ ctrip.typ + @echo "*** TRIP test for e-TeX in extended mode ***." + -$(SHELL) -c '$(etestenv) ./etex --progname=einitex --ini <$(etestdir)/etrip1.in >xtripin.fot' + mv trip.log xtripin.log + -diff ctripin.log xtripin.log + -$(SHELL) -c '$(etestenv) ./etex --progname=etex <$(etestdir)/trip2.in >xtrip.fot' + mv trip.log xtrip.log + -diff ctrip.fot xtrip.fot + -$(DIFF) $(DIFFFLAGS) ctrip.log xtrip.log + $(SHELL) -c '$(etestenv) ./dvitype $(dvitype_args) trip.dvi >xtrip.typ' + -$(DIFF) $(DIFFFLAGS) ctrip.typ xtrip.typ + @echo "*** e-TeX specific part of e-TRIP test ***." + ./pltotf $(etestdir)/etrip.pl etrip.tfm + ./tftopl ./etrip.tfm etrip.pl + -diff $(etestdir)/etrip.pl etrip.pl + $(LN) $(etestdir)/etrip.tex . # get same filename in log + -$(SHELL) -c '$(etestenv) ./etex --progname=einitex --ini <$(etestdir)/etrip2.in >etripin.fot' + mv etrip.log etripin.log + -diff $(etestdir)/etripin.log etripin.log + -$(SHELL) -c '$(etestenv) ./etex --progname=etex <$(etestdir)/etrip3.in >etrip.fot' + -diff $(etestdir)/etrip.fot etrip.fot + -$(DIFF) $(DIFFFLAGS) $(etestdir)/etrip.log etrip.log + diff $(etestdir)/etrip.out etrip.out + $(SHELL) -c '$(etestenv) ./dvitype $(dvitype_args) etrip.dvi >etrip.typ' + -$(DIFF) $(DIFFFLAGS) $(etestdir)/etrip.typ etrip.typ + +# Cleaning up for the etrip. +etrip-clean: + rm -f trip.tfm trip.pl trip.tex trip.fmt ctripin.fot ctripin.log + rm -f ctrip.fot ctrip.log trip.dvi ctrip.typ + rm -f xtripin.fot xtripin.log + rm -f xtrip.fot xtrip.log xtrip.typ + rm -f etrip.tfm etrip.pl etrip.tex etrip.fmt etripin.fot etripin.log + rm -f etrip.fot etrip.log etrip.dvi etrip.out etrip.typ + rm -f tripos.tex 8terminal.tex + rm -rf tfm + +# Distfiles ... +@MAINT@triptrapdiffs: etexdir/etrip/etrip.diffs +@MAINT@etexdir/etrip/etrip.diffs: etex +@MAINT@ $(MAKE) etrip | tail +1 >etexdir/etrip/etrip.diffs + + +# Dumps +all_efmts = etex.fmt $(efmts) + +dumps: @ETEX@ efmts +efmts: $(all_efmts) + +efmtdir = $(web2cdir)/etex +$(efmtdir):: + $(SHELL) $(top_srcdir)/../mkinstalldirs $(efmtdir) + +etex.fmt: etex + $(dumpenv) $(MAKE) progname=etex files="etex.src plain.tex cmr10.tfm" prereq-check + $(dumpenv) ./etex --progname=etex --jobname=etex --ini \*\\input etex.src \\dump </dev/null + +elatex.fmt: etex + $(dumpenv) $(MAKE) progname=elatex files="latex.ltx" prereq-check + $(dumpenv) ./etex --progname=elatex --jobname=elatex --ini \*\\input latex.ltx </dev/null + +latex.fmt: etex + $(dumpenv) $(MAKE) progname=latex files="latex.ltx" prereq-check + $(dumpenv) ./etex --progname=latex --jobname=latex --ini \*\\input latex.ltx </dev/null + +#ctex.fmt: etex +# $(dumpenv) $(MAKE) progname=ctex files="plain.tex cmr10.tfm" prereq-check +# $(dumpenv) ./etex --progname=ctex --jobname=ctex --ini \\input plain \\dump </dev/null + +#olatex.fmt: etex +# $(dumpenv) $(MAKE) progname=olatex files="latex.ltx" prereq-check +# $(dumpenv) ./etex --progname=olatex --progname=olatex --ini \\input latex.ltx </dev/null + +# Install +install-etex: install-etex-exec install-etex-data +install-etex-exec: install-etex-programs install-etex-links +install-etex-data: install-etex-pool @FMU@ install-etex-dumps +install-etex-dumps: install-etex-fmts + +install-programs: @ETEX@ install-etex-programs +install-etex-programs: etex $(bindir) + for p in etex; do $(INSTALL_LIBTOOL_PROG) $$p $(bindir); done + +install-links: @ETEX@ install-etex-links +install-etex-links: install-etex-programs + #cd $(bindir) && (rm -f einitex evirtex; \ + # $(LN) etex einitex; $(LN) etex evirtex) + +install-fmts: @ETEX@ install-etex-fmts +install-etex-fmts: efmts $(efmtdir) + efmts="$(all_efmts)"; \ + for f in $$efmts; do $(INSTALL_DATA) $$f $(efmtdir)/$$f; done + efmts="$(efmts)"; \ + for f in $$efmts; do base=`basename $$f .fmt`; \ + (cd $(bindir) && (rm -f $$base; $(LN) etex $$base)); done + +install-data:: @ETEX@ install-etex-data +install-etex-pool: etex.pool $(texpooldir) + $(INSTALL_DATA) etex.pool $(texpooldir)/etex.pool + +# end of etex.mk diff --git a/Build/source/texk/web2c/etexdir/etex_gen.tex b/Build/source/texk/web2c/etexdir/etex_gen.tex new file mode 100644 index 00000000000..c9dd037c4e2 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etex_gen.tex @@ -0,0 +1,286 @@ +% etex_gen.tex --- How to generate e-TeX --- last modified 06 Mar 1998 + +\font\eighttt= cmtt8 +\font\eightrm= cmr8 +\font\rtitlefont= cmr7 scaled\magstep5 +\font\ititlefont= cmmi7 scaled\magstep5 +\def\titlefont{\rtitlefont \textfont1=\ititlefont} +\def\eTeX{$\varepsilon$-\TeX} +\def\NTS{NTS} +\let\mc=\eightrm +\rm +\let\mainfont=\tenrm + +\def\.#1{\hbox{\tt#1}} +\def\\#1{\hbox{\it#1\/\hskip.05em}} % italic type for identifiers + +\parskip 2pt plus 1pt +\baselineskip 12pt plus .25pt + +\output{\shipout\box255\global\advance\pageno by 1} % for the title page only +\null +\vfill +\centerline{\titlefont How to generate \eTeX} +\vskip 6pt +\centerline{({\sl Version 2, March 1998\/})} +\vskip 18pt +\centerline{by The \NTS\ Team} +\vskip 6pt +\centerline{Peter Breitenlohner, Max-Planck-Institut f\"ur Physik, M\"unchen} +\vskip 6pt +\centerline{Philip Taylor, RHBNC, University of London} +\vfill +\centerline{\vbox{\hsize 4in +\noindent Given an implementation of \TeX82 for a particular system, this +report describes how to generate a corresponding implementation of +\eTeX.}} +\vskip 24pt +{\baselineskip 9pt +\eightrm\noindent +The preparation of this report was supported in part by DANTE, +Deutschsprachige Anwendervereinigung \TeX\ e.V.\hfil\break +`\TeX' is a trademark of the American Mathematical Society. + +}\pageno=0\eject + +\output{\shipout\vbox{ % for subsequent pages + \baselineskip0pt\lineskip0pt + \hbox to\hsize{\strut + \ifodd\pageno \hfil\eightrm\firstmark\hfil + \mainfont\the\pageno + \else\mainfont\the\pageno\hfil + \eightrm\firstmark\hfil\fi} + \vskip 10pt + \box255} + \global\advance\pageno by 1} +\let\runninghead=\mark +\outer\def\section#1.{\noindent{\bf#1.}\quad + \runninghead{\uppercase{#1} }\ignorespaces} + +\section Introduction. +Let us first review the process of generating an implementation of +\TeX82 for a particular system from the source files as, e.g., described +in the \.{WEB} manual [1]. The system-independent source file +\.{tex.web} must remain unmodified. All changes to \.{tex.web} +necessary for a particular operating system and\slash or compiler are to +be collected in a system-dependent change file, typically named +\.{tex.ch}. Both files \.{tex.web} and \.{tex.ch} are effectively +merged when input by the \.{WEB} system programs \.{WEAVE} and +\.{TANGLE}. When \.{WEAVE} processes this merged input, a file +\.{tex.tex} is produced. Further processing by \TeX\ yields a `pretty +printed' version of the input together with an index. + +When \.{TANGLE} processes the merged input, a string pool file +\.{tex.pool} and a Pascal file \.{tex.pas} (or similar) are produced. +The Pascal file can then be further processed by a suitable compiler +and\slash or language converter such as \.{web2c}, and eventually yields +an executable program. + +There are actually three versions of the program: First there is +\.{INITEX} with its capability to initialize all of \TeX's tables and to +write them in compact form to a format file. Next there is the +production version \.{VIRTEX} requiring a format file as input. Finally +there is \.{TRIPTEX}, a version of \.{INITEX} with special values for +some of \TeX's parameters, for the \.{TRIP} test [2] that should be used +to validate a \TeX\ implementation. Depending on the capabilities of +the compiler, these three versions of the program are generated from +three slightly different change files or they are generated from one +change file with different compiler options. They might even be one and +the same executable program used with different run time options. + +\vskip 24pt plus 24pt +\section Generating \eTeX. +The process of generating \eTeX\ is essentially the same as that of +generating \TeX\ as described above. Conceptually there is a +system-independent source file \.{etex.web} and a system-dependent change +file \.{etex.sys}. Processing these two files by \.{TANGLE} yields a +string pool file \.{etex.pool} as well as a Pascal file \.{etex.pas}, +whilst processing by \.{WEAVE} produces a \TeX\ source file, \.{etex.tex}. + +It may, however, be necessary to increase some of the constants defined +in \.{TANGLE} and \.{WEAVE}. The following values should suffice in +most cases: +$$ +\vcenter{\halign{$#$\hfil\qquad&#\hfil\cr +\\{max\_bytes}\times\\{ww}=100~000&\.{TANGLE} and \.{WEAVE}\cr +\\{max\_texts}=2~500&\.{TANGLE} and \.{WEAVE}\cr +\\{max\_toks}\times\\{zz}=180~000&\.{TANGLE}\cr +\\{max\_names}=5~000&\.{TANGLE}\cr +\\{max\_scraps}=3~000&\.{WEAVE}\cr +\\{stack\_size}=300&\.{WEAVE}\cr +}} +$$ + +The source file \.{etex.web} for \eTeX\ does not, however, exist as a +physical file. It is the hypothetical file obtained by applying the +changes in the actual source file \.{etex.ch} to \.{tex.web}. Thus +\.{etex.web} inherits the bulk of code from \.{tex.web}, whilst the +system-independent source file \.{etex.ch} for \eTeX\ defines the +differences between \.{etex.web} and \.{tex.web}. In order to generate +an implementation of \eTeX\ two change files have to be applied to +\.{tex.web}, one after the other (the actual file names may differ): +$$ +\vcenter{\halign{#\hfil&\qquad\.{#}\hfil&\qquad#\hfil\cr +0.&tex.web&system-independent \.{WEB} source for \TeX\cr +1.&etex.ch&system-independent changes for \eTeX\cr +2.&etex.sys&system-dependent changes for \eTeX\cr +}} +$$ + +The process of merging several change files into \.{tex.web} should +certainly not be performed by hand. There are programs such as \.{TIE} +and \.{PATCHWEB} that perform this process automatically. If no such +program is available, a \TeX\ program \.{WEBMERGE} can be used. +\.{WEBMERGE} reads \.{tex.web} and up to nine change files and produces +a merged change file that can then be processed, together with +\.{tex.web}, by \.{TANGLE} and \.{WEAVE}. [On systems such as VMS, use +of \.{WEBMERGE} can leave a large number of temporary files +lying around; this can be avoided by setting a version limit (e.g.~1) on any +existing versions of those files, or by setting a version limit on the +directory in which they will be created. On other systems, it will probably +leave one large temporary file.] + +Every implementor of \eTeX\ is responsible for creating and maintaining +a suitable \.{etex.sys} in the same way as every implementor of \TeX\ +is responsible for creating and maintaining \.{tex.ch}. Since the bulk +of code in \.{etex.web} is identical to that in \.{tex.web} the bulk of +the system-dependent changes in \.{etex.sys} for a particular system +will be identical to those in \.{tex.ch} for the same system. In the +following we try to give some hints where \.{etex.sys} for a particular +system might deviate from the corresponding \.{tex.ch}. + +First, it might be necessary to increase the size of \TeX's string pool +in order to accommodate \eTeX's additional strings (message texts as +well as multi-letter control sequences). If this turns out to be +necessary for \eTeX\ it would certainly not be harmful to do it for +\TeX\ as well. \TeX\ and \eTeX\ use three constants related to the +string pool: \\{max\_strings} the maximal number of strings, +\\{pool\_size} the maximal number of string characters, and +\\{string\_vacancies} the minimal number of available string characters +in addition to those occupied by strings from the pool file. It is, +therefore, sufficient to increase \\{pool\_size} (or reduce +\\{string\_vacancies}) by the number of \eTeX's additional string +characters and to increase \\{max\_strings} by the number of \eTeX's +additional strings. The latter will, however, be unnecessary for most +implementations as \\{max\_strings} is usually increased substantially +beyond its standard value in order to accommodate large \TeX\ macro +packages. + +For Version~2 of \eTeX, there are about 100 additional strings with +about 1500 additional string characters. The precise numbers can be +obtained by running \.{POOLTYPE} on \TeX's and \eTeX's pool files +(\.{POOLTYPE} reports the total number of strings and string characters +in a pool file). + +Next, \.{etex.sys} may contain a system-dependent modification of the +\\{eTeX\_banner} string. The modified \\{eTeX\_banner} string must +contain `\.{e-TeX}' as well as the \eTeX\ version number. Note, +however, that the \\{banner} string modified by \.{tex.ch} will not be +referenced by \eTeX\ unless the implementor intentionally changes that +aspect of \eTeX's functionality: therefore \.{etex.sys} can modify the +\\{banner} string in the same way as does \.{tex.ch}. + +Then, \.{etex.sys} might deviate from \.{tex.ch} in order to use a +different pool file name and\slash or format file extension (see below). + +Finally, \.{etex.sys} will necessarily deviate whenever \.{etex.ch} +and \.{tex.ch} try to change the same piece of \.{WEB} code or when the +system-independent \eTeX\ changes from \.{etex.ch} and the +system-dependent \TeX\ changes from \.{tex.ch} interfere in some other way. +In case of any such interference implementors must first of all determine +how to combine the respective changes from \.{etex.ch} and \.{tex.ch} +in order to obtain \eTeX's functionality for a particular system. +Obviously, this process cannot be automated since it requires human +insight. + +The \NTS\ team has tried to formulate \.{etex.ch} such that +interferences with system-dependent change files \.{tex.ch} are +unlikely. Suggestions by implementors how any remaining such +interferences could be avoided by a reformulation of \.{etex.ch} will +be taken into serious consideration. Such interferences can be further +reduced by reformulating the system-dependent change file \.{tex.ch} for +\TeX, e.g.\ by reducing the range of change entries from entire modules +to the pieces of code that are actually changed. + +Implementors might prefer to maintain the system-dependent change file +\.{etex.sys} not as a physical file but as a hypothetical file defined +through its deviation from \.{tex.ch}. If there are no interferences of +the kind mentioned above, then the effect of applying the changes from +the hypothetical \.{etex.sys} to the hypothetical \.{etex.web} can be +achieved by applying 3 change files, one after the other, to \.{tex.web} +(using some tool such as \.{TIE}, \.{PATCHWEB}, or \.{WEBMERGE}): +$$ +\vcenter{\halign{#\hfil&\qquad\.{#}\hfil&\qquad#\hfil\cr +0.&tex.web&system-independent \.{WEB} source for \TeX\cr +1.&etex.ch&system-independent changes for \eTeX\cr +2.&tex.ch&system-dependent changes for \TeX\cr +3.&tex.ech&additional system-dependent changes for \eTeX\cr +}} +$$ +The third change file \.{tex.ech} will be rather short and contains just +the differences between \.{etex.sys} and \.{tex.ch}. It is recommended +that implementors try to remove all interferences between \.{etex.ch} +and \.{tex.ch} and use this method to generate \eTeX. + +As with \TeX\ there are three versions of \eTeX: \.{e-INITEX}, +\.{e-VIRTEX}, and \.{e-TRIPTEX}. Depending on the implementation they +will again be generated from the three slightly different versions of +\.{tex.ch} or with different compiler options or they may be one and the +same program used with different run time options. + +\vskip 24pt plus 24pt +\section \eTeX\ modes. +In order to ensure maximal compatibility with \TeX, \eTeX\ can run in +either compatibility mode or extended mode. The possibility of this +choice is, of course, an extended feature of \eTeX. Once \eTeX\ has +chosen compatibility mode it is, however, a legitimate implementation of +\TeX\ (assuming the \TeX\ implementation itself is legitimate). The +only differences between \eTeX\ in compatibility mode and \TeX\ are +those allowed by D.~E.~Knuth [2] between different implementations of +\TeX. + +An \.{e-TRIP} test suite [3] defines the criteria by which a program can +qualify to use the name `\eTeX'. Part of the \.{e-TRIP} test consists +of the standard \.{TRIP} test for \.{e-TRIPTEX} in compatibility and +extended mode. + +\eTeX\ can therefore be used instead of \TeX\ without the necessity to +maintain both programs. For the case that both programs should +nevertheless co-exist on a system, it might be a good idea to name the +pool file for \eTeX\ \.{etex.pool} instead of \.{tex.pool} and to use +an extension other than \.{.fmt}, e.g., \.{.efmt} for \eTeX\ format +files. (Format files for \TeX\ and \eTeX\ are incompatible). All this +will require additional changes in the file \.{tex.ech}. + +When \.{INITEX} or \.{VIRTEX} start, they inspect the first non-blank +character from the command line or in response to the \.{**} prompt. +This may be an \.{\&} immediately followed by the name of a format file +to be loaded. Otherwise \.{VIRTEX} loads a default format, whereas +\.{INITEX} starts without loading a format. + +When \.{e-INITEX} or \.{e-VIRTEX} start, they inspect the first +non-blank character from the command line or in response to the \.{**} +prompt. This may again be an \.{\&} immediately followed by the name of +a format file to be loaded; otherwise \.{e-VIRTEX} loads a default +format. For \.{e-INITEX} the first non-blank character may be an \.{*} +immediately followed by what would normally be the input for \.{INITEX} +(without intervening blanks). \.{e-INITEX} enters extended mode in +response to the \.{*}, or compatibility mode otherwise. This mode is +recorded in format files produced by \.{e-INITEX} and entered again when +such a format is loaded (by either \.{e-INITEX} or \.{e-VIRTEX}). + +\vskip 24pt plus 24pt +\section References. +\item {[1]} +{\sl The \.{WEB} system of structured documentation\/}, +by Donald E.~Knuth,\hfil\break Stanford Computer Science Report~980. + +\item {[2]} +{\sl A torture test for \TeX\/}, +by Donald E.~Knuth, Stanford Computer Science Report~1027. + +\item {[3]} +{\sl A torture test for \eTeX\/}, +by The \NTS\ Team (Peter Breitenlohner and Bernd Raichle). + +\end diff --git a/Build/source/texk/web2c/etexdir/etexextra.in b/Build/source/texk/web2c/etexdir/etexextra.in new file mode 100644 index 00000000000..a500087bdaf --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etexextra.in @@ -0,0 +1,34 @@ +/* etexextra.in: banner etc. for e-TeX. + + This is included by e-TeX, from ../etexextra.c + (generated from ../lib/texmfmp.c). + +Copyright (C) 1995, 96 Karl Berry. +Copyright (C) 2004 Olaf Weber. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#define BANNER "This is e-TeX, Version 3.141592-ETEX-VERSION" +#define COPYRIGHT_HOLDER "Peter Breitenlohner" +#define AUTHOR NULL +#define PROGRAM_HELP ETEXHELP +#define BUG_ADDRESS "tex-k@mail.tug.org" +#define DUMP_VAR TEXformatdefault +#define DUMP_LENGTH_VAR formatdefaultlength +#define DUMP_OPTION "fmt" +#define DUMP_EXT ".fmt" +#define INPUT_FORMAT kpse_tex_format +#define INI_PROGRAM "einitex" +#define VIR_PROGRAM "evirtex" diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.diffs b/Build/source/texk/web2c/etexdir/etrip/etrip.diffs new file mode 100644 index 00000000000..3f0d96075b4 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.diffs @@ -0,0 +1,356 @@ +make[1]: Entering directory `/home/olaf/web2c/src/texk/texk/web2c' +cd ../kpathsea && make -w CC='gcc' CFLAGS='-g ' +make[2]: Entering directory `/home/olaf/web2c/src/texk/texk/kpathsea' +make[2]: Nothing to be done for `default'. +make[2]: Leaving directory `/home/olaf/web2c/src/texk/texk/kpathsea' +cd lib && make -w CC='gcc' CFLAGS='-g ' LDFLAGS='' +make[2]: Entering directory `/home/olaf/web2c/src/texk/texk/web2c/lib' +make[2]: Nothing to be done for `default'. +make[2]: Leaving directory `/home/olaf/web2c/src/texk/texk/web2c/lib' +cd web2c && make -w CC='gcc' CFLAGS='-g ' LDFLAGS='' fixwrites +make[2]: Entering directory `/home/olaf/web2c/src/texk/texk/web2c/web2c' +make[2]: `fixwrites' is up to date. +make[2]: Leaving directory `/home/olaf/web2c/src/texk/texk/web2c/web2c' +cd web2c && make -w CC='gcc' CFLAGS='-g ' LDFLAGS='' splitup +make[2]: Entering directory `/home/olaf/web2c/src/texk/texk/web2c/web2c' +make[2]: `splitup' is up to date. +make[2]: Leaving directory `/home/olaf/web2c/src/texk/texk/web2c/web2c' +cd web2c && make -w CC='gcc' CFLAGS='-g ' LDFLAGS='' web2c +make[2]: Entering directory `/home/olaf/web2c/src/texk/texk/web2c/web2c' +make[2]: `web2c' is up to date. +make[2]: Leaving directory `/home/olaf/web2c/src/texk/texk/web2c/web2c' +rm -f trip.tfm trip.pl trip.tex trip.fmt ctripin.fot ctripin.log +rm -f ctrip.fot ctrip.log trip.dvi ctrip.typ +rm -f xtripin.fot xtripin.log +rm -f xtrip.fot xtrip.log xtrip.typ +rm -f etrip.tfm etrip.pl etrip.tex etrip.fmt etripin.fot etripin.log +rm -f etrip.fot etrip.log etrip.dvi etrip.out etrip.typ +rm -f tripos.tex 8terminal.tex +rm -rf tfm +*** TRIP test for e-TeX in compatibility mode ***. +./pltotf ./triptrap/trip.pl trip.tfm +./tftopl ./trip.tfm trip.pl +diff ./triptrap/trip.pl trip.pl +ln -s ./triptrap/trip.tex . # get same filename in log +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./etex --progname=einitex --ini <./triptrap/trip1.in >ctripin.fot' +mv trip.log ctripin.log +diff ./triptrap/tripin.log ctripin.log +1c1 +< This is TeX, Version 3.141592 (INITEX) 20 DEC 2002 20:24 +--- +> This is e-TeX, Version 3.141592-2.2 (Web2C 7.5.5) (INITEX) 3 AUG 2005 10:50 +3c3 +< (trip.tex +--- +> (./trip.tex +450,451c450,451 +< (preloaded format=trip 2002.12.20) +< 1320 strings of total length 23539 +--- +> (format=trip 2005.8.3) +> 1479 strings of total length 25862 +461c461 +< Hyphenation trie of length 273 has 9 ops out of 500 +--- +> Hyphenation trie of length 273 has 9 ops out of 35111 +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./etex --progname=etex <./triptrap/trip2.in >ctrip.fot' +mv trip.log ctrip.log +diff ./triptrap/trip.fot ctrip.fot +1,3c1,2 +< This is TeX, Version 3.141592 (INITEX) +< ** &trip trip +< (trip.tex ## +--- +> This is e-TeX, Version 3.141592-2.2 (Web2C 7.5.5) +> **(./trip.tex ## +diff ./triptrap/trip.log ctrip.log +1c1 +< This is TeX, Version 3.141592 (preloaded format=trip 2002.12.20) 20 DEC 2002 21:28 +--- +> This is e-TeX, Version 3.141592-2.2 (Web2C 7.5.5) (format=trip 2005.8.3) 3 AUG 2005 10:50 +3c3 +< (trip.tex ## +--- +> (./trip.tex ## +58a59,62 +> \openout0 = `8terminal.tex'. +> +> \openout10 = `tripos.tex'. +> +1405c1409 +< \vbox(16383.99998+0.0)x1000.0, glue set 16342.0fil +--- +> \vbox(16383.99998+0.0)x1000.0, glue set 16341.99998fil +1954c1958 +< (tripos.tex +--- +> (./tripos.tex +2018c2022 +< \vbox(16383.99998+1.0)x100.0, glue set 16239.0fil +--- +> \vbox(16383.99998+1.0)x100.0, glue set 16238.99998fil +2533c2537 +< \vbox(16383.99998+0.0)x20.0, glue set 16331.0fil +--- +> \vbox(16383.99998+0.0)x20.0, glue set 16330.99998fil +3326c3330 +< \vbox(10000.0+2.0)x28.0, glue set 9737.58789fil +--- +> \vbox(10000.0+2.0)x28.0, glue set 9737.58742fil +3864c3868 +< \vbox(16383.99998+2.0)x100.0, glue set 16318.0fil +--- +> \vbox(16383.99998+2.0)x100.0, glue set 16317.99997fil +4034c4038 +< \vbox(16383.99998+0.0)x8236.0, glue set 16344.0fil +--- +> \vbox(16383.99998+0.0)x8236.0, glue set 16343.99998fil +4420c4424 +< \vbox(16383.99998+0.0)x100.0, glue set 16332.0fil +--- +> \vbox(16383.99998+0.0)x100.0, glue set 16331.99998fil +4742c4746 +< \vbox(16383.99998+0.0)x205.12613, glue set 16344.0fil +--- +> \vbox(16383.99998+0.0)x205.12613, glue set 16343.99998fil +6370c6374 +< (tripos.tex +--- +> (./tripos.tex +7287,7288c7291,7292 +< 47 strings out of 1674 +< 251 string characters out of 8353 +--- +> 44 strings out of 1821 +> 261 string characters out of 8138 +7290c7294 +< 372 multiletter control sequences out of 2100 +--- +> 372 multiletter control sequences out of 10000+0 +7292,7293c7296,7297 +< 2 hyphenation exceptions out of 307 +< 5i,7n,9p,113b,38s stack positions out of 200i,40n,60p,500b,600s +--- +> 1 hyphenation exception out of 659 +> 7i,7n,9p,113b,38s stack positions out of 200i,40n,60p,500b,600s +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./dvitype -output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*' trip.dvi >ctrip.typ' +diff ./triptrap/trip.typ ctrip.typ +1c1 +< This is DVItype, Version 3.6 +--- +> This is DVItype, Version 3.6 (Web2C 7.5.5) +9c9 +< ' TeX output 2002.12.20:2128' +--- +> ' TeX output 2005.08.03:1050' +419c419 +< 1121: down4 639342208 +--- +> 1121: down4 639342177 +1087,1088c1087,1088 +< 2535: y4 203921760 +< 2540: y0 203921760 +--- +> 2535: y4 203921756 +> 2540: y0 203921756 +1215d1214 +< +*** TRIP test for e-TeX in extended mode ***. +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./etex --progname=einitex --ini <./etexdir/etrip/etrip1.in >xtripin.fot' +mv trip.log xtripin.log +diff ctripin.log xtripin.log +2c2,3 +< **\input trip +--- +> entering extended mode +> ***\input trip +36,41d36 +< ! Bad register code (256). +< l.29 ...{1} \toksdef\tokens=256 +< \show\errorstopmode +< A register number must be between 0 and 255. +< I changed this one to zero. +< +452,453c447,448 +< 471 memory locations dumped; current usage is 96&278 +< 341 multiletter control sequences +--- +> 509 memory locations dumped; current usage is 134&278 +> 407 multiletter control sequences +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./etex --progname=etex <./etexdir/etrip/trip2.in >xtrip.fot' +mv trip.log xtrip.log +diff ctrip.fot xtrip.fot +2c2,3 +< **(./trip.tex ## +--- +> **entering extended mode +> ## (./trip.tex +76a78,80 +> +> ### semi simple group (level 1) entered at line 429 (begingroup) +> ### bottom level +diff ctrip.log xtrip.log +2,3c2,4 +< ** &trip trip +< (./trip.tex ## +--- +> entering extended mode +> **&trip \toksdef\tokens=0 \input trip +> (./trip.tex +1773d1773 +< {restoring \fam=-1} +1783d1782 +< {restoring \displayindent=0.0pt} +1837d1835 +< {restoring \fam=-1} +2139c2137 +< .\hbox(0.0+0.0)x0.0, shifted 50.0 +--- +> .\hbox(0.0+0.0)x0.0, shifted 50.0, display +2142c2140 +< .\hbox(0.0+0.0)x0.0, shifted 100.0 +--- +> .\hbox(0.0+0.0)x0.0, shifted 100.0, display +2574c2572 +< .\hbox(0.0+0.0)x15.0, glue set 0.1875, shifted 5.0 +--- +> .\hbox(0.0+0.0)x15.0, glue set 0.1875, shifted 5.0, display +2839d2836 +< {restoring current font=\ip} +3227d3223 +< {restoring \fam=-1} +3376c3372 +< .\hbox(68.26251+98.15005)x19.0, glue set - 1.0, shifted 9.0 +--- +> .\hbox(68.26251+98.15005)x19.0, glue set - 1.0, shifted 9.0, display +3561c3557 +< .\hbox(20.5+50.80002)x8.27895, shifted 19.72105 +--- +> .\hbox(20.5+50.80002)x8.27895, shifted 19.72105, display +3770d3765 +< {restoring \fam=-1} +3843d3837 +< {restoring \fam=-1} +3899c3893 +< ..\hbox(12.0+4.0)x8.1778 +--- +> ..\hbox(12.0+4.0)x8.1778, display +3921c3915 +< ..\hbox(0.0+13.00002)x-0.1778, glue set - 57.67767fil +--- +> ..\hbox(0.0+13.00002)x-0.1778, glue set - 57.67767fil, display +3929c3923 +< ....\hbox(7.0+1.0)x5.0, shifted 47.5 +--- +> ....\hbox(7.0+1.0)x5.0, shifted 47.5, display +4015d4008 +< {restoring \fam=-1} +4051c4044 +< .\hbox(0.0+0.0)x1009.0, shifted 7227.0 +--- +> .\hbox(0.0+0.0)x1009.0, shifted 7227.0, display +4055c4048 +< .\hbox(0.0+0.0)x-7127.0, shifted 7227.0 +--- +> .\hbox(0.0+0.0)x-7127.0, shifted 7227.0, display +7286a7280,7282 +> +> ### semi simple group (level 1) entered at line 429 (begingroup) +> ### bottom level +7294c7290 +< 372 multiletter control sequences out of 10000+0 +--- +> 438 multiletter control sequences out of 10000+0 +7297c7293 +< 7i,7n,9p,113b,38s stack positions out of 200i,40n,60p,500b,600s +--- +> 7i,7n,9p,136b,40s stack positions out of 200i,40n,60p,500b,600s +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./dvitype -output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*' trip.dvi >xtrip.typ' +diff ctrip.typ xtrip.typ +*** e-TeX specific part of e-TRIP test ***. +./pltotf ./etexdir/etrip/etrip.pl etrip.tfm +./tftopl ./etrip.tfm etrip.pl +diff ./etexdir/etrip/etrip.pl etrip.pl +ln -s ./etexdir/etrip/etrip.tex . # get same filename in log +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./etex --progname=einitex --ini <./etexdir/etrip/etrip2.in >etripin.fot' +mv etrip.log etripin.log +diff ./etexdir/etrip/etripin.log etripin.log +1c1 +< This is e-TeX, Version 3.141592-2.2 (INITEX) 6 SEP 2004 23:13 +--- +> This is e-TeX, Version 3.141592-2.2 (Web2C 7.5.5) (INITEX) 3 AUG 2005 10:50 +4c4,5 +< (etrip.tex This is the e-Trip test [2004-09-06] for e-TeX v3.141592-2.2. +--- +> (./etrip.tex +> This is the e-Trip test [2004-09-06] for e-TeX v3.141592-2.2. +25,26c26,27 +< (preloaded format=etrip 2004.9.6) +< 1435 strings of total length 24590 +--- +> (format=etrip 2005.8.3) +> 1480 strings of total length 25893 +35c36 +< Hyphenation trie of length 434 has 12 ops out of 500 +--- +> Hyphenation trie of length 434 has 12 ops out of 35111 +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./etex --progname=etex <./etexdir/etrip/etrip3.in >etrip.fot' +diff ./etexdir/etrip/etrip.fot etrip.fot +1,4c1,3 +< This is e-TeX, Version 3.141592-2.2 (INITEX) +< **&etrip etrip +< entering extended mode +< (etrip.tex e-IniTeX: e-Trip format loaded. +--- +> This is e-TeX, Version 3.141592-2.2 (Web2C 7.5.5) +> **entering extended mode +> (./etrip.tex e-IniTeX: e-Trip format loaded. +46a46,47 +> \openout1 = `etrip.out'. +> +diff ./etexdir/etrip/etrip.log etrip.log +1c1 +< This is e-TeX, Version 3.141592-2.2 (preloaded format=etrip 2004.9.6) 6 SEP 2004 23:13 +--- +> This is e-TeX, Version 3.141592-2.2 (Web2C 7.5.5) (format=etrip 2005.8.3) 3 AUG 2005 10:50 +4c4 +< (etrip.tex e-IniTeX: e-Trip format loaded. +--- +> (./etrip.tex e-IniTeX: e-Trip format loaded. +670a671,672 +> \openout1 = `etrip.out'. +> +672c674 +< (etrip.out) ( +--- +> (./etrip.out) ( +764c766 +< % end of outer \scantokens) (etrip.out +--- +> % end of outer \scantokens) (./etrip.out +4273,4274c4275,4276 +< 22 strings out of 1665 +< 132 string characters out of 8410 +--- +> 18 strings out of 1820 +> 140 string characters out of 8107 +4276c4278 +< 408 multiletter control sequences out of 2100 +--- +> 408 multiletter control sequences out of 10000+0 +4278c4280 +< 10 hyphenation exceptions out of 307 +--- +> 9 hyphenation exceptions out of 659 +diff ./etexdir/etrip/etrip.out etrip.out +/bin/sh -c 'TEXMFCNF=./etexdir/etrip ./dvitype -output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*' etrip.dvi >etrip.typ' +diff ./etexdir/etrip/etrip.typ etrip.typ +1c1 +< This is DVItype, Version 3.6 +--- +> This is DVItype, Version 3.6 (Web2C 7.5.5) +9c9 +< ' TeX output 2004.09.06:2313' +--- +> ' TeX output 2005.08.03:1050' +make[1]: Leaving directory `/home/olaf/web2c/src/texk/texk/web2c' diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.fot b/Build/source/texk/web2c/etexdir/etrip/etrip.fot new file mode 100644 index 00000000000..eb255a09cc3 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.fot @@ -0,0 +1,46 @@ +This is e-TeX, Version 3.141592-2.2 (INITEX) +**&etrip etrip +entering extended mode +(etrip.tex e-IniTeX: e-Trip format loaded. +This is the e-Trip test [2004-09-06] for e-TeX v3.141592-2.2. +(You are using e-TeX version/revision 2.2) +Missing character: There is no c in font nullfont! + + +current interactionmode (l.230): nonstop + +current interactionmode (l.231): scroll + +current interactionmode (l.232): errorstop + +! Bad interaction mode (-1). +l.237 \interactionmode=-1 + \1 1 % nonstop +current interactionmode (l.237): nonstop +! Bad interaction mode (4). +l.238 \interactionmode=4 + \1 1 % nonstop +current interactionmode (l.238): nonstop + +current interactionmode (l.239): scroll + +current interactionmode (l.239): scroll + +current interactionmode (l.239): nonstop + +current interactionmode (l.239): nonstop + +current interactionmode (l.239): errorstop + +current interactionmode (l.239): errorstop + +current interactionmode (l.240): errorstop + +1 (l.243) +1 (l.245) +current interactionmode (l.247): errorstop + +current interactionmode (l.247): scroll + +current interactionmode (l.247): nonstop + diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.log b/Build/source/texk/web2c/etexdir/etrip/etrip.log new file mode 100644 index 00000000000..fca746ee6c6 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.log @@ -0,0 +1,4281 @@ +This is e-TeX, Version 3.141592-2.2 (preloaded format=etrip 2004.9.6) 6 SEP 2004 23:13 +entering extended mode +**&etrip etrip +(etrip.tex e-IniTeX: e-Trip format loaded. +This is the e-Trip test [2004-09-06] for e-TeX v3.141592-2.2. +(You are using e-TeX version/revision 2.2) +Missing character: There is no b in font nullfont! + +Missing character: There is no c in font nullfont! + +Checking input/output of new csnames: +e-TeX Version 2 has 66 new csnames: +> \3=macro: +-> \eTeXversion \eTeXrevision + \showgroups \showtokens + \tracingassigns \tracinggroups + \tracingifs \tracingscantokens + \currentgrouplevel \currentgrouptype + \middle \lastnodetype + \TeXXeTstate \beginL + \endL \beginR + \endR \predisplaydirection + \marks \topmarks + \firstmarks \botmarks + \splitfirstmarks \splittopmarks + \protected \unexpanded + \detokenize \scantokens + \readline \unless + \ifdefined \ifcsname + \everyeof \interactionmode + \currentiflevel \currentiftype + \currentifbranch \showifs + \fontcharwd \fontcharht + \fontchardp \fontcharic + \iffontchar \tracingnesting + \parshapelength \parshapeindent + \parshapedimen \numexpr + \dimexpr \glueexpr + \muexpr \mutoglue + \gluetomu \gluestretchorder + \glueshrinkorder \gluestretch + \glueshrink \savingvdiscards + \pagediscards \splitdiscards + \lastlinefit \savinghyphcodes + \interlinepenalties \clubpenalties + \widowpenalties \displaywidowpenalties +. +l.181 \show\3 + \endgroup + +Checking creation and printing for new node types: + +Overfull \hbox (38.99965pt too wide) in paragraph at lines 195--197 +[]\trip a[]b[]p$q [] t$u[][] + +\hbox(17.0+3.00002)x0.0 +.\hbox(0.0+0.0)x0.0 +.\trip a +.\beginL +.\trip b +.\beginR +.\trip p +.\mathon +.\trip q +.\glue(\thinmuskip) 4.99988 plus 0.99997 +.\hbox(17.0+3.00002)x23.9999 +..\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +...\bigtrip a +..\trip r +..\glue(\thinmuskip) 4.99988 plus 0.99997 +..\hbox(16.0+4.00002)x6.0, shifted -1.0 +...\bigtrip B +..\trip s +..\vbox(7.0+11.0)x7.0, shifted -9.0 +...\hbox(7.0+1.0)x3.0 +....\trip A +...\hbox(8.0+2.0)x3.0 +....\trip B +.\glue(\thinmuskip) 4.99988 plus 0.99997 +.\trip t +.\mathoff +.\trip r (ligature u|) +.\penalty 10000 +.\glue(\parfillskip) 0.0 +.\endR +.\endL +.\glue(\rightskip) 0.0 + + +Overfull \hbox (11.0pt too wide) detected at line 197 +\trip aMb + +\hbox(8.0+2.0)x0.0 +.\trip a +.\trip M +.\trip b + + +Overfull \hbox (24.6pt too wide) in paragraph at lines 197--201 +[][]\trip p[]q$st$u[] + +\hbox(0.0+0.0)x0.0 +.\beginL +.\beginR +.\trip p +.\endR +.\trip q (ligature |) +.\trip q +.\mathon, surrounded 12.3 +.\trip s +.\trip t +.\mathoff, surrounded 12.3 +.\trip r (ligature u|) +.\penalty 10000 +.\glue(\parfillskip) 0.0 +.\endL +.\glue(\rightskip) 0.0 + + +Overfull \hbox (6.0pt too wide) detected at line 201 +\trip rMs + +\hbox(0.0+0.0)x0.0 +.\trip r +.\trip M +.\trip s + + +Overfull \hbox (3.0pt too wide) in paragraph at lines 201--205 +[]\trip tp[]u + +\hbox(0.0+0.0)x0.0 +.\beginL +.\trip t +.\kern3.0 +.\trip q (ligature ) +.\trip p +.\endL +.\trip r (ligature u|) +.\penalty 10000 +.\glue(\parfillskip) 0.0 +.\glue(\rightskip) 0.0 + + +Overfull \hbox (6.0pt too wide) detected at line 205 +\trip rMs + +\hbox(0.0+0.0)x0.0 +.\trip r +.\trip M +.\trip s + +! Bad register code (-1). +<to be read again> + { +l.208 \marks-1{ + -1}\marks32768{32768}% Bad register (-1) .... +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + { +l.208 ...marks-1{-1}\marks32768{ + 32768}% Bad register (-1) ...... +A register number must be between 0 and 32767. +I changed this one to zero. + +! Improper \beginL. +l.210 \beginL + \beginR\endL\endR % Improper \(begin/end)(L/R) +Sorry, this optional e-TeX feature has been disabled. + +! Improper \beginR. +l.210 \beginL\beginR + \endL\endR % Improper \(begin/end)(L/R) +Sorry, this optional e-TeX feature has been disabled. + +! Improper \endL. +l.210 \beginL\beginR\endL + \endR % Improper \(begin/end)(L/R) +Sorry, this optional e-TeX feature has been disabled. + +! Improper \endR. +l.210 ...beginL\beginR\endL\endR + % Improper \(begin/end)(L/R) +Sorry, this optional e-TeX feature has been disabled. + + +Overfull \hbox (3.0pt too wide) in paragraph at lines 205--211 +\trip tp + +\hbox(0.0+0.0)x0.0 +.\trip t +.\kern3.0 +.\trip q (ligature ) +.\trip p +.\penalty 10000 +.\glue(\parfillskip) 0.0 +.\glue(\rightskip) 0.0 + +> \box0= +\vbox(30.00002+0.0)x0.0 +.\hbox(17.0+3.00002)x0.0 +..\hbox(0.0+0.0)x0.0 +..\trip a +..\beginL +..\trip b +..\beginR +..\trip p +..\mathon +..\trip q +..\glue(\thinmuskip) 4.99988 plus 0.99997 +..\hbox(17.0+3.00002)x23.9999 +...\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +....\bigtrip a +...\trip r +...\glue(\thinmuskip) 4.99988 plus 0.99997 +...\hbox(16.0+4.00002)x6.0, shifted -1.0 +....\bigtrip B +...\trip s +...\vbox(7.0+11.0)x7.0, shifted -9.0 +....\hbox(7.0+1.0)x3.0 +.....\trip A +....\hbox(8.0+2.0)x3.0 +.....\trip B +..\glue(\thinmuskip) 4.99988 plus 0.99997 +..\trip t +..\mathoff +..\trip r (ligature u|) +..\penalty 10000 +..\glue(\parfillskip) 0.0 +..\endR +..\endL +..\glue(\rightskip) 0.0 +.\penalty 0 +.\glue(\abovedisplayskip) 0.0 +.\glue(\lineskip) 0.0 +.\hbox(8.0+2.0)x0.0 +..\beginM +..\kern0.0 +..\hbox(8.0+2.0)x0.0, display +...\trip a +...\trip M +...\trip b +..\kern0.0 +..\endM +.\penalty 0 +.\glue(\belowdisplayskip) 0.0 +.\glue(\lineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +..\beginL +..\beginR +..\trip p +..\endR +..\trip q (ligature |) +..\trip q +..\mathon, surrounded 12.3 +..\trip s +..\trip t +..\mathoff, surrounded 12.3 +..\trip r (ligature u|) +..\penalty 10000 +..\glue(\parfillskip) 0.0 +..\endL +..\glue(\rightskip) 0.0 +.\penalty 0 +.\glue(\abovedisplayskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +..\beginM +..\kern0.0 +..\hbox(0.0+0.0)x0.0, display +...\trip r +...\trip M +...\trip s +..\kern0.0 +..\endM +.\penalty 0 +.\glue(\belowdisplayskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +..\beginL +..\trip t +..\kern3.0 +..\trip q (ligature ) +..\trip p +..\endL +..\trip r (ligature u|) +..\penalty 10000 +..\glue(\parfillskip) 0.0 +..\glue(\rightskip) 0.0 +.\penalty 0 +.\glue(\abovedisplayskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0, display +..\trip r +..\trip M +..\trip s +.\penalty 0 +.\glue(\belowdisplayskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +..\trip t +..\kern3.0 +..\trip q (ligature ) +..\trip p +..\penalty 10000 +..\glue(\parfillskip) 0.0 +..\glue(\rightskip) 0.0 +.\mark{0old} +.\mark{0} +.\marks1{1} +.\marks15{15} +.\marks32767{32767} +.\mark{-1} +.\mark{32768} + +! OK. +l.211 }\showbox0 + + +Checking \interactionmode: + + +current interactionmode (l.229): batch + +current interactionmode (l.230): nonstop + +current interactionmode (l.231): scroll + +current interactionmode (l.232): errorstop + +! Bad interaction mode (-1). +l.237 \interactionmode=-1 + \1 1 % nonstop +Modes are 0=batch, 1=nonstop, 2=scroll, and +3=errorstop. Proceed, and I'll ignore this case. + +current interactionmode (l.237): nonstop +! Bad interaction mode (4). +l.238 \interactionmode=4 + \1 1 % nonstop +Modes are 0=batch, 1=nonstop, 2=scroll, and +3=errorstop. Proceed, and I'll ignore this case. + +current interactionmode (l.238): nonstop + +current interactionmode (l.239): scroll + +current interactionmode (l.239): scroll + +current interactionmode (l.239): nonstop + +current interactionmode (l.239): nonstop + +current interactionmode (l.239): errorstop + +current interactionmode (l.239): errorstop + +current interactionmode (l.239): batch + +current interactionmode (l.239): batch +current interactionmode (l.240): batch + +current interactionmode (l.240): errorstop + +1 (l.243) +0 (l.244) +1 (l.245) +current interactionmode (l.247): batch + +current interactionmode (l.247): errorstop + +current interactionmode (l.247): scroll + +current interactionmode (l.247): nonstop + +current interactionmode (l.248): batch +Checking \tracingifs: +{vertical mode: \iftrue: (level 1) entered on line 257} +{\iffalse: (level 2) entered on line 257} +{\else: \iffalse (level 2) entered on line 257} +{\fi: \iffalse (level 2) entered on line 257} +{\else: \iftrue (level 1) entered on line 257} +{\fi: \iftrue (level 1) entered on line 257} +{\unless\iftrue: (level 1) entered on line 258} +{\else: \unless\iftrue (level 1) entered on line 258} +{\unless\iffalse: (level 2) entered on line 258} +{\else: \unless\iffalse (level 2) entered on line 258} +{\fi: \unless\iffalse (level 2) entered on line 258} +{\fi: \unless\iftrue (level 1) entered on line 258} +{\ifdefined: (level 1) entered on line 260} +{true} +{\unless} +{\unless\ifdefined: (level 2) entered on line 260} +{true} +{\ifcase: (level 3) entered on line 260} +{case 2} +{\or: \ifcase (level 3) entered on line 260} +{\or: \ifcase (level 3) entered on line 260} +{\ifcsname: (level 4) entered on line 261} +{true} +{\ifcsname: (level 5) entered on line 261} +{false} +{\else: \ifcsname (level 5) entered on line 261} +{\ifx: (level 6) entered on line 262} +{false} +{\else: \ifx (level 6) entered on line 262} +{\ifx: (level 7) entered on line 262} +{false} +{\fi: \ifx (level 7) entered on line 262} +{\fi: \ifx (level 6) entered on line 262} +{\fi: \ifcsname (level 5) entered on line 261} +{\fi: \ifcsname (level 4) entered on line 261} +{\or: \ifcase (level 3) entered on line 260} +{\fi: \ifcase (level 3) entered on line 260} +{\fi: \unless\ifdefined (level 2) entered on line 260} +{\fi: \ifdefined (level 1) entered on line 260} +{\endgroup} +Checking \tracingassigns: +{into \tracingassigns=1} +{globally changing \count17=0} +{into \count17=7} +{reassigning \count17=7} +{globally changing \9=undefined} +{into \9=macro:->\relax } +{globally changing \8=undefined} +{into \8=macro:->\relax } +{reassigning \8=macro:->\relax } +{globally changing \count17=7} +{into \count17=0} +{reassigning \count17=0} +{globally changing \9=macro:->\relax } +{into \9=undefined} +{globally changing \8=macro:->\relax } +{into \8=undefined} +{reassigning \8=undefined} +{restoring \tracingassigns=0} +Checking \currentgrouptype, \currentgrouplevel, and \lastnodetype: +current group level (l.282): outer level +current group type (l.284): bottom level +current group type (l.311): semi simple group +{entering vbox group (level 2) at line 313} +current group type (l.313): vbox group +{entering adjusted hbox group (level 3) at line 314} +current group type (l.314): adjusted hbox group +{entering simple group (level 4) at line 315} +current group type (l.315): simple group +{leaving simple group (level 4) entered at line 315} +last node type (l.316): empty +{entering hbox group (level 4) at line 317} +current group type (l.317): hbox group +{entering disc group (level 5) at line 318} +current group type (l.318): disc group +{leaving disc group (level 5) entered at line 318} +{entering disc group (level 5) at line 318} +current group type (l.318): disc group +{leaving disc group (level 5) entered at line 318} +{entering disc group (level 5) at line 318} +current group type (l.318): disc group +{leaving disc group (level 5) entered at line 318} +last node type (l.320): disc node +last node type (l.321): char node +last node type (l.322): ligature node +{entering insert group (level 5) at line 323} +current group type (l.323): insert group +{leaving insert group (level 5) entered at line 323} +last node type (l.324): ins node +{entering insert group (level 5) at line 325} +current group type (l.325): insert group +{leaving insert group (level 5) entered at line 325} +last node type (l.326): adjust node +last node type (l.327): mark node +last node type (l.328): rule node +last node type (l.329): glue node +last node type (l.330): kern node +last node type (l.331): penalty node +{entering vtop group (level 5) at line 332} +current group type (l.332): vtop group +{leaving vtop group (level 5) entered at line 332} +last node type (l.333): vlist node +last node type (l.334): whatsit node +{entering math shift group (level 5) at line 335} +current group type (l.335): math shift group +{entering math group (level 6) at line 336} +current group type (l.336): math group +{leaving math group (level 6) entered at line 336} +{leaving math shift group (level 5) entered at line 335} +last node type (l.338): math node +last node type (l.339): math node +last node type (l.340): math node +{entering align group (level 5) at line 341} +{entering align group (level 6) at line 341} +current group type (l.341): align group +{leaving align group (level 6) entered at line 341} +{entering align group (level 6) at line 342} +{entering no align group (level 7) at line 342} +current group type (l.342): no align group +last node type (l.343): unset node +{leaving no align group (level 7) entered at line 342} +{leaving align group (level 6) entered at line 342} +{leaving align group (level 5) entered at line 341} +{leaving hbox group (level 4) entered at line 317} +{leaving adjusted hbox group (level 3) entered at line 314} +last node type (l.347): hlist node +{entering math shift group (level 3) at line 348} +current group type (l.348): math shift group +last node type (l.349): empty +{entering math choice group (level 4) at line 350} +current group type (l.350): math choice group +{leaving math choice group (level 4) entered at line 350} +{entering math choice group (level 4) at line 350} +current group type (l.350): math choice group +{leaving math choice group (level 4) entered at line 350} +{entering math choice group (level 4) at line 350} +current group type (l.350): math choice group +{leaving math choice group (level 4) entered at line 350} +{entering math choice group (level 4) at line 350} +current group type (l.350): math choice group +{entering vcenter group (level 5) at line 351} +current group type (l.351): vcenter group +{leaving vcenter group (level 5) entered at line 351} +last node type (l.352): math mode node +{leaving math choice group (level 4) entered at line 350} +last node type (l.353): math mode node +{entering math left group (level 4) at line 354} +current group type (l.354): math left group +{leaving math left group (level 4) entered at line 354} +{entering math left group (level 4) at line 355} +current group type (l.355): math left group +{leaving math left group (level 4) entered at line 355} +{entering math left group (level 4) at line 356} +current group type (l.356): math left group +{leaving math left group (level 4) entered at line 356} +{leaving math shift group (level 3) entered at line 348} +{leaving vbox group (level 2) entered at line 313} +{entering adjusted hbox group (level 2) at line 394} +{leaving adjusted hbox group (level 2) entered at line 394} +{entering output group (level 2) at line 394} +current group type (l.394): output group +{entering vbox group (level 3) at line 394} +{entering adjusted hbox group (level 4) at line 394} +{entering hbox group (level 5) at line 394} +{entering simple group (level 6) at line 394} +{entering align group (level 7) at line 394} +{entering align group (level 8) at line 394} +{entering no align group (level 9) at line 394} +{entering math shift group (level 10) at line 394} +{entering vtop group (level 11) at line 394} +{entering math shift group (level 12) at line 394} +{entering math group (level 13) at line 394} +{entering math left group (level 14) at line 394} +{leaving math left group (level 14) entered at line 394} +{entering math left group (level 14) at line 394} +{entering math choice group (level 15) at line 394} +{leaving math choice group (level 15) entered at line 394} +{entering math choice group (level 15) at line 394} +{leaving math choice group (level 15) entered at line 394} +{entering math choice group (level 15) at line 394} +{entering vcenter group (level 16) at line 394} +{entering insert group (level 17) at line 394} +{entering disc group (level 18) at line 394} +{leaving disc group (level 18) entered at line 394} +{entering disc group (level 18) at line 394} + +### disc group (level 18) entered at line 394 (\discretionary{}{) +### insert group (level 17) entered at line 394 (\vadjust{) +### vcenter group (level 16) entered at line 394 (\vcenter to7.0pt{) +### math choice group (level 15) entered at line 394 (\mathchoice{}{}{) +### math left group (level 14) entered at line 394 (\middle) +### math group (level 13) entered at line 394 ({) +### math shift group (level 12) entered at line 394 ($$) +### vtop group (level 11) entered at line 394 (\vtop{) +### math shift group (level 10) entered at line 394 ($) +### no align group (level 9) entered at line 394 (\noalign{) +### align group (level 8) entered at line 394 (\cr) +### align group (level 7) entered at line 394 (\valign{) +### simple group (level 6) entered at line 394 ({) +### hbox group (level 5) entered at line 394 (\raise5.0pt\hbox{) +### adjusted hbox group (level 4) entered at line 394 (\hbox spread5.0pt +{) +### vbox group (level 3) entered at line 394 (\setbox0=\vbox{) +### output group (level 2) entered at line 394 (\output) +### semi simple group (level 1) entered at line 285 (\begingroup) +### bottom level + +! OK. +<output> ...nary {}{\showgroups + }{} } } }{} \right . } $$ } $... +l.394 ...ox{}\vfil\penalty-10000 + + +{leaving disc group (level 18) entered at line 394} +{entering disc group (level 18) at line 394} +{leaving disc group (level 18) entered at line 394} +{leaving insert group (level 17) entered at line 394} +{leaving vcenter group (level 16) entered at line 394} +{leaving math choice group (level 15) entered at line 394} +{entering math choice group (level 15) at line 394} +{leaving math choice group (level 15) entered at line 394} +{leaving math left group (level 14) entered at line 394} +{leaving math group (level 13) entered at line 394} +{leaving math shift group (level 12) entered at line 394} +{leaving vtop group (level 11) entered at line 394} +{leaving math shift group (level 10) entered at line 394} +{leaving no align group (level 9) entered at line 394} +{leaving align group (level 8) entered at line 394} +{leaving align group (level 7) entered at line 394} +{leaving simple group (level 6) entered at line 394} +{leaving hbox group (level 5) entered at line 394} +{leaving adjusted hbox group (level 4) entered at line 394} +{leaving vbox group (level 3) entered at line 394} +{leaving output group (level 2) entered at line 394} +Checking expansion of \protected macros: +> \2=\protected macro: +->. +l.402 ...otected\def\2{} \show\2 + + +> \3=\protected macro: +->. +l.403 \let\3=\2 \show\3 + + +> \1=\protected macro: +->\2. +l.404 ...cted\def\1{\2}} \show\1 + + + +\1->\2 +\1\2 +\typeout ->\immediate \write 15 + +\1->\2 +\1\2 + +\1->\2 +> \box0= +\vbox(0.0+0.0)x0.0 +.\special{\1\2} + +! OK. +l.408 ...ndafter\1\1}} \showbox0 + + + +\1->\2 +> \5=macro: +->\1\2. +l.409 ...xpandafter\1\1} \show\5 + + + +\1->\2 + +\1->\3 + +\3-> + +\2-> +Checking \scantokens, \tracingscantokens, \readline, and \everyeof: + +Completed box being shipped out [1] +\vbox(0.0+0.0)x0.0 +.\openout1=etrip.out +.\write1{\unexpanded \expandafter {\1}} +.\closeout1 + +Memory usage before: 50&182; after: 36&176; still untouched: 680 +(etrip.out) ( +Warning: end of semi simple group (level 3) entered at line 431 of a dif +ferent file +Warning: end of \iftrue entered on line 431 of a different file +Warning: end of file when simple group (level 3) entered at line 3 is in +complete +Warning: end of file when \iffalse\else entered on line 4 is incomplete +) ( +Warning: end of semi simple group (level 3) entered at line 433 of a dif +ferent file +l.1 \endgroup + +l.433 ...ntokens\expandafter{\1} + \egroup \fi +Warning: end of \unless\iffalse entered on line 433 of a different file +l.2 \fi + +l.433 ...ntokens\expandafter{\1} + \egroup \fi +Warning: end of file when simple group (level 3) entered at line 3 is in +complete +Warning: end of file when \iffalse\else entered on line 4 is incomplete +l.5 \iffalse \else + +l.433 ...ntokens\expandafter{\1} + \egroup \fi) ( +Warning: end of hbox group (level 4) entered at line 1 of a different fi +le +l.1 \egroup + +l.6 } + +l.444 } + % end of outer \scantokens +Warning: end of \ifcase entered on line 2 of a different file +l.2 \else \fi + +l.6 } + +l.444 } + % end of outer \scantokens +Warning: end of hbox group (level 3) entered at line 435 of a different +file + +\1->\egroup + \fi +l.4 \1 + +l.6 } + +l.444 } + % end of outer \scantokens +Warning: end of \unless\iftrue entered on line 436 of a different file + +\1->\egroup \fi + +l.4 \1 + +l.6 } + +l.444 } + % end of outer \scantokens +Warning: end of file when math shift group (level 4) entered at line 7 i +s incomplete +Warning: end of file when vtop group (level 3) entered at line 5 is inco +mplete +Warning: end of file when \iffalse entered on line 9 is incomplete +Warning: end of file when \ifinner\else entered on line 8 is incomplete +Warning: end of file when \ifnum entered on line 6 is incomplete +l.10 \csname iffalse\endcsname + +l.6 } + +l.444 } + % end of outer \scantokens +! Incomplete \iffalse; all text was ignored after line 9. +<inserted text> + \fi +l.6 } + +l.444 } + % end of outer \scantokens +The file ended while I was skipping conditional text. +This kind of error happens when you say `\if...' and forget +the matching `\fi'. I've inserted a `\fi'; this might work. + +Warning: end of file when vtop group (level 3) entered at line 5 is inco +mplete +Warning: end of file when \ifnum entered on line 6 is incomplete +l.9 \fi + +l.444 } + % end of outer \scantokens) (etrip.out +! Undefined control sequence. +\endgroup ->\9\9 + +l.1 \endgroup + +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +) ( +! Undefined control sequence. +\endgroup ->\9\9 + +l.1 \endgroup + +l.451 ...ntokens\expandafter{\1} + \egroup \fi +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +) ( ) +Runaway definition? +->\begingroup +! File ended while scanning definition of \1. +<inserted text> + } +l.453 ...scantokens{\begingroup} + % <== error +I suspect you have forgotten a `}', causing me +to read past where you wanted me to stop. +I'll try to recover; but if the error is serious, +you'd better type `E' or `X' now and fix your file. + +( ) ( level=2 ( level=3 ( level=4 +! Undefined control sequence. +<everyeof> ...uplevel \2\else \9 + \fi +l.2 + +\2...=\the \currentgrouplevel }} + \endgroup +<everyeof> ...rrentgrouplevel \2 + \else \9\fi +l.2 + +\2...=\the \currentgrouplevel }} + \endgroup +<everyeof> ...rrentgrouplevel \2 + \else \9\fi +l.2 + +\2...=\the \currentgrouplevel }} + \endgroup +l.461 ...evel\2\else\9\fi}}}\1\2 + +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +))) +{\tracingrestores} +{\tracingassigns} +{into \tracingassigns=1} +{\setbox} +{restricted horizontal mode: \unless} +{\unless\ifeof} +{true} +{\readline} +{changing \2=macro:->\begingroup \scantokens {\message \ETC.} +{into \2=macro:->\endgroup^^M} +{\endlinechar} +{changing \endlinechar=13} +{into \endlinechar=-1} +{the character \} +Missing character: There is no \ in font etrip! +{the character e} +Missing character: There is no e in font etrip! +{the character n} +Missing character: There is no n in font etrip! +{the character d} +Missing character: There is no d in font etrip! +{the character g} +Missing character: There is no g in font etrip! +{the character r} +Missing character: There is no o in font etrip! +{the character u} +Missing character: There is no ^^M in font etrip! +{\expandafter} +{\fi} +{\unless} +{\unless\ifeof} +{true} +{\readline} +{changing \2=macro:->\endgroup^^M} +{into \2=macro:->\fi} +{\endlinechar} +{reassigning \endlinechar=-1} +{the character \} +Missing character: There is no \ in font etrip! +{the character f} +Missing character: There is no f in font etrip! +{the character i} +Missing character: There is no i in font etrip! +{\expandafter} +{\fi} +{\unless} +{\unless\ifeof} +{true} +{\readline} +{changing \2=macro:->\fi} +{into \2=macro:->\bgroup} +{\endlinechar} +{reassigning \endlinechar=-1} +{the character \} +Missing character: There is no \ in font etrip! +{the character b} +Missing character: There is no g in font etrip! +{the character r} +Missing character: There is no o in font etrip! +{the character u} +{\expandafter} +{\fi} +{\unless} +{\unless\ifeof} +{true} +{\readline} +{changing \2=macro:->\bgroup} +{into \2=macro:->\iffalse \else} +{\endlinechar} +{reassigning \endlinechar=-1} +{the character \} +Missing character: There is no \ in font etrip! +{the character i} +Missing character: There is no i in font etrip! +{the character f} +Missing character: There is no f in font etrip! +{the character f} +Missing character: There is no f in font etrip! +{the character a} +Missing character: There is no l in font etrip! +{the character s} +Missing character: There is no e in font etrip! +{blank space } +{the character \} +Missing character: There is no \ in font etrip! +{the character e} +Missing character: There is no e in font etrip! +{the character l} +Missing character: There is no l in font etrip! +{the character s} +Missing character: There is no e in font etrip! +{\expandafter} +{\fi} +{\unless} +{\unless\ifeof} +{true} +{\readline} +{changing \2=macro:->\iffalse \else} +{into \2=macro:->} +{\endlinechar} +{reassigning \endlinechar=-1} +{\expandafter} +{\fi} +{\unless} +{\unless\ifeof} +{false} +{\showlists} + +### restricted horizontal mode entered at line 468 +\trip r +\trip r (ligature up) +\trip b +\trip r +\trip r (ligature up) +\trip a +\trip s +\glue 4.0 plus 2.0 minus 1.0 +\trip s +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.468 ...ox25=\hbox{\1\showlists + }^^M + +{end-group character }} +{restoring \endlinechar=13} +{restoring \2=macro:->\begingroup \scantokens {\message \ETC.} +{changing \box25=void} +{into \box25= +\hbox(8.0+2.0)x9.0 []} +{vertical mode: blank space } +{end-group character }} +{restoring \box25=void} +{restoring \tracingassigns=0} +Checking \marks etc., \showtokens, and \detokenize: + +Current marks: + \splitfirstmarks 0=. + \splitbotmarks 0=. + \splitfirstmarks 1=. + \splitbotmarks 1=. + \splitfirstmarks 3=. + \splitbotmarks 3=. +> \box0= +\vbox(188.0+0.0)x10.0 +.\mark{0-1} +.\marks1{1-1} +.\glue 1.0 +.\vbox(9.0+0.0)x0.0 +.\mark{0-2} +.\marks3{} +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +.\glue 5.0 +.\glue 0.0 plus 1.0fil +.\penalty 0 +.\glue 40.0 +.\mark{0-3} +.\glue 1.0 +.\glue(\lineskip) 0.0 +.\vbox(19.0+0.0)x0.0 +.\marks3{3-3} +.\glue 3.0 plus 1.0fil +.\penalty 0 +.\glue 40.0 +.\glue(\lineskip) 0.0 +.\vbox(30.0+0.0)x0.0 +.\glue 0.0 plus 1.0fil +.\penalty 0 +.\glue 40.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x10.0 + +! OK. +l.491 \1 \showbox0 + \let\5=\3 \def\3#1{\showtokens\expandaft... + +> 0-1. +<recently read> } + +... +l.493 \1 + \showbox1 \showbox0 \let\3=\5 + +> 0-2. +<recently read> } + +... +l.493 \1 + \showbox1 \showbox0 \let\3=\5 + +> 1-1. +<recently read> } + +... +l.493 \1 + \showbox1 \showbox0 \let\3=\5 + +> 1-1. +<recently read> } + +... +l.493 \1 + \showbox1 \showbox0 \let\3=\5 + +> . +<recently read> } + +... +l.493 \1 + \showbox1 \showbox0 \let\3=\5 + +> . +<recently read> } + +... +l.493 \1 + \showbox1 \showbox0 \let\3=\5 + + +Current marks: + \splitfirstmarks 0=0-1. + \splitbotmarks 0=0-2. + \splitfirstmarks 1=1-1. + \splitbotmarks 1=1-1. + \splitfirstmarks 3=. + \splitbotmarks 3=. +> \box1= +\vbox(17.0+0.0)x0.0, glue set 2.0fil +.\mark{0-1} +.\marks1{1-1} +.\glue 1.0 +.\vbox(9.0+0.0)x0.0 +.\mark{0-2} +.\marks3{} +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +.\glue 5.0 +.\glue 0.0 plus 1.0fil + +! OK. +l.493 \1 \showbox1 + \showbox0 \let\3=\5 + +> \box0= +\vbox(132.0+0.0)x10.0 +.\mark{0-3} +.\glue(\splittopskip) 0.0 +.\vbox(19.0+0.0)x0.0 +.\marks3{3-3} +.\glue 3.0 plus 1.0fil +.\penalty 0 +.\glue 40.0 +.\glue(\lineskip) 0.0 +.\vbox(30.0+0.0)x0.0 +.\glue 0.0 plus 1.0fil +.\penalty 0 +.\glue 40.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x10.0 + +! OK. +l.493 \1 \showbox1 \showbox0 + \let\3=\5 + + +Current marks: + \splitfirstmarks 0=0-3. + \splitbotmarks 0=0-3. + \splitfirstmarks 1=. + \splitbotmarks 1=. + \splitfirstmarks 3=3-3. + \splitbotmarks 3=3-3. +> \box1= +\vbox(27.0+0.0)x0.0, glue set 5.0fil +.\mark{0-3} +.\glue(\splittopskip) 0.0 +.\vbox(19.0+0.0)x0.0 +.\marks3{3-3} +.\glue 3.0 plus 1.0fil + +! OK. +l.495 \1 \showbox1 + \showbox0 + +> \box0= +\vbox(70.0+0.0)x10.0 +.\glue(\splittopskip) 0.0 +.\vbox(30.0+0.0)x0.0 +.\glue 0.0 plus 1.0fil +.\penalty 0 +.\glue 40.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x10.0 + +! OK. +l.495 \1 \showbox1 \showbox0 + + + +Current marks: + \splitfirstmarks 0=. + \splitbotmarks 0=. + \splitfirstmarks 1=. + \splitbotmarks 1=. + \splitfirstmarks 3=. + \splitbotmarks 3=. +> \box1= +\vbox(37.0+0.0)x0.0, glue set 7.0fil +.\glue(\splittopskip) 0.0 +.\vbox(30.0+0.0)x0.0 +.\glue 0.0 plus 1.0fil + +! OK. +l.497 \1 \showbox1 + \showbox0 + +> \box0= +\vbox(0.0+0.0)x10.0 +.\glue(\splittopskip) 0.0 +.\hbox(0.0+0.0)x10.0 + +! OK. +l.497 \1 \showbox1 \showbox0 + + + +Current marks: + \topmarks 0=. + \firstmarks 0=. + \botmarks 0=. + \topmarks 1=. + \firstmarks 1=. + \botmarks 1=. + \topmarks 3=. + \firstmarks 3=. + \botmarks 3=. + +Current marks: + \topmarks 0=. + \firstmarks 0=0-1. + \botmarks 0=0-2. + \topmarks 1=. + \firstmarks 1=1-1. + \botmarks 1=1-1. + \topmarks 3=. + \firstmarks 3=. + \botmarks 3=. +> \box255= +\vbox(35.0+0.0)x0.0, glue set 21.0fil +.\mark{0-1} +.\marks1{1-1} +.\glue(\topskip) 0.0 +.\vbox(9.0+0.0)x0.0 +.\mark{0-2} +.\marks3{} +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +.\glue 5.0 +.\glue 0.0 plus 1.0fil + +! OK. +<output> {\1 \showbox 255 + \setbox 0=\box 255} +l.500 ...s3{}\vfil\penalty-10000 + + + +Current marks: + \topmarks 0=0-2. + \firstmarks 0=0-3. + \botmarks 0=0-3. + \topmarks 1=1-1. + \firstmarks 1=1-1. + \botmarks 1=1-1. + \topmarks 3=. + \firstmarks 3=3-3. + \botmarks 3=3-3. +> \box255= +\vbox(35.0+0.0)x0.0, glue set 13.0fil +.\mark{0-3} +.\glue(\topskip) 0.0 +.\vbox(19.0+0.0)x0.0 +.\marks3{3-3} +.\glue 3.0 plus 1.0fil + +! OK. +<output> {\1 \showbox 255 + \setbox 0=\box 255} +l.500 ...s3{}\vfil\penalty-10000 + + + +Current marks: + \topmarks 0=0-3. + \firstmarks 0=0-3. + \botmarks 0=0-3. + \topmarks 1=1-1. + \firstmarks 1=1-1. + \botmarks 1=1-1. + \topmarks 3=3-3. + \firstmarks 3=3-3. + \botmarks 3=3-3. +> \box255= +\vbox(35.0+0.0)x0.0, glue set 5.0fil +.\glue(\topskip) 0.0 +.\vbox(30.0+0.0)x0.0 +.\glue 0.0 plus 1.0fil + +! OK. +<output> {\1 \showbox 255 + \setbox 0=\box 255} +l.500 ...s3{}\vfil\penalty-10000 + + + +Current marks: + \topmarks 0=0-3. + \firstmarks 0=. + \botmarks 0=. + \topmarks 1=1-1. + \firstmarks 1=. + \botmarks 1=. + \topmarks 3=3-3. + \firstmarks 3=. + \botmarks 3=. +> \box255= +\vbox(35.0+0.0)x10.0, glue set 35.0fil +.\glue(\topskip) 0.0 +.\hbox(0.0+0.0)x10.0 +.\mark{} +.\marks1{} +.\marks3{} +.\glue 0.0 plus 1.0fil + +! OK. +<output> {\1 \showbox 255 + \setbox 0=\box 255} +l.500 ...s3{}\vfil\penalty-10000 + + + +Current marks: + \topmarks 0=. + \firstmarks 0=. + \botmarks 0=. + \topmarks 1=. + \firstmarks 1=. + \botmarks 1=. + \topmarks 3=. + \firstmarks 3=. + \botmarks 3=. +> \box255= +\vbox(35.0+0.0)x0.0, glue set 35.0fil +.\glue(\topskip) 0.0 +.\hbox(0.0+0.0)x0.0 +.\mark{} +.\marks1{} +.\marks3{} +.\glue 0.0 plus 1.0fil + +! OK. +<output> {\1 \showbox 255 + \setbox 0=\box 255} +l.501 ...s3{}\vfil\penalty-10000 + + + +Current marks: + \topmarks 0=. + \firstmarks 0=. + \botmarks 0=. + \topmarks 1=. + \firstmarks 1=. + \botmarks 1=. + \topmarks 3=. + \firstmarks 3=. + \botmarks 3=. +> \box255= +\vbox(35.0+0.0)x0.0, glue set 35.0fil +.\glue(\topskip) 0.0 +.\hbox(0.0+0.0)x0.0 +.\glue 0.0 plus 1.0fil + +! OK. +<output> {\1 \showbox 255 + \setbox 0=\box 255} +l.502 ...x{}\vfil\penalty-10000 + % reclaim sparse array memory! + +Checking \middle: +! Missing $ inserted. +<inserted text> + $ +... +l.511 \setbox0=\vbox{\middle + \par \right \par} % <== 8 errors +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +! Missing delimiter (. inserted). +<to be read again> + \par +l.511 ...box0=\vbox{\middle \par + \right \par} % <== 8 errors +I was expecting to see something like `(' or `\{' or +`\}' here. If you typed, e.g., `{' instead of `\{', you +should probably delete the `{' by typing `1' now, so that +braces don't get unbalanced. Otherwise just proceed. +Acceptable delimiters are characters whose \delcode is +nonnegative, or you can use `\delimiter <delimiter code>'. + +! Extra \middle. +<to be read again> + \par +l.511 ...box0=\vbox{\middle \par + \right \par} % <== 8 errors +I'm ignoring a \middle that had no matching \left. + +! Missing $ inserted. +<inserted text> + $ +... +l.511 ...box0=\vbox{\middle \par + \right \par} % <== 8 errors +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +! Missing $ inserted. +<inserted text> + $ +... +l.511 ...box{\middle \par \right + \par} % <== 8 errors +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +! Missing delimiter (. inserted). +<to be read again> + \par +l.511 ...middle \par \right \par + } % <== 8 errors +I was expecting to see something like `(' or `\{' or +`\}' here. If you typed, e.g., `{' instead of `\{', you +should probably delete the `{' by typing `1' now, so that +braces don't get unbalanced. Otherwise just proceed. +Acceptable delimiters are characters whose \delcode is +nonnegative, or you can use `\delimiter <delimiter code>'. + +! Extra \right. +<to be read again> + \par +l.511 ...middle \par \right \par + } % <== 8 errors +I'm ignoring a \right that had no matching \left. + +! Missing $ inserted. +<inserted text> + $ +... +l.511 ...middle \par \right \par + } % <== 8 errors +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + + +### math mode entered at line 522 +\mathord +.\fam1 r +this will be denominator of: +\fraction, thickness = default +\\left"161361 +\\mathord +\.\fam1 p +\\middle"142342 +\\mathord +\.\fam1 q +\\middle"142342 +\\mathord +\.\fam1 q +### math mode entered at line 519 +\left"161361 +\mathord +.\fam1 p +\middle"142342 +\mathord +.\fam1 q +\middle"142342 +\mathord +.\fam1 q +### math mode entered at line 515 +\mathord +.\fam1 r +this will be denominator of: +\fraction, thickness = default +\\left"161361 +\\mathord +\.\fam1 q +### math mode entered at line 514 +\left"161361 +\mathord +.\fam1 p +### math mode entered at line 513 +### restricted horizontal mode entered at line 512 +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.523 ... \over r\showlists + + + +### math mode entered at line 519 +\left"161361 +\mathord +.\fam1 p +\middle"142342 +\mathord +.\fam1 q +\middle"142342 +\mathord +.\fam1 q +\mathinner +.\left"161361 +.\mathord +..\fam1 p +.\middle"142342 +.\mathord +..\fam1 q +.\middle"142342 +.\fraction, thickness = default +.\\mathord +.\.\fam1 q +./\mathord +./.\fam1 r +.\right"162362 +### math mode entered at line 515 +\mathord +.\fam1 r +this will be denominator of: +\fraction, thickness = default +\\left"161361 +\\mathord +\.\fam1 q +### math mode entered at line 514 +\left"161361 +\mathord +.\fam1 p +### math mode entered at line 513 +### restricted horizontal mode entered at line 512 +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.524 ... \right]\showlists + + + +### math mode entered at line 515 +\mathord +.\fam1 r +\mathinner +.\left"161361 +.\mathord +..\fam1 p +.\middle"142342 +.\mathord +..\fam1 q +.\middle"142342 +.\mathord +..\fam1 q +.\mathinner +..\left"161361 +..\mathord +...\fam1 p +..\middle"142342 +..\mathord +...\fam1 q +..\middle"142342 +..\fraction, thickness = default +..\\mathord +..\.\fam1 q +../\mathord +../.\fam1 r +..\right"162362 +.\right"162362 +this will be denominator of: +\fraction, thickness = default +\\left"161361 +\\mathord +\.\fam1 q +### math mode entered at line 514 +\left"161361 +\mathord +.\fam1 p +### math mode entered at line 513 +### restricted horizontal mode entered at line 512 +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.525 ... \right]\showlists + + + +### math mode entered at line 514 +\left"161361 +\mathord +.\fam1 p +\mathinner +.\left"161361 +.\fraction, thickness = default +.\\mathord +.\.\fam1 q +./\mathord +./.\fam1 r +./\mathinner +./.\left"161361 +./.\mathord +./..\fam1 p +./.\middle"142342 +./.\mathord +./..\fam1 q +./.\middle"142342 +./.\mathord +./..\fam1 q +./.\mathinner +./..\left"161361 +./..\mathord +./...\fam1 p +./..\middle"142342 +./..\mathord +./...\fam1 q +./..\middle"142342 +./..\fraction, thickness = default +./..\\mathord +./..\.\fam1 q +./../\mathord +./../.\fam1 r +./..\right"162362 +./.\right"162362 +.\right"162362 +### math mode entered at line 513 +### restricted horizontal mode entered at line 512 +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.526 \right]\showlists + + + +### math mode entered at line 513 +\mathinner +.\left"161361 +.\mathord +..\fam1 p +.\mathinner +..\left"161361 +..\fraction, thickness = default +..\\mathord +..\.\fam1 q +../\mathord +../.\fam1 r +../\mathinner +../.\left"161361 +../.\mathord +../..\fam1 p +../.\middle"142342 +../.\mathord +../..\fam1 q +../.\middle"142342 +../.\mathord +../..\fam1 q +../.\mathinner +../..\left"161361 +../..\mathord +../...\fam1 p +../..\middle"142342 +../..\mathord +../...\fam1 q +../..\middle"142342 +../..\fraction, thickness = default +../..\\mathord +../..\.\fam1 q +../../\mathord +../../.\fam1 r +../..\right"162362 +../.\right"162362 +..\right"162362 +.\right"162362 +### restricted horizontal mode entered at line 512 +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.527 \right]\showlists + + + +### restricted horizontal mode entered at line 512 +\mathon +\hbox(30.99977+16.99977)x80.99994 +.\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +..\bigtrip a +.\trip p +.\glue(\thinmuskip) 4.99988 plus 0.99997 +.\hbox(30.99977+16.99977)x63.00005 +..\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +...\bigtrip a +..\hbox(8.5+16.49994)x50.00003 +...\hbox(0.0+0.0)x0.0, shifted -7.0 +...\vbox(8.5+16.49994)x50.00003 +....\hbox(0.0+0.0)x50.00003, glue set 25.00002fil +.....\glue 0.0 plus 1.0fil minus 1.0fil +.....\trip q +.....\glue 0.0 plus 1.0fil minus 1.0fil +....\kern1.0 +....\rule(1.0+0.0)x* +....\kern1.0 +....\hbox(17.99997+3.99997)x50.00003 +.....\trip r +.....\hbox(17.99997+3.99997)x50.00003 +......\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +.......\bigtrip a +......\trip p +......\hbox(16.0+4.00002)x6.0, shifted -1.0 +.......\bigtrip B +......\trip q +......\hbox(16.0+4.00002)x6.0, shifted -1.0 +.......\bigtrip B +......\trip q +......\hbox(17.0+3.00002)x25.00002 +.......\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +........\bigtrip a +.......\trip p +.......\hbox(16.0+4.00002)x6.0, shifted -1.0 +........\bigtrip B +.......\trip q +.......\hbox(16.0+4.00002)x6.0, shifted -1.0 +........\bigtrip B +.......\hbox(8.5+2.0)x0.0 +........\hbox(0.0+0.0)x0.0, shifted -7.0 +........\vbox(8.5+2.0)x0.0 +.........\hbox(0.0+0.0)x0.0 +..........\trip q +.........\kern1.0 +.........\rule(1.0+0.0)x* +.........\kern8.5 +.........\hbox(0.0+0.0)x0.0 +..........\trip r +........\hbox(0.0+0.0)x0.0, shifted -7.0 +.......\vbox(7.0+11.0)x7.0, shifted -9.0 +........\hbox(7.0+1.0)x3.0 +.........\trip A +........\hbox(8.0+2.0)x3.0 +.........\trip B +......\vbox(-1.00002+22.99995)x7.0, shifted -18.99998 +.......\hbox(-1.00002+2.0)x7.0 +........\trip ^^@ +.......\hbox(-1.00002+2.0)x7.0 +........\trip ^^@ +.......\hbox(7.0+1.0)x3.0 +........\trip A +.......\hbox(-1.00002+2.0)x7.0 +........\trip ^^@ +.......\hbox(-1.00002+2.0)x7.0 +........\trip ^^@ +.......\hbox(8.0+2.0)x3.0 +........\trip B +...\hbox(0.0+0.0)x0.0, shifted -7.0 +..\vbox(-1.00002+48.99956)x7.0, shifted -31.99979 +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(7.0+1.0)x3.0 +....\trip A +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(-1.00002+2.0)x7.0 +....\trip ^^@ +...\hbox(8.0+2.0)x3.0 +....\trip B +.\vbox(-1.00002+48.99956)x7.0, shifted -31.99979 +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(7.0+1.0)x3.0 +...\trip A +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(8.0+2.0)x3.0 +...\trip B +\mathoff +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.528 $\showlists + + + +### restricted horizontal mode entered at line 530 +\mathon +\hbox(17.0+3.00002)x19.00002 +.\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +..\bigtrip a +.\hbox(16.0+4.00002)x6.0, shifted -1.0 +..\bigtrip B +.\trip p +.\hbox(0.0+0.0)x0.0, shifted -16.5 +.\vbox(-1.00002+20.99998)x7.0, shifted -18.0 +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(7.0+1.0)x3.0 +...\trip A +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(8.0+2.0)x3.0 +...\trip B +\mathoff +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.532 ...box{}\right]$\showlists + } + + +### restricted horizontal mode entered at line 533 +\mathon +\hbox(17.99997+3.99997)x19.00002 +.\hbox(14.00002+2.0)x6.00002, shifted -0.99998 +..\bigtrip a +.\hbox(0.0+0.0)x0.0, shifted 3.0 +.\hbox(16.0+4.00002)x6.0, shifted -1.0 +..\bigtrip B +.\trip s +.\vbox(-1.00002+22.99995)x7.0, shifted -18.99998 +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(7.0+1.0)x3.0 +...\trip A +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(-1.00002+2.0)x7.0 +...\trip ^^@ +..\hbox(8.0+2.0)x3.0 +...\trip B +\mathoff +spacefactor 1000 +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +l.535 \right]$\showlists + } + +Checking TeX--XeT enhancements: + +\endL or \endR problem (0 missing, 1 extra) in paragraph at lines 548--5 +48 +[][][][][][] + +\hbox(0.0+0.0)x10.0, glue set 3.5fil +.\hbox(0.0+0.0)x0.5 +.\beginL +.\beginR +.\kern 3.0 +.\penalty 0 +.\hbox(0.0+0.0)x0.0 +.\kern 3.0 +.\kern 0.0 +.\endR +.\endL +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fil +.\glue(\rightskip) 0.0 + + +\endL or \endR problem (0 missing, 2 extra) in paragraph at lines 549--5 +49 +[] + +\hbox(0.0+0.0)x10.0, glue set 5.5fil +.\hbox(0.0+0.0)x0.5 +.\kern 0.0 +.\kern 4.0 +.\kern 0.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fil +.\glue(\rightskip) 0.0 + +> \box0= +\vbox(0.0+0.0)x10.0 +.\hbox(0.0+0.0)x10.0, glue set 8.5fil +..\hbox(0.0+0.0)x0.5 +..\beginL +..\kern 1.0 +..\penalty 10000 +..\glue(\parfillskip) 0.0 plus 1.0fil +..\endL +..\glue(\rightskip) 0.0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x10.0, glue set 7.5fil +..\hbox(0.0+0.0)x0.5 +..\beginR +..\kern 2.0 +..\penalty 10000 +..\glue(\parfillskip) 0.0 plus 1.0fil +..\endR +..\glue(\rightskip) 0.0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x10.0, glue set 3.5fil +..\hbox(0.0+0.0)x0.5 +..\beginL +..\beginR +..\kern 3.0 +..\penalty 0 +..\hbox(0.0+0.0)x0.0 +..\kern 3.0 +..\kern 0.0 +..\endR +..\endL +..\penalty 10000 +..\glue(\parfillskip) 0.0 plus 1.0fil +..\glue(\rightskip) 0.0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x10.0, glue set 5.5fil +..\hbox(0.0+0.0)x0.5 +..\kern 0.0 +..\kern 4.0 +..\kern 0.0 +..\penalty 10000 +..\glue(\parfillskip) 0.0 plus 1.0fil +..\glue(\rightskip) 0.0 + +! OK. +l.550 \showbox0 + + +Checking optimized \aftergroup: +! Undefined control sequence. +<to be read again> \x + }{\relax +l.562 ...roup{\aftergroup\relax} + } +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +Checking \showifs, \currentiftype, \currentiflevel, and \currentifbranch +: +\currentifbranch OK +current if level (l.581): 0 +current if level (l.582): 1 +current if level (l.583): 2 +current if type (l.601): \if!NONE +current if branch (l.601): no branch +current if type (l.602): \if +current if branch (l.602): true branch +current if type (l.602): \unless\if +current if branch (l.602): false branch +current if type (l.603): \if +current if branch (l.603): false branch +current if type (l.603): \unless\if +current if branch (l.603): true branch +current if type (l.604): \ifcat +current if branch (l.604): true branch +current if type (l.604): \unless\ifcat +current if branch (l.604): false branch +current if type (l.605): \ifcat +current if branch (l.605): false branch +current if type (l.605): \unless\ifcat +current if branch (l.605): true branch +current if type (l.606): \ifnum +current if branch (l.606): true branch +current if type (l.606): \unless\ifnum +current if branch (l.606): true branch +current if type (l.607): \ifdim +current if branch (l.607): false branch +current if type (l.607): \unless\ifdim +current if branch (l.607): true branch +current if type (l.608): \ifodd +current if branch (l.608): true branch +current if type (l.608): \unless\ifodd +current if branch (l.608): false branch +current if type (l.610): \ifvmode +current if branch (l.610): true branch +current if type (l.610): \unless\ifvmode +current if branch (l.610): false branch +current if type (l.613): \ifhmode +current if branch (l.613): true branch +current if type (l.613): \unless\ifhmode +current if branch (l.613): false branch +current if type (l.615): \ifmmode +current if branch (l.615): true branch +current if type (l.615): \unless\ifmmode +current if branch (l.615): false branch +current if type (l.617): \ifinner +current if branch (l.617): true branch +current if type (l.619): \unless\ifinner +current if branch (l.619): true branch +current if type (l.620): \ifvoid +current if branch (l.620): true branch +current if type (l.620): \unless\ifvoid +current if branch (l.620): true branch +current if type (l.621): \ifhbox +current if branch (l.621): true branch +current if type (l.621): \unless\ifhbox +current if branch (l.621): true branch +current if type (l.622): \ifvbox +current if branch (l.622): true branch +current if type (l.622): \unless\ifvbox +current if branch (l.622): true branch +current if type (l.623): \ifx +current if branch (l.623): false branch +current if type (l.623): \unless\ifx +current if branch (l.623): true branch +current if type (l.624): \ifeof +current if branch (l.624): true branch +current if type (l.624): \unless\ifeof +current if branch (l.624): false branch +current if type (l.625): \iftrue +current if branch (l.625): true branch +current if type (l.625): \unless\iftrue +current if branch (l.625): false branch +current if type (l.626): \iffalse +current if branch (l.626): false branch +current if type (l.626): \unless\iffalse +current if branch (l.626): true branch +current if type (l.627): \ifcase +current if branch (l.627): true branch +current if type (l.627): \ifcase +current if branch (l.627): false branch +current if type (l.628): \ifdefined +current if branch (l.628): true branch +current if type (l.628): \unless\ifdefined +current if branch (l.628): true branch +current if type (l.629): \ifcsname +current if branch (l.629): true branch +current if type (l.630): \unless\ifcsname +current if branch (l.630): true branch +current if type (l.631): \iffontchar +current if branch (l.631): true branch +current if type (l.631): \unless\iffontchar +current if branch (l.631): true branch +{math mode: \ifcsname: (level 41) entered on line 647} +{\unless\ifcsname: (level 42) entered on line 647} +{\iffontchar: (level 43) entered on line 648} +{\unless\iffontchar: (level 44) entered on line 648} + +### level 44: \unless\iffontchar entered on line 648 +### level 43: \iffontchar entered on line 648 +### level 42: \unless\ifcsname entered on line 647 +### level 41: \ifcsname entered on line 647 +### level 40: \unless\ifdefined entered on line 645 +### level 39: \ifdefined entered on line 645 +### level 38: \ifcase\else entered on line 644 +### level 37: \ifcase entered on line 644 +### level 36: \unless\iffalse entered on line 643 +### level 35: \iffalse\else entered on line 643 +### level 34: \unless\iftrue\else entered on line 643 +### level 33: \iftrue entered on line 643 +### level 32: \unless\ifx entered on line 642 +### level 31: \ifx\else entered on line 642 +### level 30: \unless\ifeof\else entered on line 641 +### level 29: \ifeof entered on line 641 +### level 28: \unless\ifvbox entered on line 641 +### level 27: \ifvbox entered on line 641 +### level 26: \unless\ifhbox entered on line 640 +### level 25: \ifhbox entered on line 640 +### level 24: \unless\ifvoid entered on line 640 +### level 23: \ifvoid entered on line 640 +### level 22: \unless\ifinner\else entered on line 639 +### level 21: \ifinner entered on line 639 +### level 20: \unless\ifmmode\else entered on line 639 +### level 19: \ifmmode entered on line 639 +### level 18: \unless\ifhmode\else entered on line 638 +### level 17: \ifhmode entered on line 638 +### level 16: \unless\ifvmode\else entered on line 637 +### level 15: \ifvmode entered on line 637 +### level 14: \unless\ifodd\else entered on line 636 +### level 13: \ifodd entered on line 636 +### level 12: \unless\ifdim entered on line 635 +### level 11: \ifdim\else entered on line 635 +### level 10: \unless\ifnum entered on line 635 +### level 9: \ifnum entered on line 635 +### level 8: \unless\ifcat entered on line 634 +### level 7: \ifcat\else entered on line 634 +### level 6: \unless\ifcat\else entered on line 634 +### level 5: \ifcat entered on line 634 +### level 4: \unless\if entered on line 633 +### level 3: \if\else entered on line 633 +### level 2: \unless\if\else entered on line 633 +### level 1: \if entered on line 633 + +! OK. +l.649 \showifs + % <== show 44 nested ifs + +{\fi: \unless\iffontchar (level 44) entered on line 648} +{\fi: \iffontchar (level 43) entered on line 648} +{\fi: \unless\ifcsname (level 42) entered on line 647} +{\fi: \ifcsname (level 41) entered on line 647} +Checking \iffontchar, \fontcharwd, etc.: +! Missing font identifier. +<to be read again> + \relax +... +l.672 \iffontchar \else + \fi % <== missing font identifie... +I was looking for a control sequence whose +current meaning has been defined by \font. + +! Missing number, treated as zero. +<to be read again> + \relax +... +l.672 \iffontchar \else + \fi % <== missing font identifie... +A number should have been here; I inserted `0'. +(If you can't figure out why I needed to see a number, +look up `weird error' in the index to The TeXbook.) + +! Bad character code (-1). +l.673 ...ffontchar\textfont2 -1 + \else \fi % <== bad charac... +A character number must be between 0 and 255. +I changed this one to zero. + +! Bad character code (256). +l.674 \iffontchar\font 256 + \else \fi % <== bad character... +A character number must be between 0 and 255. +I changed this one to zero. + +! You can't use `\fontcharwd' in vertical mode. +l.675 \fontcharwd + \fontcharht \fontchardp \fontcharic % ... +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\fontcharht' in vertical mode. +l.675 \fontcharwd \fontcharht + \fontchardp \fontcharic % ... +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\fontchardp' in vertical mode. +l.675 ...\fontcharht \fontchardp + \fontcharic % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\fontcharic' in vertical mode. +l.675 ...\fontchardp \fontcharic + % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +Font \font character A: wd=2.0pt ht=7.0pt dp=1.0pt ic=1.0pt +Font \textfont1 character B: wd=3.0pt ht=8.0pt dp=2.0pt +Font \scriptfont2 character B: wd=1.5pt ht=4.0pt dp=1.0pt +Font \scriptscriptfont3 character B: wd=6.0pt ht=16.0pt dp=4.00002pt +Font \trip character 7: +Font \trip character D does not exist +Font \nullfont character D does not exist +Font \font has 23 characters. +Font \trip has 23 characters. +Font \nullfont has 0 characters. +Checking \parshapelength, \parshapeindent, and \parshapedimen: +! You can't use `\parshapelength' in vertical mode. +l.699 \parshapelength + \parshapeindent \parshapedimen % <... +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\parshapeindent' in vertical mode. +l.699 ...elength \parshapeindent + \parshapedimen % <== can'... +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\parshapedimen' in vertical mode. +l.699 ...peindent \parshapedimen + % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +Parshape test 1 OK +Parshape test 2 OK +Parshape test 3 OK +Parshape test 4 OK +Checking \numexpr, \dimexpr, \glueexpr, and \muexpr: +! You can't use `\numexpr' in vertical mode. +l.763 \numexpr + \dimexpr \glueexpr \muexpr % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\dimexpr' in vertical mode. +l.763 \numexpr \dimexpr + \glueexpr \muexpr % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\glueexpr' in vertical mode. +l.763 ...expr \dimexpr \glueexpr + \muexpr % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\muexpr' in vertical mode. +l.763 ...mexpr \glueexpr \muexpr + % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! Missing ) inserted for expression. +<to be read again> + \9 +l.765 ...unt43=\numexpr ( ( 2 \9 + \dimen43=\dimexpr ... +I was expecting to see `+', `-', `*', `/', or `)'. Didn't. + +! Missing ) inserted for expression. +<to be read again> + \9 +l.765 ...unt43=\numexpr ( ( 2 \9 + \dimen43=\dimexpr ... +I was expecting to see `+', `-', `*', `/', or `)'. Didn't. + +! Missing ) inserted for expression. +<to be read again> + \9 +l.765 ...men43=\dimexpr ( 3pt \9 + +I was expecting to see `+', `-', `*', `/', or `)'. Didn't. + +\numexpr \count 43=2 +\dimexpr \dimen 43=3.0pt +\glueexpr \skip 43=4.0pt plus 3.0fil +\muexpr \muskip 43=5.0mu minus 1.0mu +{into \tracingassigns=5} +{changing \count44=0} +{into \count44=2147483647} +{changing \dimen44=0.0pt} +{into \dimen44=16383.99998pt} +{changing \count44=2147483647} +{into \count44=-2147483647} +{changing \dimen44=16383.99998pt} +{into \dimen44=-16383.99998pt} +{changing \count44=-2147483647} +{into \count44=2147450880} +{changing \dimen44=-16383.99998pt} +{into \dimen44=16383.5pt} +{changing \skip44=0.0pt} +{into \skip44=16383.99998pt} +{changing \skip44=16383.99998pt} +{into \skip44=16384.0pt} +! Dimension too large. +l.778 \dimen45=\skip44 + \dimen45=\dimexpr... +I can't work with sizes bigger than about 19 feet. +Continue and I'll use the largest value I can. + +{changing \dimen45=0.0pt} +{into \dimen45=16383.99998pt} +! Arithmetic overflow. +<recently read> \9 + +l.778 ...5=\dimexpr1sp*\skip44\9 + +I can't evaluate this expression, +since the result is out of range. + +{changing \dimen45=16383.99998pt} +{into \dimen45=0.0pt} +{changing \dimen44=16383.5pt} +{into \dimen44=-16383.99998pt} +{changing \dimen44=-16383.99998pt} +{into \dimen44=-16384.0pt} +! Dimension too large. +l.780 \dimen45=\skip44 + \dimen45=\dimexpr... +I can't work with sizes bigger than about 19 feet. +Continue and I'll use the largest value I can. + +{changing \dimen45=0.0pt} +{into \dimen45=16383.99998pt} +! Arithmetic overflow. +<recently read> \9 + +l.780 ...5=\dimexpr1sp*\skip44\9 + +I can't evaluate this expression, +since the result is out of range. + +{changing \dimen45=16383.99998pt} +{into \dimen45=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.781 ...4=\numexpr"7FFFFFFE+2\9 + \dimen44=\dimexpr"3FFFFFF... +I can't evaluate this expression, +since the result is out of range. + +{changing \count44=2147450880} +{into \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.781 ...imexpr"3FFFFFFEsp+2sp\9 + +I can't evaluate this expression, +since the result is out of range. + +{changing \dimen44=-16384.0pt} +{into \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.782 ...=\numexpr-"7FFFFFFE-2\9 + \dimen44=\dimexpr-"3FFFFFF... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.782 ...mexpr-"3FFFFFFEsp-2sp\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.783 ...=\numexpr"10000*"8000\9 + \dimen44=\dimexpr"8000sp*"... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.783 ...\dimexpr"8000sp*"8000\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.784 ...\numexpr"10000*-"8000\9 + \dimen44=\dimexpr"8000sp*-"... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.784 ...dimexpr"8000sp*-"8000\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.785 ...\numexpr-"10000*"8000\9 + \dimen44=\dimexpr-"8000sp*"... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.785 ...dimexpr-"8000sp*"8000\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.786 ...numexpr-"10000*-"8000\9 + \dimen44=\dimexpr-"8000sp*-"... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.786 ...imexpr-"8000sp*-"8000\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.787 \count44=\numexpr0/0\9 + \dimen44=\dimexpr... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.787 ...dimen44=\dimexpr0pt/0\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.788 \count44=\numexpr1/0\9 + \dimen44=\dimexpr... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.788 ...dimen44=\dimexpr1pt/0\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +! Arithmetic overflow. +<recently read> \9 + +l.789 ...\count44=\numexpr-1/0\9 + \dimen44=\dimexpr-... +I can't evaluate this expression, +since the result is out of range. + +{reassigning \count44=0} +! Arithmetic overflow. +<recently read> \9 + +l.789 ...imen44=\dimexpr-1pt/0\9 + +I can't evaluate this expression, +since the result is out of range. + +{reassigning \dimen44=0.0pt} +{into \tracingassigns=5} +{changing \skip93=0.0pt} +{into \skip93=3.0pt minus 1.0fil} +{changing \skip93=3.0pt minus 1.0fil} +{into \skip93=3.0pt minus 1.0fil} +{changing \skip93=3.0pt minus 1.0fil} +{into \skip93=3.0pt minus 1.0fil} +{reassigning \skip93=3.0pt minus 1.0fil} +{changing \skip93=3.0pt minus 1.0fil} +{into \skip93=3.0pt plus 1.0fil} +{changing \skip93=3.0pt plus 1.0fil} +{into \skip93=3.0pt plus 1.0fil} +{reassigning \skip93=3.0pt plus 1.0fil} +{changing \skip93=3.0pt plus 1.0fil} +{into \skip93=2.0pt plus -1.0fil minus 1.0fil} +{changing \skip93=2.0pt plus -1.0fil minus 1.0fil} +{into \skip93=2.0pt plus -1.0fil minus 1.0fil} +{reassigning \skip93=2.0pt plus -1.0fil minus 1.0fil} +{changing \skip93=2.0pt plus -1.0fil minus 1.0fil} +{into \skip93=0.0pt plus 1.0fil minus 1.0fil} +{changing \skip93=0.0pt plus 1.0fil minus 1.0fil} +{into \skip93=1.0pt plus 2.0fil minus 1.0fil} +{changing \skip93=1.0pt plus 2.0fil minus 1.0fil} +{into \skip93=5.0pt minus 1.0fil} +Expr quotient rounding 1 OK +Expr quotient rounding 2 OK +Expr quotient rounding 3 OK +Expr quotient rounding 4 OK +! Incompatible glue units. +<recently read> \9 + +... +l.829 \15{32}{5}{6} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<to be read again> + p +... +l.829 \15{32}{5}{6} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<recently read> \relax + +... +l.829 \15{32}{5}{6} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +Expr quotient rounding 5 OK +! Incompatible glue units. +<recently read> \9 + +... +l.830 \16{33}{5}{7} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<to be read again> + p +... +l.830 \16{33}{5}{7} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<recently read> \relax + +... +l.830 \16{33}{5}{7} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +Expr quotient rounding 6 OK +! Incompatible glue units. +<recently read> \9 + +... +l.831 \17{25}{4}{6} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<to be read again> + p +... +l.831 \17{25}{4}{6} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<recently read> \relax + +... +l.831 \17{25}{4}{6} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +Expr quotient rounding 7 OK +! Incompatible glue units. +<recently read> \9 + +... +l.832 \18{26}{4}{7} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<to be read again> + p +... +l.832 \18{26}{4}{7} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +<recently read> \relax + +... +l.832 \18{26}{4}{7} + % <== three mu_error's (! Incompatibl... +I'm going to assume that 1mu=1pt when they're mixed. + +Expr quotient rounding 8 OK +Expr fraction rounding 1 OK +Expr fraction rounding 2 OK +! Arithmetic overflow. +<to be read again> + = +\1...\fi \ifdim \dimexpr 1sp*#6= + \dimexpr (#3sp)*(#4)/(#5)\els... +l.860 ...1 "7FFFFFFF 2 "40000000 + +I can't evaluate this expression, +since the result is out of range. + +! Arithmetic overflow. +<inserted text> \relax + +<to be read again> + \else +\1...expr (#3sp)*(#4)/(#5)\else + \2#2 \fi +l.860 ...1 "7FFFFFFF 2 "40000000 + +I can't evaluate this expression, +since the result is out of range. + +Expr fraction rounding 3 OK +[1] +Memory usage before: 51&320; after: 44&320; still untouched: 680 +[1] +Memory usage before: 51&320; after: 44&320; still untouched: 680 +Checking \mutoglue and \gluetomu: +! You can't use `\mutoglue' in vertical mode. +l.903 \mutoglue + \gluetomu % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\gluetomu' in vertical mode. +l.903 \mutoglue \gluetomu + % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! Incompatible glue units. +l.905 ...kip2=\gluetomu\muskip1 + % <== two mu_error's (! Inco... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +l.905 ...kip2=\gluetomu\muskip1 + % <== two mu_error's (! Inco... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +l.906 ...uskip2=\mutoglue\skip1 + % <== two mu_error's (! Inco... +I'm going to assume that 1mu=1pt when they're mixed. + +! Incompatible glue units. +l.906 ...uskip2=\mutoglue\skip1 + % <== two mu_error's (! Inco... +I'm going to assume that 1mu=1pt when they're mixed. + +{into \tracingassigns=1} +{changing \skip1=9.0pt} +{into \skip1=1.0pt plus -2.0pt minus -3.0fil} +{changing \muskip1=9.0mu} +{into \muskip1=1.0mu plus -2.0mu minus -3.0fil} +{changing \skip2=9.0pt} +{into \skip2=-4.0pt plus 5.0fill minus 6.0filll} +{changing \muskip2=9.0mu} +{into \muskip2=-4.0mu plus 5.0fill minus 6.0filll} +{changing \skip3=0.0pt} +{into \skip3=-1.0pt plus 2.0pt minus 3.0fil} +{changing \muskip3=0.0mu} +{into \muskip3=-1.0mu plus 2.0mu minus 3.0fil} +{changing \skip4=0.0pt} +{into \skip4=4.0pt plus -5.0fill minus -6.0filll} +{changing \muskip4=0.0mu} +{into \muskip4=4.0mu plus -5.0fill minus -6.0filll} +Checking (mu)glue identity: +{changing \1=undefined} +{into \1=\relax} +{changing \1=\relax} +{into \1=\skip32767} +{changing \skip32767=0.0pt} +{into \skip32767=7.0pt} +{changing \2=undefined} +{into \2=\relax} +{changing \2=\relax} +{into \2=\muskip32766} +{changing \muskip32766=0.0mu} +{into \muskip32766=7.0mu} +{changing \tracingassigns=1} +{into \tracingassigns=458752} +{reassigning \skip32767=7.0pt} +{reassigning \muskip32766=7.0mu} +{changing \tracingassigns=458752} +Checking \gluestretchorder, \glueshrinkorder, \gluestretch, and \glueshr +ink: +! You can't use `\gluestretchorder' in vertical mode. +l.930 \gluestretchorder + \gluestretch % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\gluestretch' in vertical mode. +l.930 ...retchorder \gluestretch + % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\glueshrinkorder' in vertical mode. +l.931 \glueshrinkorder + \glueshrink % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +! You can't use `\glueshrink' in vertical mode. +l.931 ...shrinkorder \glueshrink + % <== can't use +Sorry, but I'm not programmed to handle this case; +I'll just pretend that you didn't ask for it. +If you're in the wrong mode, you might be able to +return to the right one by typing `I}' or `I$' or `I\par'. + +Checking sparse arrays: +! Bad register code (-1). +<to be read again> + \countdef +... +l.968 \2\countdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + \countdef +... +l.968 \2\countdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +\count32767=0. +! Bad register code (-1). +<to be read again> + \dimendef +... +l.969 \2\dimendef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + \dimendef +... +l.969 \2\dimendef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +\dimen32767=0.0pt. +! Bad register code (-1). +<to be read again> + \skipdef +... +l.970 \2\skipdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + \skipdef +... +l.970 \2\skipdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +\skip32767=0.0pt. +! Bad register code (-1). +<to be read again> + \muskipdef +... +l.971 \2\muskipdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + \muskipdef +... +l.971 \2\muskipdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +\muskip32767=0.0mu. +! Bad register code (-1). +<to be read again> + \toksdef +... +l.972 \2\toksdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + \toksdef +... +l.972 \2\toksdef + % Bad register code (-1) ...and (32768). +A register number must be between 0 and 32767. +I changed this one to zero. + +\toks32767=. +> \9=\dimen256. +l.979 ...8 \let\8=\relax \show\9 + + +{restoring \9=undefined} +{restoring \8=undefined} +{restoring \skip22=0.0pt} +{restoring \dimen21=0.0pt} +{restoring \muskip2200=0.0mu} +{restoring \dimen2100=0.0pt} +{restoring \count2000=0} +{restoring \count20=0} +testing count registers ... +{into \tracingassigns=1} +{reassigning \count2000=0} +{restoring \tracingassigns=0} +\count2000=0, + \count2001=5, + \count2002=7, + \count2002=7. +\count2000=5, + \count2002=12, + \count2002=12. +\count2000=50, + \count2002=120, + \count2002=120. +\count2000=10, + \count2002=24, + \count2002=24. +{into \tracingassigns=1} +{globally changing \count2002=24} +{into \count2002=5} +{changing \count2002=5} +{into \count2002=7} +{globally changing \count2002=7} +{into \count2002=0} +{restoring \tracingassigns=0} +{restoring \1=undefined} +{retaining \count2002=0} +{restoring \count2000=0} +{retaining \count2002=0} +{restoring \count2001=0} +testing dimen registers ... +{into \tracingassigns=1} +{reassigning \dimen2000=0.0pt} +{restoring \tracingassigns=0} +\dimen2000=0.0pt, + \dimen2001=2.5pt, + \dimen2002=3.5pt, + \dimen2002=3.5pt. +\dimen2000=2.5pt, + \dimen2002=6.0pt, + \dimen2002=6.0pt. +\dimen2000=25.0pt, + \dimen2002=60.0pt, + \dimen2002=60.0pt. +\dimen2000=5.0pt, + \dimen2002=12.0pt, + \dimen2002=12.0pt. +{into \tracingassigns=1} +{globally changing \dimen2002=12.0pt} +{into \dimen2002=2.5pt} +{changing \dimen2002=2.5pt} +{into \dimen2002=3.5pt} +{globally changing \dimen2002=3.5pt} +{into \dimen2002=0.0pt} +{restoring \tracingassigns=0} +{restoring \1=undefined} +{retaining \dimen2002=0.0pt} +{restoring \dimen2000=0.0pt} +{retaining \dimen2002=0.0pt} +{restoring \dimen2001=0.0pt} +testing skip registers ... +{into \tracingassigns=1} +{reassigning \skip2000=0.0pt} +{restoring \tracingassigns=0} +\skip2000=0.0pt, + \skip2001=2.5pt plus 1.0fil, + \skip2002=3.5pt minus 1.0fill, + \skip2002=3.5pt minus 1.0fill. +\skip2000=2.5pt plus 1.0fil, + \skip2002=6.0pt plus 1.0fil minus 1.0fill, + \skip2002=6.0pt plus 1.0fil minus 1.0fill. +\skip2000=25.0pt plus 10.0fil, + \skip2002=60.0pt plus 10.0fil minus 10.0fill, + \skip2002=60.0pt plus 10.0fil minus 10.0fill. +\skip2000=5.0pt plus 2.0fil, + \skip2002=12.0pt plus 2.0fil minus 2.0fill, + \skip2002=12.0pt plus 2.0fil minus 2.0fill. +{into \tracingassigns=1} +{globally changing \skip2002=12.0pt plus 2.0fil minus 2.0fill} +{into \skip2002=2.5pt plus 1.0fil} +{changing \skip2002=2.5pt plus 1.0fil} +{into \skip2002=3.5pt minus 1.0fill} +{globally changing \skip2002=3.5pt minus 1.0fill} +{into \skip2002=0.0pt} +{restoring \tracingassigns=0} +{restoring \1=undefined} +{retaining \skip2002=0.0pt} +{restoring \skip2000=0.0pt} +{retaining \skip2002=0.0pt} +{restoring \skip2001=0.0pt} +testing muskip registers ... +{into \tracingassigns=1} +{reassigning \muskip2000=0.0mu} +{restoring \tracingassigns=0} +\muskip2000=0.0mu, + \muskip2001=2.5mu plus 1.0fil, + \muskip2002=3.5mu minus 1.0fill, + \muskip2002=3.5mu minus 1.0fill. +\muskip2000=2.5mu plus 1.0fil, + \muskip2002=6.0mu plus 1.0fil minus 1.0fill, + \muskip2002=6.0mu plus 1.0fil minus 1.0fill. +\muskip2000=25.0mu plus 10.0fil, + \muskip2002=60.0mu plus 10.0fil minus 10.0fill, + \muskip2002=60.0mu plus 10.0fil minus 10.0fill. +\muskip2000=5.0mu plus 2.0fil, + \muskip2002=12.0mu plus 2.0fil minus 2.0fill, + \muskip2002=12.0mu plus 2.0fil minus 2.0fill. +{into \tracingassigns=1} +{globally changing \muskip2002=12.0mu plus 2.0fil minus 2.0fill} +{into \muskip2002=2.5mu plus 1.0fil} +{changing \muskip2002=2.5mu plus 1.0fil} +{into \muskip2002=3.5mu minus 1.0fill} +{globally changing \muskip2002=3.5mu minus 1.0fill} +{into \muskip2002=0.0mu} +{restoring \tracingassigns=0} +{restoring \1=undefined} +{retaining \muskip2002=0.0mu} +{restoring \muskip2000=0.0mu} +{retaining \muskip2002=0.0mu} +{restoring \muskip2001=0.0mu} +testing toks registers ... +{into \tracingassigns=1} +{reassigning \toks2000=} +{restoring \tracingassigns=0} +\toks2000=, + \toks2001=a b c, + \toks2002=d e f, + \toks2002=d e f. +{into \tracingassigns=1} +{reassigning \toks20=} +{changing \toks21=} +{into \toks21=a b c} +{changing \toks2100=} +{into \toks2100=d e f} +{changing \toks2002=d e f} +{into \toks2002=} +{changing \toks2002=} +{into \toks2002=a b c} +{reassigning \toks2200=} +{changing \toks2200=} +{into \toks2200=a b c} +{changing \toks2002=a b c} +{into \toks2002=} +{changing \toks2002=} +{into \toks2002=a b c} +{changing \toks2200=a b c} +{into \toks2200=} +{changing \toks2200=} +{into \toks2200=a b c} +{changing \toks30=} +{into \toks30=a b c} +{changing \toks30=a b c} +{into \toks30=} +{changing \toks30=} +{into \toks30=a b c} +{changing \toks3000=} +{into \toks3000=a b c} +{changing \toks3000=a b c} +{into \toks3000=} +{changing \toks3000=} +{into \toks3000=a b c} +{restoring \toks30=} +{restoring \toks3000=} +{restoring \toks2200=} +{restoring \toks2002=d e f} +{restoring \toks2100=} +{restoring \toks21=} +{restoring \tracingassigns=0} +{into \tracingassigns=1} +{globally changing \toks2002=d e f} +{into \toks2002=a b c} +{changing \toks2002=a b c} +{into \toks2002=d e f} +{globally changing \toks2002=d e f} +{into \toks2002=} +{restoring \tracingassigns=0} +{restoring \1=undefined} +{retaining \toks2002=} +{retaining \toks2002=} +{restoring \toks2001=} +testing box registers ... +! Bad mathchar (-1). +<to be read again> + \mathchardef +... +l.1022 \2\mathchardef + % Bad mathchar (-1) ...and (32768). +A mathchar number must be between 0 and 32767. +I changed this one to zero. + +! Bad mathchar (32768). +<to be read again> + \mathchardef +... +l.1022 \2\mathchardef + % Bad mathchar (-1) ...and (32768). +A mathchar number must be between 0 and 32767. +I changed this one to zero. + +\mathchar"7FFF=32767. +! Bad register code (-1). +<to be read again> + = +l.1023 \setbox-1= + \copy32768 % Bad register code (-1) ...and... +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +l.1023 \setbox-1=\copy32768 + % Bad register code (-1) ...and... +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + = +l.1024 \global\setbox32768= + \copy-1 % Bad register code (327... +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (-1). +l.1024 ...l\setbox32768=\copy-1 + % Bad register code (32768) .... +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (32768). +<to be read again> + = +l.1025 \wd32768= + \ht-1 % Bad register code (32768) ...and (-1). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (-1). +l.1025 \wd32768=\ht-1 + % Bad register code (32768) ...and (-1). +A register number must be between 0 and 32767. +I changed this one to zero. + +! Bad register code (-1). +l.1026 \showbox-1 + % Bad register code (-1). +A register number must be between 0 and 32767. +I changed this one to zero. + +> \box0=void + +! OK. +l.1026 \showbox-1 + % Bad register code (-1). + + +### vtop group (level 4) entered at line 1039 (\setbox32103=\vtop to7.0p +t{) +### vbox group (level 3) entered at line 1038 (\global\setbox32102=\vbox + to5.0pt{) +### hbox group (level 2) entered at line 1037 (\setbox32101=\hbox to3.0p +t{) +### semi simple group (level 1) entered at line 1019 (\begingroup) +### bottom level + +! OK. +l.1040 \showgroups + + +{restoring \box32103=void} +> \box32100=void + +! OK. +l.1044 \showbox32100 + + +> \box32101= +\hbox(0.0+0.0)x3.0 + +! OK. +l.1045 \showbox32101 + + +\box32101=\hbox,wd=3.0pt. +\box32102=\vbox,ht=5.0pt. +\box32103=void. +\box32101=\hbox,wd=3.0pt. +\box32103=\hbox,wd=3.0pt. +\box32102=void. +\box32104=\vbox,ht=5.0pt. +\box32101=\hbox,ht=2.0pt,wd=3.0pt. +\box32102=void. +\box32103=\hbox,dp=6.0pt,wd=3.0pt. +\box32104=\vbox,ht=5.0pt,wd=8.0pt. +\box32105=\hbox,ht=1.0pt,wd=5.0pt. +\box32105=\hbox,ht=1.0pt,wd=5.0pt. +\box32105=void. +\box32105=void. +\box32106=\hbox,ht=1.0pt,wd=10.0pt. +\box32105=\vbox,ht=5.0pt,wd=1.0pt. +\box32105=\vbox,ht=5.0pt,wd=1.0pt. +\box32105=void. +\box32105=void. +\box32106=\vbox,ht=10.0pt,wd=1.0pt. +\box32105=\vbox,ht=30.0pt. +\box32106=\vbox,ht=10.0pt. +\box32105=\vbox,ht=20.0pt. +{restoring \box32106=void} +{restoring \box32105=void} +{restoring \box32104=void} +{restoring \box32103=void} +{restoring \box32101=void} +Checking \lastlinefit: +@firstpass +[] [] +@ via @@0 b=371 p=0 d=137641 +@@1: line 1.0 t=137641 -> @@0 +[] +@ via @@0 b=12 p=0 d=144 +@@2: line 1.2 t=144 -> @@0 +[] +@ via @@1 b=371 p=0 d=137641 +@@3: line 2.0 t=275282 -> @@1 +[] +@\par via @@1 b=12 p=-10000 d=144 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=144 -> @@2 + +> \box0= +\vbox(0.0+0.0)x96.0 +.\hbox(0.0+0.0)x96.0, glue set - 0.5 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x96.0, glue set 31.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1079 \lastlinefit=-1 \1 + + +> \box0= +\hbox(0.0+0.0)x96.0, glue set 31.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1079 \lastlinefit=-1 \1 + + +@firstpass +[] [] +@ via @@0 b=371 p=0 d=137641 +@@1: line 1.0 t=137641 s=31.0 g=20.0 -> @@0 +[] +@ via @@0 b=12 p=0 d=144 +@@2: line 1.2 t=144 s=-4.0 g=8.0 -> @@0 +[] +@ via @@1 b=371 p=0 d=137641 +@@3: line 2.0 t=275282 s=31.0 g=20.0 -> @@1 +[] +@\par via @@1 b=12 p=-10000 d=144 +@\par via @@2 b=2 p=-10000 d=4 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=148 s=31.0 a=-1.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x96.0 +.\hbox(0.0+0.0)x96.0, glue set - 0.5 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x96.0, glue set - 0.25 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1080 \lastlinefit=500 \1 + + +> \box0= +\hbox(0.0+0.0)x96.0, glue set - 0.25 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 32.0 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1080 \lastlinefit=500 \1 + + +@firstpass +[] [] +@ via @@0 b=371 p=0 d=137641 +@@1: line 1.0 t=137641 s=31.0 g=20.0 -> @@0 +[] +@ via @@0 b=12 p=0 d=144 +@@2: line 1.2 t=144 s=-4.0 g=8.0 -> @@0 +[] +@ via @@1 b=371 p=0 d=137641 +@@3: line 2.0 t=275282 s=31.0 g=20.0 -> @@1 +[] +@\par via @@1 b=12 p=-10000 d=144 +@\par via @@2 b=12 p=-10000 d=144 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=288 s=31.0 a=-2.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x96.0 +.\hbox(0.0+0.0)x96.0, glue set - 0.5 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x96.0, glue set - 0.5 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1081 \lastlinefit=1001 \1 + + +> \box0= +\hbox(0.0+0.0)x96.0, glue set - 0.5 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 33.0 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1081 \lastlinefit=1001 \1 + + +@firstpass +[] +@ via @@0 b=0 p=0 d=0 +@@1: line 1.2 t=0 -> @@0 +[] +@ via @@0 b=0 p=0 d=0 +@ via @@1 b=0 p=0 d=0 +@@2: line 2.2 t=0 -> @@1 +[] +@ via @@0 b=2 p=0 d=4 +@ via @@1 b=0 p=0 d=0 +@ via @@2 b=0 p=0 d=0 +@@3: line 3.2 t=0 -> @@2 +[] +@ via @@1 b=2 p=0 d=4 +@ via @@2 b=0 p=0 d=0 +@ via @@3 b=0 p=0 d=0 +@@4: line 4.2 t=0 -> @@3 +[] +@\par via @@2 b=2 p=-10000 d=4 +@\par via @@3 b=0 p=-10000 d=0 +@\par via @@4 b=0 p=-10000 d=0 +@@5: line 5.2- t=0 -> @@4 + +> \box0= +\vbox(0.0+0.0)x98.0 +.\hbox(0.0+0.0)x98.0, glue set 68.0fill [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x98.0, glue set 68.0fill [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x98.0, glue set 68.0fill [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x98.0, glue set 68.0fill [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x98.0, glue set 34.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1085 ... \lastlinefit=1000 \1 + + +> \box0= +\hbox(0.0+0.0)x98.0, glue set 34.0fill +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 plus 1.0fill + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1085 ... \lastlinefit=1000 \1 + + +@firstpass +[] [] +@ via @@0 b=449 p=0 d=201601 +@@1: line 1.0 t=201601 s=33.0 g=20.0 -> @@0 +[] +@ via @@0 b=2 p=0 d=4 +@@2: line 1.2 t=4 s=-2.0 g=8.0 -> @@0 +[] +@ via @@1 b=449 p=0 d=201601 +@@3: line 2.0 t=403202 s=33.0 g=20.0 -> @@1 +[] +@\par via @@1 b=2 p=-10000 d=4 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=4 s=33.0 a=-0.5 -> @@2 + +> \box0= +\vbox(0.0+0.0)x98.0 +.\hbox(0.0+0.0)x98.0, glue set - 0.25 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x98.0, glue set - 0.125 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1087 \lastlinefit=500 \1 + + +> \box0= +\hbox(0.0+0.0)x98.0, glue set - 0.125 +.\glue(\leftskip) 0.0 plus -1.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 33.5 +.\glue(\rightskip) 0.0 plus 1.0fill + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1087 \lastlinefit=500 \1 + + +@firstpass +[] [] +@ via @@0 b=449 p=0 d=201601 +@@1: line 1.0 t=201601 s=33.0 g=20.0 -> @@0 +[] +@ via @@0 b=2 p=0 d=4 +@@2: line 1.2 t=4 s=-2.0 g=8.0 -> @@0 +[] +@ via @@1 b=449 p=0 d=201601 +@@3: line 2.0 t=403202 s=33.0 g=20.0 -> @@1 +[] +@\par via @@1 b=2 p=-10000 d=4 +@\par via @@2 b=2 p=-10000 d=4 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=8 s=33.0 a=-1.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x98.0 +.\hbox(0.0+0.0)x98.0, glue set - 0.25 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x98.0, glue set - 0.25 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1089 \lastlinefit=1000 \1 + + +> \box0= +\hbox(0.0+0.0)x98.0, glue set - 0.25 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 34.0 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1089 \lastlinefit=1000 \1 + + +@firstpass +[] [] +@ via @@0 b=533 p=0 d=284089 +@@1: line 1.0 t=284089 -> @@0 +[] +@ via @@0 b=0 p=0 d=0 +@@2: line 1.2 t=0 -> @@0 +[] +@ via @@1 b=533 p=0 d=284089 +@@3: line 2.0 t=568178 -> @@1 +[] +@\par via @@1 b=0 p=-10000 d=0 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x100.0 +.\hbox(0.0+0.0)x100.0 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x100.0, glue set 35.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1091 \lastlinefit=0 \1 + + +> \box0= +\hbox(0.0+0.0)x100.0, glue set 35.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1091 \lastlinefit=0 \1 + + +@firstpass +[] [] +@ via @@0 b=533 p=0 d=284089 +@@1: line 1.0 t=284089 s=35.0 g=20.0 -> @@0 +[] +@ via @@0 b=0 p=0 d=0 +@@2: line 1.2 t=0 s=0.0 g=0.0 -> @@0 +[] +@ via @@1 b=533 p=0 d=284089 +@@3: line 2.0 t=568178 s=35.0 g=20.0 -> @@1 +[] +@\par via @@1 b=0 p=-10000 d=0 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=0 s=0.0 a=0.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x100.0 +.\hbox(0.0+0.0)x100.0 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x100.0, glue set 35.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1092 \lastlinefit=500 \1 + + +> \box0= +\hbox(0.0+0.0)x100.0, glue set 35.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1092 \lastlinefit=500 \1 + + +@firstpass +[] [] +@ via @@0 b=533 p=0 d=284089 +@@1: line 1.0 t=284089 s=35.0 g=20.0 -> @@0 +[] +@ via @@0 b=0 p=0 d=0 +@@2: line 1.2 t=0 s=0.0 g=0.0 -> @@0 +[] +@ via @@1 b=533 p=0 d=284089 +@@3: line 2.0 t=568178 s=35.0 g=20.0 -> @@1 +[] +@\par via @@1 b=0 p=-10000 d=0 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=0 s=0.0 a=0.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x100.0 +.\hbox(0.0+0.0)x100.0 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x100.0, glue set 35.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1093 \lastlinefit=1000 \1 + + +> \box0= +\hbox(0.0+0.0)x100.0, glue set 35.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1093 \lastlinefit=1000 \1 + + +@firstpass +[] [] +@ via @@0 b=1137 p=0 d=1292769 +@@1: line 1.0 t=1292769 s=45.0 g=20.0 -> @@0 +[] +@ via @@0 b=2 p=0 d=4 +@@2: line 1.2 t=4 s=10.0 g=40.0 -> @@0 +[] +@ via @@1 b=1137 p=0 d=1292769 +@@3: line 2.0 t=2585538 s=45.0 g=20.0 -> @@1 + [] +@\par via @@1 b=0 p=-10000 d=0 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=4 s=0.0 a=0.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x110.0 +.\hbox(0.0+0.0)x110.0, glue set 0.25 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x110.0, glue set 45.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1097 ... \lastlinefit=1000 \1 + + +> \box0= +\hbox(0.0+0.0)x110.0, glue set 45.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\glue 0.0 plus 1.0fil +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1097 ... \lastlinefit=1000 \1 + + +@firstpass +[] [] +@ via @@0 b=1137 p=0 d=1292769 +@@1: line 1.0 t=1292769 s=45.0 g=20.0 -> @@0 +[] +@ via @@0 b=2 p=0 d=4 +@@2: line 1.2 t=4 s=10.0 g=40.0 -> @@0 +[] +@ via @@1 b=1137 p=0 d=1292769 +@@3: line 2.0 t=2585538 s=45.0 g=20.0 -> @@1 +[] +@\par via @@1 b=2 p=-10000 d=4 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=4 s=45.0 a=2.5 -> @@2 + +> \box0= +\vbox(0.0+0.0)x110.0 +.\hbox(0.0+0.0)x110.0, glue set 0.25 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x110.0, glue set 0.125 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1099 \lastlinefit=500 \1 + + +> \box0= +\hbox(0.0+0.0)x110.0, glue set 0.125 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 42.5 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1099 \lastlinefit=500 \1 + + +@firstpass +[] [] +@ via @@0 b=1137 p=0 d=1292769 +@@1: line 1.0 t=1292769 s=45.0 g=20.0 -> @@0 +[] +@ via @@0 b=2 p=0 d=4 +@@2: line 1.2 t=4 s=10.0 g=40.0 -> @@0 +[] +@ via @@1 b=1137 p=0 d=1292769 +@@3: line 2.0 t=2585538 s=45.0 g=20.0 -> @@1 +[] +@\par via @@1 b=2 p=-10000 d=4 +@\par via @@2 b=2 p=-10000 d=4 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=8 s=45.0 a=5.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x110.0 +.\hbox(0.0+0.0)x110.0, glue set 0.25 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x110.0, glue set 0.25 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1100 \lastlinefit=1000 \1 + + +> \box0= +\hbox(0.0+0.0)x110.0, glue set 0.25 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 40.0 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1100 \lastlinefit=1000 \1 + + +@firstpass +[] [] +@ via @@0 b=2073 p=0 d=4297329 +@@1: line 1.0 t=4297329 -> @@0 +[] +@ via @@0 b=12 p=0 d=144 +@@2: line 1.2 t=144 -> @@0 +[] +@ via @@1 b=2073 p=0 d=4297329 +@@3: line 2.0 t=8594658 -> @@1 +[] +@\par via @@1 b=0 p=-10000 d=0 +@\par via @@2 b=0 p=-10000 d=0 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=144 -> @@2 + +> \box0= +\vbox(0.0+0.0)x120.0 +.\hbox(0.0+0.0)x120.0, glue set 0.5 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x120.0, glue set 55.0fill [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1102 \lastlinefit=0 \1 + + +> \box0= +\hbox(0.0+0.0)x120.0, glue set 55.0fill +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fill +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1102 \lastlinefit=0 \1 + + +@firstpass +[] [] +@ via @@0 b=2073 p=0 d=4297329 +@@1: line 1.0 t=4297329 s=55.0 g=20.0 -> @@0 +[] +@ via @@0 b=12 p=0 d=144 +@@2: line 1.2 t=144 s=20.0 g=40.0 -> @@0 +[] +@ via @@1 b=2073 p=0 d=4297329 +@@3: line 2.0 t=8594658 s=55.0 g=20.0 -> @@1 +[] +@\par via @@1 b=12 p=-10000 d=144 +@\par via @@2 b=2 p=-10000 d=4 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=148 s=55.0 a=5.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x120.0 +.\hbox(0.0+0.0)x120.0, glue set 0.5 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x120.0, glue set 0.25 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1103 \lastlinefit=500 \1 + + +> \box0= +\hbox(0.0+0.0)x120.0, glue set 0.25 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 50.0 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1103 \lastlinefit=500 \1 + + +@firstpass +[] [] +@ via @@0 b=2073 p=0 d=4297329 +@@1: line 1.0 t=4297329 s=55.0 g=20.0 -> @@0 +[] +@ via @@0 b=12 p=0 d=144 +@@2: line 1.2 t=144 s=20.0 g=40.0 -> @@0 +[] +@ via @@1 b=2073 p=0 d=4297329 +@@3: line 2.0 t=8594658 s=55.0 g=20.0 -> @@1 +[] +@\par via @@1 b=12 p=-10000 d=144 +@\par via @@2 b=12 p=-10000 d=144 +@\par via @@3 b=0 p=-10000 d=0 +@@4: line 2.2- t=288 s=55.0 a=10.0 -> @@2 + +> \box0= +\vbox(0.0+0.0)x120.0 +.\hbox(0.0+0.0)x120.0, glue set 0.5 [] +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x120.0, glue set 0.5 [] + +! OK. +\1...nt \2\2\2\2\3\2}\showbox 0 + \setbox 0=\vbox {\unvbox 0 \s... +l.1104 \lastlinefit=1000 \1 + + +> \box0= +\hbox(0.0+0.0)x120.0, glue set 0.5 +.\hbox(0.0+0.0)x30.0 +.\glue 5.0 plus 20.0 minus 4.0 +.\hbox(0.0+0.0)x30.0 +.\penalty 10000 +.\glue(\parfillskip) 45.0 +.\glue(\rightskip) 0.0 + +! OK. +\1...tbox 0=\lastbox \showbox 0 + } +l.1104 \lastlinefit=1000 \1 + + +Checking expansion of V 2 \protected macros: +\1 (l.1113) +\1 (l.1113) +relax (l.1115) +relax (l.1115) +Checking hyphenation and \savinghyphcodes: + +Underfull \hbox (badness 10000) in paragraph at lines 1132--1132 + []\trip pp1Aqq []pp1Aqq []pp1A1qq []pp1Aqq []ppAqq + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1132--1132 + []\trip up1Aqq []up1Aqq []up1A1qq []up1Aqq []upAqq + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1132--1132 + []\trip ppB1qq []ppB1qq []ppB1qq []pp1B1qq []ppBqq + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1132--1132 + []\trip upB1qq []upB1qq []upB1qq []up1B1qq []upBqq + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1134--1134 + []\trip pp1A1qq []pp1Aqq []pp1A1qq []pp1Aqq []ppAqq + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1134--1134 + []\trip up1A1qq []up1Aqq []up1A1qq []up1Aqq []upAqq + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1134--1134 + []\trip ppB1qq []ppB1qq []ppB1qq []pp1B1qq []ppBqq + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1134--1134 + []\trip upB1qq []upB1qq []upB1qq []up1B1qq []upBqq + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1136--1136 + []\trip pp1Aqq []pp1Aqq []pp1A1qq []pp1Aqq []ppAqq + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1136--1136 + []\trip up1Aqq []up1Aqq []up1A1qq []up1Aqq []upAqq + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1136--1136 + []\trip pp1B1qq []ppB1qq []ppB1qq []pp1B1qq []ppBqq + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1136--1136 + []\trip up1B1qq []upB1qq []upB1qq []up1B1qq []upBqq + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1138--1138 + []\trip qq1app []qq1app []qqapp []qq1app []qqapp + +\hbox(7.0+1.0)x16383.99998, glue set 1635.4 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1138--1138 + []\trip qqb1pp []qqb1pp []qqb1pp []qqb1pp []qqbpp + +\hbox(8.0+2.0)x16383.99998, glue set 1634.9 [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1138--1138 + []\trip qqrpp []qqrpp []qq1r1pp []qq1r1pp []qqrpp + +\hbox(0.0+0.0)x16383.99998, glue set 1634.9 [] + +Checking \savingvdiscards, \pagediscards, and \splitdiscards: +! Missing $ inserted. +<inserted text> + $ +... +l.1146 ...oindent$\splitdiscards + \noindent$\pagediscards} +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +! Missing $ inserted. +<inserted text> + $ +... +l.1146 ...noindent$\pagediscards + } +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +> \box27= +\vbox(0.0+0.0)x0.0 +.\hbox(0.0+0.0)x0.0 +..\mathon +..\mathoff +..\penalty 10000 +..\glue(\parfillskip) 0.0 +..\glue(\rightskip) 0.0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 0.0 +.\hbox(0.0+0.0)x0.0 +..\mathon +..\mathoff +..\penalty 10000 +..\glue(\parfillskip) 0.0 +..\glue(\rightskip) 0.0 + +! OK. +l.1147 \showbox27 + + +> \box0= +\vbox(40.0+0.0)x0.0 +.\vbox(20.0+0.0)x0.0 +..\vbox(20.0+0.0)x0.0 +..\openout0=abc +..\penalty 0 +..\write1{write 1} +.\vbox(20.0+0.0)x0.0 +..\write2{write 2} +..\closeout3 +..\glue(\splittopskip) 0.0 +..\vbox(20.0+0.0)x0.0 +..\glue 0.0 plus 1.0fil + +! OK. +\1...cards \box 28 } \showbox 0 + } +l.1175 \1 -1 20 + \1 0 30 \1 1 20 \1 2 30 + +> \box0= +\vbox(50.0+0.0)x0.0 +.\vbox(30.0+0.0)x0.0 +..\vbox(20.0+0.0)x0.0 +..\openout0=abc +..\penalty 0 +..\write1{write 1} +..\glue 10.0 plus 1.0 minus 1.0 +..\write2{write 2} +.\vbox(20.0+0.0)x0.0 +..\closeout3 +..\glue(\splittopskip) 0.0 +..\vbox(20.0+0.0)x0.0 +..\glue 0.0 plus 1.0fil + +! OK. +\1...cards \box 28 } \showbox 0 + } +l.1175 \1 -1 20 \1 0 30 + \1 1 20 \1 2 30 + +> \box0= +\vbox(60.0+0.0)x0.0 +.\vbox(20.0+0.0)x0.0 +..\vbox(20.0+0.0)x0.0 +..\openout0=abc +..\penalty 0 +..\write1{write 1} +.\glue 10.0 plus 1.0 minus 1.0 +.\penalty 0 +.\kern 10.0 +.\vbox(20.0+0.0)x0.0 +..\write2{write 2} +..\closeout3 +..\glue(\splittopskip) 0.0 +..\vbox(20.0+0.0)x0.0 +..\glue 0.0 plus 1.0fil + +! OK. +\1...cards \box 28 } \showbox 0 + } +l.1175 ... \1 0 30 \1 1 20 + \1 2 30 + +> \box0= +\vbox(60.0+0.0)x0.0 +.\vbox(30.0+0.0)x0.0 +..\vbox(20.0+0.0)x0.0 +..\openout0=abc +..\penalty 0 +..\write1{write 1} +..\glue 10.0 plus 1.0 minus 1.0 +..\write2{write 2} +.\penalty 0 +.\kern 10.0 +.\vbox(20.0+0.0)x0.0 +..\closeout3 +..\glue(\splittopskip) 0.0 +..\vbox(20.0+0.0)x0.0 +..\glue 0.0 plus 1.0fil + +! OK. +\1...cards \box 28 } \showbox 0 + } +l.1175 ... \1 1 20 \1 2 30 + + + +### internal vertical mode entered at line 1184 +prevdepth ignored +### vertical mode entered at line 0 +### recent contributions: +\glue 0.0 plus 1.0fil +\kern 20.0 +prevdepth 0.0 + +! OK. +\1...{ \pagediscards \showlists + }} +l.1184 ...0 \vfil \kern 20 pt \1 + \penalty -1 \1 + + +### internal vertical mode entered at line 1184 +prevdepth ignored +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +\1...{ \pagediscards \showlists + }} +l.1184 ...0 pt \1 \penalty -1 \1 + + + +### internal vertical mode entered at line 1185 +prevdepth ignored +### vertical mode entered at line 0 +### recent contributions: +\glue 0.0 plus 1.0fill +\kern 2.0 +prevdepth 0.0 + +! OK. +\1...{ \pagediscards \showlists + }} +l.1185 ...1 \vfill \kern 2 pt \1 + \penalty 10 \1 + + +### internal vertical mode entered at line 1185 +\glue 0.0 plus 1.0fill +\kern 2.0 +\penalty 10 +prevdepth ignored +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +\1...{ \pagediscards \showlists + }} +l.1185 ...2 pt \1 \penalty 10 \1 + + +> \box0= +\vbox(12.0+0.0)x0.0 +.\kern 5.0 +.\penalty 0 +.\kern 7.0 +.\glue(\baselineskip) 0.0 + +! OK. +<output> ...scards } \showbox 0 + \showbox 255 \setbox 0 = \box... +l.1190 ...box {} \penalty -10000 + + +> \box255= +\vbox(0.0+0.0)x0.0 +.\write1{} +.\write2{} +.\write3{} +.\glue(\topskip) 0.0 +.\hbox(0.0+0.0)x0.0 + +! OK. +<output> ...wbox 0 \showbox 255 + \setbox 0 = \box 255 \global ... +l.1190 ...box {} \penalty -10000 + + + +### internal vertical mode entered at line 1191 +\penalty 10000 +prevdepth ignored +### vertical mode entered at line 0 +prevdepth 0.0 + +! OK. +\1...{ \pagediscards \showlists + }} +l.1191 \1 + + +Checking \interlinepenalties, \clubpenalties, \widowpenalties, and \disp +laywidowpenalties: +{into \tracingassigns=1} +{changing \tracingrestores=0} +{into \tracingrestores=1} +\interlinepenalties=0 +\clubpenalties=0 +\widowpenalties=0 +\displaywidowpenalties=0 +\interlinepenalties-1=0 +\interlinepenalties0=0 +\interlinepenalties5=0 +\interlinepenalties\interlinepenalties0=0 +\clubpenalties-1=0 +\clubpenalties0=0 +\clubpenalties5=0 +\clubpenalties\clubpenalties0=0 +\widowpenalties-1=0 +\widowpenalties0=0 +\widowpenalties5=0 +\widowpenalties\widowpenalties0=0 +\displaywidowpenalties-1=0 +\displaywidowpenalties0=0 +\displaywidowpenalties5=0 +\displaywidowpenalties\displaywidowpenalties0=0 +{changing \interlinepenalties=0} +{into \interlinepenalties=3 101\ETC.} +{changing \clubpenalties=0} +{into \clubpenalties=1 1} +{changing \clubpenalties=1 1} +{into \clubpenalties=4 201\ETC.} +{changing \widowpenalties=0} +{into \widowpenalties=5 301\ETC.} +{changing \displaywidowpenalties=0} +{into \displaywidowpenalties=6 401\ETC.} +\interlinepenalties=3 101 102 103 +\clubpenalties=4 201 202 203 204 +\widowpenalties=5 301 302 303 304 305 +\displaywidowpenalties=6 401 402 403 404 405 406 +\interlinepenalties-1=0 +\interlinepenalties0=3 +\interlinepenalties5=103 +\interlinepenalties\interlinepenalties0=103 +\clubpenalties-1=0 +\clubpenalties0=4 +\clubpenalties5=204 +\clubpenalties\clubpenalties0=204 +\widowpenalties-1=0 +\widowpenalties0=5 +\widowpenalties5=305 +\widowpenalties\widowpenalties0=305 +\displaywidowpenalties-1=0 +\displaywidowpenalties0=6 +\displaywidowpenalties5=405 +\displaywidowpenalties\displaywidowpenalties0=406 +{changing \interlinepenalties=3 101\ETC.} +{into \interlinepenalties=0} +{restoring \interlinepenalties=3 101\ETC.} +{changing \box0=void} +{into \box0= +\vbox(0.0+0.0)x0.0} +{restoring \box0=void} +{restoring \displaywidowpenalties=0} +{restoring \widowpenalties=0} +{restoring \clubpenalties=0} +{restoring \interlinepenalties=0} + ) +Here is how much of TeX's memory you used: + 22 strings out of 1665 + 132 string characters out of 8410 + 2661 words of memory out of 3000 + 408 multiletter control sequences out of 2100 + 2286 words of font info for 3 fonts, out of 20000 for 75 + 10 hyphenation exceptions out of 307 + 10i,15n,8p,137b,78s stack positions out of 200i,40n,60p,500b,600s + +Output written on etrip.dvi (3 pages, 220 bytes). diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.out b/Build/source/texk/web2c/etexdir/etrip/etrip.out new file mode 100644 index 00000000000..38cd5282c5a --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.out @@ -0,0 +1,4 @@ +\endgroup +\fi +\bgroup +\iffalse \else diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.pl b/Build/source/texk/web2c/etexdir/etrip/etrip.pl new file mode 100644 index 00000000000..6a38a92316b --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.pl @@ -0,0 +1,833 @@ +(FAMILY UNSPECIFIED) +(FACE F MRR) +(CODINGSCHEME TEX TEST: NOT A REAL FONT) +(DESIGNSIZE R 10.0) +(COMMENT DESIGNSIZE IS IN POINTS) +(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE) +(CHECKSUM O 32107654321) +(FONTDIMEN + (SLANT R -2.0) + (SPACE R 0.400001) + (STRETCH R 0.200001) + (SHRINK R 0.1) + (XHEIGHT R 0.45) + (QUAD R 1.0) + (EXTRASPACE R 0.200001) + (PARAMETER D 8 R 0.05) + (PARAMETER D 9 R 0.1) + (PARAMETER D 10 R 0.200001) + (PARAMETER D 11 R 0.3) + (PARAMETER D 12 R 0.400001) + (PARAMETER D 13 R 0.5) + ) +(BOUNDARYCHAR C Z) +(LIGTABLE + (LABEL C t) + (KRN O 0 R -1.0) + (KRN O 0 R -0.01) + (KRN O 0 R -0.02) + (KRN O 0 R -0.03) + (KRN O 0 R -0.04) + (KRN O 0 R -0.05) + (KRN O 0 R -0.06) + (KRN O 0 R -0.07) + (KRN O 0 R -0.08) + (KRN O 0 R -0.09) + (KRN O 0 R -0.1) + (KRN O 0 R -0.11) + (KRN O 0 R -0.12) + (KRN O 0 R -0.13) + (KRN O 0 R -0.14) + (KRN O 0 R -0.15) + (KRN O 0 R -0.16) + (KRN O 0 R -0.17) + (KRN O 0 R -0.18) + (KRN O 0 R -0.19) + (KRN O 0 R -0.2) + (KRN O 0 R -0.21) + (KRN O 0 R -0.22) + (KRN O 0 R -0.23) + (KRN O 0 R -0.24) + (KRN O 0 R -0.25) + (KRN O 0 R -0.26) + (KRN O 0 R -0.27) + (KRN O 0 R -0.28) + (KRN O 0 R -0.29) + (KRN O 0 R -0.3) + (KRN O 0 R -0.31) + (KRN O 0 R -0.32) + (KRN O 0 R -0.33) + (KRN O 0 R -0.34) + (KRN O 0 R -0.35) + (KRN O 0 R -0.36) + (KRN O 0 R -0.37) + (KRN O 0 R -0.38) + (KRN O 0 R -0.39) + (KRN O 0 R -0.4) + (KRN O 0 R -0.41) + (KRN O 0 R -0.42) + (KRN O 0 R -0.43) + (KRN O 0 R -0.44) + (KRN O 0 R -0.45) + (KRN O 0 R -0.46) + (KRN O 0 R -0.47) + (KRN O 0 R -0.48) + (KRN O 0 R -0.49) + (KRN O 0 R -0.5) + (KRN O 0 R -0.51) + (KRN O 0 R -0.52) + (KRN O 0 R -0.53) + (KRN O 0 R -0.54) + (KRN O 0 R -0.55) + (KRN O 0 R -0.56) + (KRN O 0 R -0.57) + (KRN O 0 R -0.58) + (KRN O 0 R -0.59) + (KRN O 0 R -0.6) + (KRN O 0 R -0.61) + (KRN O 0 R -0.62) + (KRN O 0 R -0.63) + (KRN O 0 R -0.64) + (KRN O 0 R -0.65) + (KRN O 0 R -0.66) + (KRN O 0 R -0.67) + (KRN O 0 R -0.68) + (KRN O 0 R -0.69) + (KRN O 0 R -0.7) + (KRN O 0 R -0.71) + (KRN O 0 R -0.72) + (KRN O 0 R -0.73) + (KRN O 0 R -0.74) + (KRN O 0 R -0.75) + (KRN O 0 R -0.76) + (KRN O 0 R -0.77) + (KRN O 0 R -0.78) + (KRN O 0 R -0.79) + (KRN O 0 R -0.8) + (KRN O 0 R -0.81) + (KRN O 0 R -0.82) + (KRN O 0 R -0.83) + (KRN O 0 R -0.84) + (KRN O 0 R -0.85) + (KRN O 0 R -0.86) + (KRN O 0 R -0.87) + (KRN O 0 R -0.88) + (KRN O 0 R -0.89) + (KRN O 0 R -0.9) + (KRN O 0 R -0.91) + (KRN O 0 R -0.92) + (KRN O 0 R -0.93) + (KRN O 0 R -0.94) + (KRN O 0 R -0.95) + (KRN O 0 R -0.96) + (KRN O 0 R -0.97) + (KRN O 0 R -0.98) + (KRN O 0 R -0.99) + (KRN O 0 R -1.0) + (KRN O 0 R -1.01) + (KRN O 0 R -1.02) + (KRN O 0 R -1.03) + (KRN O 0 R -1.04) + (KRN O 0 R -1.05) + (KRN O 0 R -1.06) + (KRN O 0 R -1.07) + (KRN O 0 R -1.08) + (KRN O 0 R -1.09) + (KRN O 0 R -1.1) + (KRN O 0 R -1.11) + (KRN O 0 R -1.12) + (KRN O 0 R -1.13) + (KRN O 0 R -1.14) + (KRN O 0 R -1.15) + (KRN O 0 R -1.16) + (KRN O 0 R -1.17) + (KRN O 0 R -1.18) + (KRN O 0 R -1.19) + (KRN O 0 R -1.2) + (KRN O 0 R -1.21) + (KRN O 0 R -1.22) + (KRN O 0 R -1.23) + (KRN O 0 R -1.24) + (KRN O 0 R -1.25) + (KRN O 0 R -1.26) + (KRN O 0 R -1.27) + (KRN O 0 R -1.28) + (KRN O 0 R -1.29) + (KRN O 0 R -1.3) + (KRN O 0 R -1.31) + (KRN O 0 R -1.32) + (KRN O 0 R -1.33) + (KRN O 0 R -1.34) + (KRN O 0 R -1.35) + (KRN O 0 R -1.36) + (KRN O 0 R -1.37) + (KRN O 0 R -1.38) + (KRN O 0 R -1.39) + (KRN O 0 R -1.4) + (KRN O 0 R -1.41) + (KRN O 0 R -1.42) + (KRN O 0 R -1.43) + (KRN O 0 R -1.44) + (KRN O 0 R -1.45) + (KRN O 0 R -1.46) + (KRN O 0 R -1.47) + (KRN O 0 R -1.48) + (KRN O 0 R -1.49) + (KRN O 0 R -1.5) + (KRN O 0 R -1.51) + (KRN O 0 R -1.52) + (KRN O 0 R -1.53) + (KRN O 0 R -1.54) + (KRN O 0 R -1.55) + (KRN O 0 R -1.56) + (KRN O 0 R -1.57) + (KRN O 0 R -1.58) + (KRN O 0 R -1.59) + (KRN O 0 R -1.6) + (KRN O 0 R -1.61) + (KRN O 0 R -1.62) + (KRN O 0 R -1.63) + (KRN O 0 R -1.64) + (KRN O 0 R -1.65) + (KRN O 0 R -1.66) + (KRN O 0 R -1.67) + (KRN O 0 R -1.68) + (KRN O 0 R -1.69) + (KRN O 0 R -1.7) + (KRN O 0 R -1.71) + (KRN O 0 R -1.72) + (KRN O 0 R -1.73) + (KRN O 0 R -1.74) + (KRN O 0 R -1.75) + (KRN O 0 R -1.76) + (KRN O 0 R -1.77) + (KRN O 0 R -1.78) + (KRN O 0 R -1.79) + (KRN O 0 R -1.8) + (KRN O 0 R -1.81) + (KRN O 0 R -1.82) + (KRN O 0 R -1.83) + (KRN O 0 R -1.84) + (KRN O 0 R -1.85) + (KRN O 0 R -1.86) + (KRN O 0 R -1.87) + (KRN O 0 R -1.88) + (KRN O 0 R -1.89) + (KRN O 0 R -1.9) + (KRN O 0 R -1.91) + (KRN O 0 R -1.92) + (KRN O 0 R -1.93) + (KRN O 0 R -1.94) + (KRN O 0 R -1.95) + (KRN O 0 R -1.96) + (KRN O 0 R -1.97) + (KRN O 0 R -1.98) + (KRN O 0 R -1.99) + (KRN O 0 R -2.0) + (KRN O 0 R -2.01) + (KRN O 0 R -2.02) + (KRN O 0 R -2.03) + (KRN O 0 R -2.04) + (KRN O 0 R -2.05) + (KRN O 0 R -2.06) + (KRN O 0 R -2.07) + (KRN O 0 R -2.08) + (KRN O 0 R -2.09) + (KRN O 0 R -2.1) + (KRN O 0 R -2.11) + (KRN O 0 R -2.12) + (KRN O 0 R -2.13) + (KRN O 0 R -2.14) + (KRN O 0 R -2.15) + (KRN O 0 R -2.16) + (KRN O 0 R -2.17) + (KRN O 0 R -2.18) + (KRN O 0 R -2.19) + (KRN O 0 R -2.2) + (KRN O 0 R -2.21) + (KRN O 0 R -2.22) + (KRN O 0 R -2.23) + (KRN O 0 R -2.24) + (KRN O 0 R -2.25) + (KRN O 0 R -2.26) + (KRN O 0 R -2.27) + (KRN O 0 R -2.28) + (KRN O 0 R -2.29) + (KRN O 0 R -2.3) + (SKIP D 3) + (LABEL O 55) + (LIG O 0 O 55) + (/LIG> C q C p) + (LABEL O 57) + (KRN C A R 0.1) + (STOP) + (KRN O 0 R -2.31) + (KRN O 0 R -2.32) + (KRN O 0 R -2.33) + (KRN O 0 R -2.34) + (KRN O 0 R -2.35) + (KRN O 0 R -2.36) + (KRN O 0 R -2.37) + (KRN O 0 R -2.38) + (KRN O 0 R -2.39) + (KRN O 0 R -2.4) + (KRN O 0 R -2.41) + (KRN O 0 R -2.42) + (KRN O 0 R -2.43) + (KRN O 0 R -2.44) + (KRN O 0 R -2.45) + (KRN O 0 R -2.46) + (KRN O 0 R -2.47) + (KRN O 0 R -2.48) + (KRN O 0 R -2.49) + (KRN O 0 R -2.5) + (KRN O 0 R -2.51) + (KRN O 0 R -2.52) + (KRN O 0 R -2.53) + (KRN O 0 R -2.54) + (KRN O 0 R -2.55) + (KRN O 0 R -2.56) + (KRN O 0 R -2.57) + (/LIG/>> C r C s) + (SKIP D 9) + (LABEL C p) + (/LIG/ C q C r) + (/LIG/> C r C t) + (LIG C t C t) + (STOP) + (LABEL C q) + (/LIG/ C u C p) + (/LIG/ C s C r) + (KRN C t R 0.1) + (/LIG> C r C t) + (SKIP D 2) + (LABEL C r) + (LIG/ C u C q) + (/LIG C q C u) + (STOP) + (/LIG/ C p C s) + (KRN C s R 0.3) + (STOP) + (LABEL C s) + (LIG/> C p C q) + (KRN C r R 0.1) + (STOP) + (LABEL C u) + (/LIG C Z C p) + (LIG C p C r) + (STOP) + (LABEL BOUNDARYCHAR) + (LIG/ C q C q) + (/LIG C 1 C 5) + (KRN O 55 R -0.1) + (STOP) + (LABEL C 1) + (/LIG/ C 1 C 2) + (/LIG/ C 2 C 3) + (/LIG> O 55 C 1) + (SKIP D 1) + (LABEL C 2) + (/LIG/ C 1 C 3) + (/LIG/ C 3 C 4) + (SKIP D 2) + (LABEL C 3) + (/LIG/ C 1 C 4) + (/LIG/ C 2 C 4) + (/LIG/ C 4 C 5) + (SKIP D 3) + (LABEL C 4) + (/LIG/ C 1 C 5) + (/LIG/ C 2 C 5) + (/LIG/ C 3 C 5) + (/LIG/ C 5 C 6) + (SKIP D 4) + (LABEL C 5) + (/LIG/ C 1 C 6) + (/LIG/ C 2 C 6) + (/LIG/ C 3 C 6) + (/LIG/ C 4 C 6) + (/LIG/ C 6 C 7) + (SKIP D 5) + (LABEL C 6) + (/LIG/ C 1 C 7) + (/LIG/ C 2 C 7) + (/LIG/ C 3 C 7) + (/LIG/ C 4 C 7) + (/LIG/ C 5 C 7) + (/LIG/>> C Z C 7) + (STOP) + (LABEL C 7) + (KRN C Z R 0.1) + (LABEL C A) + (LIG C A C A) + (KRN C B R 0.200001) + (KRN O 55 R 0.3) + (KRN C 1 R -0.200001) + (STOP) + (LABEL C B) + (LIG C B C A) + (LIG O 55 C C) + (KRN C C R 0.400001) + (STOP) + (LABEL C C) + (LIG C A O 202) + (LIG O 57 C B) + (STOP) + ) +(CHARACTER O 0 + (CHARWD R 0.700001) + (CHARHT R -0.1) + (CHARDP R 0.200001) + ) +(CHARACTER O 55 + (CHARWD R -0.5) + (COMMENT + (LIG O 0 O 55) + (/LIG> C q C p) + (KRN C A R 0.1) + ) + ) +(CHARACTER O 57 + (CHARWD R 0.1) + (COMMENT + (KRN C A R 0.1) + ) + ) +(CHARACTER C 1 + (CHARWD R 0.0) + (COMMENT + (/LIG/ C 1 C 2) + (/LIG/ C 2 C 3) + (/LIG> O 55 C 1) + (/LIG/ C 3 C 4) + (/LIG/ C 4 C 5) + (/LIG/ C 5 C 6) + (/LIG/ C 6 C 7) + (/LIG/>> C Z C 7) + ) + ) +(CHARACTER C 2 + (CHARWD R 0.0) + (COMMENT + (/LIG/ C 1 C 3) + (/LIG/ C 3 C 4) + (/LIG/ C 4 C 5) + (/LIG/ C 5 C 6) + (/LIG/ C 6 C 7) + (/LIG/>> C Z C 7) + ) + ) +(CHARACTER C 3 + (CHARWD R 0.0) + (COMMENT + (/LIG/ C 1 C 4) + (/LIG/ C 2 C 4) + (/LIG/ C 4 C 5) + (/LIG/ C 5 C 6) + (/LIG/ C 6 C 7) + (/LIG/>> C Z C 7) + ) + ) +(CHARACTER C 4 + (CHARWD R 0.0) + (COMMENT + (/LIG/ C 1 C 5) + (/LIG/ C 2 C 5) + (/LIG/ C 3 C 5) + (/LIG/ C 5 C 6) + (/LIG/ C 6 C 7) + (/LIG/>> C Z C 7) + ) + ) +(CHARACTER C 5 + (CHARWD R 0.0) + (COMMENT + (/LIG/ C 1 C 6) + (/LIG/ C 2 C 6) + (/LIG/ C 3 C 6) + (/LIG/ C 4 C 6) + (/LIG/ C 6 C 7) + (/LIG/>> C Z C 7) + ) + ) +(CHARACTER C 6 + (CHARWD R 0.0) + (COMMENT + (/LIG/ C 1 C 7) + (/LIG/ C 2 C 7) + (/LIG/ C 3 C 7) + (/LIG/ C 4 C 7) + (/LIG/ C 5 C 7) + (/LIG/>> C Z C 7) + ) + ) +(CHARACTER C 7 + (CHARWD R 0.0) + (COMMENT + (KRN C Z R 0.1) + (LIG C A C A) + (KRN C B R 0.200001) + (KRN O 55 R 0.3) + (KRN C 1 R -0.200001) + ) + ) +(CHARACTER C A + (CHARWD R 0.200001) + (CHARHT R 0.700001) + (CHARDP R 0.1) + (CHARIC R 0.1) + (COMMENT + (LIG C A C A) + (KRN C B R 0.200001) + (KRN O 55 R 0.3) + (KRN C 1 R -0.200001) + ) + ) +(CHARACTER C B + (CHARWD R 0.3) + (CHARHT R 0.8) + (CHARDP R 0.200001) + (COMMENT + (LIG C B C A) + (LIG O 55 C C) + (KRN C C R 0.400001) + ) + ) +(CHARACTER C C + (CHARWD R 0.400001) + (COMMENT + (LIG C A O 202) + (LIG O 57 C B) + ) + ) +(CHARACTER C M + (CHARWD R 0.6) + (CHARIC R 0.200001) + (VARCHAR + (MID C A) + (BOT C B) + (REP O 0) + ) + ) +(CHARACTER C a + (CHARWD R 0.200001) + (CHARHT R 0.700001) + (CHARDP R 0.1) + (CHARIC R 0.1) + (NEXTLARGER O 202) + ) +(CHARACTER C b + (CHARWD R 0.3) + (CHARHT R 0.8) + (CHARDP R 0.200001) + (NEXTLARGER C M) + ) +(CHARACTER C p + (CHARWD R 0.0) + (COMMENT + (/LIG/ C q C r) + (/LIG/> C r C t) + (LIG C t C t) + ) + ) +(CHARACTER C q + (CHARWD R 0.0) + (COMMENT + (/LIG/ C u C p) + (/LIG/ C s C r) + (KRN C t R 0.1) + (/LIG> C r C t) + (/LIG/ C p C s) + (KRN C s R 0.3) + ) + ) +(CHARACTER C r + (CHARWD R 0.0) + (COMMENT + (LIG/ C u C q) + (/LIG C q C u) + ) + ) +(CHARACTER C s + (CHARWD R 0.0) + (COMMENT + (LIG/> C p C q) + (KRN C r R 0.1) + ) + ) +(CHARACTER C t + (CHARWD R 0.0) + (COMMENT + (KRN O 0 R -1.0) + (KRN O 0 R -0.01) + (KRN O 0 R -0.02) + (KRN O 0 R -0.03) + (KRN O 0 R -0.04) + (KRN O 0 R -0.05) + (KRN O 0 R -0.06) + (KRN O 0 R -0.07) + (KRN O 0 R -0.08) + (KRN O 0 R -0.09) + (KRN O 0 R -0.1) + (KRN O 0 R -0.11) + (KRN O 0 R -0.12) + (KRN O 0 R -0.13) + (KRN O 0 R -0.14) + (KRN O 0 R -0.15) + (KRN O 0 R -0.16) + (KRN O 0 R -0.17) + (KRN O 0 R -0.18) + (KRN O 0 R -0.19) + (KRN O 0 R -0.2) + (KRN O 0 R -0.21) + (KRN O 0 R -0.22) + (KRN O 0 R -0.23) + (KRN O 0 R -0.24) + (KRN O 0 R -0.25) + (KRN O 0 R -0.26) + (KRN O 0 R -0.27) + (KRN O 0 R -0.28) + (KRN O 0 R -0.29) + (KRN O 0 R -0.3) + (KRN O 0 R -0.31) + (KRN O 0 R -0.32) + (KRN O 0 R -0.33) + (KRN O 0 R -0.34) + (KRN O 0 R -0.35) + (KRN O 0 R -0.36) + (KRN O 0 R -0.37) + (KRN O 0 R -0.38) + (KRN O 0 R -0.39) + (KRN O 0 R -0.4) + (KRN O 0 R -0.41) + (KRN O 0 R -0.42) + (KRN O 0 R -0.43) + (KRN O 0 R -0.44) + (KRN O 0 R -0.45) + (KRN O 0 R -0.46) + (KRN O 0 R -0.47) + (KRN O 0 R -0.48) + (KRN O 0 R -0.49) + (KRN O 0 R -0.5) + (KRN O 0 R -0.51) + (KRN O 0 R -0.52) + (KRN O 0 R -0.53) + (KRN O 0 R -0.54) + (KRN O 0 R -0.55) + (KRN O 0 R -0.56) + (KRN O 0 R -0.57) + (KRN O 0 R -0.58) + (KRN O 0 R -0.59) + (KRN O 0 R -0.6) + (KRN O 0 R -0.61) + (KRN O 0 R -0.62) + (KRN O 0 R -0.63) + (KRN O 0 R -0.64) + (KRN O 0 R -0.65) + (KRN O 0 R -0.66) + (KRN O 0 R -0.67) + (KRN O 0 R -0.68) + (KRN O 0 R -0.69) + (KRN O 0 R -0.7) + (KRN O 0 R -0.71) + (KRN O 0 R -0.72) + (KRN O 0 R -0.73) + (KRN O 0 R -0.74) + (KRN O 0 R -0.75) + (KRN O 0 R -0.76) + (KRN O 0 R -0.77) + (KRN O 0 R -0.78) + (KRN O 0 R -0.79) + (KRN O 0 R -0.8) + (KRN O 0 R -0.81) + (KRN O 0 R -0.82) + (KRN O 0 R -0.83) + (KRN O 0 R -0.84) + (KRN O 0 R -0.85) + (KRN O 0 R -0.86) + (KRN O 0 R -0.87) + (KRN O 0 R -0.88) + (KRN O 0 R -0.89) + (KRN O 0 R -0.9) + (KRN O 0 R -0.91) + (KRN O 0 R -0.92) + (KRN O 0 R -0.93) + (KRN O 0 R -0.94) + (KRN O 0 R -0.95) + (KRN O 0 R -0.96) + (KRN O 0 R -0.97) + (KRN O 0 R -0.98) + (KRN O 0 R -0.99) + (KRN O 0 R -1.0) + (KRN O 0 R -1.01) + (KRN O 0 R -1.02) + (KRN O 0 R -1.03) + (KRN O 0 R -1.04) + (KRN O 0 R -1.05) + (KRN O 0 R -1.06) + (KRN O 0 R -1.07) + (KRN O 0 R -1.08) + (KRN O 0 R -1.09) + (KRN O 0 R -1.1) + (KRN O 0 R -1.11) + (KRN O 0 R -1.12) + (KRN O 0 R -1.13) + (KRN O 0 R -1.14) + (KRN O 0 R -1.15) + (KRN O 0 R -1.16) + (KRN O 0 R -1.17) + (KRN O 0 R -1.18) + (KRN O 0 R -1.19) + (KRN O 0 R -1.2) + (KRN O 0 R -1.21) + (KRN O 0 R -1.22) + (KRN O 0 R -1.23) + (KRN O 0 R -1.24) + (KRN O 0 R -1.25) + (KRN O 0 R -1.26) + (KRN O 0 R -1.27) + (KRN O 0 R -1.28) + (KRN O 0 R -1.29) + (KRN O 0 R -1.3) + (KRN O 0 R -1.31) + (KRN O 0 R -1.32) + (KRN O 0 R -1.33) + (KRN O 0 R -1.34) + (KRN O 0 R -1.35) + (KRN O 0 R -1.36) + (KRN O 0 R -1.37) + (KRN O 0 R -1.38) + (KRN O 0 R -1.39) + (KRN O 0 R -1.4) + (KRN O 0 R -1.41) + (KRN O 0 R -1.42) + (KRN O 0 R -1.43) + (KRN O 0 R -1.44) + (KRN O 0 R -1.45) + (KRN O 0 R -1.46) + (KRN O 0 R -1.47) + (KRN O 0 R -1.48) + (KRN O 0 R -1.49) + (KRN O 0 R -1.5) + (KRN O 0 R -1.51) + (KRN O 0 R -1.52) + (KRN O 0 R -1.53) + (KRN O 0 R -1.54) + (KRN O 0 R -1.55) + (KRN O 0 R -1.56) + (KRN O 0 R -1.57) + (KRN O 0 R -1.58) + (KRN O 0 R -1.59) + (KRN O 0 R -1.6) + (KRN O 0 R -1.61) + (KRN O 0 R -1.62) + (KRN O 0 R -1.63) + (KRN O 0 R -1.64) + (KRN O 0 R -1.65) + (KRN O 0 R -1.66) + (KRN O 0 R -1.67) + (KRN O 0 R -1.68) + (KRN O 0 R -1.69) + (KRN O 0 R -1.7) + (KRN O 0 R -1.71) + (KRN O 0 R -1.72) + (KRN O 0 R -1.73) + (KRN O 0 R -1.74) + (KRN O 0 R -1.75) + (KRN O 0 R -1.76) + (KRN O 0 R -1.77) + (KRN O 0 R -1.78) + (KRN O 0 R -1.79) + (KRN O 0 R -1.8) + (KRN O 0 R -1.81) + (KRN O 0 R -1.82) + (KRN O 0 R -1.83) + (KRN O 0 R -1.84) + (KRN O 0 R -1.85) + (KRN O 0 R -1.86) + (KRN O 0 R -1.87) + (KRN O 0 R -1.88) + (KRN O 0 R -1.89) + (KRN O 0 R -1.9) + (KRN O 0 R -1.91) + (KRN O 0 R -1.92) + (KRN O 0 R -1.93) + (KRN O 0 R -1.94) + (KRN O 0 R -1.95) + (KRN O 0 R -1.96) + (KRN O 0 R -1.97) + (KRN O 0 R -1.98) + (KRN O 0 R -1.99) + (KRN O 0 R -2.0) + (KRN O 0 R -2.01) + (KRN O 0 R -2.02) + (KRN O 0 R -2.03) + (KRN O 0 R -2.04) + (KRN O 0 R -2.05) + (KRN O 0 R -2.06) + (KRN O 0 R -2.07) + (KRN O 0 R -2.08) + (KRN O 0 R -2.09) + (KRN O 0 R -2.1) + (KRN O 0 R -2.11) + (KRN O 0 R -2.12) + (KRN O 0 R -2.13) + (KRN O 0 R -2.14) + (KRN O 0 R -2.15) + (KRN O 0 R -2.16) + (KRN O 0 R -2.17) + (KRN O 0 R -2.18) + (KRN O 0 R -2.19) + (KRN O 0 R -2.2) + (KRN O 0 R -2.21) + (KRN O 0 R -2.22) + (KRN O 0 R -2.23) + (KRN O 0 R -2.24) + (KRN O 0 R -2.25) + (KRN O 0 R -2.26) + (KRN O 0 R -2.27) + (KRN O 0 R -2.28) + (KRN O 0 R -2.29) + (KRN O 0 R -2.3) + (KRN O 0 R -2.31) + (KRN O 0 R -2.32) + (KRN O 0 R -2.33) + (KRN O 0 R -2.34) + (KRN O 0 R -2.35) + (KRN O 0 R -2.36) + (KRN O 0 R -2.37) + (KRN O 0 R -2.38) + (KRN O 0 R -2.39) + (KRN O 0 R -2.4) + (KRN O 0 R -2.41) + (KRN O 0 R -2.42) + (KRN O 0 R -2.43) + (KRN O 0 R -2.44) + (KRN O 0 R -2.45) + (KRN O 0 R -2.46) + (KRN O 0 R -2.47) + (KRN O 0 R -2.48) + (KRN O 0 R -2.49) + (KRN O 0 R -2.5) + (KRN O 0 R -2.51) + (KRN O 0 R -2.52) + (KRN O 0 R -2.53) + (KRN O 0 R -2.54) + (KRN O 0 R -2.55) + (KRN O 0 R -2.56) + (KRN O 0 R -2.57) + (/LIG/>> C r C s) + (/LIG/ C p C s) + (KRN C s R 0.3) + ) + ) +(CHARACTER C u + (CHARWD R 0.0) + (COMMENT + (/LIG C Z C p) + (LIG C p C r) + ) + ) +(CHARACTER O 202 + (CHARWD R 0.400001) + ) diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.tex b/Build/source/texk/web2c/etexdir/etrip/etrip.tex new file mode 100644 index 00000000000..ab3468d5cd8 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.tex @@ -0,0 +1,1249 @@ +%%; This is `etrip.tex' for e-TeX v3.141592-2.2 as of August 21, 2004. +%%; +%%; This is a diabolical test file for e-TeX, an extension of TeX82. +%%; It is not as diabolical as `trip.tex', Knuth's torture test for TeX. +%%; +%%; ==>> Do not use this TeX code and its macros as an example <<== +%%; ==>> how you can make use of the new e-TeX features! It is <<== +%%; ==>> meant to test these extensions and often uses slightly <<== +%%; ==>> wrong e-TeX input to produce errors and warnings. <<== +%%; +\catcode`\{=1\catcode`\}=2\catcode`\#=6 \let\bgroup={ \let\egroup=} +\def\etripdate {2004-09-06} +\def\texversion {3.141592} +\def\etripversion{2.2} +% +\message{This is the e-Trip test [\etripdate] for + e-TeX v\texversion-\etripversion.} +% +% --- Make sure that e-Trip is run in e-TeX extended mode +\def\stop#1{\message{Emergency stop: #1!}} +\expandafter\ifx\csname eTeXversion\endcsname\relax + \stop{You aren't using e-TeX in extended mode} + \message{(Do not forget to give an asterisk `*' as the first non-blank} + \message{character to make e-IniTeX enter extended mode.)} + \expandafter\end +\fi +% +% --- Check for e-TeX version +\def\1.#1#2\relax{\bgroup + \edef\1{\egroup + \def\noexpand\2{\number\eTeXversion\eTeXrevision}% + \def\noexpand\1{\number\eTeXversion.#1}}\1} +\expandafter\1\eTeXrevision\relax +\message{(You are using e-TeX version/revision \2)} +\ifx\1\etripversion \else \stop{I have expected e-TeX + v\texversion-\etripversion...}\expandafter\end\fi +\let\1=\5 \let\2=\5 +% +% --- a special branch for e-IniTeX +\ifx\einitex\undefined \def\einitex{} + % + \message{e-IniTeX: Assigning category codes,} + \catcode`\$=3\catcode`\&=4 + \catcode`\^=7\catcode`\^^I=10\catcode`\_=8 + \message{tracing switches,} + \tracingstats=4\tracinglostchars=2 + \message{other codes,} + \endlinechar=`\^^M \newlinechar=`\^^J + % + \message{definitions for e-VirTeX e-Trip test run,} + \def\error{\immediate\write15{Bug in your e-TeX implementation!}% + \immediate\write15 } + \def\typeout{\immediate\write15 } + \def\empty{} \def\space{ } + % + \message{constants and registers,} + \chardef\zero=0\chardef\one=1\chardef\two=2 + \countdef\ctmp=255 \countdef\cndx=254 + % + \message{fonts,} + \fontdimen12\nullfont=13pt + \font\trip=etrip \hyphenchar\trip=`1 \trip + \textfont0=\trip \textfont1=\trip + \font\smalltrip=etrip scaled 500\relax % our symbols font + \fontdimen22\smalltrip=7pt + \textfont2=\smalltrip \scriptfont2=\smalltrip + \scriptscriptfont2=\smalltrip + \font\bigtrip=etrip at 20pt\relax % our extension font + \textfont3=\bigtrip \scriptfont3=\bigtrip + \scriptscriptfont3=\bigtrip + % + \message{some math characters,} + \delcode`\[="161361 % small (family 1, character "61 (a)), large (3,"61) + \delcode`\|="142342 % small (family 1, character "42 (B)), large (3,"42) + \delcode`\]="162362 % small (family 1, character "62 (b)), large (3,"62) + % + \message{some math parameters,} + \thinmuskip=18mu plus 3.6mu + \medmuskip=27mu plus 9mu minus 18mu + \thickmuskip=36mu minus 7.2mu + % + \message{hyphenation,} + \lefthyphenmin=2\righthyphenmin=2 + \begingroup + \def\x{\patterns{% + .pp1aqq. .up1aqq. .ppb1qq. .upb1qq. .pp1r1qq. .up1r1qq.}} + \language=0 \x \savinghyphcodes=1 + \language=1 \lccode`A=`a \lccode`B=`b \x + \language=2 \lccode`A=`r \lccode`B=`b \x + \language=3 \lccode`A=`a \lccode`B=`r \x + {\def\1{\lccode\count20=0 \ifnum\count20<255 \advance\count20 1 + \expandafter\1\fi}\count20=0 \1 + \language=4 \patterns{}} + {\lccode`B=`b \hyphenation{qqB-pp}} + \count20=\interactionmode \nonstopmode + {\setbox0\vbox{\parfillskip=0pt + \hbadness=0 \showboxdepth=0 + \hsize=16383.99999pt \pretolerance=-1 \tolerance=-1 + \trip\ ppaqq upaqq ppbqq upbqq pprqq uprqq qqbpp}} + {\lccode`B=`b \language=4 \hyphenation{-q-}} + \interactionmode=\count20 + {\lccode`B=`b \hyphenation{qq-B-pp}} + \endgroup + % + \message{enable e-TeX enhancements (TeXXeT),} + \TeXXeTstate=1 + % + \message{prepare saved items (not to be dumped),} + \bgroup \savingvdiscards=1 + \vfill \penalty 1234 % set \pagediscards + \setbox0=\vbox{\vbox to10pt{}\vskip5pt\penalty-4321} + \setbox1=\vsplit0 to10pt % set \splitdiscards + \egroup + % + \message{everyjob ...dumped.} + \everyjob={\message{e-IniTeX: e-Trip format loaded.}} + \expandafter\dump +\fi + +% +% -- Test \lostchars=1 and 2 +\begingroup + \tracingonline=0 + \setbox0=\hbox{% + \tracinglostchars=0 \nullfont a% + \tracinglostchars=1 \nullfont b% + \tracinglostchars=2 \nullfont c% + } +\endgroup +% +% -- Do the rest in silent, almost all of it: +\batchmode + +% +% -- Check that all e-TeX enhancements are switched off +\ifnum\TeXXeTstate=0 \else + \error{dumped e-TeX enhancement state registers aren't switch off} +\fi + +% +% ============================== input/output: new csnames +% +% -- Check table of equivalents and the routines |id_lookup|, +% |print_cmd_chr| for all new e-TeX control sequences +% -- Check new primitive \unexpanded (first test) +\typeout{Checking input/output of new csnames:} +\begingroup + \edef\1{% + \unexpanded{% +% --- additional e-TeX V 1 primitives + \eTeXversion \eTeXrevision \showgroups \showtokens + \tracingassigns \tracinggroups \tracingifs \tracingscantokens + \currentgrouplevel \currentgrouptype \middle \lastnodetype + \TeXXeTstate \beginL \endL \beginR \endR \predisplaydirection + \marks \topmarks \firstmarks \botmarks + \splitfirstmarks \splittopmarks + \protected \unexpanded \detokenize \scantokens \readline + \unless \ifdefined \ifcsname \everyeof \interactionmode +% --- additional e-TeX V 2 primitives + \currentiflevel \currentiftype \currentifbranch \showifs + \fontcharwd \fontcharht \fontchardp \fontcharic \iffontchar + \tracingnesting \parshapelength \parshapeindent \parshapedimen + \numexpr \dimexpr \glueexpr \muexpr \mutoglue \gluetomu + \gluestretchorder \glueshrinkorder \gluestretch \glueshrink + \savingvdiscards \pagediscards \splitdiscards + \lastlinefit \savinghyphcodes \interlinepenalties + \clubpenalties \widowpenalties \displaywidowpenalties + }% + } + +% loop through the list, count the number of csnames, +% insert the \newlinechar after the 2nd, 4th, 6th, ... + \ctmp=0\def\3{} + \def\2#1{\ifx\relax#1\else + \advance\ctmp\one + \edef\3{\unexpanded\expandafter{\3 #1}\ifodd\ctmp\else ^^J\fi}% + \expandafter\2\fi} + \expandafter\2\1\relax + \typeout{e-TeX Version \number\eTeXversion\space has + \number\ctmp\space new csnames:}% + \show\3\endgroup + +% +% ============================== create and output nodes +% +% -- Check |new_...| routines and |short_display|, |show_node_list| +% for all new e-TeX node types and subtypes +% -- Check for new primitives disabled when read. +\typeout{Checking creation and printing for new node types:} +\tracingonline=1 +\showboxbreadth=255\showboxdepth=255 +\begingroup + \setbox0=\vbox{\hsize=0pt\TeXXeTstate=1\relax + %% []\trip a[]b[]p$q [] t$u[][] % <== \endR\endL at end + a\beginL b\beginR p$q\left[\mathpunct{r}\middle|s\right]t$u + %% \trip aMb + $$aMb$$ % \hbox ..., display + %% [][]\trip p[]q$st$u[] % <== \beginL\beginR at beginning + p\endR q\mathsurround=12.3pt$st$u % <== \endL at end + %% \trip rMs + $$rMs$$ % \hbox ..., display + %% []\trip tp[]u % <== \beginL at beginning + tp\endL u + %% \trip rMs + $$rMs$$ % \hbox ..., display + %% \trip tp % <== no \mark(s), no \(begin/end)(L/R)! + tp\mark{0old}\marks0{0}\marks1{1}\marks15{15}\marks32767{32767}% + \marks-1{-1}\marks32768{32768}% Bad register (-1) ...and (32768). + \TeXXeTstate=0\relax + \beginL\beginR\endL\endR % Improper \(begin/end)(L/R) + }\showbox0 +\endgroup + +% +% +% ============================== \interactionmode +% +% -- Check new special register \interactionmode +\typeout{Checking \string\interactionmode:} +\begingroup \ctmp=\interactionmode % save current value +\nonstopmode +% test inquiry using \interactionmode +\def\3{\typeout{current interactionmode (l.\number\inputlineno): + \ifcase\interactionmode batch\or nonstop\or scroll\or + errorstop\else UNKNOWN!\fi}} +\def\1#1{\relax\ifnum#1=\interactionmode \3 \else + \typeout{wrong interactionmode: + \number\interactionmode\space should be \number#1!}\fi} +\batchmode \1 0 +\nonstopmode \1 1 +\scrollmode \1 2 +\errorstopmode \1 3 +% test setting |interaction_mode| using this special register +\def\2#1{\interactionmode=#1\relax \1{#1}} + \nonstopmode + % generate two errors: + \interactionmode=-1 \1 1 % nonstop + \interactionmode=4 \1 1 % nonstop +\2 2 \2 2 \2 1 \2 1 \2 3 \2 3 \2 0 \2 0 +\1 0{\interactionmode=3}\1 3 % global assignment! +% Test for the correct call of |new_interaction|, i.e. +% correct setting of |selector|: +\interactionmode=1 \message{1 (l.\number\inputlineno)}% log+term +\interactionmode=0 \message{0 (l.\number\inputlineno)}% log only +\interactionmode=1 \message{1 (l.\number\inputlineno)}% log+term +% Some tests with TeX's old command and register assignments +\batchmode \1 0 \2 3 \scrollmode \1 2 \2 1 +\2 \ctmp +\endgroup + +% +% -- Check \tracingifs +\typeout{Checking \string\tracingifs:} +\begingroup + \def\1#1\1{\def\2{#1\iffalse \else \fi}#1\iftrue \2\else \2\fi} + \tracingifs=1 + \1\1 + \1\unless\1 + \tracingcommands=2 + \ifdefined\hbox \unless\ifdefined\abc \ifcase 2 \or \or + \ifcsname hbox\endcsname \ifcsname abc\endcsname \abc \else + \ifx\abc\relax \else \ifx\abc\relax \fi \fi \fi \fi \or\fi \fi \fi +\endgroup +% +% -- Check \tracingassigns +\typeout{Checking \string\tracingassigns:} +\begingroup + \tracingrestores=1 \tracingassigns=1 + \global\count17=7 \count17=7 + \global\def\9{\relax} \global\let\8=\9 \let\8=\9 + \bgroup + \global\count17=0 \count17=0 + \global\let\9=\7 \global\let\8=\9 \let\8=\9 + \egroup +\endgroup + +% +% -- Check \currentgrouptype, \currentgrouplevel, and \lastnodetype +\typeout{Checking \string\currentgrouptype, + \string\currentgrouplevel, and \string\lastnodetype:} +\typeout{current group level (l.\number\inputlineno): + \ifcase\currentgrouptype outer level\else BAD!\fi} +\typeout{current group type (l.\number\inputlineno): + \ifcase\currentgrouptype bottom level\else BAD!\fi} +\begingroup + \def\4{\typeout{current group type (l.\number\inputlineno): + \ifcase\currentgrouptype bottom level\or simple group\or + hbox group\or adjusted hbox group\or vbox group\or + vtop group\or align group\or no align group\or + output group\or math group\or disc group\or + insert group\or vcenter group\or math choice group\or + semi simple group\or math shift group\or + math left group\else UNKNOWN!\fi}} + \def\1 #1 {\relax\ifnum#1=\currentgrouptype \4\else + \typeout{wrong current group type: + \number\currentgrouptype\space should be #1!}\fi} + \def\5{\edef\6{\ifcase\lastnodetype char node\or hlist node\or + vlist node\or rule node\or ins node\or mark node\or + adjust node\or ligature node\or disc node\or whatsit node\or + math node\or glue node\or kern node\or penalty node\or + unset node\or math mode node\else + \ifnum-1=\lastnodetype empty\else UNKNOWN!\fi\fi}% + \typeout{last node type (l.\number\inputlineno): \6}} + \def\2 #1 {\relax\ifnum#1=\lastnodetype \5\else + \typeout{wrong last node type: + \number\lastnodetype\space should be #1!}\fi} + \def\3 #1 {\relax\ifnum#1=\currentgrouplevel \else + \typeout{wrong current group level: + \number\currentgrouplevel\space should be #1!}\fi} + \tracinggroups=1 + \1 14 % semi simple group + \3 1 % group level 1 + \setbox0=\vbox{\1 4 % vbox group + \hbox{\1 3 % adjusted hbox group + {\1 1 % simple group + }\2 -1 % empty list + \hbox{\1 2 % hbox group + \discretionary{\1 10 }{\1 10 }{\1 10 % disc group + \3 5 % group level 5 + }\2 8 % disc node + A\2 0 % char node + AA\2 7 % ligature node + \insert27{\1 11 % insert group + }\2 4 % ins node + \vadjust{\1 11 % insert group + }\2 6 % adjust node + \mark{}\2 5 % mark node + \vrule \2 3 % rule node + \hfil \2 11 % glue node + \kern 0pt\2 12 % kern node + \penalty 0\2 13 % penalty node + \vtop{\1 5 % vtop group + }\2 2 % vlist node + \write5{}\2 9 % whatsit node + $\1 15 % math shift group + {\1 9 % math group + } + $\2 10 % math node + \TeXXeTstate=1\beginR\2 10 % math node + \endR\2 10 % math node + \valign{#\cr\1 6 % two align groups + \cr\noalign{\1 7 % no align agroup + \2 14 % unset node + } + } + } + }\2 1 % hlist node + $$\1 15 % math shift group + \2 -1 % empty list + \mathchoice{\1 13 }{\1 13 }{\1 13 }{\1 13 % math choice group + \vcenter{\1 12 % vcenter group + }\2 15 % math mode node + }\2 15 % math mode node + \left.\1 16 % math left group + \middle.\1 16 % math left group + \middle.\1 16 % math left group + \right. + $$ + } + \output={\1 8 % output group + \setbox0=\box255 + \setbox0=\vbox{ % vbox group % this is definitely weird! + \hbox spread 5pt{\hfil % adjusted hbox group + \raise5pt\hbox{ % hbox group + { %simple group + \valign{#\cr % two align groups + \noalign{ % no align group + $ % math shift group + \vtop{ % vtop group + $$ % math shift group + { % math group + \left.\middle. % math left group + \mathchoice{}{}{ % math choice group + \vcenter to 7pt{\vss % vcenter group + \noindent\vadjust{ % insert group + \discretionary{}{% disc group + \showgroups % show all of them + }{} + } + } + }{} + \right. + } + $$ + } + $ + } + } + } + } + } + } + } + \hbox{}\vfil\penalty-10000 + \deadcycles=0 +\endgroup + +% +% -- Check expansion of \protected macros +\typeout{Checking expansion of \string\protected\space macros:} +\begingroup + \protected\def\2{} \show\2 + \let\3=\2 \show\3 + \protected\unexpanded\bgroup\2\protected\3\protected\def\1{\2}} \show\1 + \tracingmacros=1 + \message{\expandafter\1\1} + \typeout{\expandafter\1\1} + \setbox0=\vbox{\special{\expandafter\1\1}} \showbox0 + \edef\5{\expandafter\1\1} \show\5 + \setbox0=\vbox{\halign{#\1&#\span\1\cr + \protected\def\1{\3}&\protected\def\1{\3}\cr}} +\endgroup + +% +% -- Check \scantokens, \tracingscantokens, \readline, and \everyeof +\typeout{Checking \string\scantokens, \string\tracingscantokens, + \string\readline, and \string\everyeof:} +\begingroup + \newlinechar=`\^^J + \def\1{\endgroup ^^J\fi ^^J\bgroup ^^J\iffalse \else} + \tracingoutput=1 + \shipout\vbox{\global\advance\count\zero by\one + \openout1=\jobname.out + \write1{\unexpanded\expandafter{\1}} + \closeout1} + \begingroup \iftrue \input\jobname.out \egroup \fi + \begingroup \iftrue \scantokens\expandafter{\1} \egroup \fi + \errorcontextlines=1000 \tracingscantokens=1 + \begingroup + \tracingnesting=1 + \begingroup \iftrue \scantokens\expandafter{\1} \egroup \fi + \tracingnesting=2 + \begingroup \unless\iffalse \scantokens\expandafter{\1} \egroup \fi +% and now a really weird (although legitimate) combination + \setbox0=\hbox\bgroup + \unless\iftrue\else + \scantokens{\hbox\bgroup^^J\ifcase0^^J\tracingscantokens=0^^J + \newlinechar=`\^^Z + \scantokens{\egroup^^Z\else\fi^^Z\def\1{\egroup\fi}^^Z\1^^Z^^J + \setbox0=\vtop\bgroup^^Z\ifnum0=0^^Z$$^^Z\ifinner\else^^Z + \csname iffalse\endcsname^^J + }^^J % end of inner scantokens + $$^^J\fi + } % end of outer \scantokens + \egroup + \else\fi + \endgroup + \begingroup \iftrue \let\9=\endgroup \def\endgroup{\9\9} + \input\jobname.out \egroup \fi + \begingroup \iftrue \let\9=\endgroup \def\endgroup{\9\9} + \scantokens\expandafter{\1} \egroup \fi + + \edef\1{\scantokens{\begingroup} % <== error + \everyeof={\noexpand} + \edef\1{\scantokens{\begingroup}\endgroup} % <== OK + \errorcontextlines=100 + \def\2{\begingroup\scantokens{\message{level=\the\currentgrouplevel}}% + \endgroup} + \bgroup\bgroup\bgroup \edef\1{\egroup\egroup\egroup + \everyeof={\noexpand\ifnum\number\currentgrouplevel + \unexpanded{>\currentgrouplevel\2\else\9\fi}}}\1\2 + + \openin7=\jobname.out + \bgroup + \def\1{\unless\ifeof7\readline7to\2% + \endlinechar=-\one\2\expandafter\1\fi} + \tracingcommands=2 \tracingrestores=1 \tracingassigns=1 + \setbox25=\hbox{\1\showlists} + \egroup + +\endgroup + +% +% -- Check \marks etc., \showtokens, and \detokenize +\typeout{Checking \string\marks\space etc., \string\showtokens, and + \string\detokenize:} +\begingroup + \newlinechar=`\^^J + \def\4{\message{Current marks:\9^^J}} + \def\3#1{\edef\9{\9^^J \detokenize{#1}=\detokenize\expandafter{#1}.}} + \def\2#1 {\3{\splitfirstmarks#1}\3{\splitbotmarks#1}} + \def\0{\let\9=\empty} + \def\7{\penalty0\vskip40pt} + \def\1{\0\20 \21 \23 \4} + \setbox0=\vbox{% + \marks0{0-1}\marks1{1-1}\vskip1pt\vbox to9pt{} + \mark{0-2}\marks3{}\hbox{}\vskip5pt\vfil\7 + \marks0{0-3}\vskip1pt\vbox to19pt{}\marks3{3-3}\vskip3ptplus1fil\7 + \vbox to30pt{}\vfil\7\hbox to10pt{}} + \setbox4=\copy0 + \1 \showbox0 \let\5=\3 \def\3#1{\showtokens\expandafter{#1}\5{#1}} + \setbox1=\vsplit0to17pt + \1 \showbox1 \showbox0 \let\3=\5 + \setbox1=\vsplit0to27pt + \1 \showbox1 \showbox0 + \setbox1=\vsplit0to37pt + \1 \showbox1 \showbox0 + \def\2#1 {\3{\topmarks#1}\3{\firstmarks#1}\3{\botmarks#1}} + \vsize=35pt \output{\1 \showbox255 \setbox0=\box255}\1 + \unvbox4\marks0{}\marks1{}\marks3{}\vfil\penalty-10000 + \hbox{}\marks0{}\marks1{}\marks3{}\vfil\penalty-10000 + \hbox{}\vfil\penalty-10000 % reclaim sparse array memory! + \deadcycles=0 +\endgroup + +% +% -- Check \middle +\typeout{Checking \string\middle:} +\begingroup + \scriptfont1=\textfont1 \scriptscriptfont1=\scriptfont1 + \setbox0=\vbox{\middle \par \right \par} % <== 8 errors + \setbox0=\hbox{% + $ + \left[p + \left[q + \over r + \left[p + \middle|q + \middle|q + \left[p + \middle|q + \middle|q + \over r\showlists + \right]\showlists + \right]\showlists + \right]\showlists + \right]\showlists + $\showlists + } + \setbox0=\hbox{$\displaystyle + \left[\scriptstyle\middle|\mathchoice{p}{q}{r}{s} + \raise16.5pt\hbox{}\right]$\showlists} + \setbox0=\hbox{$\scriptscriptstyle + \left[\displaystyle\lower3pt\hbox{}\middle|\mathchoice{p}{q}{r}{s} + \right]$\showlists} +\endgroup + +% +% -- Check TeX--XeT's new primitives +\typeout{Checking TeX--XeT enhancements:} +\begingroup +% -- incorrect matching & conversion +% (extra `endL/R' nodes are converted to `kern 0.0' nodes) + \setbox0=\vbox{\TeXXeTstate=1 + \parfillskip=0pt plus1fil\hsize=10pt\parindent=.5pt + \beginL\kern1pt\par + \beginR\kern2pt\par + \beginL\beginR\kern3pt\penalty0\hbox{}\kern3pt\endL\endR\endL\par + \endL\kern4pt\endR\par} + \showbox0 +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% STILL INCOMPLETE!!! +% %%%%% Missing: Test for functionality of all new primitives +% \TeXXeTstate \beginL \endL \beginR \endR \predisplaydirection +% %%%%% +\endgroup + +% +% -- Check optimized \aftergroup +\typeout{Checking optimized \string\aftergroup:} +\begingroup + \errorcontextlines=1000 + {{\aftergroup\x\aftergroup}\aftergroup{\aftergroup\relax}} +\endgroup + +% +% -- Check \showifs, \currentiftype, \currentiflevel, and \currentifbranch +\typeout{Checking \string\showifs, \string\currentiftype, + \string\currentiflevel, and \string\currentifbranch:} +\begingroup + \def\1{ !BAD} \edef\2{ \ifnum0=\currentifbranch OK\else!BAD\fi} + \iftrue \expandafter \ifnum \number\currentifbranch=1 + \iffalse \else \expandafter \ifnum \number\currentifbranch=-1 + \ifnum \currentifbranch=0 \let\1=\2 \fi \fi \fi \fi \fi + \message{\string\currentifbranch \1} + \def\1 #1 {\edef\2{\number\currentiflevel}% + \ifnum\2=#1 + \typeout{current if level (l.\number\inputlineno): \number\2}% + \else + \typeout{wrong current if level: \2\space should be #1!}% + \fi} + \1 0 % if level 0 + \iftrue \1 1 % if level 1 + \iftrue \1 2 % if level 2 + \fi + \fi + \def\1 #1 #2 {\edef\2{\number\currentiftype}% + \edef\3{\number\currentifbranch}% + \ifnum\2=#1 \4\else + \typeout{wrong current if type: \2\space should be #1!}\fi + \ifnum\3=#2 \5\else + \typeout{wrong current if branch: \3\space should be #2!}\fi} + \def\4{\typeout{current if type (l.\number\inputlineno): + \ifnum\2<0 \string\unless\6{-\2}\else\6{\2}\fi}} + \def\5{\typeout{current if branch (l.\number\inputlineno): + \ifnum\3>0 true\else \ifnum\3<0 false\else + \ifnum0=\3 no\else !UNKNOWN\fi\fi\fi\space branch}} + \def\6#1{\string\if \ifcase#1!NONE\or \or cat\or num\or dim\or odd\or + vmode\or hmode\or mmode\or inner\or void\or hbox\or vbox\or x\or + eof\or true\or false\or case\or defined\or csname\or fontchar\else + !UNKNOWN\fi} + \1 0 0 + \if00 \1 1 1 \fi \unless\if00 \else \1 -1 -1 \fi + \if0a \else \1 1 -1 \fi \unless\if0a \1 -1 1 \fi + \ifcat00 \1 2 1 \fi \unless\ifcat00 \else \1 -2 -1 \fi + \ifcat0a \else \1 2 -1 \fi \unless\ifcat0a \1 -2 1 \fi + \ifnum1=1 \1 3 1 \fi \unless\ifnum1<1 \1 -3 1 \fi + \ifdim1pt=2pt \else \1 4 -1 \fi \unless\ifdim1pt>2pt \1 -4 1 \fi + \ifodd5 \1 5 1 \fi \unless\ifodd5 \else \1 -5 -1 \fi + \setbox2=\vbox{ + \ifvmode \1 6 1 \fi \unless\ifvmode \else \1 -6 -1 \fi + } \setbox0=\box2 + \setbox1=\hbox{ + \ifhmode \1 7 1 \fi \unless\ifhmode \else \1 -7 -1 \fi + $ + \ifmmode \1 8 1 \fi \unless\ifmmode \else \1 -8 -1 \fi + $ + \ifinner \1 9 1 \fi + } + \unless\ifinner \1 -9 1 \fi + \ifvoid2 \1 10 1 \fi \unless\ifvoid0 \1 -10 1 \fi + \ifhbox1 \1 11 1 \fi \unless\ifhbox2 \1 -11 1 \fi + \ifvbox0 \1 12 1 \fi \unless\ifvbox1 \1 -12 1 \fi + \ifx\abc\relax \else \1 13 -1 \fi \unless\ifx\relax\abc \1 -13 1 \fi + \ifeof7 \1 14 1 \fi \unless\ifeof5 \else \1 -14 -1 \fi + \iftrue \1 15 1 \fi \unless\iftrue \else \1 -15 -1 \fi + \iffalse \else \1 16 -1 \fi \unless\iffalse \1 -16 1 \fi + \ifcase2 \or \or \1 17 1 \fi \ifcase2 \or \else \1 17 -1 \fi + \ifdefined\hbox \1 18 1 \fi \unless\ifdefined\abc \1 -18 1 \fi + \ifcsname hbox\endcsname \1 19 1 \fi + \unless\ifcsname abc\endcsname \1 -19 1 \fi + \iffontchar\trip`b \1 20 1 \fi \unless\iffontchar\trip`c \1 -20 1 \fi +% + \if00 \unless\if00 \else \if0a \else \unless\if0a + \ifcat00 \unless\ifcat00 \else \ifcat0a \else \unless\ifcat0a + \ifnum1=1 \unless\ifnum1<1 \ifdim1pt=2pt \else \unless\ifdim1pt>2pt + \ifodd5 \unless\ifodd5 \else + \setbox3=\vbox{\ifvmode \unless\ifvmode \else + \hbox{\ifhmode \unless\ifhmode \else + $\ifmmode \unless\ifmmode \else \ifinner \unless\ifinner \else + \ifvoid2 \unless\ifvoid0 \ifhbox1 \unless\ifhbox2 + \ifvbox0 \unless\ifvbox1 \ifeof7 \unless\ifeof5 \else + \ifx\abc\relax \else \unless\ifx\relax\abc + \iftrue \unless\iftrue \else \iffalse \else \unless\iffalse + \ifcase2 \or \or \ifcase2 \or \else + \ifdefined\hbox \unless\ifdefined\abc + \begingroup \tracingifs=1 + \ifcsname hbox\endcsname \unless\ifcsname abc\endcsname + \iffontchar\trip`b \unless\iffontchar\trip`c + \showifs % <== show 44 nested ifs + \fi \fi + \fi \fi + \endgroup + \fi \fi + \fi \fi + \fi \fi \fi \fi + \fi \fi + \fi \fi \fi \fi + \fi \fi \fi \fi + \fi \fi \fi \fi $ + \fi \fi } + \fi \fi } + \fi \fi + \fi \fi \fi \fi + \fi \fi \fi \fi + \fi \fi \fi \fi +\endgroup + +% +% -- Check \iffontchar, \fontcharwd, etc. +\typeout{Checking \string\iffontchar, \string\fontcharwd, etc.:} +\begingroup + \iffontchar \else \fi % <== missing font identifier and number + \iffontchar\textfont2 -1 \else \fi % <== bad character code + \iffontchar\font 256 \else \fi % <== bad character code + \fontcharwd \fontcharht \fontchardp \fontcharic % <== can't use + \def\1#1#2{% + \def\2##1##2{\ifdim\csname fontchar##1##2\endcsname#1`#2=0pt \else + \space##1##2=\the\csname fontchar##1##2\endcsname#1`#2 \fi}% + \typeout{Font \string#1 character #2% + \iffontchar#1`#2:\2wd\2ht\2dp\2ic\else \space does not exist\fi}} + \1\font A \1{\textfont1}B \1{\scriptfont2}B \1{\scriptscriptfont3}B + \1\trip 7 \1\trip D \1\nullfont D +% + \def\1#1{\cndx=\zero \ctmp=\zero + \def\2{\iffontchar#1\cndx \advance\ctmp by\one \fi + \advance\cndx by\one + \ifnum\cndx<256 \expandafter\2\fi}% + \2% + \typeout{Font \string#1 has \number\ctmp\space character% + \ifnum1=\cndx \else s\fi .}} + \1\font \1\trip \1\nullfont +\endgroup + +% +% -- Check \parshapelength, \parshapeindent, and \parshapedimen +\typeout{Checking \string\parshapelength, \string\parshapeindent, and + \string\parshapedimen:} +\begingroup + \parshapelength \parshapeindent \parshapedimen % <== can't use + \def\1#1 {\edef\2{\2 #1}} + \let\2=\empty + \ifdim\parshapeindent-5=0pt \else\1a \fi + \ifdim\parshapelength-5=0pt \else\1b \fi + \ifdim\parshapeindent-1=0pt \else\1c \fi + \ifdim\parshapelength-1=0pt \else\1d \fi + \ifdim\parshapeindent-0=0pt \else\1e \fi + \ifdim\parshapelength-0=0pt \else\1f \fi + \ifdim\parshapeindent 1=0pt \else\1g \fi + \ifdim\parshapelength 1=0pt \else\1h \fi + \ifdim\parshapeindent 5=0pt \else\1j \fi + \ifdim\parshapelength 5=0pt \else\1i \fi + \ifdim\parshapedimen-5=0pt \else\1k \fi + \ifdim\parshapedimen-1=0pt \else\1l \fi + \ifdim\parshapedimen 0=0pt \else\1m \fi + \ifdim\parshapedimen 1=0pt \else\1n \fi + \ifdim\parshapedimen 2=0pt \else\1o \fi + \typeout{Parshape test 1 \ifx\2\empty OK\else error(s):\2\fi} + \parshape=2 1pt 2pt 3pt 4pt + \let\2=\empty + \ifdim\parshapeindent-5=0pt \else\1a \fi + \ifdim\parshapelength-5=0pt \else\1b \fi + \ifdim\parshapeindent-1=0pt \else\1c \fi + \ifdim\parshapelength-1=0pt \else\1d \fi + \ifdim\parshapeindent-0=0pt \else\1e \fi + \ifdim\parshapelength-0=0pt \else\1f \fi + \ifdim\parshapedimen-5=0pt \else\1g \fi + \ifdim\parshapedimen-1=0pt \else\1h \fi + \ifdim\parshapedimen 0=0pt \else\1i \fi + \typeout{Parshape test 2 \ifx\2\empty OK\else error(s):\2\fi} + \parshape=2 1pt 2pt 3pt 4pt + \parshape=2 \parshapelength2 \parshapeindent2 + \parshapelength1 \parshapeindent1 + \let\2=\empty + \ifdim\parshapeindent1=4pt \else\1A \fi + \ifdim\parshapelength1=3pt \else\1B \fi + \ifdim\parshapeindent2=2pt \else\1C \fi + \ifdim\parshapelength2=1pt \else\1D \fi + \ifdim\parshapeindent3=2pt \else\1E \fi + \ifdim\parshapelength3=1pt \else\1F \fi + \ifdim\parshapeindent9=2pt \else\1G \fi + \ifdim\parshapelength9=1pt \else\1H \fi + \typeout{Parshape test 3 \ifx\2\empty OK\else error(s):\2\fi} + \parshape=2 1pt 2pt 3pt 4pt + \parshape=2 11\parshapedimen4 11\parshapedimen3 + 11\parshapedimen2 11\parshapedimen1 + \let\2=\empty + \ifdim\parshapedimen1=44pt \else\1A \fi + \ifdim\parshapedimen2=33pt \else\1B \fi + \ifdim\parshapedimen3=22pt \else\1C \fi + \ifdim\parshapedimen4=11pt \else\1D \fi + \ifdim\parshapedimen5=22pt \else\1E \fi + \ifdim\parshapedimen6=11pt \else\1F \fi + \ifdim\parshapedimen99=22pt \else\1G \fi + \ifdim\parshapedimen100=11pt \else\1H \fi + \typeout{Parshape test 4 \ifx\2\empty OK\else error(s):\2\fi} +\endgroup + +% +% -- Check \numexpr, \dimexpr, \glueexpr, and \muexpr +\typeout{Checking \string\numexpr, \string\dimexpr, \string\glueexpr, + and \string\muexpr:} +\begingroup + \numexpr \dimexpr \glueexpr \muexpr % <== can't use + \let\9=\relax + \count43=\numexpr ( ( 2 \9 \dimen43=\dimexpr ( 3pt \9 + \skip43=\glueexpr 4pt plus 3fil \9 \muskip43=\muexpr(5muminus1mu)\9 + \def\1#1 {\typeout{\detokenize{#1}=\the#1}} + \1\numexpr\count43 \1\dimexpr\dimen43 + \1\glueexpr\skip43 \1\muexpr\muskip43 + + % Test arithmetic overflow + \begingroup + \tracingassigns=5 + \count44=\numexpr"7FFFFFFE+1 \dimen44=\dimexpr"3FFFFFFEsp+1sp + \count44=\numexpr-"7FFFFFFE-1 \dimen44=\dimexpr-"3FFFFFFEsp-1sp + \count44=\numexpr"FFFF*"8000 \dimen44=\dimexpr"7FFFsp*"8000 + \skip44="3FFFFFFFsp \advance\skip44by1sp \relax + \dimen45=\skip44 \dimen45=\dimexpr1sp*\skip44\9 + \dimen44=-"3FFFFFFFsp \advance\dimen44by-1sp + \dimen45=\skip44 \dimen45=\dimexpr1sp*\skip44\9 + \count44=\numexpr"7FFFFFFE+2\9 \dimen44=\dimexpr"3FFFFFFEsp+2sp\9 + \count44=\numexpr-"7FFFFFFE-2\9 \dimen44=\dimexpr-"3FFFFFFEsp-2sp\9 + \count44=\numexpr"10000*"8000\9 \dimen44=\dimexpr"8000sp*"8000\9 + \count44=\numexpr"10000*-"8000\9 \dimen44=\dimexpr"8000sp*-"8000\9 + \count44=\numexpr-"10000*"8000\9 \dimen44=\dimexpr-"8000sp*"8000\9 + \count44=\numexpr-"10000*-"8000\9 \dimen44=\dimexpr-"8000sp*-"8000\9 + \count44=\numexpr0/0\9 \dimen44=\dimexpr0pt/0\9 + \count44=\numexpr1/0\9 \dimen44=\dimexpr1pt/0\9 + \count44=\numexpr-1/0\9 \dimen44=\dimexpr-1pt/0\9 + \endgroup + + % Test glue arithmetic (add and sub) + \begingroup + \skip90=3pt plus 0fill minus 1fil + \skip91=3pt plus 1fil minus 0fill + \skip92=2pt plus -1fil minus 1fil + \tracingassigns=5 + \skip93=\glueexpr\skip90+0pt \skip93=\glueexpr\skip90+0pt + \skip93=\glueexpr--\skip90 \skip93=\glueexpr--\skip90 + \skip93=\glueexpr\skip91+0pt + \skip93=\glueexpr--\skip91 \skip93=\glueexpr--\skip91 + \skip93=\glueexpr\skip92+0pt + \skip93=\glueexpr--\skip92 \skip93=\glueexpr--\skip92 + \skip93=\glueexpr\skip90-\skip91 + \skip93=\glueexpr\skip91-\skip92 + \skip93=\glueexpr\skip91+\skip92 + \endgroup + + % Test rounding of division (all combinations of signs) + \def\2#1 {\edef\3{\3 #1}} + \def\1#1#2#3#4{\let\3=\empty + \ifnum#4=\numexpr#2/#3\else\2a \fi + \ifnum#4=-\numexpr-#2/#3\else\2b \fi + \ifnum-#4=\numexpr#2/-#3\else\2c \fi + \ifnum#4=\numexpr-#2/-#3\else\2d \fi + \typeout{Expr quotient rounding #1 \ifx\3\empty OK\else + error(s):\3\fi}} + \11{"3FFFFFFF}{"7FFFFFFF}{0} + \12{"40000000}{"7FFFFFFF}{1} + \13{"3FFFFFFE}{"7FFFFFFE}{0} + \14{"3FFFFFFF}{"7FFFFFFE}{1} + \def\1#1#2#3#4{\let\3=\empty + \ifnum#4=\numexpr#2/#3\else\2a \fi + \ifnum#4=-\dimexpr-#2sp/#3\else\2b \fi + \ifnum-#4=\glueexpr\muexpr#2mu/"10000\9/-#3\else\2c \fi + \ifnum#4=\muexpr-\dimexpr#2spplus-1muminus-1fil/-#3\else\2d \fi + \typeout{Expr quotient rounding #1 \ifx\3\empty OK\else + error(s):\3\fi}} + \15{32}{5}{6} % <== three mu_error's (! Incompatible glue units) + \16{33}{5}{7} % <== three mu_error's (! Incompatible glue units) + \17{25}{4}{6} % <== three mu_error's (! Incompatible glue units) + \18{26}{4}{7} % <== three mu_error's (! Incompatible glue units) + + % Test rounding of fractions + \begingroup + \def\1#1 #2 #3 #4 #5 {\let\3=\empty + \ifnum#5=\numexpr#2*#3/#4\else\2a \fi + \ifnum-#5=\numexpr-#2*#3/#4\else\2b \fi + \ifnum-#5=\numexpr#2*-#3/#4\else\2c \fi + \ifnum#5=\numexpr-#2*-#3/#4\else\2d \fi + \ifnum-#5=\numexpr#2*#3/-#4\else\2e \fi + \ifnum#5=\numexpr-#2*#3/-#4\else\2f \fi + \ifnum#5=\numexpr#2*-#3/-#4\else\2g \fi + \ifnum-#5=\numexpr-#2*-#3/-#4\else\2h \fi + \4#1} + \def\4#1{\typeout{Expr fraction rounding #1 \ifx\3\empty OK\else + error(s):\3\fi}\let\3=\empty} + \11 "7FFFFFFE "7FFFFFFE "7FFFFFFD "7FFFFFFF + \12 "7FFFFFFE "7FFFFFFE "7FFFFFFF "7FFFFFFD + \def\1#1#2 #3 #4 #5 #6 {\let\3=\empty + \ifnum\numexpr#6=\numexpr(#3)*(#4)/(#5)\else\2#1 \fi + \ifdim\dimexpr1sp*#6=\dimexpr(#3sp)*(#4)/(#5)\else\2#2 \fi} + \1ab "3FFFFFFE "7FFFFFFE "7FFFFFFD "3FFFFFFF + \1cd "3FFFFFFE "7FFFFFFE "7FFFFFFF "3FFFFFFD + \1ef "1FFFBFFE "20003FFE "1FFFFFFE "1FFFFFFF + \1gh "1FFFBFFF "20003FFF "1FFFFFFF "20000000 + \1ij "1FFFC000 "20004000 "20000000 "20000000 + \1kl "1FFFC001 "20004001 "20000001 "20000001 + \errorcontextlines=100 + \1mn 1 "7FFFFFFF 2 "40000000 + \43 + \endgroup + + \bgroup + \skip44=\glueexpr ( \skip43 ) + 3 pt plus 1 fil minus 1 fil l l + \muskip44=\muexpr (\muskip43)+3muplus1fill + \dimen44=\dimexpr\skip43+\count43pt + \dimen44=\dimexpr(\skip43)+(\count43pt) + \dimen44=\dimexpr\skip43*\count43 + \skip44=\glueexpr\skip43/\count43 + \skip44=\glueexpr\skip43*2/3 + \egroup + + % Test operator precedence + \bgroup + \def\1#1#2#3#4{#1#2#3#4=#2#3(#4)\else + \typeout{expression error (l.\number\inputlineno)}\fi} + \1\ifnum\numexpr{1+}{2*3} + \1\ifnum\numexpr{4-}{5*6} + \1\ifnum\numexpr{7+}{12/4} + \1\ifnum\numexpr{4-}{6/3} + \1\ifdim\dimexpr{1pt+}{2pt*3} + \1\ifdim\dimexpr{4pt-}{5pt*6} + \1\ifdim\dimexpr{7pt+}{12pt/4} + \1\ifdim\dimexpr{4pt-}{6pt/3} + \1\ifdim\glueexpr{7pt+}{12pt/4} + \egroup + + % Test glue reference count handling + \shipout\hbox{} + \bgroup + \skip43=\glueexpr1ptplus0ptminus0pt + \skip43=\glueexpr1pt-0pt+0pt + \skip43=\glueexpr(((\skip43))) + \egroup + \shipout\hbox{} +\endgroup + +% +% -- Check \mutoglue and \gluetomu +\typeout{Checking \string\mutoglue\space and \string\gluetomu:} +\begingroup + \mutoglue \gluetomu % <== can't use + \skip1=-\mutoglue-\gluetomu9pt \muskip1=-\gluetomu-\mutoglue9mu + \skip2=\gluetomu\muskip1 % <== two mu_error's (! Incompatible glue units) + \muskip2=\mutoglue\skip1 % <== two mu_error's (! Incompatible glue units) + \tracingassigns=1 + \skip1=\mutoglue1muplus-2muminus-3fil + \muskip1=\gluetomu1ptplus-2ptminus-3fil + \skip2=\mutoglue-4muplus5fillminus6filll + \muskip2=\gluetomu-4ptplus5fillminus6filll + \skip3=-\mutoglue\muskip1 + \muskip3=-\gluetomu\skip1 + \skip4=\mutoglue-\muskip2 + \muskip4=\gluetomu-\skip2 + +% +% -- Check (mu)glue identity + \typeout{Checking (mu)glue identity:} + \skipdef\132767\1=7ptplus0filminus0fill\muskipdef\232766\2=\gluetomu\1 + \tracingassigns=\1 + \1=--\mutoglue--\muexpr(--\gluetomu--\glueexpr(--\1)) + \2=--\gluetomu--\glueexpr(--\mutoglue--\muexpr(--\2)) + \tracingassigns=0 + +% +% -- Check \gluestretchorder, \glueshrinkorder, \gluestretch, and \glueshrink + \typeout{Checking \string\gluestretchorder, \string\glueshrinkorder, + \string\gluestretch, and \string\glueshrink:} + \gluestretchorder \gluestretch % <== can't use + \glueshrinkorder \glueshrink % <== can't use + \skip5=1ptminus0fil + \skip6=1ptplus0fillminus0filll + \def\2#1{\typeout{wrong glue #1 (l.\number\inputlineno)}} + \def\1#1#2pt#3#4pt#5 {% + \ifnum\gluestretchorder#5=#1 \else \2{stretch order}\fi + \ifdim\gluestretch#5=#2pt \else \2{stretch}\fi + \ifnum\glueshrinkorder#5=#3 \else \2{shrink order}\fi + \ifdim\glueshrink#5=#4pt \else \2{shrink}\fi} + \def\9{\relax} + \100pt10pt1ptminus0fil + \100pt10pt\mutoglue1muminus0fil + \100pt10pt\mutoglue\gluetomu1ptminus0fil + \100pt10pt\skip5 + \muskip5=\gluetomu\skip5 + \100pt10pt\mutoglue\muskip5 + \100pt10pt\glueexpr\mutoglue\muexpr\gluetomu\skip5\9\9 + \100pt00pt\glueexpr\skip5+0pt\9 + \120pt30pt1ptplus0fillminus0filll + \120pt30pt\mutoglue1muplus0fillminus0filll + \120pt30pt\mutoglue\gluetomu1ptplus0fillminus0filll + \120pt30pt\skip6 + \muskip6=\gluetomu\skip6 + \120pt30pt\mutoglue\muskip6 + \120pt30pt\mutoglue\muexpr\gluetomu\glueexpr\skip6\9\9 + \100pt00pt\glueexpr\skip6+0pt\9 + \10-2pt1-3pt\skip1 + \10-2pt1-3pt\mutoglue\muskip1 + \125pt36pt\skip2 + \125pt36pt\mutoglue\muskip2 +\endgroup + +% +% -- Check sparse arrays +\typeout{Checking sparse arrays:} +\begingroup + \def\2#1{#1\1=-1#1\1=32768#1\1=0#1\1=32767\typeout{\meaning\1=\the\1.}} + \2\countdef % Bad register code (-1) ...and (32768). + \2\dimendef % Bad register code (-1) ...and (32768). + \2\skipdef % Bad register code (-1) ...and (32768). + \2\muskipdef % Bad register code (-1) ...and (32768). + \2\toksdef % Bad register code (-1) ...and (32768). + \tracingrestores=1 + \count20=5 + \count2000=5 + \dimen21=5pt + \dimen2100=5pt + \skip22=5pt\relax \muskip2200=5mu\relax + \dimendef\8=256\relax \let\9=\8 \let\8=\relax \show\9 +\endgroup +\begingroup + \def\4#1#2#3#4{{\typeout{testing #1 registers ...}% + \5\2{#1}\5\3{#1def}% define, e.g., \count and \countdef + \newlinechar=`^^J \tracingrestores=1 {\tracingassigns=1 + \22000=#2} \22001=#3 \3\1=2002 \1=#4 + \typeout{\6\22000=\the\22000,^^J \6\22001=\the\22001,^^J + \6\22002=\the\22002,^^J \7\1=\the\1.}% + \expandafter\unless\expandafter\ifx\2\toks +% more tests for \count, \dimen, \skip, and \muskip + \advance\22000by#3 \advance\1by#3 \8 + \multiply\22000by10 \multiply\1by10 \8 + \divide\22000by5 \divide\1by5 \8 + \else +% more tests for \toks + \begingroup + \tracingassigns=1 + \toks20=#2 \toks21=#3 \toks2100=#4 + \1=\toks20 \1=\toks21 + \toks2200=\toks20 \toks2200=\toks21 + \1=\toks2000 \1=\toks2001 + \toks2200=\toks2000 \toks2200=\toks2001 + \toks30=\1 \toks30=\toks2000 \toks30=\toks2001 + \toks3000=\1 \toks3000=\toks2000 \toks3000=\toks2001 + \endgroup + \fi + \tracingassigns=1 \global\22002=#3 \1=#4 \global\1=#2 + }} + \def\5#1#2{\edef#1{\csname#2\endcsname}} + \def\6{\expandafter\string} + \def\7{\expandafter\meaning} + \def\8{\typeout{\6\22000=\the\22000,^^J \6\22002=\the\22002,^^J + \7\1=\the\1.}} + \4{count}{0}{5}{7} % test \count, \countdef + \4{dimen}{0pt}{2.5pt}{3.5pt} % test \dimen, \dimendef + \4{skip}{0pt}{2.5ptplus1fil}{3.5ptminus1fill} % test \skip, \skipdef + \4{muskip}{0mu}{2.5muplus1fil}{3.5muminus1fill} % test \muskip, \muskipdef + \4{toks}{{}}{{a b c}}{{d e f}} % test \toks and \toksdef +\endgroup +\begingroup + \typeout{testing box registers ...} + \def\2#1{#1\1=-1#1\1=32768#1\1=0#1\1=32767\typeout{\meaning\1=\the\1.}} + \2\mathchardef % Bad mathchar (-1) ...and (32768). + \setbox-1=\copy32768 % Bad register code (-1) ...and (32768). + \global\setbox32768=\copy-1 % Bad register code (32768) ...and (-1). + \wd32768=\ht-1 % Bad register code (32768) ...and (-1). + \showbox-1 % Bad register code (-1). + \def\2#1{\typeout{\string\box#1=% + \ifhbox#1 \ifvbox#1 \else\ifvoid#1 \else\string\hbox\fi\fi\fi + \ifvbox#1 \ifhbox#1 \else\ifvoid#1 \else\string\vbox\fi\fi\fi + \ifvoid#1 void\else + \ifdim\ht#1 =0pt \else,ht=\the\ht#1 \fi + \ifdim\dp#1 =0pt \else,dp=\the\dp#1 \fi + \ifdim\wd#1 =0pt \else,wd=\the\wd#1 \fi + \fi.}} + \def\1#1{\2{3210#1}} + \tracingrestores=1 + \setbox32101=\hbox to 3pt{% + \global\setbox32102=\vbox to 5pt{% + \setbox32103=\vtop to 7pt{% + \showgroups + }% + }% + } + \showbox32100 + \showbox32101 + \11\12\13 + \setbox32103=\copy32101 \11\13 + \setbox32104=\box32102 \12\14 + \ht32101=2pt \11 + \ht32102=4pt \12 + \dp32103=6pt \13 + \wd32104=8pt \14 + \setbox32105=\hbox{\vbox to1pt{}\hskip5pt} \15 + \setbox32106=\hbox{% + \unhcopy32105 \15% + \unhbox32105 \15% + \unhcopy32105 \unhbox32105 } \15 \16 + \setbox32105=\vbox{\hbox to1pt{}\vskip5pt} \15 + \setbox32106=\vbox{% + \unvcopy32105 \15% + \unvbox32105 \15% + \unvcopy32105 \unvbox32105 } \15 \16 + \setbox32105=\vbox{\vbox to10pt{}\penalty0\vbox to20pt{}} \15 + \setbox32106=\vsplit32105 to 10pt \16 \15 +\endgroup + +% +% -- Check \lastlinefit +\typeout{Checking \string\lastlinefit:} +\begingroup + \def\1{\setbox0=\vbox{\noindent\2\2\2\2\3\2}\showbox0 + \setbox0=\vbox{\unvbox0 \setbox0=\lastbox \showbox0 }} + \def\2{\hbox to30pt{}\hskip 5pt plus 20pt minus 4pt } + \def\3{} + \tracingparagraphs=1 \showboxdepth=1 + \hbadness=100 \pretolerance=9000 + \parfillskip=0pt plus 1fill \relax + \hsize=96pt + \lastlinefit=-1 \1 + \lastlinefit=500 \1 + \lastlinefit=1001 \1 + \hsize=98pt + \begingroup + \rightskip=0pt plus 1fill \relax + \lastlinefit=1000 \1 + \leftskip=0pt plus -1fill \relax + \lastlinefit=500 \1 + \endgroup + \lastlinefit=1000 \1 + \hsize=100pt + \lastlinefit=0 \1 + \lastlinefit=500 \1 + \lastlinefit=1000 \1 + \hsize=110pt + \begingroup + \let\3=\hfil + \lastlinefit=1000 \1 + \endgroup + \lastlinefit=500 \1 + \lastlinefit=1000 \1 + \hsize=120pt + \lastlinefit=0 \1 + \lastlinefit=500 \1 + \lastlinefit=1000 \1 +\endgroup + +% +% -- Check expansion of V 2 \protected macros +\typeout{Checking expansion of V 2 \string\protected\space macros:} +\begingroup + \protected\def\1{\omit} \def\2{\omit} \def\3{relax} + \setbox0=\vbox{\halign{&\typeout{# (l.\number\inputlineno)}\cr + \1& \1\cr + \2& \2\cr + \3& \3\cr}} +\endgroup + +% +% -- Check hyphenation and \savinghyphcodes +\typeout{Checking hyphenation and \string\savinghyphcodes:} +\begingroup + \def\2#1#2 {\language=#1 #2 } + \def\1#1 {\noindent\trip\ \20#1 \21#1 \22#1 \23#1 \24#1 \par} + \parfillskip=0pt \hbadness=0 \showboxdepth=0 + \hsize=16383.99999pt \pretolerance=-1 \tolerance=-1 + \setbox0=\vbox{ + \lccode`A=`a \lccode`B=`b + \language=0 \hyphenation{qq-App qqB-pp} + \language=1 \hyphenation{qq-App qqB-pp} + \language=2 \hyphenation{qq-A-pp qqB-pp} + \language=3 \hyphenation{qq-App qq-B-pp} + \1ppAqq \1upAqq \1ppBqq \1upBqq + \lccode`A=`r \lccode`B=`b + \1ppAqq \1upAqq \1ppBqq \1upBqq + \lccode`A=`a \lccode`B=`r + \1ppAqq \1upAqq \1ppBqq \1upBqq + } + \setbox0=\vbox{\language=3 \1qqapp \1qqbpp \1qqrpp } +\endgroup + +% +% -- Check \savingvdiscards, \pagediscards, and \splitdiscards +\typeout{Checking \string\savingvdiscards, \string\pagediscards, and + \string\splitdiscards:} +\begingroup + \setbox27=\vbox{\noindent$\splitdiscards\noindent$\pagediscards} + \showbox27 + \setbox 27 = \vbox { + \vbox to 20 pt {} + \prevdepth = -10000 pt + \openout 0 = abc + \penalty 0 + \write 1 {write 1} + \vskip 10 pt plus 1 pt minus 1 pt + \write 2 {write 2} + \penalty 0 + \closeout 3 + \kern 10 pt + \vbox to 20 pt {} + \vfil + } + \def\1 #1 #2 {% + \savingvdiscards = #1 + \setbox 28 = \copy 27 + { + \setbox 0 = \vbox { + \vsplit 28 to #2 pt + \prevdepth = -10000 pt + \splitdiscards + \box 28 + } + \showbox 0 + } + } + \1 -1 20 \1 0 30 \1 1 20 \1 2 30 + \output = {% + \setbox 0 = \vbox { \pagediscards } + \showbox 0 + \showbox 255 + \setbox 0 = \box 255 + \global \deadcycles = 0 + } + \def\1{{\setbox 0 = \vbox { \pagediscards \showlists }}} + \savingvdiscards = 0 \vfil \kern 20 pt \1 \penalty -1 \1 + \savingvdiscards = 1 \vfill \kern 2 pt \1 \penalty 10 \1 + \kern 5 pt \write 1 {} \penalty 0 + { \savingvdiscards = 0 + \kern 6 pt \write 2 {} \penalty 1 + } + \kern 7 pt \write 3 {} \hbox {} \penalty -10000 + \1 +\endgroup + +% +% -- Check \interlinepenalties, \clubpenalties, \widowpenalties, +% and \displaywidowpenalties +\typeout{Checking \string\interlinepenalties, \string\clubpenalties, + \string\widowpenalties, and \string\displaywidowpenalties:} +\begingroup + \begingroup + \def\2#1{% + \typeout{\string#1-1=\the#1-1}% + \typeout{\string#10=\the#10}% + \typeout{\string#15=\the#15}% + \typeout{\string#1\string#10=\the#1#10}} + \def\1{% + \2\interlinepenalties + \2\clubpenalties + \2\widowpenalties + \2\displaywidowpenalties} + \def\5#1#2{\number#1#2 + \ifnum#2<#10 \space\expandafter\5\expandafter#1\expandafter + {\number\numexpr#2+1\expandafter}\fi} + \def\4#1{\typeout{\string#1=\5#1{0}}} + \def\3{% + \4\interlinepenalties + \4\clubpenalties + \4\widowpenalties + \4\displaywidowpenalties} + \tracingassigns=1 \tracingrestores=1 + \3 \1 + \interlinepenalties=3 101 102 103 + \clubpenalties=1 1 \clubpenalties=4 201 202 203 204 + \widowpenalties=5 301 302 303 304 305 + \displaywidowpenalties=6 401 402 403 404 405 406 + \3 \1 + \setbox0=\vbox{} + \endgroup + \parfillskip=0pt \interlinepenalty=7 \clubpenalty=500 \widowpenalty=300 + \displaywidowpenalty=310 \rightskip=0ptplus1fil \hsize=20pt + \def\3#1 {\setbox0=\lastbox \unskip \count0=\lastpenalty \unpenalty + \ifnum\count0=#1 \else \typeout{Wrong penalty \number\count0 + \space should be #1 (l.\number\inputlineno)}\fi} + \def\2{\vrule height1ptwidth19pt\hskip5pt } + \def\1#1#2 #3 #4 #5 #6 #7 {\setbox0=\vbox{#1\noindent\2\2\2\2$$ + $$\2\2\2\2\par\3#7 \3#6 \3#5 \30 \30 \30 \30 \3#4 \3#3 \3#2 \30 }} + + \1{\interlinepenalties=8 8 7 6 5 4 3 2 1 }508 7 316 501 1 301 + \1{\clubpenalties=2 200 100 }207 107 417 207 107 407 + \1{\widowpenalties=2 2000 1000 \displaywidowpenalties=3 2200 1100 0 }% + 507 1107 2207 1507 1007 2007 +\endgroup + +% +\showboxbreadth=10\showboxdepth=10 +\tracingonline=1\tracingoutput=1 +\end +\error{e-VirTeX: can't happen in e-trip test!} +%% End of file `etrip.tex'. diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip.typ b/Build/source/texk/web2c/etexdir/etrip/etrip.typ new file mode 100644 index 00000000000..a0b0d0f6856 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip.typ @@ -0,0 +1,20 @@ +This is DVItype, Version 3.6 +Options selected: + Starting page = *.*.*.*.*.*.*.*.*.* + Maximum number of pages = 1000000 + Output level = 2 (mnemonics) + Resolution = 72.27000000 pixels per inch +numerator/denominator=25400000/473628672 +magnification=1000; 0.00001526 pixels per DVI unit +' TeX output 2004.09.06:2313' + +42: beginning of page 1.0.0.0.0.0.0.0.0.0 +87: eop + +88: beginning of page 1.0.0.0.0.0.0.0.0.0 +133: eop + +134: beginning of page 1.0.0.0.0.0.0.0.0.0 +179: eop +Postamble starts at byte 180. +maxv=0, maxh=0, maxstackdepth=0, totalpages=3 diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip1.in b/Build/source/texk/web2c/etexdir/etrip/etrip1.in new file mode 100644 index 00000000000..0ad278fb43e --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip1.in @@ -0,0 +1,2 @@ + +*\input trip diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip2.in b/Build/source/texk/web2c/etexdir/etrip/etrip2.in new file mode 100644 index 00000000000..8001246f85a --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip2.in @@ -0,0 +1 @@ +*etrip diff --git a/Build/source/texk/web2c/etexdir/etrip/etrip3.in b/Build/source/texk/web2c/etexdir/etrip/etrip3.in new file mode 100644 index 00000000000..97e7957c245 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etrip3.in @@ -0,0 +1 @@ +&etrip etrip diff --git a/Build/source/texk/web2c/etexdir/etrip/etripin.log b/Build/source/texk/web2c/etexdir/etrip/etripin.log new file mode 100644 index 00000000000..5e8c0286e90 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etripin.log @@ -0,0 +1,40 @@ +This is e-TeX, Version 3.141592-2.2 (INITEX) 6 SEP 2004 23:13 +entering extended mode +***etrip +(etrip.tex This is the e-Trip test [2004-09-06] for e-TeX v3.141592-2.2. +(You are using e-TeX version/revision 2.2) +e-IniTeX: Assigning category codes, tracing switches, other codes, +definitions for e-VirTeX e-Trip test run, constants and registers, +fonts, some math characters, some math parameters, hyphenation, + +Underfull \hbox (badness 10000) in paragraph at lines 99--99 +[] \trip pp1aqq up1aqq ppb1qq upb1qq pp1r1qq up1r1qq qqb1pp + +\hbox(8.0+2.0)x16383.99998, glue set 1166.92857 [] + +! Not a letter. +l.100 ...guage=4 \hyphenation{-q + -}} +Letters in \hyphenation words must have \lccode>0. +Proceed; I'll ignore the character I just read. + + +enable e-TeX enhancements (TeXXeT), +prepare saved items (not to be dumped), everyjob ...dumped. ) +Beginning to dump on file etrip.fmt + (preloaded format=etrip 2004.9.6) +1435 strings of total length 24590 +279 memory locations dumped; current usage is 36&165 +407 multiletter control sequences +\font\nullfont=nullfont +\font\trip=etrip +\font\smalltrip=etrip at 5.0pt +\font\bigtrip=etrip at 20.0pt +2279 words of font info for 3 preloaded fonts +2 hyphenation exceptions +Hyphenation trie of length 434 has 12 ops out of 500 + 3 for language 3 + 3 for language 2 + 3 for language 1 + 3 for language 0 +No pages of output. diff --git a/Build/source/texk/web2c/etexdir/etrip/etripman.tex b/Build/source/texk/web2c/etexdir/etrip/etripman.tex new file mode 100644 index 00000000000..16464f8fb45 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/etripman.tex @@ -0,0 +1,436 @@ +% The e-TRIP manual: How to validate e-TeX - last modified 25 Aug 2004 +% +% some e-TeX numbers +% +\def\minps{32000} % minimum pool_size for e-TRIP test +\def\minms{3200} % minimum max_string for e-TRIP test +% +\def\extracs{66} % additional multiletter control sequences +\def\extrasv{2} % additional save stack positions +\def\extrabf{23} % additional input buffer positions +\def\extramw{38} % additional memory words dumped +% +\font\eighttt= cmtt8 +\font\eightrm= cmr8 +\font\rtitlefont= cmr7 scaled\magstep5 +\font\ititlefont= cmmi7 scaled\magstep5 +\def\titlefont{\rtitlefont \textfont1=\ititlefont} +\def\eTeX{$\varepsilon$-\TeX} +\def\NTS{NTS} +\let\mc=\eightrm +\rm +\let\mainfont=\tenrm + +\def\.#1{\hbox{\tt#1}} +\def\\#1{\hbox{\it#1\/\hskip.05em}} % italic type for identifiers + +\parskip 2pt plus 1pt +\baselineskip 12pt plus .25pt + +\def\verbatim#1{\begingroup \frenchspacing + \def\do##1{\catcode`##1=12 } \dospecials + \parskip 0pt \parindent 0pt + \catcode`\ =\active \catcode`\^^M=\active + \tt \def\par{\ \endgraf} \obeylines \obeyspaces + \input #1 \endgroup} +% a blank line will be typeset at the end of the file; +% if you're unlucky it will appear on a page by itself! +{\obeyspaces\global\let =\ } + +\def\verblines#1 {$$\frenchspacing \global\count255=-#1 + \abovedisplayskip=0pt \belowdisplayskip=\abovedisplayskip + \def\do##1{\catcode`##1=12 }\dospecials + \def\par{\cr\noalign{\global\advance\count255by1 }% + \ifnum\count255<0 \else \egroup $$\fi}% + \obeylines \obeyspaces + \halign\bgroup\indent\tt##\hfil\cr} + +\output{\shipout\box255\global\advance\pageno by 1} % for the title page only +\null +\vfill +\centerline{\titlefont A torture test for \eTeX} +\vskip 6pt +\centerline{({\sl Version 2.2, August 2004\/})} +\vskip 18pt +\centerline{by The \NTS\ Team} +\vskip 6pt +\centerline{Peter Breitenlohner, Max-Planck-Institut f\"ur Physik, M\"unchen} +\vskip 6pt +\centerline{Bernd Raichle, Institut f\"ur Informatik, Universit\"at Stuttgart} +\vfill +\centerline{\vbox{\hsize 4in +\noindent Programs that claim to be implementations of \eTeX\ are +supposed to be able to process the test routines described in this +report, producing the outputs described in this report.}} +\vskip 24pt +{\baselineskip 9pt +\eightrm\noindent +The preparation of this report was supported in part by DANTE, +Deutschsprachige Anwendervereinigung \TeX\ e.V.\hfil\break +`\TeX' is a trademark of the American Mathematical Society. + +}\pageno=0\eject + +\output{\shipout\vbox{ % for subsequent pages + \baselineskip0pt\lineskip0pt + \hbox to\hsize{\strut + \ifodd\pageno \hfil\eightrm\firstmark\hfil + \mainfont\the\pageno + \else\mainfont\the\pageno\hfil + \eightrm\firstmark\hfil\fi} + \vskip 10pt + \box255} + \global\advance\pageno by 1} +\let\runninghead=\mark +\outer\def\section#1.{\noindent{\bf#1.}\quad + \runninghead{\uppercase{#1} }\ignorespaces} + +\section Introduction. +The program \TeX82 by D.E.~Knuth is in the public domain, and its +algorithms are published; he has done this since he does not want to +discourage its use by placing proprietary restrictions on the software. +However, he doesn't want faulty imitations to masquerade as \TeX\ +processors, since users want \TeX\ to produce identical results on +different machines. He has copyrighted the programs so that he has some +chance to forbid unauthorized copies; he explicitly authorizes copying +of correct \TeX\ implementations, and not of incorrect ones! In order +to determine, what is a correct implementation of \TeX, he has devised +a test suite for \TeX, the \.{TRIP} test [1]. + +The program \eTeX\ by `The \NTS\ Team' extends the capabilities of \TeX\ +by adding a relatively small amount (less than 10 per cent) of code; it +is in the public domain, and its algorithms (beyond those of \TeX) are +published. This report has been inspired by and is based on the +\.{TRIP} manual. It describes the \.{e-TRIP} test, a test suite that +allows one to determine whether what one has is a correct implementation +of \eTeX. + +If somebody claims to have a correct implementation of \eTeX, we will +not believe it until we see that the \.{e-TRIP} test is performed +properly. We propose, in fact, that a program must meet two criteria +before it can justifiably be called \eTeX: (1)~The person who wrote it +must be happy with the way it works at his or her installation; and +(2)~the program must produce the correct results from the \.{e-TRIP} +test. Hence we are planning to do whatever we can to suppress any +systems that call themselves \eTeX\ without meeting conditions (1) +and~(2). We have copyrighted the program (1994,98 by The \NTS\ Team, +1999-2004 by P.~Breitenlohner) so that we have some chance to forbid +unauthorized copies; we explicitly authorize copying of correct \eTeX\ +implementations, and not of incorrect ones! + +The process of generating an \eTeX\ implementation for a particular +system [2] is based on that of generating a \TeX\ implementation for the +same system. Moreover, when \eTeX\ is used in compatibility mode, it is +supposed to be 100 per cent compatible with \TeX. Thus a correct \eTeX\ +implementation, when running in compatibility mode, must pass the +\.{TRIP} test. In fact, the first part of the \.{e-TRIP} test for a +particular implementation of \eTeX\ consists in performing the standard +\.{TRIP} test (a)~for \eTeX\ in compatibility mode and (b)~for \eTeX\ in +extended mode. The deviations in the test output from step~(a) should, +of course, be limited to those explicitly allowed by Knuth and described +in Appendix~A, item~5 of the \.{TRIP} manual. Any additional deviations +in the test output from step~(b) must be accounted for by \eTeX's +additional algorithms and are described in detail in this report. Once +an \eTeX\ implementation has passed these preliminary tests, it should be +subjected to the second part of the \.{e-TRIP} test. There the extended +features and algorithms of \eTeX\ are tested under normal circumstances +as well as in situations a normal user would never dream of (in the +spirit of the \.{TRIP} test). + +The remainder of this report consists of appendices, whose contents ought +to be described briefly here: + +Appendix A explains in detail how to carry out the first part of the +test of \eTeX, given copies of the files described in the \.{TRIP} +manual. + +Appendix B explains how to carry out the \eTeX\ specific test, given +copies of the files described in the other appendices. + +Appendix C is \.{eTRIP.TEX}, a fiendish test file for \eTeX. + +Appendix D is \.{eTRIP.PL}, the property-list description of a +special font called \.{etrip}. + +Appendix E is \.{eTRIPIN.LOG}, a correct transcript file \.{eTRIP.LOG} +that results if \.{e-TRIPTEX} is applied to \.{eTRIP.TEX}. +This run of \.{e-TRIPTEX} also creates a binary format file called +\.{eTRIP.FMT} (or similar). + +Appendix F is a correct transcript file \.{eTRIP.LOG} that results if +\.{e-TRIPTEX} or any other version of \eTeX\ is applied to \.{eTRIP.TEX} +with format \.{eTRIP.FMT}. + +Appendix G is \.{eTRIP.TYP}, the symbolic version of a correct output +file \.{eTRIP.DVI} that was produced at the same time as the +\.{eTRIP.LOG} file of Appendix~F. + +Appendix H is \.{eTRIP.OUT}, a short file written out and read in by +\eTeX\ when it processes \.{eTRIP.TEX}. + +Appendix I is \.{eTRIP.FOT}, an abbreviated version of Appendix F that +appears on the user's terminal during the run that produces +\.{eTRIP.LOG}. + +\vskip 24pt plus 24pt +\section References. +\item {[1]} +{\sl A torture test for \TeX\/}, +by Donald E.~Knuth, Stanford Computer Science Report~1027. + +\item {[2]} +{\sl How to generate \eTeX\/}, +by The \NTS\ Team (Peter Breitenlohner and Phil Taylor). + +\item {[3]} +{\sl The \.{WEB} system of structured documentation\/}, +by Donald E.~Knuth, Stanford Computer Science Report~980. + +\item {[4]} +{\sl \TeX ware\/}, by Donald E.~Knuth and David R.~Fuchs, +Stanford Computer Science Report~1097. + +\vfill\eject + +\section Appendix A: How to test \eTeX\ (part 1). + +\item{0.} Let's assume that you have copies of the files \.{TRIP.TEX}, +\.{TRIP.PL}, \.{TRIPIN.LOG}, \.{TRIP.LOG}, \.{TRIP.TYP}, and +\.{TRIP.FOT} as described in Appendices~B, C, D, E, F, and~G of the +\.{TRIP} manual [1] (in a safe place so that these ``master'' files will +not be clobbered). Furthermore, let's suppose that you have a working +\.{WEB} system [3], and that you have working programs \.{PLtoTF} and +\.{DVItype}, as described in the \TeX ware report [4]. Finally let's +assume that you are able to generate \eTeX\ as described in [2]. + +\item{1.} Use \.{PLtoTF} to convert \.{TRIP.PL} into \.{TRIP.TFM}; +install \.{TRIP.TFM} in the standard file area for \TeX\ font metric +files (or set a suitable environment variable or similar such that these +files will be found by the program). + +\item{2.} Generate \.{e-TRIPTEX}, a special version of \.{e-INITEX}. +The parameters for \.{e-TRIPTEX} should agree with those for \.{TRIPTEX} +(as described in [1]), except that you should set \\{pool\_size} to a +value $\ge\minps$ and \\{max\_strings} to a value $\ge\minms$. + +\item{3.} Perform the \.{TRIP} test as described in Appendix~A, +items~3--7 of [1], with \.{e-TRIPTEX} as prepared in step~2. The program +will run in compatibility mode and should therefore be fully compatible +with \.{TRIPTEX} as described in [1]; apart from the allowed differences +listed in item~5, the test output should deviate from the master files in +the following \eTeX-specific point (and only in this one): + +\itemitem{a)} The name and version by which the program announces itself +will be different; the extension of the format file produced during the +first \.{e-TRIPTEX} run may be different. + +\def\bs{{\char`\\}} +\def\sp{{\char'40}} + +\item{4.} Perform steps 3--7 of the \.{TRIP} test once again with +\.{e-TRIPTEX}. During the first run type `\.{*\bs input\sp trip}' +instead of `\.{\bs input\sp trip}', as a consequence \.{e-TRIPTEX} will +run in extended mode. During the second run type `\.{\&trip\sp\bs +toksdef\bs tokens=0\sp\bs input\sp trip}' instead of `\.{\sp\&trip\sp\sp +trip\sp}'. The test output should differ from that of step~3 above in +the following respects (and only in these): + +\itemitem{a)} The date and\slash or time will naturally be different. + +\itemitem{b)} The message `\.{entering extended mode}' will appear on +the terminal and in the \.{TRIP.LOG} files. + +\itemitem{c)} The input `\.{*\bs input trip}' instead of +`\.{\bs input trip}' is recorded in the first \.{TRIP.LOG} file; +similarly the input `\.{\&trip\sp\bs toksdef\bs tokens=0\sp\bs input\sp +trip}' instead of `\.{\sp\&trip\sp\sp trip\sp}' is recorded in the +second \.{TRIP.LOG} file. + +\itemitem{d)} The following 6 lines (the last of them blank) will be +missing from the first \.{TRIP.LOG} file\verblines 6 +! Bad register code (256). +l.29 ...{1} \toksdef\tokens=256 + \show\errorstopmode +A register number must be between 0 and 255. +I changed this one to zero. + + +\itemitem{e)} The first \.{TRIP.LOG} file will report the dumping of +\extramw~additional memory words. + +\itemitem{f)} If the date has changed, the number of string characters +dumped by the first \.{e-TRIPTEX} run may vary by $\pm2$. + +\itemitem{g)} Both \.{e-TRIPTEX} runs report \extracs~additional +multiletter control sequences (in the \.{TRIP.LOG} files). + +\itemitem{f)} The second \.{e-TRIPTEX} run reports the unfinished +group(s) when the program terminates; there are three additional lines +(the first of them blank) on the terminal and in the \.{TRIP.LOG} +file\verblines 3 + +### semi simple group (level 1) entered at line 429 (begingroup) +### bottom level +The second \.{TRIP.LOG} does not contain six lines\verblines 1 +{restoring \fam=-1} +one line\verblines 1 +{restoring \displayindent=0.0pt} +and one line\verblines 1 +{restoring current font=\ip} +Ten lines displaying an \.{\bs hbox} contain the additional text +`\.{, display}'. +Finally the second \.{TRIP.LOG} reports the additional use of +\extrabf~input buffer (\.{b}) and \extrasv~save (\.{s}) stack positions. + +\vfill\eject + +\section Appendix B: How to test \eTeX\ (part 2). + +\item{5.} Assume that you have copies of the ``master'' files +\.{eTRIP.TEX}, \.{eTRIP.PL}, \.{eTRIPIN.LOG}, \.{eTRIP.LOG}, +\.{eTRIP.TYP}, \.{eTRIP.OUT}, and \.{eTRIP.FOT}, as in Appendices C, D, +E, F, G, H, and~I (again in a safe place). + +\item{6.} Use \.{PLtoTF} to convert \.{eTRIP.PL} into \.{eTRIP.TFM}; +install \.{eTRIP.TFM} in the standard file area for \TeX\ font metric +files (or set a suitable environment variable or similar). + +\item{7.} Run \.{e-TRIPTEX}; in response to the `\.{**}' prompt, type +`\.{*etrip}'. You should get an output file \.{eTRIP.LOG} that matches +the file \.{eTRIPIN.LOG} (Appendix~E). Contrary to the analogous step +in the \.{TRIP} test (steps~3 and~4 above) there should be no error +messages; lines in the output saying ``Emergency stop'' would indicate +that you have performed this test with a standard \TeX\ or with \eTeX\ +in compatibility mode. + +\item{8.} Run \.{e-TRIPTEX} again; this time type +`\.{\&etrip{\char'40}etrip}'. You should get outputs \.{eTRIP.LOG}, +\.{eTRIP.DVI}, and \.{eTRIP.OUT}. Furthermore, your terminal should +receive output that matches \.{eTRIP.FOT} (Appendix~I). Once again, the +terminal will be getting no output during the middle part of this test. + +\item{9.} Compare the \.{eTRIP.LOG} file from step 8 with the ``master'' +\.{eTRIP.LOG} file of step~5. There should be no lines saying +``Emergency stop'' (see above) or ``Bug in your e-TeX implementation''; +there should be perfect agreement between these files except in the +following respects: + +\itemitem{a)} The dates and possibly the file names will naturally be +different. + +\itemitem{b)} Glue settings in the displays of \TeX\ boxes are subject +to system-dependent rounding, so slight deviations are permissible. +However, such deviations apply only to the `\.{glue set}' values that +appear at the end of an \.{\char'134hbox} or \.{\char'134vbox} line; all +other numbers should agree exactly, since they are computed with integer +arithmetic in a prescribed system-independent manner. + +\itemitem{c)} The amount of space in kerns that are marked ``for +accent'' are, similarly, subject to system-dependent rounding. + +\itemitem{d)} If you had different values for \\{stack\_size}, +\\{buf\_size}, etc., the corresponding capacity values will be different +when they are printed out at the end. + +\itemitem{e)} Help messages may be different; indeed, the author of +\TeX\ encourages non-English help messages in versions of \TeX\ for +people who don't understand English as well as some other language. +Similarly, \eTeX\ could well be used with non-English help messages. + +\itemitem{f)} The total number and length of strings at the end may well +be different. + +\itemitem{g)} If your \eTeX\ uses a different memory allocation or +packing scheme or \.{DVI} output logic, the memory usage statistics may +change. + +\item{10.} Use \.{DVItype} to convert your file \.{eTRIP.DVI} to a file +\.{eTRIP.TYP}. The following options should be set when using +\.{DVItype}: +$$\vbox{\halign{#\hfil&\hfil#\cr +Output level = 2\cr +Starting page = \.{*.*.*.*.*.*.*.*.*.*}\hskip-20pt\cr +Number of pages = 1000000&(this is the default)\cr +Resolution = 7227/100&(this is one point per pixel)\cr +New magnification = 0&(this is the default)\cr}}$$ +The resulting file should agree with the master \.{eTRIP.TYP} file of +step~5, except that some of the values might be a little off due to +floating-point rounding discrepancies. Furthermore there may be +differences between `\\{right}' and `\\w' and `\\x' commands, and +between `\\{down}' and `\\y' and `\\z'; the key thing is that all +characters and rules and \\{xxx}'s should be in almost the same +positions as specified in Appendix~G. If you have set +\\{dvi\_buf\_size} to 800, then your \.{DVI} file should be virtually +identical to the one supplied.) + +\vfill\eject + +\section Appendix C: The \.{eTRIP.TEX} file. +The contents of the test routine are prefixed here with line numbers, +for ease in comparing this file with the error messages printed later; +the line numbers aren't actually present. +\runninghead{APPENDIX C: \.{eTRIP.TEX} (CONTINUED)} + +\vskip 8pt +\begingroup\count255=0 +\everypar{\global\advance\count255 by 1 + \hbox to 20pt{\sevenrm\hfil\the\count255\ \ }} +\verbatim{etrip.tex} +\endgroup +\vfill\eject + +\section Appendix D: The \.{eTRIP.PL} file. +At the moment the \.{eTRIP.PL} file is just a copy of \.{TRIP.PL} as +described in Appendix~C of [1]. + +\section Appendix E: The \.{eTRIPIN.LOG} file. +When \.{e-TRIPTEX} makes the \.{eTRIP.FMT} file, it also creates a file +called \.{eTRIP.LOG} that looks like this. +\runninghead{APPENDIX E: \.{eTRIPIN.LOG} (CONTINUED)} + +\vskip8pt +\verbatim{etripin.log} +\vfill\eject + +\section Appendix F: The \.{eTRIP.LOG} file. +Here is the major output of the \.{e-TRIP} test; it is generated by +running \.{e-TRIPTEX} and loading \.{eTRIP.FMT}, then reading +\.{eTRIP.TEX}. +\runninghead{APPENDIX F: \.{eTRIP.LOG} (CONTINUED)} + +{\let\tt=\eighttt\leftskip 1in\baselineskip 9pt plus .1pt minus .1pt +\vskip8pt +\verbatim{etrip.log} +} +\vfill\eject + +\section Appendix G: The \.{eTRIP.TYP} file. +Here is another major component of the test. It shows the output of +\.{DVItype} applied to the file \.{eTRIP.DVI} that was created at the +same time Appendix F was produced. +\runninghead{APPENDIX G: \.{eTRIP.TYP} (CONTINUED)} + +{\let\tt=\eighttt\leftskip 1in\baselineskip 9pt plus .1pt minus .1pt +\vskip8pt +\verbatim{etrip.typ} +} +\vfill\eject + +\section Appendix H: The \.{eTRIP.OUT} file. +This short file was written out once and read in several times, during +the time Appendix F was being produced. There are only four lines. +\runninghead{APPENDIX H: \.{eTRIP.OUT} (CONTINUED)} + +\vskip8pt +\verbatim{etrip.out} +\vfill\eject + +\section Appendix I: The \.{eTRIP.FOT} file. +This shows what appeared on the terminal while Appendix F was being +produced. +\runninghead{APPENDIX I: \.{eTRIP.FOT} (CONTINUED)} + +\vskip8pt +\verbatim{etrip.fot} + +\vfill\end diff --git a/Build/source/texk/web2c/etexdir/etrip/texmf.cnf b/Build/source/texk/web2c/etexdir/etrip/texmf.cnf new file mode 100644 index 00000000000..d02f04dcd2d --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/texmf.cnf @@ -0,0 +1,46 @@ +% triptrap/texmf.cnf -- configuration for the trip and trap tests. + +% These values apply to all the programs, and they are necessary for any +% kind of reasonable diff. +error_line = 64 +half_error_line = 32 +max_print_line = 72 + +% e-TeX. +main_memory.etex = 2999 % can't change mem_bot, it stays 0 +max_strings.etex = 3300 +pool_size.etex = 34000 + +% In case you happen to run an ini* link by hand. +main_memory.einitex = 2999 % can't change mem_bot, it stays 0 +max_strings.einitex = 3300 +pool_size.einitex = 34000 + +string_vacancies = 8000 +pool_size = 32000 + +% TeX end e-TeX. +font_mem_size = 20000 +font_max = 75 +stack_size = 200 +nest_size = 40 +buf_size = 500 +save_size = 600 +dvi_buf_size = 800 +% Although hyph_size is settable, it can't be <hyph_prime, which is 607, +% and the original trip setting is 307, so no point in changing the default. + +% Avoid running any MakeTeX* program. +MAKETEXTFM = 0 +MAKETEXTEX = 0 +MAKETEXMF = 0 + +% Search paths. +% (e)trip.tex: +TEXINPUTS = . +% (e)trip.tfm: +TFMFONTS = . +% (e)trip.efmt: +TEXFORMATS = . +% etex.pool: +TEXPOOL = . diff --git a/Build/source/texk/web2c/etexdir/etrip/trip2.in b/Build/source/texk/web2c/etexdir/etrip/trip2.in new file mode 100644 index 00000000000..86f72b31b17 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/etrip/trip2.in @@ -0,0 +1 @@ +&trip \toksdef\tokens=0 \input trip diff --git a/Build/source/texk/web2c/etexdir/tex.ch0 b/Build/source/texk/web2c/etexdir/tex.ch0 new file mode 100644 index 00000000000..a395aa8d274 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/tex.ch0 @@ -0,0 +1,22 @@ +% Change file to assist in creating the web2c-specific change file. +% This one comes first, resolves inconsistencies between the generated +% etex.web and tex.ch +% Public domain. + +@x [1.2] l.188 +@d TeX_banner=='This is TeX, Version 3.141592' {printed when \TeX\ starts} +@# +@d banner==eTeX_banner +@y +@d banner=='This is TeX, Version 3.141592' {printed when \TeX\ starts} +@z + +@x [17.236] l.4960 - first web2c, then e-TeX additional integer parameters +@d tex_int_pars=55 {total number of \TeX's integer parameters} +@# +@d etex_int_base=tex_int_pars {base for \eTeX's integer parameters} +@y +@d int_pars=55 {total number of integer parameters} +@# +@d etex_int_base=tex_int_pars {base for \eTeX's integer parameters} +@z diff --git a/Build/source/texk/web2c/etexdir/tex.ch1 b/Build/source/texk/web2c/etexdir/tex.ch1 new file mode 100644 index 00000000000..bf02fd83350 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/tex.ch1 @@ -0,0 +1,19 @@ +% Change file to assist in creating the web2c-specific change file. +% This one resolves inconsistencies between tex.ch and tex.ech. +% Public domain. + +@x [1] m.2 l.188 - banner +@d banner==TeX_banner +@d banner_k==TeX_banner_k +@y +@d banner==eTeX_banner +@d banner_k==eTeX_banner_k +@z + +@x [17.236] l.4960 - first web2c, then e-TeX additional integer parameters +@d int_pars=web2c_int_pars {total number of integer parameters} +@# +@d etex_int_base=tex_int_pars {base for \eTeX's integer parameters} +@y +@d etex_int_base=web2c_int_pars {base for \eTeX's integer parameters} +@z diff --git a/Build/source/texk/web2c/etexdir/tex.ech b/Build/source/texk/web2c/etexdir/tex.ech new file mode 100644 index 00000000000..1d0409dd2c2 --- /dev/null +++ b/Build/source/texk/web2c/etexdir/tex.ech @@ -0,0 +1,111 @@ +% This is `tex.ech' in text format as of Aug 3, 2005, +% for web2c-7.5 and e-TeX Version 2.1 as of Jul 19, 2004, +% made by B. Raichle and P. Breitenlohner. +% Public domain. + +% Note: This file, etexdir/tex.ech, contains the web2c changes for the +% e-TeX specific part of etex.web (defined in etexdir/etex.ch) and is +% used as follows to construct the web2c change file for e-TeX: +% +% etexdir/tex.ch0 ) +% + ) +% tex.ch ) +% + ) => tie -c ... => etex.ch +% etexdir/tex.ch1 ) +% + ) +% etexdir/tex.ech ) +% +% In addition, this file is used to construct the web2c change file +% for pdfeTeX: +% +% pdfetexdir/tex.ch0 ) +% + ) +% tex.ch ) +% + ) +% etexdir/tex.ch1 ) +% + ) => tie -c ... => pdfetex.ch +% etexdir/tex.ech ) +% + ) +% pdfetexdir/tex.ch1 ) +% + ) +% pdftexdir/tex.pch ) +% +% where the four (small) files {,pdf}etexdir/tex.ch[01] take care +% of interferences between web2c, e-Tex, pdfTeX changes. +% Consequently, changes in all these files have to be coordinated. + +@x [1] m.2 l.188 - Web2C: extensions imply we're not e-TeX +@d eTeX_banner=='This is e-TeX, Version 3.141592',eTeX_version_string +@y +@d eTeX_banner_k=='This is e-TeXk, Version 3.141592',eTeX_version_string +@d eTeX_banner=='This is e-TeX, Version 3.141592',eTeX_version_string +@z + +@x [51.1332] l.24203 (ca.) texarray + line_stack:=xmalloc_array (integer, max_in_open); +@y + line_stack:=xmalloc_array (integer, max_in_open); + eof_seen:=xmalloc_array (boolean, max_in_open); + grp_stack:=xmalloc_array (save_pointer, max_in_open); + if_stack:=xmalloc_array (pointer, max_in_open); +@z + +@x [51.1337] l.24371 (ca.) texarray + trie_root:=0; trie_c[0]:=si(0); trie_ptr:=0; +@y + trie_root:=0; trie_c[0]:=si(0); trie_ptr:=0; + hyph_root:=0; hyph_start:=0; +@z + +@x [53a.1379] l.??? -etex command line switch +@!init if (buffer[loc]="*")and(format_ident=" (INITEX)") then +@y +@!init if (etex_p or(buffer[loc]="*"))and(format_ident=" (INITEX)") then +@z + +@x [53a.1379] l.??? -etex command line switch + incr(loc); eTeX_mode:=1; {enter extended mode} +@y + if (buffer[loc]="*") then incr(loc); + eTeX_mode:=1; {enter extended mode} +@z + +@x [53a.1383] l.??? -etex command line switch +@!eTeX_mode: 0..1; {identifies compatibility and extended mode} +@y +@!eTeX_mode: 0..1; {identifies compatibility and extended mode} +@!etex_p: boolean; {was the -etex option specified} +@z + +@x [53a.1391] l.??? texarray +@!eof_seen : array[1..max_in_open] of boolean; {has eof been seen?} +@y +@!eof_seen : ^boolean; {has eof been seen?} +@z + +@x [53a.1506] l.??? texarray +@!grp_stack : array[0..max_in_open] of save_pointer; {initial |cur_boundary|} +@!if_stack : array[0..max_in_open] of pointer; {initial |cond_ptr|} +@y +@!grp_stack : ^save_pointer; {initial |cur_boundary|} +@!if_stack : ^pointer; {initial |cond_ptr|} +@z + +@x [53a.1587] l.??? texarray +hyph_root:=0; hyph_start:=0; +@y +@z + +@x [54/web2c.???] l.??? needed earlier +replacement, but always existing character |font_bc[f]|. +@^inner loop@> + +@<Declare additional functions for ML\TeX@>= +function effective_char(@!err_p:boolean; +@y +replacement, but always existing character |font_bc[f]|. +@^inner loop@> + +@<Declare \eTeX\ procedures for sc...@>= +function effective_char(@!err_p:boolean; +@z |