summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/etexdir
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/web2c/etexdir
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/etexdir')
-rw-r--r--Build/source/texk/web2c/etexdir/ChangeLog607
-rw-r--r--Build/source/texk/web2c/etexdir/am/etex.am123
-rw-r--r--Build/source/texk/web2c/etexdir/etex.ch6371
-rw-r--r--Build/source/texk/web2c/etexdir/etex_gen.tex286
-rw-r--r--Build/source/texk/web2c/etexdir/etex_version.h1
-rw-r--r--Build/source/texk/web2c/etexdir/etexextra.c12
-rw-r--r--Build/source/texk/web2c/etexdir/etexextra.h34
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.diffs550
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.fot47
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.log4429
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.out4
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.pl833
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.tex1265
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip.typ20
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip1.in2
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip2.in1
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etrip3.in1
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etripin.log41
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/etripman.tex436
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/texmf.cnf41
-rw-r--r--Build/source/texk/web2c/etexdir/etrip/trip2.in1
-rwxr-xr-xBuild/source/texk/web2c/etexdir/etriptest.test128
-rw-r--r--Build/source/texk/web2c/etexdir/tex.ch022
-rw-r--r--Build/source/texk/web2c/etexdir/tex.ch119
-rw-r--r--Build/source/texk/web2c/etexdir/tex.ech118
-rwxr-xr-xBuild/source/texk/web2c/etexdir/wprob.test15
26 files changed, 15407 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..4a71c7f3cc0
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/ChangeLog
@@ -0,0 +1,607 @@
+2021-02-22 Phelype Oleinik <phe.h.o1@gmail.com>
+
+ * etex.ch: avoid "expansion depth" overflow with \numexpr.
+
+2021-02-13 Karl Berry <karl@freefriends.org>
+
+ * am/etex.am (etex_ch_srcs): adjust for split enctex changes.
+
+2019-12-10 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
+
+ * am/etex.am (etex_CPPFLAGS): append $(ZLIB_INCLUDES).
+ (etex_LDADD): include $(ZLIB_LIBS.)
+ (etex_DEPENDENCIES): define as $(ZLIB_DEPEND)
+ (etex_web_srcs): include zlib-fmt.ch.
+
+2018-03-24 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+ Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
+
+ * tex.ech: Recover the right \lastnodetype initialization
+ value ignored by tex.ch.
+
+2016-04-06 Karl Berry <karl@tug.org>
+
+ * etexextra.h (COPYRIGHT_HOLDER): add et al. since
+ peb passed away in 2015 so can't hold later copyrights.
+
+2015-09-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etriptest.test: Also check tripos.tex and etrip.out.
+
+2015-07-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Fixed a stupid typo that caused 'make dist' to
+ create e-TeX.
+
+2015-07-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etriptest (removed): Renamed ...
+ * etriptest.test (new): ... into this.
+ * am/etex.am: Better dependencies for 'make check'.
+
+2015-06-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Use $(tie_c) and $(tie_m).
+
+2015-04-12 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip/etrip.diffs: Updated for TL 2015.
+
+2014-12-12 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etriptest: Complain early if (e)trip.fmt is not created.
+ Inspired by report from vvv, tlbuild 14 Jun 2011 10:25:47.
+
+2014-05-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip/etrip.diffs: Updated for TL14.
+
+2014-01-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip/etrip.{diffs,fot,log,tex,typ}, etrip/etripin.log:
+ Updated for e-TeX 3.14159265.
+
+2014-01-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etexextra.h: Adapt to TeX Version 3.14159265.
+
+2014-01-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ TeX tuneup of 2014.
+ * etex.ch, tex.ch0, tex.ech: Adapt to TeX Version 3.14159265.
+
+2014-01-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip.test (removed): Renamed ...
+ * etriptest (new): ... into this.
+ * am/etex.am: Adapted.
+
+2013-11-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Enable hyphenation of text between \beginL and \endL or
+ between \beginR and \endR.
+ * etrip/etrip.diffs, etrip/etrip.fot, etrip/etrip.log,
+ etrip/etrip.tex, etrip/etrip.typ, etrip/etripin.log:
+ Version 2.6 [2013-11-21] for TL 2014.
+
+2013-04-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip/etrip.diffs, etrip/etrip.fot, etrip/etrip.typ,
+ etrip/etripin.log: Update for TL 2013.
+
+2013-03-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Towards better handling of right-to-left text.
+
+2013-03-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Better rule for etex_version.h.
+
+2013-03-01 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch, etex_version.h: Version 2.6.
+ Better handling of right-to-left text.
+ * etrip/etrip.diffs, etrip/etrip.fot, etrip/etrip.log,
+ etrip/etrip.tex, etrip/etripin.log: Version 2.6 [2013-03-01].
+
+2013-02-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Version 2.5, dated February 28, 2013.
+
+2013-01-24 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * wprob.test: Avoid spurious failure of parallel-tests.
+ * am/etex.am: Renamed wprob.{tex,log} => ewprob.{tex,log}.
+
+2013-01-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am, etrip.test: Enable parallel-tests.
+
+2012-12-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etex_version.h): Enable silent rules.
+
+2012-08-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch, etex_version.h: Version 2.5.
+ Better tracing of font definitions, reported by
+ Bruno Le Floch <blflatex@@gmail.com>, Jul 2012.
+ * etrip/etrip.tex: Test the additional tracing.
+
+2012-07-19 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Distribute etex_version.h.
+
+2012-07-15 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * etexextra.c: Must #define DLLPROC before reading etexd.h.
+
+2012-06-30 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etexextra.c [W32TeX]: #define DLLPROC for etex.dll.
+
+2012-05-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Version 2.4, dated May 11, 2012.
+ * etrip/etrip.tex, etrip/etripin.log, etrip/etrip.log,
+ etrip/etrip.fot, etrip/etrip.typ, etrip/etrip.diffs: Adapted.
+
+2012-04-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Fixed a typo in TeX text.
+
+ * INSTALL, README: Removed these obsolete files.
+ * am/etex.am (EXTRA_DIST): Removed INSTALL and README.
+
+2011-09-30 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * wprob.test: New shell script to test for uninitialized line.
+ * am/etex.am: Add the new test.
+
+2011-09-30 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Slightly reformulate printing of current line.
+
+2011-04-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Version 2.3, dated April 7, 2011.
+ * etrip/etrip.tex, etrip/etripin.log, etrip/etrip.log,
+ etrip/etrip.fot, etrip/etrip.typ, etrip/etrip.diffs: Adapted.
+
+2011-04-03 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Remove remove_end_M and insert_end_M (now unused).
+
+2011-03-31 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
+
+ * etex.ch: TeX formatting.
+
+2011-03-30 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Further reduce e-pTeX interferences.
+
+2011-03-29 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Rename box_lrstat into box_lr and define to also work
+ for min_quarterword<0.
+
+2011-03-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Use AM_CFLAGS instead of etex_CFLAGS.
+
+2011-03-27 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Reformulate @<Fetch an item in the current node...@>,
+ begin_box, and delete_last to fix a bug in \lastpenalty & Co;
+ further reduce e-pTeX interferences.
+
+2011-03-24 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Reformulate begin_box and delete_last to reduce
+ interferences between e-TeX and pTeX.
+
+2011-03-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Reformulate @<Fetch an item in the current node...@>
+ to reduce interferences between e-TeX and pTeX.
+
+2011-03-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Define and use the Web macros box_lr and set_box_lr
+ to reduce interferences between e-TeX and pTeX.
+
+2011-01-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etrip.diffs): Use $(triptrap_diffs).
+
+2011-01-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip/etrip.tex: Fixed 'wrong last node type' diagnostic.
+
+2011-01-14 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etrip-clean): Use TRIPTRAP_CLEAN.
+
+2011-01-14 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Mention \protected in error and help messages only
+ when in extended mode.
+ * etrip/etrip.tex: Fixed a typo currentgroup{type => level}.
+
+2011-01-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.mak, etex.mk (removed): Obsolete.
+
+2011-01-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etex_web_srcs): Removed etex.fix.
+ (etex_ch_srcs): Added enctex.ch.
+ * etex.fix: Deleted.
+
+2011-01-01 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etexextra.in: Renamed ...
+ * etexextra.h: ... into this; #include etex_version.h
+ for ETEX_VERSION.
+
+ * etexextra.c (new): #include <etexd.h> and <lib/texmfmp.c>.
+
+ * am/etex.am: etexextra.[ch] are now distributed;
+ create etex_version.h instead of etex.version.
+
+2010-06-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etex_CPPFLAGS): Add $(AM_CPPFLAGS).
+
+2010-05-25 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (EXTRA_DIST): Remove tmf-pool.h.
+
+2010-05-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: More error message with \protected, from Heiko.
+
+2010-04-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Checked and adjusted tex.web line numbers.
+ Fixed the error message for improper use of \protected,
+ reported by Heiko Oberdiek <heiko.oberdiek@googlemail.com>.
+
+2010-04-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etex_ch_srcs): Use tex-binpool.ch as for TeX.
+
+2010-03-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (TRIPTRAP): Add etrip.diffs.
+
+2009-12-23 Karl Berry <karl@tug.org>
+
+ * etexextra.in (BUG_ADDRESS): tex-k@tug.org, not @mail.
+
+2009-12-12 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Replace the obsolete $(mkdir_p) by $(MKDIR_P).
+
+2009-10-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Enable compiler warnings.
+ * etex-binpool.ch (get_strings_started): Drop unused variables.
+
+2009-09-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Adapt to new makecpool with one argument.
+
+2009-09-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Prepare compiler warnings.
+
+2009-08-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: SyncTeX now integrated into ../texmfmp.h.
+
+2009-08-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am: Adapt to tangle-sh and web2c-sh.
+
+2009-08-13 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * am/etex.am (etex_c_h): avoid to split the C code.
+
+2009-05-12 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etrip.test (new): Shell script for e-TRIP tests.
+ * etrip/texmf.cnf (main_memory): Increased from 2999 to 3999
+ required due to increased node sizes for syncTeX extensions.
+
+2008-05-15 Karl Berry <karl@tug.org>
+
+ * etex.mk (etex-pool.c): the input is etex.pool. From Akira.
+
+2008-05-13 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex-mk: Use $(makecpool) instead of ./tex-mkcpool.
+
+2008-03-24 Karl Berry <karl@tug.org>
+
+ * tex.ch0,
+ * etex.ch,
+ * tex.ech: update for 3.1415926.
+
+2008-02-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * etex.ch: Fixed a bug in hyph_code handling (\savinghyphcodes)
+ reported by Vladimir Volovich <vvv@vsu.ru>.
+ Corrected a few typos in TeX text.
+
+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/am/etex.am b/Build/source/texk/web2c/etexdir/am/etex.am
new file mode 100644
index 00000000000..a7c954f729c
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/am/etex.am
@@ -0,0 +1,123 @@
+## $Id$
+## texk/web2c/etexdir/am/etex.am: Makefile fragment for e-TeX.
+##
+## Copyright 2015-2021 Karl Berry <tex-live@tug.org>
+## Copyright 2009-2015 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+
+## e-TeX
+##
+if ETEX
+bin_PROGRAMS += etex
+endif ETEX
+EXTRA_PROGRAMS += etex
+
+etex_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_INCLUDES)
+
+# With --enable-ipc, e-TeX may need to link with -lsocket.
+etex_LDADD = $(LDADD) $(ZLIB_LIBS) $(ipc_socketlibs)
+etex_DEPENDENCIES = $(ZLIB_DEPEND)
+
+# e-TeX C sources
+etex_c_h = etexini.c etex0.c etexcoerce.h etexd.h
+nodist_etex_SOURCES = $(etex_c_h) etex-pool.c
+dist_etex_SOURCES = etexdir/etexextra.c etexdir/etexextra.h etexdir/etex_version.h
+
+# We must create etexd.h and etexdir/etex_version.h before building the
+# etex_OBJECTS.
+etex_prereq = etexd.h etexdir/etex_version.h
+$(etex_OBJECTS): $(etex_prereq)
+
+$(etex_c_h): etex-web2c
+ @$(web2c) etex
+etex-web2c: etex.p $(web2c_texmf)
+ @$(web2c) etex
+
+etex-pool.c: etex.pool etexd.h $(makecpool_stamp)
+ $(makecpool) etex >$@ || rm -f $@
+
+# Tangling e-TeX
+etex.p etex.pool: etex-tangle
+ @$(texmf_tangle) etex etex
+etex-tangle: tangle$(EXEEXT) etex.web etex.ch tangle-sh
+ @$(texmf_tangle) etex etex
+
+# Extract etex version
+$(srcdir)/etexdir/etex_version.h: @MAINTAINER_MODE_TRUE@ etexdir/etex.ch
+ $(AM_V_GEN)grep '^@d eTeX_version_string==' $(srcdir)/etexdir/etex.ch \
+ | sed "s/^.*'-/#define ETEX_VERSION \"/;s/'.*$$/\"/" >$@
+
+# Generate etex.web
+etex.web: tie$(EXEEXT) $(etex_web_srcs)
+ $(tie_m) $(etex_web_srcs)
+etex_web_srcs = \
+ tex.web \
+ etexdir/etex.ch
+
+# Generate etex.ch
+etex.ch: tie$(EXEEXT) etex.web $(etex_ch_srcs)
+ $(tie_c) etex.web $(etex_ch_srcs)
+etex_ch_srcs = \
+ etexdir/tex.ch0 \
+ tex.ch \
+ zlib-fmt.ch \
+ enctexdir/enctex1.ch \
+ enctexdir/enctex-tex.ch \
+ enctexdir/enctex2.ch \
+ $(etex_ch_synctex) \
+ etexdir/tex.ch1 \
+ etexdir/tex.ech \
+ tex-binpool.ch
+##
+EXTRA_DIST += $(etex_web_srcs) $(etex_ch_srcs)
+
+DISTCLEANFILES += $(nodist_etex_SOURCES) etex.web etex.ch etex-web2c \
+ etex.p etex.pool etex-tangle
+
+EXTRA_DIST += \
+ etexdir/ChangeLog \
+ etexdir/etex_gen.tex
+
+# e-TeX Tests
+#
+etex_tests = etexdir/wprob.test etexdir/etriptest.test
+etexdir/wprob.log: etex$(EXEEXT)
+etexdir/etriptest.log: etex$(EXEEXT) dvitype$(EXEEXT) pltotf$(EXEEXT) tftopl$(EXEEXT)
+
+EXTRA_DIST += $(etex_tests)
+
+if ETEX
+TESTS += $(etex_tests)
+TRIPTRAP += etrip.diffs
+TRIPTRAP_CLEAN += etrip-clean
+endif ETEX
+DISTCLEANFILES += etrip.diffs
+
+## wprob.test
+EXTRA_DIST += tests/wprob.tex
+DISTCLEANFILES += ewprob.log ewprob.tex
+## etriptest
+etrip.diffs: etex$(EXEEXT) dvitype$(EXEEXT) pltotf$(EXEEXT) tftopl$(EXEEXT)
+ $(triptrap_diffs) $@
+.PHONY: etrip-clean
+etrip-clean:
+ rm -rf etripdir
+
+## Test data
+##
+EXTRA_DIST += \
+ etexdir/etrip/etrip.diffs \
+ etexdir/etrip/etrip.fot \
+ etexdir/etrip/etrip.log \
+ etexdir/etrip/etrip.out \
+ etexdir/etrip/etrip.pl \
+ etexdir/etrip/etrip.tex \
+ etexdir/etrip/etrip.typ \
+ etexdir/etrip/etrip1.in \
+ etexdir/etrip/etrip2.in \
+ etexdir/etrip/etrip3.in \
+ etexdir/etrip/etripin.log \
+ etexdir/etrip/etripman.tex \
+ etexdir/etrip/texmf.cnf \
+ etexdir/etrip/trip2.in
+
diff --git a/Build/source/texk/web2c/etexdir/etex.ch b/Build/source/texk/web2c/etexdir/etex.ch
new file mode 100644
index 00000000000..d6363552633
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etex.ch
@@ -0,0 +1,6371 @@
+% This is etex.ch, a
+% WEB change file containing code for various features extending TeX;
+% to be applied to tex.web in order to define the
+% e-TeX program.
+
+% e-TeX is copyright (C) 1999-2012 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.14159265 as of January 20, 2014.
+
+@x limbo l.1 - this is e-TeX
+% This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved.
+% Unlimited copying and redistribution of this file are permitted as long
+% as this file is not modified. Modifications are permitted, but only if
+% the resulting file is not named tex.web. (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) 1999-2012 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.
+
+% 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.51 - 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.
+% Version 2.3 development was started in Feb 2008; released in Apr 2011.
+% fixed a bug in hyph_code handling (\savinghyphcodes)
+% reported by Vladimir Volovich <vvv@@vsu.ru>, Feb 2008.
+% fixed the error messages for improper use of \protected,
+% reported by Heiko Oberdiek
+% <heiko.oberdiek@@googlemail.com>, May 2010.
+% some rearrangements to reduce interferences between
+% e-TeX and pTeX, in part suggested by Hironori Kitagawa
+% <h_kitagawa2001@@yahoo.co.jp>, Mar 2011.
+% Version 2.4 fixed an uninitialized line number bug, released in May 2012.
+% Version 2.5 development was started in Aug 2012; released in Feb 2013.
+% better tracing of font definitions, reported by
+% Bruno Le Floch <blflatex@@gmail.com>, Jul 2012.
+% Version 2.6 development was started in Mar 2013; released in ??? 201?.
+% enable hyphenation of text between \beginL and \endL or
+% between \beginR and \endR, problem reported by
+% Vafa Khalighi <vafalgk@@gmail.com>, Nov 2013.
+% better handling of right-to-left text -- to be done.
+
+% 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.63 - 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.66 - 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.82 - 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.93 - 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.182 - 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.188 - 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.190 - e-TeX basic
+@d banner=='This is TeX, Version 3.141592653' {printed when \TeX\ starts}
+@y
+@d eTeX_version=2 { \.{\\eTeXversion} }
+@d eTeX_revision==".6" { \.{\\eTeXrevision} }
+@d eTeX_version_string=='-2.6' {current \eTeX\ version}
+@#
+@d eTeX_banner=='This is e-TeX, Version 3.141592653',eTeX_version_string
+ {printed when \eTeX\ starts}
+@#
+@d TeX_banner=='This is TeX, Version 3.141592653' {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.209 - 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.504 - 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.135 l.2895 - e-TeX TeXXeT
+|fil|, |fill|, or |filll|). The |subtype| field is not used.
+@y
+|fil|, |fill|, or |filll|). The |subtype| field is not used in \TeX.
+In \eTeX\ the |subtype| field records the box direction mode |box_lr|.
+@z
+%---------------------------------------
+@x [10] m.141 l.2980 - 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.2986 - 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.2995 - 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.3084 - 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.3088 - 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.3561 - 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.3728 - 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.3826 - 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.3859 - 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.4096 - 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.4106 - 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.4122 - 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.4166 - e-TeX basic
+ \.{\\insertpenalties} )}
+@y
+ \.{\\insertpenalties} )}
+ {( or \.{\\interactionmode} )}
+@z
+%---------------------------------------
+@x [15] m.209 l.4168 - 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.4178 - 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.4181 - 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.4196 - 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.4201 - 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.4304 - 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.4319 - e-TeX basic
+ @!head_field,@!tail_field: pointer;
+@y
+ @!head_field,@!tail_field: pointer;
+ @!eTeX_aux_field: pointer;
+@z
+%---------------------------------------
+@x [16] m.213 l.4326 - 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.4357 - 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.4373 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.4736 - 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.4737 - 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.4802 - 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.4820 - 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.4848 - 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.4969 - 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.5031 - 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.5096 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.5627 primitive - e-TeX basic
+@!j:small_number; {index into |buffer|}
+@y
+@!j:0..buf_size; {index into |buffer|}
+@z
+%---------------------------------------
+@x [18] m.264 l.5631 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.5706 - e-TeX penalties
+primitive("parshape",set_shape,0);@/
+@y
+primitive("parshape",set_shape,par_shape_loc);@/
+@z
+%---------------------------------------
+@x [18] m.265 l.5723 - e-TeX sparse arrays
+primitive("toks",toks_register,0);@/
+@y
+primitive("toks",toks_register,mem_bot);@/
+@z
+%---------------------------------------
+@x [18] m.266 l.5756 - 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.5762 - 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.5773 - 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.5777 - 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.5778 - 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.5779 - 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.5781 - 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.5815 - e-TeX sparse arrays
+interpreted in one of four ways:
+@y
+interpreted in one of five ways:
+@z
+%---------------------------------------
+@x [19] m.268 l.5835 - 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.5845 - 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.5903 - 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.5909 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.5931 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.5938 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.5956 eq_destroy - e-TeX sparse arrays
+othercases do_nothing
+@y
+@/@<Cases for |eq_destroy|@>@/
+othercases do_nothing
+@z
+%---------------------------------------
+@x [19] m.277 l.5978 - 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.5982 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.5985 eq_define - e-TeX tracing
+end;
+@y
+assign_trace(p,"into")@;@/
+exit:end;
+@z
+%---------------------------------------
+@x [19] m.278 l.5992 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.5996 eq_word_define - e-TeX tracing
+end;
+@y
+assign_trace(p,"into")@;@/
+exit:end;
+@z
+%---------------------------------------
+@x [19] m.279 l.6005 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.6010 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.6027 - e-TeX tracing
+@p@t\4@>@<Declare the procedure called |restore_trace|@>@;@/
+@y
+@p
+@z
+%---------------------------------------
+@x [19] m.281 l.6034 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.6048 - 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.6056 - 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.6082 - e-TeX tracing
+@ @<Declare the procedure called |restore_trace|@>=
+@y
+@ @<Declare \eTeX\ procedures for tr...@>=
+@z
+%---------------------------------------
+@x [20] m.289 l.6170 - 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.6295 - e-TeX protected
+end_match: print("->");
+@y
+end_match: if c=0 then print("->");
+@z
+%---------------------------------------
+@x [20] m.296 l.6316 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.6390 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.6409 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.6414 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.6490 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.6687 - 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.6708 - 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.6764 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.6809 - e-TeX scan_tokens
+else begin print_nl("l."); print_int(line);
+@y
+else begin print_nl("l.");
+ if index=in_open then print_int(line)
+ else print_int(line_stack[index+1]); {input from a pseudo file}
+@z
+%---------------------------------------
+@x [22] m.314 l.6831 - 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.7024 - 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.7052 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.7062 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.7081 - 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.7553 - 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.7556 - 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.7559 - 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.7643 - 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.7650 expand - e-TeX cond
+procedure expand;
+@y
+procedure expand;
+label reswitch;
+@z
+%---------------------------------------
+@x [25] m.366 l.7661 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.7672 - 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.7792 - 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.7795 - 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.7851 - 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.7883 - 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.7889 - e-TeX marks
+ endcases;
+@y
+ endcases;
+ if chr_code>=marks_code then print_char("s");
+ end;
+@z
+%---------------------------------------
+@x [25] m.386 l.7895 - 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.7958 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.8270 - 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.8314 - 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.8317 - 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.8327 - 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.8343 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,@!r:pointer; {general purpose indices}
+@!tx:pointer; {effective tail node}
+@!i:four_quarters; {character info}
+@z
+%---------------------------------------
+@x [26] m.413 l.8369 scan_something_internal - e-TeX basic
+end;
+@y
+exit:end;
+@z
+%---------------------------------------
+@x [26] m.415 l.8390 - 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.8405 - 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.8407 - 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.8440 - 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.8449 - 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.8469 - 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.8474 - 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.8499 - 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.8504 - e-TeX \lastnodetype
+@ Here is where \.{\\lastpenalty}, \.{\\lastkern}, and \.{\\lastskip} are
+@y
+@ Here is where \.{\\lastpenalty}, \.{\\lastkern}, \.{\\lastskip}, and
+\.{\\lastnodetype} are
+@z
+%---------------------------------------
+@x [26] m.424 l.8508 - e-TeX TeXXeT
+legal in similar contexts.
+@y
+legal in similar contexts.
+
+The macro |find_effective_tail_eTeX| sets |tx| to the last non-\.{\\endM}
+node of the current list.
+@z
+%---------------------------------------
+@x [26] m.424 l.8510 - e-TeX TeXXeT
+@<Fetch an item in the current node...@>=
+@y
+@d find_effective_tail_eTeX==
+tx:=tail;
+if not is_char_node(tx) then
+ if (type(tx)=math_node)and(subtype(tx)=end_M_code) then
+ begin r:=head;
+ repeat q:=r; r:=link(q);
+ until r=tx;
+ tx:=q;
+ end
+@#
+@d find_effective_tail==find_effective_tail_eTeX
+
+@<Fetch an item in the current node...@>=
+@z
+%---------------------------------------
+@x [26] m.424 l.8511 - e-TeX basic
+if cur_chr>glue_val then
+@y
+if m>=input_line_no_code then
+@z
+%---------------------------------------
+@x [26] m.424 l.8512 - 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.8517 - e-TeX last_node_type
+ cur_val_level:=cur_chr;
+ if not is_char_node(tail)and(mode<>0) then
+ case cur_chr of
+ int_val: if type(tail)=penalty_node then cur_val:=penalty(tail);
+ dimen_val: if type(tail)=kern_node then cur_val:=width(tail);
+ glue_val: if type(tail)=glue_node then
+ begin cur_val:=glue_ptr(tail);
+ if subtype(tail)=mu_glue then cur_val_level:=mu_val;
+ end;
+ end {there are no other cases}
+ else if (mode=vmode)and(tail=head) then
+@y
+ find_effective_tail;
+ if cur_chr=last_node_type_code then
+ begin cur_val_level:=int_val;
+ if (tx=head)or(mode=0) then cur_val:=-1;
+ end
+ else cur_val_level:=cur_chr;
+ if not is_char_node(tx)and(mode<>0) then
+ case cur_chr of
+ int_val: if type(tx)=penalty_node then cur_val:=penalty(tx);
+ dimen_val: if type(tx)=kern_node then cur_val:=width(tx);
+ glue_val: if type(tx)=glue_node then
+ begin cur_val:=glue_ptr(tx);
+ if subtype(tx)=mu_glue then cur_val_level:=mu_val;
+ end;
+ last_node_type_code: if type(tx)<=unset_node then cur_val:=type(tx)+1
+ else cur_val:=unset_node+2;
+ end {there are no other cases}
+ else if (mode=vmode)and(tx=head) then
+@z
+%---------------------------------------
+@x [26] m.424 l.8531 - 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.8547 - 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.8554 - e-TeX sparse arrays
+cur_val_level:=m;
+@y
+ end;
+@z
+%---------------------------------------
+@x [26] m.461 l.9082 - e-TeX expr
+exit:end;
+@y
+exit:end;
+@#
+@<Declare procedures needed for expressions@>@;
+@z
+%---------------------------------------
+@x [27] m.464 l.9141 - 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.9166 the_toks - e-TeX unexpanded
+@p function the_toks:pointer;
+@y
+@p function the_toks:pointer;
+label exit;
+@z
+%---------------------------------------
+@x [27] m.465 l.9170 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.9184 the_toks - e-TeX unexpanded
+end;
+@y
+exit:end;
+@z
+%---------------------------------------
+@x [27] m.468 l.9207 - 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.9212 - 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.9235 - e-TeX basic
+ othercases print_esc("jobname")
+@y
+ eTeX_revision_code: print_esc("eTeXrevision");
+ othercases print_esc("jobname")
+@z
+%---------------------------------------
+@x [27] m.471 l.9260 - 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.9276 - 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.9386 - 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.9434 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.9460 - e-TeX read_line
+loop@+ begin get_token;
+@y
+@<Handle \.{\\readline} and |goto done|@>;@/
+loop@+ begin get_token;
+@z
+%---------------------------------------
+@x [28] m.487 l.9512 - 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.9567 - 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.9584 - 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.9658 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.9674 - 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.9711 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.9754 - e-TeX cond
+if_false_code: b:=false;
+@y
+if_false_code: b:=false;
+@/@<Cases for |conditional|@>@/
+@z
+%---------------------------------------
+@x [28] m.505 l.9793 - 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.9883 - 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.9894 - e-TeX cond
+ end
+@y
+ end;
+end
+@z
+%---------------------------------------
+@x [29] m.536 l.10348 - e-TeX basic
+print_two(sys_time div 60); print_char(":"); print_two(sys_time mod 60);
+@y
+print_two(sys_time div 60); print_char(":"); print_two(sys_time mod 60);
+if eTeX_ex then
+ begin; wlog_cr; wlog('entering extended mode');
+ end;
+@z
+%---------------------------------------
+@x [30] m.581 l.11282 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.11289 char_warning - e-TeX tracing
+end;
+@y
+ tracing_online:=old_setting;
+ end;
+end;
+@z
+%---------------------------------------
+@x [32] m.616 l.12257 - 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.12259 - e-TeX TeXXeT
+@d synch_h==if cur_h<>dvi_h then
+@y
+@d reversed=1 {subtype for an |hlist_node| whose hlist has been reversed}
+@d dlist=2 {subtype for an |hlist_node| from display math mode}
+@d box_lr(#) == (qo(subtype(#))) {direction mode of a box}
+@d set_box_lr(#) == subtype(#):=set_box_lr_end
+@d set_box_lr_end(#) == qi(#)
+@#
+@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.12327 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.12337 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.12340 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.12359 - 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.12384 - 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.12386 - 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.12391 - e-TeX TeXXeT
+next_p:p:=link(p);
+@y
+next_p:prev_p:=p; p:=link(p);
+@z
+%---------------------------------------
+@x [32] m.623 l.12398 - 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.12401 - 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.12419 - 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.12438 - 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.12454 - 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.12460 - 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.12499 - 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.12573 - 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.12585 - 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.12651 - 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.12688 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.12909 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.12919 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.12943 - 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.13514 - 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.13531 - 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.13704 - e-TeX middle
+right_noad: begin print_esc("right"); print_delimiter(delimiter(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(delimiter(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.14302 - 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.14963 - 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.15004 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.15495 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.15606 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.15868 - 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 set_box_lr(q)(dlist); {for |ship_out|}
+@z
+%---------------------------------------
+@x [37] m.808 l.15886 - 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;
+set_box_lr(r)(0); {for |ship_out|}
+@z
+%---------------------------------------
+@x [38] m.814 l.16009 - 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.16036 line_break - e-TeX penalties
+procedure line_break(@!final_widow_penalty:integer);
+@y
+procedure line_break(@!d:boolean);
+@z
+%---------------------------------------
+@x [38] m.815 l.16046 - e-TeX basic
+end;
+@y
+end;
+@#
+@t\4@>@<Declare \eTeX\ procedures for use by |main_control|@>
+@z
+%---------------------------------------
+@x [38] m.816 l.16066 - 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.16131 - 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.16294 - 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.16345 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.16637 - 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.16650 - 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.16749 - 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.16773 - 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.16830 - 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.17003 - 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.17014 - 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.17064 - 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:=odd(subtype(cur_p));
+ kern_break;
+@z
+%---------------------------------------
+@x [39] m.876 l.17226 - e-TeX penalties
+post_line_break(final_widow_penalty)
+@y
+post_line_break(d)
+@z
+%---------------------------------------
+@x [39] m.877 l.17240 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.17250 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.17263 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.17293 - 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.17310 - 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.17333 - 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.17427 - 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.17455 - e-TeX TeXXeT
+implicit kern nodes, and $p_m$ is a glue or penalty or insertion or adjust
+@y
+implicit kern or text direction nodes, and $p_m$ is a glue or penalty or
+insertion or adjust
+@z
+%---------------------------------------
+@x [40] m.891 l.17494 - 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.17557 - e-TeX TeXXeT
+ else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+@y
+ else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue
+ else if (type(s)=math_node)and(subtype(s)>=L_code) then goto continue
+@z
+%---------------------------------------
+@x [40] m.896 l.17563 - 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.17580 - 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.17606 - 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 [40] m.899 l.17623 - e-TeX TeXXeT
+ othercases goto done1
+@y
+ math_node: if subtype(s)>=L_code then goto done4@+else goto done1;
+ othercases goto done1
+@z
+%---------------------------------------
+@x [42] m.934 l.18245 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.18255 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.18287 - 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.18295 - 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.18583 - 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.18671 - 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.18675 - 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.18718 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.18825 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.18841 - 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.18848 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.18859 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.19026 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.19032 vsplit - e-TeX sparse arrays
+begin v:=box(n);
+@y
+begin cur_val:=n; fetch_box(v);
+@z
+%---------------------------------------
+@x [44] m.977 l.19033 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.19041 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.19042 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.19067 - 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.19201 - 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.19214 - 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.19353 - 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.19420 - 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.19454 - 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.19697 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.19705 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.19742 - 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.19854 - 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.19890 - 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.19932 - 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.20735 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.20756 - 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.20770 - 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.20853 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.20891 - 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.20920 begin_box - e-TeX TeXXeT
+@!m:quarterword; {the length of a replacement list}
+@y
+@!r:pointer; {running behind |p|}
+@!fm:boolean; {a final \.{\\beginM} \.{\\endM} node pair?}
+@!tx:pointer; {effective tail node}
+@!m:quarterword; {the length of a replacement list}
+@z
+%---------------------------------------
+@x [47] m.1079 l.20922 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.20940 - e-TeX TeXXeT
+@<If the current list ends with a box node, delete it...@>=
+@y
+@d fetch_effective_tail_eTeX(#)== {extract |tx|,
+ drop \.{\\beginM} \.{\\endM} pair}
+q:=head; p:=null;
+repeat r:=p; p:=q; fm:=false;
+if not is_char_node(q) then
+ if type(q)=disc_node then
+ begin for m:=1 to replace_count(q) do p:=link(p);
+ if p=tx then #;
+ end
+ else if (type(q)=math_node)and(subtype(q)=begin_M_code) then fm:=true;
+q:=link(p);
+until q=tx; {found |r|$\to$|p|$\to$|q=tx|}
+q:=link(tx); link(p):=q; link(tx):=null;
+if q=null then if fm then confusion("tail1")
+@:this can't happen tail1}{\quad tail1@>
+ else tail:=p
+else if fm then {|r|$\to$|p=begin_M|$\to$|q=end_M|}
+ begin tail:=r; link(r):=null; flush_node_list(p);@+end
+@#
+@d check_effective_tail(#)==find_effective_tail_eTeX
+@d fetch_effective_tail==fetch_effective_tail_eTeX
+
+@<If the current list ends with a box node, delete it...@>=
+@z
+%---------------------------------------
+@x [47] m.1080 l.20950 - e-TeX TeXXeT
+else begin if not is_char_node(tail) then
+ if (type(tail)=hlist_node)or(type(tail)=vlist_node) then
+ @<Remove the last box, unless it's part of a discretionary@>;
+ end;
+@y
+else begin check_effective_tail(goto done);
+ if not is_char_node(tx) then
+ if (type(tx)=hlist_node)or(type(tx)=vlist_node) then
+ @<Remove the last box, unless it's part of a discretionary@>;
+ done:end;
+@z
+%---------------------------------------
+@x [47] m.1081 l.20957 - e-TeX TeXXeT
+begin q:=head;
+repeat p:=q;
+if not is_char_node(q) then if type(q)=disc_node then
+ begin for m:=1 to replace_count(q) do p:=link(p);
+ if p=tail then goto done;
+ end;
+q:=link(p);
+until q=tail;
+cur_box:=tail; shift_amount(cur_box):=0;
+tail:=p; link(p):=null;
+done:end
+@y
+begin fetch_effective_tail(goto done);
+cur_box:=tx; shift_amount(cur_box):=0;
+end
+@z
+%---------------------------------------
+@x [47] m.1082 l.20972 - 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.21156 - 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.21212 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.21246 delete_last - e-TeX TeXXeT
+@!m:quarterword; {the length of a replacement list}
+@y
+@!r:pointer; {running behind |p|}
+@!fm:boolean; {a final \.{\\beginM} \.{\\endM} node pair?}
+@!tx:pointer; {effective tail node}
+@!m:quarterword; {the length of a replacement list}
+@z
+%---------------------------------------
+@x [47] m.1105 l.21250 delete_last - e-TeX TeXXeT
+else begin if not is_char_node(tail) then if type(tail)=cur_chr then
+ begin q:=head;
+ repeat p:=q;
+ if not is_char_node(q) then if type(q)=disc_node then
+ begin for m:=1 to replace_count(q) do p:=link(p);
+ if p=tail then return;
+ end;
+ q:=link(p);
+ until q=tail;
+ link(p):=null; flush_node_list(tail); tail:=p;
+@y
+else begin check_effective_tail(return);
+ if not is_char_node(tx) then if type(tx)=cur_chr then
+ begin fetch_effective_tail(return);
+ flush_node_list(tx);
+@z
+%---------------------------------------
+@x [47] m.1108 l.21299 - 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.21309 unpackage - e-TeX saved_items
+label exit;
+@y
+label done, exit;
+@z
+%---------------------------------------
+@x [47] m.1110 l.21312 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.21324 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.21327 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.21599 - 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.21678 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.21736 - 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.21749 - 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.21757 - 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.21772 - e-TeX TeXXeT
+done:
+@y
+done:
+@<Finish the natural width computation@>
+@z
+%---------------------------------------
+@x [48] m.1147 l.21783 - 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.22292 - 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.22337 - 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.22346 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.22351 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.22357 math_left_right - e-TeX middle
+ info(nucleus(tail)):=p;
+@y
+ info(nucleus(tail)):=q;
+@z
+%---------------------------------------
+@x [48] m.1192 l.22365 - 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.22380 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.22387 after_math - e-TeX TeXXeT
+begin danger:=false;
+@y
+begin danger:=false;
+@<Retrieve the prototype box@>;
+@z
+%---------------------------------------
+@x [48] m.1194 l.22394 after_math - e-TeX TeXXeT
+ mlist_to_hlist; a:=hpack(link(temp_head),natural);
+@y
+ mlist_to_hlist; a:=hpack(link(temp_head),natural);
+ set_box_lr(a)(dlist);
+@z
+%---------------------------------------
+@x [48] m.1194 l.22397 after_math - e-TeX TeXXeT
+ danger:=false;
+@y
+ danger:=false;
+ @<Retrieve the prototype box@>;
+@z
+%---------------------------------------
+@x [48] m.1199 l.22484 - 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.22499 - e-TeX TeXXeT
+resume_after_display
+@y
+@<Flush the prototype box@>;
+resume_after_display
+@z
+%---------------------------------------
+@x [48] m.1202 l.22541 - e-TeX TeXXeT
+d:=half(z-w);
+@y
+set_box_lr(b)(dlist);
+d:=half(z-w);
+@z
+%---------------------------------------
+@x [48] m.1203 l.22562 - 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.22572 - e-TeX TeXXeT
+shift_amount(b):=s+d; append_to_vlist(b)
+@y
+app_display(j,b,d)
+@z
+%---------------------------------------
+@x [48] m.1205 l.22582 - 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.22601 - e-TeX TeXXeT
+pop_nest;
+@y
+flush_node_list(LR_box);
+pop_nest;
+@z
+%---------------------------------------
+@x [49] m.1208 l.22626 - 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.22652 - 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.22714 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.1212 l.22730 - e-TeX protected
+help1("I'll pretend you didn't say \long or \outer or \global.");
+@y
+help1("I'll pretend you didn't say \long or \outer or \global.");
+if eTeX_ex then help_line[0]:=@|
+ "I'll pretend you didn't say \long or \outer or \global or \protected.";
+@z
+%---------------------------------------
+@x [49] m.1213 l.22735 - e-TeX protected
+if (cur_cmd<>def)and(a mod 4<>0) then
+ begin print_err("You can't use `"); print_esc("long"); print("' or `");
+ print_esc("outer"); print("' with `");
+@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
+ begin print_err("You can't use `"); print_esc("long"); print("' or `");
+ print_esc("outer");
+ help1("I'll pretend you didn't say \long or \outer here.");
+ if eTeX_ex then
+ begin help_line[0]:=@|
+ "I'll pretend you didn't say \long or \outer or \protected here.";
+ print("' or `"); print_esc("protected");
+ end;
+ print("' with `");
+@z
+%---------------------------------------
+@x [49] m.1213 l.22740 - e-TeX protected
+ help1("I'll pretend you didn't say \long or \outer here.");
+@y
+@z
+%---------------------------------------
+@x [49] m.1218 l.22798 - 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.22826 - 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.22889 - 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.22902 - 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.22911 - 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.22920 - 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.22930 - 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.22938 - 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.22943 - 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.23059 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.23076 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.23098 - 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.23105 - 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.23111 - 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.23118 - 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.23138 - 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.23160 - 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.23231 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.23240 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.23249 - 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.23259 - e-TeX penalties
+ define(par_shape_loc,shape_ref,p);
+@y
+ define(q,shape_ref,p);
+@z
+%---------------------------------------
+@x [49] m.1260 l.23346 new_font - e-TeX tracing
+common_ending: equiv(u):=f; eqtb[font_id_base+f]:=eqtb[u]; font_id_text(f):=t;
+@y
+common_ending: define(u,set_font,f); eqtb[font_id_base+f]:=eqtb[u]; font_id_text(f):=t;
+@z
+%---------------------------------------
+@x [49] m.1292 l.23633 - e-TeX show_groups
+ show_lists_code:print_esc("showlists");
+@y
+ show_lists_code:print_esc("showlists");
+ @<Cases of |xray| for |print_cmd_chr|@>@;@/
+@z
+%---------------------------------------
+@x [49] m.1293 l.23640 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.23646 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.23681 - 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.23689 - 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.23831 - e-TeX basic
+dump_int(@$);@/
+@y
+dump_int(@$);@/
+@<Dump the \eTeX\ state@>@/
+@z
+%---------------------------------------
+@x [50] m.1308 l.23846 - 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.23900 - 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.23923 - 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.24117 - e-TeX hyph_codes
+dump_int(trie_max);
+@y
+dump_int(trie_max);
+dump_int(hyph_start);
+@z
+%---------------------------------------
+@x [50] m.1325 l.24145 - 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.24365 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.24388 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.24398 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.24413 - 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.24421 - e-TeX basic
+ end;
+@y
+ end;
+if eTeX_ex then wterm_ln('entering extended mode');
+@z
+%---------------------------------------
+@x [53] m.1362 l.24762 adv_past - e-TeX hyph_codes
+ begin cur_lang:=what_lang(#); l_hyf:=what_lhm(#); r_hyf:=what_rhm(#);@+end
+@y
+ begin cur_lang:=what_lang(#); l_hyf:=what_lhm(#); r_hyf:=what_rhm(#);
+ set_hyph_index;
+ end
+@z
+%---------------------------------------
+@x [54] m.1379 l.24956 - 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
+explicitly 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(box_lr(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_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_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
+
+@ @<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 box_lr(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 set_box_lr(this_box)(0);
+ if (cur_dir=right_to_left)and(box_lr(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 box_lr(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; set_box_lr(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
+
+@ OLD VERSION.
+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;
+
+@ NEW VERSION.
+The |reverse| function defined here is responsible to reverse (parts of)
+the nodes of an hlist. 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.
+
+@<Declare procedures needed in |hlist_out|, |vlist_out|@>=
+@{
+@t\4@>@<Declare subprocedures for |reverse|@>@;
+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);
+@<Build a list of segments and determine their widths@>;
+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;
+@}
+
+@ We cannot simply remove nodes from the original list and add them to the
+head of the new one; this might reverse the order of whatsit nodes such
+that, e.g., a |write_node| for a stream appears before the |open_node|
+and\slash or after the |close_node| for that stream.
+
+All whatsit nodes as well as hlist and vlist nodes containing such nodes
+must not be permuted. A sequence of hlist and vlist nodes not containing
+whatsit nodes as well as char, ligature, rule, kern, and glue nodes together
+with math nodes not changing the text direction can be explicitly reversed.
+Embedded sections of left-to-right text are treated as a unit and all
+remaining nodes are irrelevant and can be ignored.
+
+In a first step we determine the width of various segments of the hlist to
+be reversed: (1)~embedded left-to-right text, (2)~sequences of permutable or
+irrelevant nodes, (3)~sequences of whatsit or irrelevant nodes, and
+(4)~individual hlist and vlist nodes containing whatsit nodes.
+
+@d segment_node=style_node
+@d segment_node_size=style_node_size {number of words in a segment node}
+@d segment_first(#)==info(#+2) {first node of the segment}
+@d segment_last(#)==link(#+2) {last node of the segment}
+
+@<Declare subprocedures for |reverse|@>=
+function new_segment(@!s:small_number;@!f:pointer):pointer;
+ {create a segment node}
+var p:pointer; {the new node}
+begin p:=get_node(segment_node_size); type(p):=segment_node; subtype(p):=s;
+width(p):=0; {the |width| field will be set later}
+segment_first(p):=f; segment_last(p):=f;
+new_segment:=p;
+end;
+
+@ @<Build a list of segments and determine their widths@>=
+begin
+end
+
+@ Here is a recursive subroutine that determines if the hlist or vlist
+node~|p| contains whatsit nodes.
+
+@<Declare subprocedures for |reverse|@>=
+function has_whatsit(@!p:pointer):boolean;
+label exit;
+begin p:=list_ptr(p); has_whatsit:=true;
+while p<>null do
+ begin if not is_char_node(p) then
+ case type(p) of
+ hlist_node, vlist_node: if has_whatsit(p) then goto exit;
+ whatsit_node: goto exit;
+ othercases do_nothing
+ endcases;@/
+ p:=link(p);
+ end;
+has_whatsit:=false;
+exit: 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 box_lr(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;
+incr(expand_depth_count);
+if expand_depth_count>=expand_depth then overflow("expansion depth",expand_depth);
+@<Scan and evaluate an expression |e| of type |l|@>;
+decr(expand_depth_count);
+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 two 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 of
+|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_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/etex_version.h b/Build/source/texk/web2c/etexdir/etex_version.h
new file mode 100644
index 00000000000..13752253536
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etex_version.h
@@ -0,0 +1 @@
+#define ETEX_VERSION "2.6"
diff --git a/Build/source/texk/web2c/etexdir/etexextra.c b/Build/source/texk/web2c/etexdir/etexextra.c
new file mode 100644
index 00000000000..91de6d48ae6
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etexextra.c
@@ -0,0 +1,12 @@
+/* etexextra.c: Hand-coded routines for e-TeX.
+
+ This file is public domain. */
+
+#define EXTERN /* Instantiate data from etexd.h here. */
+#define DLLPROC dlletexmain
+
+/* This file defines TeX and eTeX. */
+#include <etexd.h>
+
+/* Hand-coded routines for TeX or Metafont in C. */
+#include <lib/texmfmp.c>
diff --git a/Build/source/texk/web2c/etexdir/etexextra.h b/Build/source/texk/web2c/etexdir/etexextra.h
new file mode 100644
index 00000000000..77a2a9d4246
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etexextra.h
@@ -0,0 +1,34 @@
+/* etexextra.h: banner etc. for e-TeX.
+
+ This is included by e-TeX, from etexextra.c.
+
+Copyright (C) 1995, 1996, 2009, 2014, 2016 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, see <http://www.gnu.org/licenses/>. */
+
+#include <etexdir/etex_version.h> /* for ETEX_VERSION */
+
+#define BANNER "This is e-TeX, Version 3.141592653-" ETEX_VERSION
+#define COPYRIGHT_HOLDER "Peter Breitenlohner et al"
+#define AUTHOR NULL
+#define PROGRAM_HELP ETEXHELP
+#define BUG_ADDRESS "tex-k@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..0c635a9e6b2
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/etrip.diffs
@@ -0,0 +1,550 @@
+#! /bin/sh -vx
+# $Id: etriptest.test 45809 2017-11-15 00:36:56Z karl $
+# Copyright 2017 Karl Berry <tex-live@tug.org>
+# Copyright 2009-2014 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+testdir=$abs_srcdir/triptrap
++ testdir=SRCDIR/triptrap
+etestdir=$abs_srcdir/etexdir/etrip
++ etestdir=SRCDIR/etexdir/etrip
+
+TEXMFCNF=$etestdir; export TEXMFCNF
++ TEXMFCNF=SRCDIR/etexdir/etrip
++ export TEXMFCNF
+
+rm -rf etripdir
++ rm -rf etripdir
+mkdir etripdir
++ mkdir etripdir
+cd etripdir
++ cd etripdir
+
+dvitype_args="-output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*'"
++ dvitype_args='-output-level=2 -dpi=72.27 -page-start='\''*.*.*.*.*.*.*.*.*.*'\'''
+
+echo ">>> Running e-TRIP test for e-TeX." >&2
++ echo '>>> Running e-TRIP test for e-TeX.'
+>>> Running e-TRIP test for e-TeX.
+echo ">>> See $etestdir/etrip.diffs for example of acceptable diffs." >&2
++ echo '>>> See SRCDIR/etexdir/etrip/etrip.diffs for example of acceptable diffs.'
+>>> See SRCDIR/etexdir/etrip/etrip.diffs for example of acceptable diffs.
+
+is_OK=:
++ is_OK=:
+
+set -x
++ set -x
+
+echo "*** TRIP test for e-TeX in compatibility mode ***."
++ echo '*** TRIP test for e-TeX in compatibility mode ***.'
+*** TRIP test for e-TeX in compatibility mode ***.
+
+./pltotf $testdir/trip.pl trip.tfm || exit 1
++ ./pltotf SRCDIR/triptrap/trip.pl trip.tfm
+
+./tftopl ./trip.tfm trip.pl || exit 1
++ ./tftopl ./trip.tfm trip.pl
+
+diff $testdir/trip.pl trip.pl || is_OK=false
++ diff SRCDIR/triptrap/trip.pl trip.pl
+
+# get same filename in log
+$LN_S $testdir/trip.tex .
++ ln -s SRCDIR/triptrap/trip.tex .
+
+./etex --progname=einitex --ini <$testdir/trip1.in >ctripin.fot
++ ./etex --progname=einitex --ini
+if test ! -s trip.fmt; then
+ echo "*** trip.fmt not created by trip1.in, investigate!" >&2
+ exit 1
+fi
++ test '!' -s trip.fmt
+mv trip.log ctripin.log || exit 1
++ mv trip.log ctripin.log
+diff $testdir/tripin.log ctripin.log
++ diff SRCDIR/triptrap/tripin.log ctripin.log
+1c1
+< This is TeX, Version 3.141592653 (INITEX) 4 JUL 1776 12:00
+---
+> This is e-TeX, Version 3.141592653-2.6 (TeX Live 2021/dev) (INITEX) 27 JAN 2021 18:01
+3c3
+< (trip.tex
+---
+> (./trip.tex
+450,453c450,453
+< (preloaded format=trip 1776.7.4)
+< 1326 strings of total length 23633
+< 471 memory locations dumped; current usage is 96&278
+< 341 multiletter control sequences
+---
+> (preloaded format=trip 2021.1.27)
+> 1491 strings of total length 26266
+> 479 memory locations dumped; current usage is 104&278
+> 342 multiletter control sequences
+461c461
+< Hyphenation trie of length 273 has 9 ops out of 500
+---
+> Hyphenation trie of length 273 has 9 ops out of 35111
+
+# May as well test non-ini second time through.
+./etex --progname=etex <$testdir/trip2.in >ctrip.fot
++ ./etex --progname=etex
+mv trip.log ctrip.log
++ mv trip.log ctrip.log
+diff $testdir/trip.fot ctrip.fot
++ diff SRCDIR/triptrap/trip.fot ctrip.fot
+1,3c1,2
+< This is TeX, Version 3.141592653 (INITEX)
+< ** &trip trip
+< (trip.tex ##
+---
+> This is e-TeX, Version 3.141592653-2.6 (TeX Live 2021/dev) (preloaded format=etex)
+> **(./trip.tex ##
+17c16
+< Memory usage before: 159&313; after: 102&278; still untouched: 1613
+---
+> Memory usage before: 185&313; after: 112&278; still untouched: 2612
+75c74
+< Memory usage before: 334&431; after: 292&418; still untouched: 175
+---
+> Memory usage before: 434&431; after: 376&418; still untouched: 178
+
+# We use $DIFF instead of `diff' only for those files where there
+# might actually be legitimate numerical differences.
+$DIFF $DIFFFLAGS $testdir/trip.log ctrip.log
++ diff SRCDIR/triptrap/trip.log ctrip.log
+1c1
+< This is TeX, Version 3.141592653 (preloaded format=trip 1776.7.4) 4 JUL 1776 12:00
+---
+> This is e-TeX, Version 3.141592653-2.6 (TeX Live 2021/dev) (preloaded format=trip 2021.1.27) 27 JAN 2021 18:01
+3c3
+< (trip.tex ##
+---
+> (./trip.tex ##
+73c73
+< Memory usage before: 159&313; after: 102&278; still untouched: 1613
+---
+> Memory usage before: 185&313; after: 112&278; still untouched: 2612
+642c642
+< Memory usage before: 747&484; after: 581&481; still untouched: 1492
+---
+> Memory usage before: 1027&484; after: 795&481; still untouched: 1491
+815c815
+< Memory usage before: 475&470; after: 290&466; still untouched: 1473
+---
+> Memory usage before: 653&470; after: 384&466; still untouched: 1472
+915c915
+< Memory usage before: 218&459; after: 149&458; still untouched: 1473
+---
+> Memory usage before: 286&459; after: 181&458; still untouched: 1472
+1070c1070
+< Memory usage before: 118&328; after: 102&328; still untouched: 1473
+---
+> Memory usage before: 132&328; after: 110&328; still untouched: 1472
+1405c1405
+< \vbox(16383.99998+0.0)x1000.0, glue set 16342.0fil
+---
+> \vbox(16383.99998+0.0)x1000.0, glue set 16341.99998fil
+1511c1511
+< Memory usage before: 990&376; after: 584&370; still untouched: 735
+---
+> Memory usage before: 1396&376; after: 788&370; still untouched: 1472
+1954c1954
+< (tripos.tex
+---
+> (./tripos.tex
+2018c2018
+< \vbox(16383.99998+1.0)x100.0, glue set 16239.0fil
+---
+> \vbox(16383.99998+1.0)x100.0, glue set 16238.99998fil
+2189c2189
+< Memory usage before: 950&531; after: 546&448; still untouched: 706
+---
+> Memory usage before: 1400&531; after: 772&448; still untouched: 1443
+2533c2533
+< \vbox(16383.99998+0.0)x20.0, glue set 16331.0fil
+---
+> \vbox(16383.99998+0.0)x20.0, glue set 16330.99998fil
+2575c2575
+< Memory usage before: 339&413; after: 236&405; still untouched: 706
+---
+> Memory usage before: 455&413; after: 296&405; still untouched: 1443
+3326c3326
+< \vbox(10000.0+2.0)x28.0, glue set 9737.58789fil
+---
+> \vbox(10000.0+2.0)x28.0, glue set 9737.58742fil
+3616c3616
+< Memory usage before: 2170&521; after: 1181&459; still untouched: 175
+---
+> Memory usage before: 3016&521; after: 1607&459; still untouched: 178
+3864c3864
+< \vbox(16383.99998+2.0)x100.0, glue set 16318.0fil
+---
+> \vbox(16383.99998+2.0)x100.0, glue set 16317.99997fil
+3951c3951
+< Memory usage before: 640&415; after: 397&410; still untouched: 175
+---
+> Memory usage before: 888&415; after: 525&410; still untouched: 178
+4034c4034
+< \vbox(16383.99998+0.0)x8236.0, glue set 16344.0fil
+---
+> \vbox(16383.99998+0.0)x8236.0, glue set 16343.99998fil
+4053c4053
+< Memory usage before: 235&401; after: 178&399; still untouched: 175
+---
+> Memory usage before: 307&401; after: 218&399; still untouched: 178
+4420c4420
+< \vbox(16383.99998+0.0)x100.0, glue set 16332.0fil
+---
+> \vbox(16383.99998+0.0)x100.0, glue set 16331.99998fil
+4506c4506
+< Memory usage before: 651&432; after: 417&418; still untouched: 175
+---
+> Memory usage before: 941&432; after: 565&418; still untouched: 178
+4742c4742
+< \vbox(16383.99998+0.0)x205.12613, glue set 16344.0fil
+---
+> \vbox(16383.99998+0.0)x205.12613, glue set 16343.99998fil
+4828c4828
+< Memory usage before: 776&458; after: 464&452; still untouched: 175
+---
+> Memory usage before: 1098&458; after: 630&452; still untouched: 178
+6381c6381
+< (tripos.tex
+---
+> (./tripos.tex
+6596c6596
+< Memory usage before: 819&428; after: 720&426; still untouched: 175
+---
+> Memory usage before: 1155&428; after: 1016&426; still untouched: 178
+7156c7156
+< Memory usage before: 895&439; after: 290&420; still untouched: 175
+---
+> Memory usage before: 1269&439; after: 374&420; still untouched: 178
+7289c7289
+< Memory usage before: 334&431; after: 292&418; still untouched: 175
+---
+> Memory usage before: 434&431; after: 376&418; still untouched: 178
+7297,7300c7297,7300
+< 47 strings out of 1674
+< 253 string characters out of 8367
+< 2825 words of memory out of 3000
+< 372 multiletter control sequences out of 2100
+---
+> 44 strings out of 1809
+> 261 string characters out of 7734
+> 3821 words of memory out of 3999
+> 373 multiletter control sequences out of 15000+0
+7302c7302
+< 2 hyphenation exceptions out of 307
+---
+> 1 hyphenation exception out of 659
+
+mv tripos.tex ctripos.tex
++ mv tripos.tex ctripos.tex
+diff $testdir/tripos.tex ctripos.tex
++ diff SRCDIR/triptrap/tripos.tex ctripos.tex
+
+eval ./dvitype $dvitype_args trip.dvi >ctrip.typ || exit 1
++ eval ./dvitype -output-level=2 -dpi=72.27 '-page-start='\''*.*.*.*.*.*.*.*.*.*'\''' trip.dvi
+./dvitype -output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*' trip.dvi
+++ ./dvitype -output-level=2 -dpi=72.27 '-page-start=*.*.*.*.*.*.*.*.*.*' trip.dvi
+$DIFF $DIFFFLAGS $testdir/trip.typ ctrip.typ
++ diff SRCDIR/triptrap/trip.typ ctrip.typ
+1c1
+< This is DVItype, Version 3.6
+---
+> This is DVItype, Version 3.6 (TeX Live 2021/dev)
+9c9
+< ' TeX output 1776.07.04:1200'
+---
+> ' TeX output 2021.01.27:1801'
+419c419
+< 1121: down4 639342208
+---
+> 1121: down4 639342177
+1087,1088c1087,1088
+< 2535: y4 203921760
+< 2540: y0 203921760
+---
+> 2535: y4 203921756
+> 2540: y0 203921756
+
+mv trip.fmt ctrip.fmt
++ mv trip.fmt ctrip.fmt
+
+# ==============================
+
+echo "*** TRIP test for e-TeX in extended mode ***."
++ echo '*** TRIP test for e-TeX in extended mode ***.'
+*** TRIP test for e-TeX in extended mode ***.
+
+./etex --progname=einitex --ini <$etestdir/etrip1.in >xtripin.fot
++ ./etex --progname=einitex --ini
+if test ! -s trip.fmt; then
+ echo "*** trip.fmt not created by etrip1.in, investigate!" >&2
+ exit 1
+fi
++ test '!' -s trip.fmt
+mv trip.log xtripin.log || exit 1
++ mv trip.log xtripin.log
+diff ctripin.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
+< 479 memory locations dumped; current usage is 104&278
+< 342 multiletter control sequences
+---
+> 517 memory locations dumped; current usage is 142&278
+> 408 multiletter control sequences
+
+# May as well test non-ini second time through.
+./etex --progname=etex <$etestdir/trip2.in >xtrip.fot
++ ./etex --progname=etex
+mv trip.log xtrip.log
++ mv trip.log xtrip.log
+diff ctrip.fot xtrip.fot
++ diff ctrip.fot xtrip.fot
+2c2,3
+< **(./trip.tex ##
+---
+> **entering extended mode
+> ## (./trip.tex
+16c17
+< Memory usage before: 185&313; after: 112&278; still untouched: 2612
+---
+> Memory usage before: 185&313; after: 112&278; still untouched: 1612
+76a78,80
+>
+> ### semi simple group (level 1) entered at line 429 (begingroup)
+> ### bottom level
+
+# We use $DIFF instead of `diff' only for those files where there
+# might actually be legitimate numerical differences.
+$DIFF $DIFFFLAGS ctrip.log xtrip.log
++ diff ctrip.log xtrip.log
+2,3c2,4
+< ** &trip trip
+< (./trip.tex ##
+---
+> entering extended mode
+> **&trip \toksdef\tokens=0 \input trip
+> (./trip.tex
+73c74
+< Memory usage before: 185&313; after: 112&278; still untouched: 2612
+---
+> Memory usage before: 185&313; after: 112&278; still untouched: 1612
+1769d1769
+< {restoring \fam=-1}
+1779d1778
+< {restoring \displayindent=0.0pt}
+1833d1831
+< {restoring \fam=-1}
+2135c2133
+< .\hbox(0.0+0.0)x0.0, shifted 50.0
+---
+> .\hbox(0.0+0.0)x0.0, shifted 50.0, display
+2138c2136
+< .\hbox(0.0+0.0)x0.0, shifted 100.0
+---
+> .\hbox(0.0+0.0)x0.0, shifted 100.0, display
+2570c2568
+< .\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
+2835d2832
+< {restoring current font=\ip}
+3223d3219
+< {restoring \fam=-1}
+3372c3368
+< .\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
+3557c3553
+< .\hbox(20.5+50.80002)x8.27895, shifted 19.72105
+---
+> .\hbox(20.5+50.80002)x8.27895, shifted 19.72105, display
+3766d3761
+< {restoring \fam=-1}
+3839d3833
+< {restoring \fam=-1}
+3895c3889
+< ..\hbox(12.0+4.0)x8.1778
+---
+> ..\hbox(12.0+4.0)x8.1778, display
+3917c3911
+< ..\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
+3925c3919
+< ....\hbox(7.0+1.0)x5.0, shifted 47.5
+---
+> ....\hbox(7.0+1.0)x5.0, shifted 47.5, display
+4011d4004
+< {restoring \fam=-1}
+4047c4040
+< .\hbox(0.0+0.0)x1009.0, shifted 7227.0
+---
+> .\hbox(0.0+0.0)x1009.0, shifted 7227.0, display
+4051c4044
+< .\hbox(0.0+0.0)x-7127.0, shifted 7227.0
+---
+> .\hbox(0.0+0.0)x-7127.0, shifted 7227.0, display
+4845c4838
+< I'll pretend you didn't say \long or \outer or \global.
+---
+> I'll pretend you didn't say \long or \outer or \global or \protected.
+7292a7286,7288
+>
+> ### semi simple group (level 1) entered at line 429 (begingroup)
+> ### bottom level
+7300c7296
+< 373 multiletter control sequences out of 15000+0
+---
+> 439 multiletter control sequences out of 15000+0
+7303c7299
+< 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
+
+mv tripos.tex xtripos.tex
++ mv tripos.tex xtripos.tex
+diff $testdir/tripos.tex xtripos.tex
++ diff SRCDIR/triptrap/tripos.tex xtripos.tex
+
+eval ./dvitype $dvitype_args trip.dvi >xtrip.typ || exit 1
++ eval ./dvitype -output-level=2 -dpi=72.27 '-page-start='\''*.*.*.*.*.*.*.*.*.*'\''' trip.dvi
+./dvitype -output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*' trip.dvi
+++ ./dvitype -output-level=2 -dpi=72.27 '-page-start=*.*.*.*.*.*.*.*.*.*' trip.dvi
+$DIFF $DIFFFLAGS ctrip.typ xtrip.typ
++ diff ctrip.typ xtrip.typ
+
+mv trip.fmt xtrip.fmt
++ mv trip.fmt xtrip.fmt
+
+# ==============================
+
+echo "*** e-TeX specific part of e-TRIP test ***."
++ echo '*** e-TeX specific part of e-TRIP test ***.'
+*** e-TeX specific part of e-TRIP test ***.
+
+./pltotf $etestdir/etrip.pl etrip.tfm || exit 1
++ ./pltotf SRCDIR/etexdir/etrip/etrip.pl etrip.tfm
+
+./tftopl ./etrip.tfm etrip.pl || exit 1
++ ./tftopl ./etrip.tfm etrip.pl
+
+diff $etestdir/etrip.pl etrip.pl || is_OK=false
++ diff SRCDIR/etexdir/etrip/etrip.pl etrip.pl
+
+# get same filename in log
+$LN_S $etestdir/etrip.tex .
++ ln -s SRCDIR/etexdir/etrip/etrip.tex .
+
+./etex --progname=einitex --ini <$etestdir/etrip2.in >etripin.fot
++ ./etex --progname=einitex --ini
+if test ! -s etrip.fmt; then
+ echo "*** etrip.fmt not created by etrip2.in, investigate!" >&2
+ exit 1
+fi
++ test '!' -s etrip.fmt
+mv etrip.log etripin.log || exit 1
++ mv etrip.log etripin.log
+diff $etestdir/etripin.log etripin.log
++ diff SRCDIR/etexdir/etrip/etripin.log etripin.log
+1c1
+< This is e-TeX, Version 3.14159265-2.6 (TeX Live 2014) (INITEX) 22 JAN 2014 11:25
+---
+> This is e-TeX, Version 3.141592653-2.6 (TeX Live 2021/dev) (INITEX) 27 JAN 2021 18:01
+26,27c26,27
+< (preloaded format=etrip 2014.1.22)
+< 1491 strings of total length 26258
+---
+> (preloaded format=etrip 2021.1.27)
+> 1492 strings of total length 26297
+
+# May as well test non-ini second time through.
+./etex --progname=etex <$etestdir/etrip3.in >etrip.fot
++ ./etex --progname=etex
+diff $etestdir/etrip.fot etrip.fot
++ diff SRCDIR/etexdir/etrip/etrip.fot etrip.fot
+1c1
+< This is e-TeX, Version 3.14159265-2.6 (TeX Live 2014) (preloaded format=etex)
+---
+> This is e-TeX, Version 3.141592653-2.6 (TeX Live 2021/dev) (preloaded format=etex)
+45,46d44
+<
+< \openout1 = `etrip.out'.
+
+# We use $DIFF instead of `diff' only for those files where there
+# might actually be legitimate numerical differences.
+$DIFF $DIFFFLAGS $etestdir/etrip.log etrip.log
++ diff SRCDIR/etexdir/etrip/etrip.log etrip.log
+1c1
+< This is e-TeX, Version 3.14159265-2.6 (TeX Live 2014) (preloaded format=etrip 2014.1.22) 22 JAN 2014 11:25
+---
+> This is e-TeX, Version 3.141592653-2.6 (TeX Live 2021/dev) (preloaded format=etrip 2021.1.27) 27 JAN 2021 18:01
+692,693d691
+< \openout1 = `etrip.out'.
+<
+1426c1424
+< this will be denominator of:
+---
+> this will begin denominator of:
+1450c1448
+< this will be denominator of:
+---
+> this will begin denominator of:
+1497c1495
+< this will be denominator of:
+---
+> this will begin denominator of:
+1545c1543
+< this will be denominator of:
+---
+> this will begin denominator of:
+4421,4422c4419,4420
+< 19 strings out of 1809
+< 145 string characters out of 7742
+---
+> 19 strings out of 1808
+> 145 string characters out of 7703
+
+diff $etestdir/etrip.out etrip.out
++ diff SRCDIR/etexdir/etrip/etrip.out etrip.out
+
+eval ./dvitype $dvitype_args etrip.dvi >etrip.typ || exit 1
++ eval ./dvitype -output-level=2 -dpi=72.27 '-page-start='\''*.*.*.*.*.*.*.*.*.*'\''' etrip.dvi
+./dvitype -output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*' etrip.dvi
+++ ./dvitype -output-level=2 -dpi=72.27 '-page-start=*.*.*.*.*.*.*.*.*.*' etrip.dvi
+$DIFF $DIFFFLAGS $etestdir/etrip.typ etrip.typ
++ diff SRCDIR/etexdir/etrip/etrip.typ etrip.typ
+1c1
+< This is DVItype, Version 3.6 (TeX Live 2014)
+---
+> This is DVItype, Version 3.6 (TeX Live 2021/dev)
+9c9
+< ' TeX output 2014.01.22:1125'
+---
+> ' TeX output 2021.01.27:1801'
+
+$is_OK || {
+ echo ">>> There were some errors." >&2
+ exit 1
+}
++ :
+
+PASS etexdir/etriptest.test (exit status: 0)
+PASS: etexdir/etriptest.test
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..c1c8210f47b
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/etrip.fot
@@ -0,0 +1,47 @@
+This is e-TeX, Version 3.14159265-2.6 (TeX Live 2014) (preloaded format=etex)
+**entering extended mode
+(./etrip.tex e-IniTeX: e-Trip format loaded.
+This is the e-Trip test [2014-01-22] for e-TeX v3.14159265-2.6.
+(You are using e-TeX version/revision 2.6)
+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
+
+\openout1 = `etrip.out'.
+
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..b694b2ce46b
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/etrip.log
@@ -0,0 +1,4429 @@
+This is e-TeX, Version 3.14159265-2.6 (TeX Live 2014) (preloaded format=etrip 2014.1.22) 22 JAN 2014 11:25
+entering extended mode
+**&etrip etrip
+(./etrip.tex e-IniTeX: e-Trip format loaded.
+This is the e-Trip test [2014-01-22] for e-TeX v3.14159265-2.6.
+(You are using e-TeX version/revision 2.6)
+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 \6=undefined}
+{into \6=select font nullfont}
+{globally changing \6=select font nullfont}
+{into \6=select font etrip at 11.0pt}
+{changing \6=select font etrip at 11.0pt}
+{into \6=select font nullfont}
+{changing \6=select font nullfont}
+{into \6=select font etrip at 11.0pt}
+{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 \5=undefined}
+{into \5=select font nullfont}
+{globally changing \5=select font nullfont}
+{into \5=select font etrip at 12.0pt}
+{changing \5=select font etrip at 12.0pt}
+{into \5=select font nullfont}
+{changing \5=select font nullfont}
+{into \5=select font etrip at 12.0pt}
+{changing \4=undefined}
+{into \4=select font etrip at 12.0pt}
+{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 \4=undefined}
+{restoring \5=select font etrip at 12.0pt}
+{restoring \6=select font etrip at 11.0pt}
+{restoring \tracingassigns=0}
+Checking \currentgrouptype, \currentgrouplevel, and \lastnodetype:
+current group level (l.284): outer level
+current group type (l.286): bottom level
+current group type (l.313): semi simple group
+{entering vbox group (level 2) at line 315}
+current group type (l.315): vbox group
+{entering adjusted hbox group (level 3) at line 316}
+current group type (l.316): adjusted hbox group
+{entering simple group (level 4) at line 317}
+current group type (l.317): simple group
+{leaving simple group (level 4) entered at line 317}
+last node type (l.318): empty
+{entering hbox group (level 4) at line 319}
+current group type (l.319): hbox group
+{entering disc group (level 5) at line 320}
+current group type (l.320): disc group
+{leaving disc group (level 5) entered at line 320}
+{entering disc group (level 5) at line 320}
+current group type (l.320): disc group
+{leaving disc group (level 5) entered at line 320}
+{entering disc group (level 5) at line 320}
+current group type (l.320): disc group
+{leaving disc group (level 5) entered at line 320}
+last node type (l.322): disc node
+last node type (l.323): char node
+last node type (l.324): ligature 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): ins node
+{entering insert group (level 5) at line 327}
+current group type (l.327): insert group
+{leaving insert group (level 5) entered at line 327}
+last node type (l.328): adjust node
+last node type (l.329): mark node
+last node type (l.330): rule node
+last node type (l.331): glue node
+last node type (l.332): kern node
+last node type (l.333): penalty node
+{entering vtop group (level 5) at line 334}
+current group type (l.334): vtop group
+{leaving vtop group (level 5) entered at line 334}
+last node type (l.335): vlist node
+last node type (l.336): whatsit node
+{entering math shift group (level 5) at line 337}
+current group type (l.337): math shift group
+{entering math group (level 6) at line 338}
+current group type (l.338): math group
+{leaving math group (level 6) entered at line 338}
+{leaving math shift group (level 5) entered at line 337}
+last node type (l.340): math node
+last node type (l.341): math node
+last node type (l.342): math node
+{entering align group (level 5) at line 343}
+{entering align group (level 6) at line 343}
+current group type (l.343): align group
+{leaving align group (level 6) entered at line 343}
+{entering align group (level 6) at line 344}
+{entering no align group (level 7) at line 344}
+current group type (l.344): no align group
+last node type (l.345): unset node
+{leaving no align group (level 7) entered at line 344}
+{leaving align group (level 6) entered at line 344}
+{leaving align group (level 5) entered at line 343}
+{leaving hbox group (level 4) entered at line 319}
+{leaving adjusted hbox group (level 3) entered at line 316}
+last node type (l.349): hlist node
+{entering math shift group (level 3) at line 350}
+current group type (l.350): math shift group
+last node type (l.351): empty
+{entering math choice group (level 4) at line 352}
+current group type (l.352): math choice group
+{leaving math choice group (level 4) entered at line 352}
+{entering math choice group (level 4) at line 352}
+current group type (l.352): math choice group
+{leaving math choice group (level 4) entered at line 352}
+{entering math choice group (level 4) at line 352}
+current group type (l.352): math choice group
+{leaving math choice group (level 4) entered at line 352}
+{entering math choice group (level 4) at line 352}
+current group type (l.352): math choice group
+{entering vcenter group (level 5) at line 353}
+current group type (l.353): vcenter group
+{leaving vcenter group (level 5) entered at line 353}
+last node type (l.354): math mode node
+{leaving math choice group (level 4) entered at line 352}
+last node type (l.355): math mode node
+{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}
+{entering math left group (level 4) at line 357}
+current group type (l.357): math left group
+{leaving math left group (level 4) entered at line 357}
+{entering math left group (level 4) at line 358}
+current group type (l.358): math left group
+{leaving math left group (level 4) entered at line 358}
+{leaving math shift group (level 3) entered at line 350}
+{leaving vbox group (level 2) entered at line 315}
+{entering adjusted hbox group (level 2) at line 396}
+{leaving adjusted hbox group (level 2) entered at line 396}
+{entering output group (level 2) at line 396}
+current group type (l.396): output group
+{entering vbox group (level 3) at line 396}
+{entering adjusted hbox group (level 4) at line 396}
+{entering hbox group (level 5) at line 396}
+{entering simple group (level 6) at line 396}
+{entering align group (level 7) at line 396}
+{entering align group (level 8) at line 396}
+{entering no align group (level 9) at line 396}
+{entering math shift group (level 10) at line 396}
+{entering vtop group (level 11) at line 396}
+{entering math shift group (level 12) at line 396}
+{entering math group (level 13) at line 396}
+{entering math left group (level 14) at line 396}
+{leaving math left group (level 14) entered at line 396}
+{entering math left group (level 14) at line 396}
+{entering math choice group (level 15) at line 396}
+{leaving math choice group (level 15) entered at line 396}
+{entering math choice group (level 15) at line 396}
+{leaving math choice group (level 15) entered at line 396}
+{entering math choice group (level 15) at line 396}
+{entering vcenter group (level 16) at line 396}
+{entering insert group (level 17) at line 396}
+{entering disc group (level 18) at line 396}
+{leaving disc group (level 18) entered at line 396}
+{entering disc group (level 18) at line 396}
+
+### disc group (level 18) entered at line 396 (\discretionary{}{)
+### insert group (level 17) entered at line 396 (\vadjust{)
+### vcenter group (level 16) entered at line 396 (\vcenter to7.0pt{)
+### math choice group (level 15) entered at line 396 (\mathchoice{}{}{)
+### math left group (level 14) entered at line 396 (\middle)
+### math group (level 13) entered at line 396 ({)
+### math shift group (level 12) entered at line 396 ($$)
+### vtop group (level 11) entered at line 396 (\vtop{)
+### math shift group (level 10) entered at line 396 ($)
+### no align group (level 9) entered at line 396 (\noalign{)
+### align group (level 8) entered at line 396 (\cr)
+### align group (level 7) entered at line 396 (\valign{)
+### simple group (level 6) entered at line 396 ({)
+### hbox group (level 5) entered at line 396 (\raise5.0pt\hbox{)
+### adjusted hbox group (level 4) entered at line 396 (\hbox spread5.0pt
+{)
+### vbox group (level 3) entered at line 396 (\setbox0=\vbox{)
+### output group (level 2) entered at line 396 (\output)
+### semi simple group (level 1) entered at line 287 (\begingroup)
+### bottom level
+
+! OK.
+<output> ...nary {}{\showgroups
+ }{} } } }{} \right . } $$ } $...
+l.396 ...ox{}\vfil\penalty-10000
+
+
+{leaving disc group (level 18) entered at line 396}
+{entering disc group (level 18) at line 396}
+{leaving disc group (level 18) entered at line 396}
+{leaving insert group (level 17) entered at line 396}
+{leaving vcenter group (level 16) entered at line 396}
+{leaving math choice group (level 15) entered at line 396}
+{entering math choice group (level 15) at line 396}
+{leaving math choice group (level 15) entered at line 396}
+{leaving math left group (level 14) entered at line 396}
+{leaving math group (level 13) entered at line 396}
+{leaving math shift group (level 12) entered at line 396}
+{leaving vtop group (level 11) entered at line 396}
+{leaving math shift group (level 10) entered at line 396}
+{leaving no align group (level 9) entered at line 396}
+{leaving align group (level 8) entered at line 396}
+{leaving align group (level 7) entered at line 396}
+{leaving simple group (level 6) entered at line 396}
+{leaving hbox group (level 5) entered at line 396}
+{leaving adjusted hbox group (level 4) entered at line 396}
+{leaving vbox group (level 3) entered at line 396}
+{leaving output group (level 2) entered at line 396}
+Checking expansion of \protected macros:
+> \2=\protected macro:
+->.
+l.404 ...otected\def\2{} \show\2
+
+
+> \3=\protected macro:
+->.
+l.405 \let\3=\2 \show\3
+
+
+> \1=\protected macro:
+->\2.
+l.406 ...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.410 ...ndafter\1\1}} \showbox0
+
+
+
+\1->\2
+> \5=macro:
+->\1\2.
+l.411 ...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
+
+\openout1 = `etrip.out'.
+
+Memory usage before: 52&184; after: 36&178; still untouched: 1672
+(./etrip.out) (
+Warning: end of semi simple group (level 3) entered at line 433 of a dif
+ferent file
+Warning: end of \iftrue entered on line 433 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 435 of a dif
+ferent file
+l.1 \endgroup
+
+l.435 ...ntokens\expandafter{\1}
+ \egroup \fi
+Warning: end of \unless\iffalse entered on line 435 of a different file
+l.2 \fi
+
+l.435 ...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.435 ...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.446 }
+ % end of outer \scantokens
+Warning: end of \ifcase entered on line 2 of a different file
+l.2 \else \fi
+
+l.6 }
+
+l.446 }
+ % end of outer \scantokens
+Warning: end of hbox group (level 3) entered at line 437 of a different
+file
+
+\1->\egroup
+ \fi
+l.4 \1
+
+l.6 }
+
+l.446 }
+ % end of outer \scantokens
+Warning: end of \unless\iftrue entered on line 438 of a different file
+
+\1->\egroup \fi
+
+l.4 \1
+
+l.6 }
+
+l.446 }
+ % 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.446 }
+ % end of outer \scantokens
+! Incomplete \iffalse; all text was ignored after line 9.
+<inserted text>
+ \fi
+l.6 }
+
+l.446 }
+ % 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.446 }
+ % 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.453 ...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.455 ...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.463 ...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 470
+\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.470 ...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.493 \1 \showbox0
+ \let\5=\3 \def\3#1{\showtokens\expandaft...
+
+> 0-1.
+<recently read> }
+
+...
+l.495 \1
+ \showbox1 \showbox0 \let\3=\5
+
+> 0-2.
+<recently read> }
+
+...
+l.495 \1
+ \showbox1 \showbox0 \let\3=\5
+
+> 1-1.
+<recently read> }
+
+...
+l.495 \1
+ \showbox1 \showbox0 \let\3=\5
+
+> 1-1.
+<recently read> }
+
+...
+l.495 \1
+ \showbox1 \showbox0 \let\3=\5
+
+> .
+<recently read> }
+
+...
+l.495 \1
+ \showbox1 \showbox0 \let\3=\5
+
+> .
+<recently read> }
+
+...
+l.495 \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.495 \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.495 \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.497 \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.497 \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.499 \1 \showbox1
+ \showbox0
+
+> \box0=
+\vbox(0.0+0.0)x10.0
+.\glue(\splittopskip) 0.0
+.\hbox(0.0+0.0)x10.0
+
+! OK.
+l.499 \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.502 ...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.502 ...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.502 ...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.502 ...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.503 ...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.504 ...x{}\vfil\penalty-10000
+ % reclaim sparse array memory!
+
+Checking \middle:
+! Missing $ inserted.
+<inserted text>
+ $
+...
+l.513 \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.513 ...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.513 ...box0=\vbox{\middle \par
+ \right \par} % <== 8 errors
+I'm ignoring a \middle that had no matching \left.
+
+! Missing $ inserted.
+<inserted text>
+ $
+...
+l.513 ...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.513 ...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.513 ...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.513 ...middle \par \right \par
+ } % <== 8 errors
+I'm ignoring a \right that had no matching \left.
+
+! Missing $ inserted.
+<inserted text>
+ $
+...
+l.513 ...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 524
+\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 521
+\left"161361
+\mathord
+.\fam1 p
+\middle"142342
+\mathord
+.\fam1 q
+\middle"142342
+\mathord
+.\fam1 q
+### math mode entered at line 517
+\mathord
+.\fam1 r
+this will be denominator of:
+\fraction, thickness = default
+\\left"161361
+\\mathord
+\.\fam1 q
+### math mode entered at line 516
+\left"161361
+\mathord
+.\fam1 p
+### math mode entered at line 515
+### restricted horizontal mode entered at line 514
+spacefactor 1000
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+l.525 ... \over r\showlists
+
+
+
+### math mode entered at line 521
+\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 517
+\mathord
+.\fam1 r
+this will be denominator of:
+\fraction, thickness = default
+\\left"161361
+\\mathord
+\.\fam1 q
+### math mode entered at line 516
+\left"161361
+\mathord
+.\fam1 p
+### math mode entered at line 515
+### restricted horizontal mode entered at line 514
+spacefactor 1000
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+l.526 ... \right]\showlists
+
+
+
+### math mode entered at line 517
+\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 516
+\left"161361
+\mathord
+.\fam1 p
+### math mode entered at line 515
+### restricted horizontal mode entered at line 514
+spacefactor 1000
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+l.527 ... \right]\showlists
+
+
+
+### math mode entered at line 516
+\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 515
+### restricted horizontal mode entered at line 514
+spacefactor 1000
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+l.528 \right]\showlists
+
+
+
+### math mode entered at line 515
+\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 514
+spacefactor 1000
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+l.529 \right]\showlists
+
+
+
+### restricted horizontal mode entered at line 514
+\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.530 $\showlists
+
+
+
+### restricted horizontal mode entered at line 532
+\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.534 ...box{}\right]$\showlists
+ }
+
+
+### restricted horizontal mode entered at line 535
+\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.537 \right]$\showlists
+ }
+
+Checking TeX--XeT enhancements:
+
+\endL or \endR problem (0 missing, 1 extra) in paragraph at lines 550--5
+50
+[][][][][][]
+
+\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 551--5
+51
+[]
+
+\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.552 \showbox0
+
+
+Checking optimized \aftergroup:
+! Undefined control sequence.
+<to be read again> \x
+ }{\relax
+l.564 ...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.583): 0
+current if level (l.584): 1
+current if level (l.585): 2
+current if type (l.603): \if!NONE
+current if branch (l.603): no branch
+current if type (l.604): \if
+current if branch (l.604): true branch
+current if type (l.604): \unless\if
+current if branch (l.604): false branch
+current if type (l.605): \if
+current if branch (l.605): false branch
+current if type (l.605): \unless\if
+current if branch (l.605): true branch
+current if type (l.606): \ifcat
+current if branch (l.606): true branch
+current if type (l.606): \unless\ifcat
+current if branch (l.606): false branch
+current if type (l.607): \ifcat
+current if branch (l.607): false branch
+current if type (l.607): \unless\ifcat
+current if branch (l.607): true branch
+current if type (l.608): \ifnum
+current if branch (l.608): true branch
+current if type (l.608): \unless\ifnum
+current if branch (l.608): true branch
+current if type (l.609): \ifdim
+current if branch (l.609): false branch
+current if type (l.609): \unless\ifdim
+current if branch (l.609): true branch
+current if type (l.610): \ifodd
+current if branch (l.610): true branch
+current if type (l.610): \unless\ifodd
+current if branch (l.610): false branch
+current if type (l.612): \ifvmode
+current if branch (l.612): true branch
+current if type (l.612): \unless\ifvmode
+current if branch (l.612): false branch
+current if type (l.615): \ifhmode
+current if branch (l.615): true branch
+current if type (l.615): \unless\ifhmode
+current if branch (l.615): false branch
+current if type (l.617): \ifmmode
+current if branch (l.617): true branch
+current if type (l.617): \unless\ifmmode
+current if branch (l.617): false branch
+current if type (l.619): \ifinner
+current if branch (l.619): true branch
+current if type (l.621): \unless\ifinner
+current if branch (l.621): true branch
+current if type (l.622): \ifvoid
+current if branch (l.622): true branch
+current if type (l.622): \unless\ifvoid
+current if branch (l.622): true branch
+current if type (l.623): \ifhbox
+current if branch (l.623): true branch
+current if type (l.623): \unless\ifhbox
+current if branch (l.623): true branch
+current if type (l.624): \ifvbox
+current if branch (l.624): true branch
+current if type (l.624): \unless\ifvbox
+current if branch (l.624): true branch
+current if type (l.625): \ifx
+current if branch (l.625): false branch
+current if type (l.625): \unless\ifx
+current if branch (l.625): true branch
+current if type (l.626): \ifeof
+current if branch (l.626): true branch
+current if type (l.626): \unless\ifeof
+current if branch (l.626): false branch
+current if type (l.627): \iftrue
+current if branch (l.627): true branch
+current if type (l.627): \unless\iftrue
+current if branch (l.627): false branch
+current if type (l.628): \iffalse
+current if branch (l.628): false branch
+current if type (l.628): \unless\iffalse
+current if branch (l.628): true branch
+current if type (l.629): \ifcase
+current if branch (l.629): true branch
+current if type (l.629): \ifcase
+current if branch (l.629): false branch
+current if type (l.630): \ifdefined
+current if branch (l.630): true branch
+current if type (l.630): \unless\ifdefined
+current if branch (l.630): true branch
+current if type (l.631): \ifcsname
+current if branch (l.631): true branch
+current if type (l.632): \unless\ifcsname
+current if branch (l.632): true branch
+current if type (l.633): \iffontchar
+current if branch (l.633): true branch
+current if type (l.633): \unless\iffontchar
+current if branch (l.633): true branch
+{math mode: \ifcsname: (level 41) entered on line 649}
+{\unless\ifcsname: (level 42) entered on line 649}
+{\iffontchar: (level 43) entered on line 650}
+{\unless\iffontchar: (level 44) entered on line 650}
+
+### level 44: \unless\iffontchar entered on line 650
+### level 43: \iffontchar entered on line 650
+### level 42: \unless\ifcsname entered on line 649
+### level 41: \ifcsname entered on line 649
+### level 40: \unless\ifdefined entered on line 647
+### level 39: \ifdefined entered on line 647
+### level 38: \ifcase\else entered on line 646
+### level 37: \ifcase entered on line 646
+### level 36: \unless\iffalse entered on line 645
+### level 35: \iffalse\else entered on line 645
+### level 34: \unless\iftrue\else entered on line 645
+### level 33: \iftrue entered on line 645
+### level 32: \unless\ifx entered on line 644
+### level 31: \ifx\else entered on line 644
+### level 30: \unless\ifeof\else entered on line 643
+### level 29: \ifeof entered on line 643
+### level 28: \unless\ifvbox entered on line 643
+### level 27: \ifvbox entered on line 643
+### level 26: \unless\ifhbox entered on line 642
+### level 25: \ifhbox entered on line 642
+### level 24: \unless\ifvoid entered on line 642
+### level 23: \ifvoid entered on line 642
+### level 22: \unless\ifinner\else entered on line 641
+### level 21: \ifinner entered on line 641
+### level 20: \unless\ifmmode\else entered on line 641
+### level 19: \ifmmode entered on line 641
+### level 18: \unless\ifhmode\else entered on line 640
+### level 17: \ifhmode entered on line 640
+### level 16: \unless\ifvmode\else entered on line 639
+### level 15: \ifvmode entered on line 639
+### level 14: \unless\ifodd\else entered on line 638
+### level 13: \ifodd entered on line 638
+### level 12: \unless\ifdim entered on line 637
+### level 11: \ifdim\else entered on line 637
+### level 10: \unless\ifnum entered on line 637
+### level 9: \ifnum entered on line 637
+### level 8: \unless\ifcat entered on line 636
+### level 7: \ifcat\else entered on line 636
+### level 6: \unless\ifcat\else entered on line 636
+### level 5: \ifcat entered on line 636
+### level 4: \unless\if entered on line 635
+### level 3: \if\else entered on line 635
+### level 2: \unless\if\else entered on line 635
+### level 1: \if entered on line 635
+
+! OK.
+l.651 \showifs
+ % <== show 44 nested ifs
+
+{\fi: \unless\iffontchar (level 44) entered on line 650}
+{\fi: \iffontchar (level 43) entered on line 650}
+{\fi: \unless\ifcsname (level 42) entered on line 649}
+{\fi: \ifcsname (level 41) entered on line 649}
+Checking \iffontchar, \fontcharwd, etc.:
+! Missing font identifier.
+<to be read again>
+ \relax
+...
+l.674 \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.674 \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.675 ...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.676 \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.677 \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.677 \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.677 ...\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.677 ...\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.701 \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.701 ...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.701 ...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.765 \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.765 \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.765 ...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.765 ...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.767 ...unt43=\numexpr ( ( 2 \9
+ \dimen43=\dimexpr ...
+I was expecting to see `+', `-', `*', `/', or `)'. Didn't.
+
+! Missing ) inserted for expression.
+<to be read again>
+ \9
+l.767 ...unt43=\numexpr ( ( 2 \9
+ \dimen43=\dimexpr ...
+I was expecting to see `+', `-', `*', `/', or `)'. Didn't.
+
+! Missing ) inserted for expression.
+<to be read again>
+ \9
+l.767 ...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.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}
+{changing \dimen44=16383.5pt}
+{into \dimen44=-16383.99998pt}
+{changing \dimen44=-16383.99998pt}
+{into \dimen44=-16384.0pt}
+! Dimension too large.
+l.782 \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.782 ...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.783 ...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.783 ...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.784 ...=\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.784 ...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.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 ...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.787 ...\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.787 ...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.788 ...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.788 ...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.789 \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.789 ...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.790 \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.790 ...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.791 ...\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.791 ...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.831 \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.831 \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.831 \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.832 \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.832 \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.832 \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.833 \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.833 \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.833 \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.834 \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.834 \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.834 \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.862 ...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.862 ...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: 53&322; after: 44&322; still untouched: 835
+[1]
+Memory usage before: 53&322; after: 44&322; still untouched: 835
+Checking \mutoglue and \gluetomu:
+! You can't use `\mutoglue' in vertical mode.
+l.905 \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.905 \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.907 ...kip2=\gluetomu\muskip1
+ % <== two mu_error's (! Inco...
+I'm going to assume that 1mu=1pt when they're mixed.
+
+! Incompatible glue units.
+l.907 ...kip2=\gluetomu\muskip1
+ % <== two mu_error's (! Inco...
+I'm going to assume that 1mu=1pt when they're mixed.
+
+! Incompatible glue units.
+l.908 ...uskip2=\mutoglue\skip1
+ % <== two mu_error's (! Inco...
+I'm going to assume that 1mu=1pt when they're mixed.
+
+! Incompatible glue units.
+l.908 ...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.932 \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.932 ...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.933 \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.933 ...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.970 \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.970 \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.971 \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.971 \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.972 \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.972 \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.973 \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.973 \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.974 \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.974 \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.981 ...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.1024 \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.1024 \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.1025 \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.1025 \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.1026 \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.1026 ...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.1027 \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.1027 \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.1028 \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.1028 \showbox-1
+ % Bad register code (-1).
+
+
+### vtop group (level 4) entered at line 1041 (\setbox32103=\vtop to7.0p
+t{)
+### vbox group (level 3) entered at line 1040 (\global\setbox32102=\vbox
+ to5.0pt{)
+### hbox group (level 2) entered at line 1039 (\setbox32101=\hbox to3.0p
+t{)
+### semi simple group (level 1) entered at line 1021 (\begingroup)
+### bottom level
+
+! OK.
+l.1042 \showgroups
+
+
+{restoring \box32103=void}
+> \box32100=void
+
+! OK.
+l.1046 \showbox32100
+
+
+> \box32101=
+\hbox(0.0+0.0)x3.0
+
+! OK.
+l.1047 \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.1081 \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.1081 \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.1082 \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.1082 \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.1083 \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.1083 \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.1087 ... \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.1087 ... \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.1089 \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.1089 \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.1091 \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.1091 \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.1093 \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.1093 \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.1094 \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.1094 \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.1095 \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.1095 \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.1099 ... \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.1099 ... \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.1101 \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.1101 \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.1102 \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.1102 \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.1104 \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.1104 \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.1105 \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.1105 \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.1106 \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.1106 \lastlinefit=1000 \1
+
+
+Checking expansion of V 2 \protected macros:
+\1 (l.1115)
+\1 (l.1115)
+relax (l.1117)
+relax (l.1117)
+Checking hyphenation and \savinghyphcodes:
+
+Underfull \hbox (badness 10000) in paragraph at lines 1134--1134
+ []\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 1134--1134
+ []\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 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 pp1A1qq []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 up1A1qq []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 ppB1qq []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 upB1qq []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 pp1Aqq []pp1Aqq []pp1A1qq []pp1Aqq []ppAqq
+
+\hbox(7.0+1.0)x16383.99998, glue set 1635.4 []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 1138--1138
+ []\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 1138--1138
+ []\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 1138--1138
+ []\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 1140--1140
+ []\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 1140--1140
+ []\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 1140--1140
+ []\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.1148 ...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.1148 ...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.1149 \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.1177 \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.1177 \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.1177 ... \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.1177 ... \1 1 20 \1 2 30
+
+
+
+### internal vertical mode entered at line 1186
+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.1186 ...0 \vfil \kern 20 pt \1
+ \penalty -1 \1
+
+
+### internal vertical mode entered at line 1186
+prevdepth ignored
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+\1...{ \pagediscards \showlists
+ }}
+l.1186 ...0 pt \1 \penalty -1 \1
+
+
+
+### internal vertical mode entered at line 1187
+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.1187 ...1 \vfill \kern 2 pt \1
+ \penalty 10 \1
+
+
+### internal vertical mode entered at line 1187
+\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.1187 ...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.1192 ...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.1192 ...box {} \penalty -10000
+
+
+
+### internal vertical mode entered at line 1193
+\penalty 10000
+prevdepth ignored
+### vertical mode entered at line 0
+prevdepth 0.0
+
+! OK.
+\1...{ \pagediscards \showlists
+ }}
+l.1193 \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}
+Checking hyphenation of LR and RL segments:
+
+Overfull \hbox (15.0pt too wide) in paragraph at lines 1256--1256
+ \trip MM1
+
+\hbox(0.0+0.0)x0.0, glue set - 1.0
+.\glue 4.0 plus 2.0 minus 1.0
+.\trip M
+.\trip M
+.\discretionary
+.\trip 1
+.\trip 7 (ligature |)
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+\trip MM
+
+\hbox(0.0+0.0)x0.0
+.\trip M
+.\trip M
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM1[]
+
+\hbox(0.0+0.0)x0.0
+.\beginL
+.\trip M
+.\trip M
+.\discretionary
+.\trip 1
+.\trip 7 (ligature |)
+.\endL
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM[]
+
+\hbox(0.0+0.0)x0.0
+.\beginL
+.\trip M
+.\trip M
+.\endL
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM1[]
+
+\hbox(0.0+0.0)x0.0
+.\beginL
+.\trip M
+.\trip M
+.\discretionary
+.\trip 1
+.\trip 7 (ligature |)
+.\endL
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM[]
+
+\hbox(0.0+0.0)x0.0
+.\beginL
+.\trip M
+.\trip M
+.\endL
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM1[]
+
+\hbox(0.0+0.0)x0.0
+.\beginL
+.\trip M
+.\trip M
+.\discretionary
+.\trip 1
+.\trip 7 (ligature |)
+.\endL
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM[]
+
+\hbox(0.0+0.0)x0.0
+.\beginL
+.\trip M
+.\trip M
+.\endL
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM1[]
+
+\hbox(0.0+0.0)x0.0
+.\beginR
+.\trip M
+.\trip M
+.\discretionary
+.\trip 1
+.\trip 7 (ligature |)
+.\endR
+.\glue(\rightskip) 0.0
+
+
+Overfull \hbox (12.0pt too wide) in paragraph at lines 1256--1256
+[]\trip MM[]
+
+\hbox(0.0+0.0)x0.0
+.\beginR
+.\trip M
+.\trip M
+.\endR
+.\penalty 10000
+.\glue(\parfillskip) 0.0
+.\glue(\rightskip) 0.0
+
+ )
+Here is how much of TeX's memory you used:
+ 19 strings out of 1809
+ 145 string characters out of 7742
+ 3164 words of memory out of 3999
+ 409 multiletter control sequences out of 15000+0
+ 3796 words of font info for 5 fonts, out of 20000 for 75
+ 10 hyphenation exceptions out of 659
+ 10i,15n,8p,137b,79s 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..bb688740f82
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/etrip.tex
@@ -0,0 +1,1265 @@
+%%; This is `etrip.tex' for e-TeX v3.141592653-2.6 as of Jan 28, 2021.
+%%;
+%%; 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 macros as an example of <<==
+%%; ==>> 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 {2021-01-28}
+\def\texversion {3.141592653}
+\def\etripversion{2.6}
+%
+\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\font\6=etrip at 11pt \font\6=etrip at 11pt
+ \global\count17=7 \count17=7
+ \global\def\9{\relax} \global\let\8=\9 \let\8=\9
+ \bgroup
+ \global\font\5=etrip at 12pt \font\5=etrip at 12pt \let\4=\5
+ \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\currentgrouplevel 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
+ \edef\6{\number\lastnodetype}%
+ \typeout{wrong last node type: \6 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
+
+%
+% -- Check hyphenation of LR and RL segments
+\typeout{Checking hyphenation of LR and RL segments:}
+\begingroup
+ \setbox0=\vbox{\trip
+% \language=5
+ \lccode`M=`M \hyphenation{MM-MM}
+ \TeXXeTstate=1
+ \hsize=0pt
+ \parfillskip=0pt
+ \noindent{} MMMM \beginL MMMM MMMM MMMM\endL{} \beginR MMMM\endR \par
+ }
+\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..1d6d8716829
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/etrip.typ
@@ -0,0 +1,20 @@
+This is DVItype, Version 3.6 (TeX Live 2014)
+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 2014.01.22:1125'
+
+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..af805ca4c67
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/etripin.log
@@ -0,0 +1,41 @@
+This is e-TeX, Version 3.14159265-2.6 (TeX Live 2014) (INITEX) 22 JAN 2014 11:25
+entering extended mode
+***etrip
+(./etrip.tex
+This is the e-Trip test [2014-01-22] for e-TeX v3.14159265-2.6.
+(You are using e-TeX version/revision 2.6)
+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 2014.1.22)
+1491 strings of total length 26258
+281 memory locations dumped; current usage is 36&167
+408 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 35111
+ 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..b4e4bb4c6bb
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etrip/texmf.cnf
@@ -0,0 +1,41 @@
+% etexdir/etrip/texmf.cnf -- configuration for the e-trip test.
+
+% 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 = 3999 % can't change mem_bot, it stays 0
+max_strings = 3300
+pool_size = 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.fmt:
+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/etriptest.test b/Build/source/texk/web2c/etexdir/etriptest.test
new file mode 100755
index 00000000000..04e196d9624
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/etriptest.test
@@ -0,0 +1,128 @@
+#! /bin/sh -vx
+# $Id$
+# Copyright 2017 Karl Berry <tex-live@tug.org>
+# Copyright 2009-2014 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+testdir=$abs_srcdir/triptrap
+etestdir=$abs_srcdir/etexdir/etrip
+
+TEXMFCNF=$etestdir; export TEXMFCNF
+
+rm -rf etripdir
+mkdir etripdir
+cd etripdir
+
+dvitype_args="-output-level=2 -dpi=72.27 -page-start='*.*.*.*.*.*.*.*.*.*'"
+
+echo ">>> Running e-TRIP test for e-TeX." >&2
+echo ">>> See $etestdir/etrip.diffs for example of acceptable diffs." >&2
+
+is_OK=:
+
+set -x
+
+echo "*** TRIP test for e-TeX in compatibility mode ***."
+
+../pltotf $testdir/trip.pl trip.tfm || exit 1
+
+../tftopl ./trip.tfm trip.pl || exit 1
+
+diff $testdir/trip.pl trip.pl || is_OK=false
+
+# get same filename in log
+$LN_S $testdir/trip.tex .
+
+../etex --progname=einitex --ini <$testdir/trip1.in >ctripin.fot
+if test ! -s trip.fmt; then
+ echo "*** trip.fmt not created by trip1.in, investigate!" >&2
+ exit 1
+fi
+mv trip.log ctripin.log || exit 1
+diff $testdir/tripin.log ctripin.log
+
+# May as well test non-ini second time through.
+../etex --progname=etex <$testdir/trip2.in >ctrip.fot
+mv trip.log ctrip.log
+diff $testdir/trip.fot ctrip.fot
+
+# We use $DIFF instead of `diff' only for those files where there
+# might actually be legitimate numerical differences.
+$DIFF $DIFFFLAGS $testdir/trip.log ctrip.log
+
+mv tripos.tex ctripos.tex
+diff $testdir/tripos.tex ctripos.tex
+
+eval ../dvitype $dvitype_args trip.dvi >ctrip.typ || exit 1
+$DIFF $DIFFFLAGS $testdir/trip.typ ctrip.typ
+
+mv trip.fmt ctrip.fmt
+
+# ==============================
+
+echo "*** TRIP test for e-TeX in extended mode ***."
+
+../etex --progname=einitex --ini <$etestdir/etrip1.in >xtripin.fot
+if test ! -s trip.fmt; then
+ echo "*** trip.fmt not created by etrip1.in, investigate!" >&2
+ exit 1
+fi
+mv trip.log xtripin.log || exit 1
+diff ctripin.log xtripin.log
+
+# May as well test non-ini second time through.
+../etex --progname=etex <$etestdir/trip2.in >xtrip.fot
+mv trip.log xtrip.log
+diff ctrip.fot xtrip.fot
+
+# We use $DIFF instead of `diff' only for those files where there
+# might actually be legitimate numerical differences.
+$DIFF $DIFFFLAGS ctrip.log xtrip.log
+
+mv tripos.tex xtripos.tex
+diff $testdir/tripos.tex xtripos.tex
+
+eval ../dvitype $dvitype_args trip.dvi >xtrip.typ || exit 1
+$DIFF $DIFFFLAGS ctrip.typ xtrip.typ
+
+mv trip.fmt xtrip.fmt
+
+# ==============================
+
+echo "*** e-TeX specific part of e-TRIP test ***."
+
+../pltotf $etestdir/etrip.pl etrip.tfm || exit 1
+
+../tftopl ./etrip.tfm etrip.pl || exit 1
+
+diff $etestdir/etrip.pl etrip.pl || is_OK=false
+
+# get same filename in log
+$LN_S $etestdir/etrip.tex .
+
+../etex --progname=einitex --ini <$etestdir/etrip2.in >etripin.fot
+if test ! -s etrip.fmt; then
+ echo "*** etrip.fmt not created by etrip2.in, investigate!" >&2
+ exit 1
+fi
+mv etrip.log etripin.log || exit 1
+diff $etestdir/etripin.log etripin.log
+
+# May as well test non-ini second time through.
+../etex --progname=etex <$etestdir/etrip3.in >etrip.fot
+diff $etestdir/etrip.fot etrip.fot
+
+# We use $DIFF instead of `diff' only for those files where there
+# might actually be legitimate numerical differences.
+$DIFF $DIFFFLAGS $etestdir/etrip.log etrip.log
+
+diff $etestdir/etrip.out etrip.out
+
+eval ../dvitype $dvitype_args etrip.dvi >etrip.typ || exit 1
+$DIFF $DIFFFLAGS $etestdir/etrip.typ etrip.typ
+
+$is_OK || {
+ echo ">>> There were some errors." >&2
+ exit 1
+}
+
diff --git a/Build/source/texk/web2c/etexdir/tex.ch0 b/Build/source/texk/web2c/etexdir/tex.ch0
new file mode 100644
index 00000000000..43370703dd4
--- /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.141592653' {printed when \TeX\ starts}
+@#
+@d banner==eTeX_banner
+@y
+@d banner=='This is TeX, Version 3.141592653' {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..9fa445db42c
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/tex.ech
@@ -0,0 +1,118 @@
+% 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.141592653',eTeX_version_string
+@y
+@d eTeX_banner_k=='This is e-TeXk, Version 3.141592653',eTeX_version_string
+@d eTeX_banner=='This is e-TeX, Version 3.141592653',eTeX_version_string
+@z
+
+@x [16.215] - 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 [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
diff --git a/Build/source/texk/web2c/etexdir/wprob.test b/Build/source/texk/web2c/etexdir/wprob.test
new file mode 100755
index 00000000000..043a28e5762
--- /dev/null
+++ b/Build/source/texk/web2c/etexdir/wprob.test
@@ -0,0 +1,15 @@
+#! /bin/sh -vx
+# $Id$
+# Copyright 2017 Karl Berry <tex-live@tug.org>
+# Copyright 2011-2013 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+rm -rf ewprob.*
+cp $srcdir/tests/wprob.tex ./ewprob.tex
+
+TEXMFCNF=$srcdir/../kpathsea \
+ ./etex --ini --etex --file-line-error --interaction=nonstopmode ewprob.tex
+
+grep '^\./ewprob\.tex:12: Could not open file NoSuchFile\.eps\.$' \
+ ewprob.log || exit 1
+