summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/eplain
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:03:17 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:03:17 +0000
commitecf966f305f6aeff2bbdf42c82d8425921aa9eda (patch)
treedb606a57e3619610e4c35cae849d41cf4e0937d5 /Master/texmf-dist/source/eplain
parentac3c55a3216b5988f0e48ba9414ddb059f19a699 (diff)
source 1
git-svn-id: svn://tug.org/texlive/trunk@105 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/eplain')
-rw-r--r--Master/texmf-dist/source/eplain/base/add-date28
-rw-r--r--Master/texmf-dist/source/eplain/base/add-version24
-rw-r--r--Master/texmf-dist/source/eplain/base/etex.tex5
-rw-r--r--Master/texmf-dist/source/eplain/base/fix-checksum20
-rw-r--r--Master/texmf-dist/source/eplain/base/merge84
-rw-r--r--Master/texmf-dist/source/eplain/base/packages.zipbin0 -> 11374 bytes
-rw-r--r--Master/texmf-dist/source/eplain/base/test/allref.tex15
-rw-r--r--Master/texmf-dist/source/eplain/base/test/boxes.tex11
-rw-r--r--Master/texmf-dist/source/eplain/base/test/boxit.tex24
-rw-r--r--Master/texmf-dist/source/eplain/base/test/catcode.tex8
-rw-r--r--Master/texmf-dist/source/eplain/base/test/center.tex12
-rw-r--r--Master/texmf-dist/source/eplain/base/test/cite.bib25
-rw-r--r--Master/texmf-dist/source/eplain/base/test/cite.tex35
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citeall.tex12
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citealph.tex26
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citeapa.tex26
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citebegin.tex20
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citecust.tex38
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citenote.tex13
-rw-r--r--Master/texmf-dist/source/eplain/base/test/citex.tex8
-rw-r--r--Master/texmf-dist/source/eplain/base/test/colfootn.tex18
-rw-r--r--Master/texmf-dist/source/eplain/base/test/colrule.tex33
-rw-r--r--Master/texmf-dist/source/eplain/base/test/column.tex228
-rw-r--r--Master/texmf-dist/source/eplain/base/test/column2.tex51
-rw-r--r--Master/texmf-dist/source/eplain/base/test/column3.tex23
-rw-r--r--Master/texmf-dist/source/eplain/base/test/commdiags.tex111
-rw-r--r--Master/texmf-dist/source/eplain/base/test/contents.tex30
-rw-r--r--Master/texmf-dist/source/eplain/base/test/displine.tex36
-rw-r--r--Master/texmf-dist/source/eplain/base/test/double.tex24
-rw-r--r--Master/texmf-dist/source/eplain/base/test/double2.tex163
-rw-r--r--Master/texmf-dist/source/eplain/base/test/dvipdfm.tex111
-rw-r--r--Master/texmf-dist/source/eplain/base/test/ecommdiag.tex15
-rw-r--r--Master/texmf-dist/source/eplain/base/test/emergncy.tex19
-rw-r--r--Master/texmf-dist/source/eplain/base/test/env.tex42
-rw-r--r--Master/texmf-dist/source/eplain/base/test/eqdef.tex15
-rw-r--r--Master/texmf-dist/source/eplain/base/test/eqref.tex141
-rw-r--r--Master/texmf-dist/source/eplain/base/test/example.eps389
-rw-r--r--Master/texmf-dist/source/eplain/base/test/filexist.tex22
-rw-r--r--Master/texmf-dist/source/eplain/base/test/flynn.tex7
-rw-r--r--Master/texmf-dist/source/eplain/base/test/footnote.tex88
-rw-r--r--Master/texmf-dist/source/eplain/base/test/frac.tex24
-rw-r--r--Master/texmf-dist/source/eplain/base/test/gcol.tex218
-rw-r--r--Master/texmf-dist/source/eplain/base/test/hlcite.tex55
-rw-r--r--Master/texmf-dist/source/eplain/base/test/hlfoot.tex47
-rw-r--r--Master/texmf-dist/source/eplain/base/test/hlidx.mst2
-rw-r--r--Master/texmf-dist/source/eplain/base/test/hlidx.tex138
-rw-r--r--Master/texmf-dist/source/eplain/base/test/hlink.tex144
-rw-r--r--Master/texmf-dist/source/eplain/base/test/ian.tex28
-rw-r--r--Master/texmf-dist/source/eplain/base/test/index.tex36
-rw-r--r--Master/texmf-dist/source/eplain/base/test/jan.tex15
-rw-r--r--Master/texmf-dist/source/eplain/base/test/justify.tex106
-rw-r--r--Master/texmf-dist/source/eplain/base/test/knuth.bib17
-rw-r--r--Master/texmf-dist/source/eplain/base/test/label.tex8
-rw-r--r--Master/texmf-dist/source/eplain/base/test/latexcite.tex9
-rw-r--r--Master/texmf-dist/source/eplain/base/test/liang.tex300
-rw-r--r--Master/texmf-dist/source/eplain/base/test/list.tex90
-rw-r--r--Master/texmf-dist/source/eplain/base/test/listing.tex10
-rw-r--r--Master/texmf-dist/source/eplain/base/test/logo.tex20
-rw-r--r--Master/texmf-dist/source/eplain/base/test/loop.tex20
-rw-r--r--Master/texmf-dist/source/eplain/base/test/loopnext.tex21
-rw-r--r--Master/texmf-dist/source/eplain/base/test/mag.tex14
-rw-r--r--Master/texmf-dist/source/eplain/base/test/makecol.tex17
-rw-r--r--Master/texmf-dist/source/eplain/base/test/margin.tex68
-rw-r--r--Master/texmf-dist/source/eplain/base/test/matrix.tex18
-rw-r--r--Master/texmf-dist/source/eplain/base/test/mdisplay.tex215
-rw-r--r--Master/texmf-dist/source/eplain/base/test/names.tex21
-rw-r--r--Master/texmf-dist/source/eplain/base/test/noarrow.tex8
-rw-r--r--Master/texmf-dist/source/eplain/base/test/nobib.tex10
-rw-r--r--Master/texmf-dist/source/eplain/base/test/nonouter.tex11
-rw-r--r--Master/texmf-dist/source/eplain/base/test/optional.tex30
-rw-r--r--Master/texmf-dist/source/eplain/base/test/outer.tex26
-rw-r--r--Master/texmf-dist/source/eplain/base/test/page.tex8
-rw-r--r--Master/texmf-dist/source/eplain/base/test/path.tex25
-rw-r--r--Master/texmf-dist/source/eplain/base/test/pcol.tex183
-rw-r--r--Master/texmf-dist/source/eplain/base/test/pdftex.tex112
-rw-r--r--Master/texmf-dist/source/eplain/base/test/psfont.map78
-rw-r--r--Master/texmf-dist/source/eplain/base/test/rex.tex277
-rw-r--r--Master/texmf-dist/source/eplain/base/test/rule.tex23
-rw-r--r--Master/texmf-dist/source/eplain/base/test/sidx.tex5
-rw-r--r--Master/texmf-dist/source/eplain/base/test/subdef.tex24
-rw-r--r--Master/texmf-dist/source/eplain/base/test/tenenb.tex48
-rw-r--r--Master/texmf-dist/source/eplain/base/test/tenenb2.tex23
-rw-r--r--Master/texmf-dist/source/eplain/base/test/test.tex14
-rw-r--r--Master/texmf-dist/source/eplain/base/test/time.tex10
-rw-r--r--Master/texmf-dist/source/eplain/base/test/truemarg.tex36
-rw-r--r--Master/texmf-dist/source/eplain/base/test/uscore.bib5
-rw-r--r--Master/texmf-dist/source/eplain/base/test/uscore.tex14
-rw-r--r--Master/texmf-dist/source/eplain/base/test/usepackage.tex146
-rw-r--r--Master/texmf-dist/source/eplain/base/test/verb2.tex61
-rw-r--r--Master/texmf-dist/source/eplain/base/test/verbatim.tex65
-rw-r--r--Master/texmf-dist/source/eplain/base/test/vlach.tex258
-rw-r--r--Master/texmf-dist/source/eplain/base/test/whitespc.tex51
-rw-r--r--Master/texmf-dist/source/eplain/base/test/xampl.tex13
-rw-r--r--Master/texmf-dist/source/eplain/base/test/xref.tex39
-rw-r--r--Master/texmf-dist/source/eplain/base/util/idxuniq37
-rw-r--r--Master/texmf-dist/source/eplain/base/util/trimsee106
-rw-r--r--Master/texmf-dist/source/eplain/base/xeplain.tex4783
97 files changed, 10190 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/eplain/base/add-date b/Master/texmf-dist/source/eplain/base/add-date
new file mode 100644
index 00000000000..8465939b5b8
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/add-date
@@ -0,0 +1,28 @@
+#!/bin/sh
+# This file is public domain.
+
+# Change placeholders to variations on the current date. Assumes
+# various % constructs are recognized.
+
+if test $# -lt 1
+then
+ echo "Usage: $0 [<file> <file> ...]"
+ exit 1
+fi
+
+temp=${TMPDIR-/tmp}/adddate$$
+
+for f in "$@"; do
+ sed -e s/REPLACE-WITH-MONTH-YEAR/"`date +'%B %Y'`"/ \
+ -e s/REPLACE-WITH-DAY-MONTH-YEAR/"`date +'%e %B %Y'`"/ \
+ -e s/REPLACE-WITH-DATE/"`date`"/ \
+ <$f >$temp
+ if cmp -s $f $temp; then
+ echo "$f: No REPLACE-WITH-<date>."
+ exit 1
+ fi
+ rm -f $f
+ mv $temp $f
+done
+
+rm -f $temp
diff --git a/Master/texmf-dist/source/eplain/base/add-version b/Master/texmf-dist/source/eplain/base/add-version
new file mode 100644
index 00000000000..1934c8957f6
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/add-version
@@ -0,0 +1,24 @@
+#!/bin/sh
+# This file is public domain.
+
+if test $# -lt 2; then
+ echo "Usage: $0 <version> [<file> <file> ...]"
+ exit 1
+fi
+
+temp=${TMPDIR-/tmp}/version$$
+
+version=$1
+shift
+
+for f in "$@"; do
+ sed "s/REPLACE-WITH-VERSION/$version/" <$f >$temp || exit 1
+ if cmp -s $f $temp; then
+ echo "$f: No REPLACE-WITH-VERSION."
+ exit 1
+ fi
+ rm -f $f
+ mv $temp $f
+done
+
+rm -f $temp
diff --git a/Master/texmf-dist/source/eplain/base/etex.tex b/Master/texmf-dist/source/eplain/base/etex.tex
new file mode 100644
index 00000000000..46fe32ee733
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/etex.tex
@@ -0,0 +1,5 @@
+% This file just makes a .fmt file, assuming plain is loaded.
+%
+\input eplain
+
+\dump
diff --git a/Master/texmf-dist/source/eplain/base/fix-checksum b/Master/texmf-dist/source/eplain/base/fix-checksum
new file mode 100644
index 00000000000..c2f830f10f3
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/fix-checksum
@@ -0,0 +1,20 @@
+#!/bin/sh
+# This file is public domain.
+
+# Fix a checksum line in the files given as arguments.
+
+tmpfile=/tmp/checksum$$
+
+for f in $*
+do
+ checksum=""
+ newchecksum=`wc < $f | sed "s/^ *//"`
+ while test "$checksum" != "$newchecksum"
+ do
+ sed -e "1,50s/checksum = .*,/checksum = \"$newchecksum\",/" $f > $tmpfile
+ checksum="$newchecksum"
+ newchecksum=`wc < $tmpfile | sed "s/^ *//"`
+ done
+ mv -f $tmpfile $f
+done
+
diff --git a/Master/texmf-dist/source/eplain/base/merge b/Master/texmf-dist/source/eplain/base/merge
new file mode 100644
index 00000000000..b300b936bca
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/merge
@@ -0,0 +1,84 @@
+#!/bin/sh
+# This file is public domain.
+
+# Merge the constituent files with xeplain.tex to produce eplain.tex.
+
+# Usually we are called from the Makefile, and the `version' variable is set.
+if test -z "$version"; then
+ echo "No version number, using xx!"
+ version=xx
+fi
+
+btxtmp=/tmp/mergebtx$$
+common1tmp=/tmp/mergec1$$
+common2tmp=/tmp/mergec2$$
+common3tmp=/tmp/mergec3$$
+eplaintmp=/tmp/mergepl$$
+arrow1tmp=/tmp/mergea1$$
+arrow2tmp=/tmp/mergea2$$
+pathtmp=/tmp/mergepa$$
+ifpdftmp=/tmp/mergeif$$
+
+rm -f eplain.tex
+
+# Use this regexp to strip comments with egrep.
+commentre='^ *%([^%]|$)'
+
+# Extract the relevant parts of btxmac.tex (without comments).
+egrep -v "$commentre" btxmac.tex \
+ | sed -n \
+ -e "1,/^%% \[\[\[start .*\]\]\]/w $common1tmp" \
+ -e "/^%% \[\[\[start .*\]\]\]/,/^%% \[\[\[end .*\]\]\]/w $btxtmp" \
+ -e "/^%% \[\[\[end .*\]\]\]/,\$w $common2tmp"
+
+# Get texnames.sty and path.sty. Remove the announcement, as well as
+# the comments.
+egrep -v "$commentre|immediate" texnames.sty > $common3tmp
+egrep -v "$commentre|immediate" path.sty > $pathtmp
+
+# Get arrow.tex.
+egrep -v "$commentre" arrow.tex \
+ | sed -n \
+ -e '1,/catcode.*\&.*4/w '"$arrow1tmp" \
+ -e '/catcode.*\&.*4/,$w '"$arrow2tmp"
+
+# Get ifpdf.sty
+egrep -v "$commentre"'|^ {0,6}\\immediate' ifpdf.sty > $ifpdftmp
+
+# Merge the above into xeplain, calling the result eplain. Also change the
+# `filename' in the comment.%%
+egrep -v "$commentre" xeplain.tex \
+ | sed -e 's/"xeplain.tex"/"eplain.tex"/' \
+ -e "/^%% \[\[\[here is the first.*\]\]\]/r $common1tmp" \
+ -e "/^ %% \[\[\[here are the BibTeX.*\]\]\]/r $btxtmp" \
+ -e "/^%% \[\[\[here is the second.*\]\]\]/r $common2tmp" \
+ -e "/^%% \[\[\[include texnames.*\]\]\]/r $common3tmp" \
+ -e "/^%% \[\[\[include path.*\]\]\]/r $pathtmp" \
+ -e "/^ %% \[\[\[include arrow1\]\]\]/r $arrow1tmp" \
+ -e "/^ %% \[\[\[include arrow2\]\]\]/r $arrow2tmp" \
+ -e "/^%% \[\[\[include ifpdf.*\]\]\]/r $ifpdftmp" \
+ > $eplaintmp
+
+# Remove our [[[...]]] markers and \endinput's.
+egrep -v '\[\[\[|^ *$|\\endinput' $eplaintmp > eplain.tex
+
+# Fix header fields.
+./add-date eplain.tex
+./add-version $version eplain.tex
+./fix-checksum eplain.tex
+
+# Old checksum computation:
+#checksum=`wc < $eplaintmp | sed -n "s/^ *//"`
+# Replace the checksum in the old file. We really should loop here,
+# since one iteration may not be enough. Only replace the first
+# checksum, since the second is for btxmac.
+#sed -e "1,50s/checksum = .*,/checksum = \"$checksum\",/" $eplaintmp \
+# > eplain.tex
+
+chmod a-w eplain.tex
+#ls -lt btxmac.tex path.sty texnames.sty xeplain.tex eplain.tex arrow.tex
+#wc eplain.tex
+#grep 'checksum.*=' eplain.tex
+
+rm -f $btxtmp $eplaintmp $common1tmp $common2tmp $common3tmp
+rm -f $arrow1tmp $arrow2tmp $pathtmp $ifpdftmp
diff --git a/Master/texmf-dist/source/eplain/base/packages.zip b/Master/texmf-dist/source/eplain/base/packages.zip
new file mode 100644
index 00000000000..6bbf89e4203
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/packages.zip
Binary files differ
diff --git a/Master/texmf-dist/source/eplain/base/test/allref.tex b/Master/texmf-dist/source/eplain/base/test/allref.tex
new file mode 100644
index 00000000000..8e4f51270b0
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/allref.tex
@@ -0,0 +1,15 @@
+% This file is public domain.
+%
+% Test all kinds of references.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+\let\primitiveend = \end
+\let\end = \relax
+
+\input cite
+\input xref
+\primitiveend
+
+\input eqref
+
diff --git a/Master/texmf-dist/source/eplain/base/test/boxes.tex b/Master/texmf-dist/source/eplain/base/test/boxes.tex
new file mode 100644
index 00000000000..b58e1ffef34
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/boxes.tex
@@ -0,0 +1,11 @@
+% This file is public domain.
+%
+\input eplain
+
+A box: \blackbox
+
+A large rectangle:
+\ht0=2pc \dp0=2pc \wd0=3pc
+\makeblankbox{.8pt}{.8pt}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/boxit.tex b/Master/texmf-dist/source/eplain/base/test/boxit.tex
new file mode 100644
index 00000000000..20da2e7c27d
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/boxit.tex
@@ -0,0 +1,24 @@
+% This file is public domain.
+%
+% Test \boxit.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+\boxit{\hbox{the basics, boxed}}
+
+\boxitspace = 24pt
+\boxit{\hbox{should be spacier}}
+
+\boxitspace = 5pt
+
+\boxit{\vbox{Something that is more than one line long, no matter how verbose
+I have to do make it so, so that we can see if the line breaks are
+plausible.}}
+
+
+\boxit{\vbox{\hsize = 4in Another one that is more than one line long, just
+to see if resetting hsize inside the box will work.}}
+
+\boxit{\boxit{\hbox{double box}}}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/catcode.tex b/Master/texmf-dist/source/eplain/base/test/catcode.tex
new file mode 100644
index 00000000000..af71f740ea9
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/catcode.tex
@@ -0,0 +1,8 @@
+% This file is public domain.
+%
+The catcode BEFORE loading eplain: \the\catcode`@ \showthe\catcode`@
+\input eplain
+
+The catcode AFTER loading eplain: \the\catcode`@ \showthe\catcode`@
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/center.tex b/Master/texmf-dist/source/eplain/base/test/center.tex
new file mode 100644
index 00000000000..628155050a6
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/center.tex
@@ -0,0 +1,12 @@
+% This file is public domain.
+%
+\input eplain
+
+\def\title{\begingroup \def\endcentermacro{\endtitle}\bf\center}
+\def\endtitle{\endcenter\endgroup}
+
+\loggingall
+\title hi
+\endtitle
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/cite.bib b/Master/texmf-dist/source/eplain/base/test/cite.bib
new file mode 100644
index 00000000000..7c082677b4f
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/cite.bib
@@ -0,0 +1,25 @@
+% This file is public domain.
+
+@book{chicago,
+ title = "Chicago",
+}
+
+@book{texbook,
+ title = "texbook"
+}
+
+@book{prime-number-theorem,
+ title = "prime number theorem",
+}
+
+@book{1234567890)(@!`['";:]|<>./?-=+_$^&,
+ title = "weird label"
+}
+
+@book{others,
+ author = "Jill and Susan and others"
+}
+
+@book{accented,
+ author = "{\'E}ric {\'E}ttelbaum"
+}
diff --git a/Master/texmf-dist/source/eplain/base/test/cite.tex b/Master/texmf-dist/source/eplain/base/test/cite.tex
new file mode 100644
index 00000000000..12b818995bb
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/cite.tex
@@ -0,0 +1,35 @@
+% This file is public domain.
+%
+% Test file for citations (plain bibliography style).
+%
+\ifx\eplain\undefined \input eplain \fi
+\loggingall
+
+Let's cite chicago: \cite{chicago}.
+
+Now let's have multiple citations: \cite{chicago,texbook}.
+
+Now let's have a non-alphabetic label: \cite{prime-number-theorem}.
+
+Here is an undefined citation: \cite{undefined}.
+
+Here is a citation with an optional note: \cite[note]{texbook}.
+
+Here is a citation with a weird label:
+\cite{1234567890)(@!`['";:]|<>./?-=+_$^&}.
+
+Now let's cite an `and others': \cite{others}.
+
+And an accented one: \cite{accented}.
+
+Let's get up to ten refs:
+\cite{article-minimal,article-full,article-crossref,whole-journal,%
+inbook-minimal,inbook-full}
+
+\bigskip
+\leftline{\bf References.}
+
+\bibliography{cite,xampl}
+\bibliographystyle{plain}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/citeall.tex b/Master/texmf-dist/source/eplain/base/test/citeall.tex
new file mode 100644
index 00000000000..24929568abe
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citeall.tex
@@ -0,0 +1,12 @@
+% This file is public domain.
+%
+\input btxmac
+
+Cite all the entries in the bib database files {\tt knuth.bib} and {\tt
+ep.bib}:
+
+\nocite{*}
+\bibliography{knuth,ep}
+\bibliographystyle{plain}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/citealph.tex b/Master/texmf-dist/source/eplain/base/test/citealph.tex
new file mode 100644
index 00000000000..5b83d26d2b6
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citealph.tex
@@ -0,0 +1,26 @@
+% This file is public domain.
+%
+% Test file for citations (alphabetic bibliography style).
+%
+\input eplain
+
+Let's cite chicago and van-leunen: \cite{chicago,van-leunen}.
+
+Now let's cite an `and others': \cite{others}.
+
+And an accented one: \cite{accented}.
+
+Here is a citation with an optional note: \cite[note]{texbook}.
+
+Here is a citation with a weird label:
+\cite{1234567890)(@!`['";:]|<>./?-=+}.
+
+Here is an undefined citation: \cite{undefined}.
+
+\bigskip
+\leftline{\bf References.}
+
+\bibliography{cite}
+\bibliographystyle{alpha}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/citeapa.tex b/Master/texmf-dist/source/eplain/base/test/citeapa.tex
new file mode 100644
index 00000000000..3d59f70fa09
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citeapa.tex
@@ -0,0 +1,26 @@
+% This file is public domain.
+%
+% Test file for citations (alphabetic bibliography style).
+%
+\input btxmac
+
+Let's cite chicago and van-leunen: \cite{chicago,van-leunen}.
+
+Now let's cite an `and others': \cite{others}.
+
+And an accented one: \cite{accented}.
+
+Here is a citation with an optional note: \cite[note]{texbook}.
+
+Here is a citation with a weird label:
+\cite{1234567890)(@!`['";:]|<>./?-=+}.
+
+Here is an undefined citation: \cite{undefined}.
+
+\bigskip
+\leftline{\bf References.}
+
+\bibliography{cite}
+\bibliographystyle{apalike}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/citebegin.tex b/Master/texmf-dist/source/eplain/base/test/citebegin.tex
new file mode 100644
index 00000000000..75b5c8d6de6
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citebegin.tex
@@ -0,0 +1,20 @@
+% This file is public domain.
+%
+\input eplain
+
+\let\primitiveend = \end
+\def\bye{\vfill\eject\primitiveend}
+
+\def\begin#1#2{%
+ \message{widest label is #2}
+}
+\def\end#1{}
+
+Two citations to Knuthian works: \cite{surreal,concrete-math}.
+
+\beginsection{References.}\par % Title for the bibliography.
+
+\bibliography{knuth} % Use knuth.bib to resolve the labels.
+\bibliographystyle{plain} % Number the references.
+
+\bye % End of the document.
diff --git a/Master/texmf-dist/source/eplain/base/test/citecust.tex b/Master/texmf-dist/source/eplain/base/test/citecust.tex
new file mode 100644
index 00000000000..2b3266407ba
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citecust.tex
@@ -0,0 +1,38 @@
+% This file is public domain.
+%
+% File to test the various customizations btxmac.tex allows.
+%
+\input eplain
+
+% Have citations come out as superscripts, as in footnotes.
+%
+% Unfortunately, plain TeX doesn't define the \scriptfont for the \tt
+% family. Since we use \tt to print unresolved bib-references, we define
+% it ourselves, so we can use superscripts.
+\font\eighttt = cmtt8
+\scriptfont\ttfam = \eighttt
+\def\printcitestart{$^\bgroup}
+\def\printbetweencitations{,\space}
+\def\printcitefinish{\egroup$}
+\def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
+
+% Do angle brackets instead of brackets. (We don't redefine \biblabelprint.)
+%
+\def\biblabelcontents#1{\bblrm $\langle$#1$\rangle$}
+
+% Use sans serif instead of roman, and slanted instead of italic.
+%
+\font\bblrm = cmss10
+\font\bblem = cmsl10
+
+% Put a rule before the bibliography.
+%
+\def\bblhook{\medskip\hrule\smallskip}
+
+Two citations to Knuthian works: \cite{surreal,concrete-math}.
+
+This one with a note: \cite[another one]{surreal}.
+
+\bibliography{knuth} % Use knuth.bib to resolve the labels.
+\bibliographystyle{plain} % Number the references.
+\end % End of the document.
diff --git a/Master/texmf-dist/source/eplain/base/test/citenote.tex b/Master/texmf-dist/source/eplain/base/test/citenote.tex
new file mode 100644
index 00000000000..429b5cd456f
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citenote.tex
@@ -0,0 +1,13 @@
+% This file is public domain.
+%
+% Test file for citations (plain bibliography style).
+%
+\ifx\eplain\undefined \input eplain \fi
+\loggingall
+
+Here is a citation with an optional note, first: \cite[note]{texbook}.
+
+\bibliography{cite}
+\bibliographystyle{plain}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/citex.tex b/Master/texmf-dist/source/eplain/base/test/citex.tex
new file mode 100644
index 00000000000..69e880490a7
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/citex.tex
@@ -0,0 +1,8 @@
+% This file is public domain.
+%
+\input eplain
+Two citations to Knuthian works: \cite{surreal,concrete-math}.
+\beginsection{References.}\par % Title for the bibliography.
+\bibliography{knuth} % Use knuth.bib to resolve the labels.
+\bibliographystyle{plain} % Number the references.
+\end % End of the document.
diff --git a/Master/texmf-dist/source/eplain/base/test/colfootn.tex b/Master/texmf-dist/source/eplain/base/test/colfootn.tex
new file mode 100644
index 00000000000..942f71f50b3
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/colfootn.tex
@@ -0,0 +1,18 @@
+% This file is public domain.
+%
+\input eplain
+
+\loggingall
+
+\vsize = 6\baselineskip
+\doublecolumns
+
+\leftline{1\footnote\dag{A footnote that is longer than the column
+width. Much much longer longer.}}
+\count255 = 2
+\loop
+ \leftline{\number\count255}
+ \advance\count255 by 1
+\ifnum\count255 < 14 \repeat
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/colrule.tex b/Master/texmf-dist/source/eplain/base/test/colrule.tex
new file mode 100644
index 00000000000..5213685e9a3
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/colrule.tex
@@ -0,0 +1,33 @@
+% This file is public domain.
+%
+\input eplain
+
+% ashley suggested the length of the footnote rule changes where the
+% second column starts.
+\vsize = 3in
+\footnoterulewidth = 6in
+\doublecolumns
+This is a footnote\footnote1{No, this is the footnote} in double column mode.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+And now we have lots of text to fill up the column.
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/column.tex b/Master/texmf-dist/source/eplain/base/test/column.tex
new file mode 100644
index 00000000000..be1d521fe08
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/column.tex
@@ -0,0 +1,228 @@
+% This file is public domain.
+%
+% Test double columns with headlines, single-column material, and a
+% \topinsert.
+\ifx\undefined\eplain \input eplain \fi
+%\catcode`@=11
+%\input gcol
+%\catcode`@=12
+
+\gutter = 1pc
+\hyphenation{pour-ed}
+
+\headline = {This is the headline \hfil}
+
+{\center
+ A test file for eplain
+ Karl\footnote\dag{Credit in a footnote. Longer than one column. %
+ Longer longer longer.}
+}
+
+\topinsert
+This should appear at the top of the page, since it's a topinsert. It's
+also longer than one column.
+\endinsert
+
+Here is a six-and-a-half-inch long rule.
+
+\hrule width 6.5in
+
+\doublecolumns
+
+Here the main document starts. It should be in double columns until
+further notice. It's all one paragraph. I am going to use Wuthering
+Heights, as usual. With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, pour\-ed forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, pour\-ed forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, re forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, re forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+\singlecolumn
+Now we should be typesetting in a single column, i.e., normally. The
+fingers relaxed; I snatched mine through the hole, hurriedly piled the
+books up in a pyramid against it, and stopped my ears to exclude the
+lamentable prayer. I seemed to keep them closed above a quarter of an
+hour; yet the instant I listened again, there was the doleful cry
+moaning on! ``Begone!'' I shouted; ``I'll never let you in---not if you
+beg for twenty years.'' ``It is twenty years,'' mourned the
+voice---``twenty years. I've been a waif for twenty years!'' Thereat
+began a feeble scratching outside, and the pile of books moved as if
+thrust forward. I tried to jump up, but could not stir a limb, and so
+yelled aloud in a frenzy of fright. To my confusion, I discovered the
+yell was not ideal. Hasty footsteps approached my chamber door; somebody
+pushed it open with a vigorous hand, and a light glimmered through the
+squares at the top of the bed. I sat shuddering yet, and wiping the
+perspiration from my forehead. The intruder appeared to hesitate, and
+muttered to himself. At last he said in a half-whisper, plainly not
+expecting an answer, ``Is any one here?'' I considered it best to
+confess my presence, for I knew Heathcliff's accents, and feared he
+might search further if I kept quiet. With this intention I turned and
+opened the panels. I shall not soon forget the effect my action
+produced. Heathcliff stood near the entrance, in his shirt and
+trousers, with a candle dripping over his fingers, and his face as white
+as the wall behind him. The first creak of the oak startled him like an
+electric shock. The light leaped from his hold to a distance of some
+feet, and his agitation was so extreme that he could hardly pick it up.
+``It is only your guest, sir,'' I called out, desirous to spare him the
+humiliation of exposing his cowardice further. ``I had the misfortune
+to scream in my sleep, owing to a frightful nightmare. I'm sorry I
+disturbed you.''
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/column2.tex b/Master/texmf-dist/source/eplain/base/test/column2.tex
new file mode 100644
index 00000000000..90a736e4333
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/column2.tex
@@ -0,0 +1,51 @@
+% This file is public domain.
+%
+\input eplain
+
+\headline = {headline\hfil}
+\topinsert
+topinsert
+\endinsert
+
+\parskip = 0pt
+
+\centerline{Xiaogen Yang and Max L. Deinzer}
+\smallskip
+\centerline{Department of Agricultural Chemistry}
+\centerline{Oregon State University, Corvallis, Oregon 97331}
+
+\doublecolumns
+Humulene monoepoxides exist in hop essential oil and were suggested
+as one of the important contributors of hop flavor to fermented
+malt beverages [1-3]. However, it is more possible that the ``noble
+hop'' aroma compounds are produced from certain hop components
+during the brewing process, because the ``noble hop'' aroma is
+distinct from ``dry hop'' aroma. The aging of hops, during which the
+amount of oxidation products of humulene increases [4], is also
+necessary to develop the ``noble hop'' aroma. One approach to find
+out the flavor compounds and their origin is to examine the brewing
+products of the oxygenated sesquiterpenes. The reactions of the
+brewing process can be simplified to hydrolyzation and fermentation
+as the first step. We have been investigated the hydrolysis of
+humulene monoepoxides.
+\singlecolumn
+To simulate the hydrolyzation effect in the ``late hop'' brewing
+process, humulene monoepoxides were boiled in water at
+pH\thinspace 4 for 10 minutes. After boiling, a large amount of
+the epoxides remain unreacted. When the solution was kept at
+ambient temperature for several weeks, humulene epoxides were
+then almost completely hydrolyzed. To accelerate the hydrolysis
+process, humulene epoxides were suspended in a aqueous solution
+buffered at pH\thinspace 4 and boiled for three hours under
+reflux. All three humulene monoepoxides produced a complex
+mixture after the reaction (Figure 1). The hydrolysis products
+can be easily separated into two groups by extraction with
+pentane and dichloro\-me\-thane subsequently. The pentane
+extracts are less polar, more volatile and smell stron\-ger than
+the dichloro\-methane extracts. Sensory evaluation of the
+hydrolysis products of humulene epoxide II and III by sniffing
+gas chromatography effluent indicates that some of the compounds
+have the flavor notes which are close to the ``noble hop'' aroma
+character described as ``spicy, citrus, floral'' (Table 1).
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/column3.tex b/Master/texmf-dist/source/eplain/base/test/column3.tex
new file mode 100644
index 00000000000..01788bd3064
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/column3.tex
@@ -0,0 +1,23 @@
+% This file is public domain.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+Here is a single-column line of text.
+%\vskip 6in
+%And another one.
+
+\doublecolumns
+\newcount \xxx
+\xxx=0
+\par
+\baselineskip = 2.5\baselineskip
+\loop
+ \hbox{Line \the\xxx.}
+ \ifnum \xxx < 3
+ \advance \xxx by 1
+\repeat
+
+\singlecolumn
+Another single-column line of text.
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/commdiags.tex b/Master/texmf-dist/source/eplain/base/test/commdiags.tex
new file mode 100644
index 00000000000..ae5ca6221d4
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/commdiags.tex
@@ -0,0 +1,111 @@
+% This file is public domain.
+%
+% Examples of commutative diagrams from Brockett, {\it Finite
+% Dimensional Linear Systems}.
+
+\input arrow
+
+\def\Real{\mathord{R}}
+\def\Rn{\Real^n}
+\def\A{{\bf A}}
+\def\B{{\bf B}}
+\def\C{{\bf C}}
+\def\F{{\bf F}}
+\def\G{{\bf G}}
+\def\H{{\bf H}}
+\def\I{{\bf I}}
+\def\K{{\bf K}}
+\def\L{{\bf L}}
+\def\M{{\bf M}}
+\def\N{{\bf N}}
+\def\P{{\bf P}}
+\def\Q{{\bf Q}}
+\def\R{{\bf R}}
+\def\S{{\bf S}}
+\def\W{{\bf W}}
+\def\bp{{\bf\Phi}}
+
+
+Page 29, Fig.~3
+$$\commdiag{\Rn&\mapright^{\bp(t_1,t_0)}&\Rn\cr
+&\arrow(3,-2)\lft{\bp(t,t_0)}&\mapdown\rt{\bp(t,t_1)}\cr &&\Rn\cr}$$
+
+Page 48, Fig.~1:
+$$\commdiag{\Rn&\mapright^{\bp(t,t_0)}&\Rn\cr
+\mapdown\lft{\P(t_0)}&&\mapup\rt{\P^{-1}(t)}\cr
+\Rn&\mapright^{e^{\R(t-t_0)}}&\Rn\cr}$$
+
+Page 69, Fig.~1:
+$$\commdiag{\Rn&\mapright^{\M_1}&\Real^m\cr
+\mapdown\lft\Q&&\mapup\rt\P\cr
+\Rn&\mapright^{\M_2}&\Real^m\cr}$$
+
+Page 69, Fig.~2:
+$$\commdiag{\Rn&\mapright^\A&\Rn\cr
+\mapdown\lft\P&&\mapup\rt{\P'}\cr
+\Rn&\mapright^\S&\Rn\cr}$$
+
+Page 71, Fig.~3:
+$$\commdiag{\Rn&\mapright^\A&\Rn\cr
+\mapdown\lft\P&&\mapup\rt{\P^{-1}}\cr
+\Rn&\mapright^\B&\Rn\cr}$$
+
+Page 92, Fig.~1:
+$$\harrowlength=40pt \varrowlength=24.7pt \sarrowlength=\harrowlength
+\commdiag{C^m&\mapright^{\B(\sigma)}&\Rn&\mapright^{\bp_\A(t_0,\sigma)}&
+\Rn&\mapright^{\int_{t_0}^t-d\sigma}&\Rn&\mapright^{\bp_\A(t,t_0)}&
+\Rn&\mapright^{\C(t)}&C^q\cr
+&\arrow(3,-2)\lft{\P(\sigma)\B(\sigma)}&\mapdown\rt{\P(\sigma)}&&
+\mapdown\rt{\P^{-1}(t_0)}&&\mapdown\rt{\P(t_0)}&&\mapdown\lft{\P^{-1}(t)}&
+\arrow(3,2)\rt{\C(t)\P^{-1}(t)}\cr
+&&\Rn&\mapright_{\bp_{\A_1}(t_0,\sigma)}&\Rn&\mapright_{\int_{t_0}^t-d\sigma}&
+\Rn&\mapright_{\bp_{\A_1}(t,t_0)}&\Rn}$$
+
+Page 96, Fig.~2:
+$$\harrowlength=32pt \varrowlength=\harrowlength \sarrowlength=\harrowlength
+\def\olap#1{\harrowlength=118pt\hbox to0pt{\hss$#1$\hss}}
+\commdiag{C^m&&&&&&&&&&C^q\cr \mapup\lft{\G(\sigma)}
+&\hmorphposn=2pt\arrow(1,-1)\rt{\int_{t_0}^{t_1}-\G(\sigma)\,d\sigma}
+&&&&&&&&\arrow(1,1)\lft{\H(\ )}&\mapdown\rt
+{\int_{t_0}^{t_1}-\H(\sigma)\,d\sigma}\cr
+\Rn&\mapleft_{\W(t_0,t_1)}&\Rn&&&\olap{\mapright^{\I}}&&&
+\Rn&\mapleft_{\M(t_0,t_1)}&\Rn\cr
+\mapdown\lft{\P'}&&\mapup\lft\P&\arrow(-1,1)\rt\P&&&&\arrow(-1,-1)\lft\Q&
+\mapdown\rt\Q&&\mapup\rt{\Q'}\cr
+\Rn&\mapright^{\S_1}&\Rn&\mapright^{\S_1}&\Rn&\harrowlength=20pt
+\mapright^{\Q\P}&\Rn&\mapright^{\S_2}&\Rn&\mapright^{\S_2}&\Rn\cr
+&&\mapdown\lft{\N_1}&&&&&&\mapup\rt{\N_2}\cr
+&&\Rn&&&\olap{\mapright^{\I}}&&&\Rn\cr}$$
+
+Page 114, Fig.~1:
+$$\sarrowlength=.42\harrowlength
+\commdiag{&\Real^m\cr &\arrow(-1,-1)\lft\B\quad \arrow(1,-1)\rt\G\cr
+\Rn&\mapright^\P&\Rn\cr \mapdown\lft{e^{\A t}}&&\mapdown\rt{e^{\F t}}\cr
+\Rn&\mapright^\P&\Rn\cr &\arrow(1,-1)\lft\C\quad \arrow(-1,-1)\rt\H\cr
+&\Real^q\cr}$$
+
+Page 127, Fig.~2:
+$$\commdiag{Y&\mapright^{L^*}&X\cr &\adjarrow(3,-2)\lft{LL^*}\rt{(LL^*)^{-1}}&
+\mapdown\rt{L}\cr &&Y\cr}$$
+
+Page 135, Fig.~2:
+$$\harrowlength=80pt \varrowlength=40pt \sarrowlength=50pt
+\def\olap#1{\harrowlength=214pt\hbox to0pt{\hss$#1$\hss}}
+\def\vlap#1{\varrowlength=93pt\setbox0=\hbox{$#1$}\ht0=0pt\dp0=0pt\box0}
+\commdiag{\Rn&&&\olap{\mapright^{\dot\K+\A'\K+\K\A+\L}}&&&\Rn\cr
+&\arrow(3,-1)\rt\K&&&&\arrow(-3,-1)\lft\K\cr \noalign{\vskip-3pt}
+&&\Rn&\mapright^{\B\B'}&\Rn\cr
+\vlap{\mapdown\lft\P}&&\mapup\lft{\P'}&&\mapdown\rt\P&&\vlap{\mapup\rt{\P'}}\cr
+&&\Rn&\mapleft^{\P\B\B'\P'}&\Rn\cr \noalign{\vskip-3pt}
+&\arrow(3,1)\lft{\K_1}&&&&\arrow(-3,1)\rt{\K_1}\cr
+\Rn&&&\olap{\mapright_{\dot\K_1+(\P\A\P^{-1}+\dot\P\P^{-1})\K_1
++\K_1(\P\A\P^{-1}+\dot\P\P^{-1})+\P'^{-1}\L\P^{-1}}}&&&\Rn\cr
+\noalign{\medskip}}$$
+
+Page 139, Fig.~2:
+$$\harrowlength=80pt \varrowlength=.618\harrowlength
+\sarrowlength=\harrowlength
+\commdiag{\Rn&\mapright^{\B'(\sigma)\bp'(t_0,\sigma)}&C^m\cr
+&\adjarrow(3,-2)\lft{\W(t_0,t_1)}\rt{\W^{-1}(t_0,t_1)}&
+\mapdown\rt{\int_{t_0}^{t_1}\bp(t_0,\sigma)\B(\sigma)\,d\sigma}\cr
+&&\Rn\cr}$$
diff --git a/Master/texmf-dist/source/eplain/base/test/contents.tex b/Master/texmf-dist/source/eplain/base/test/contents.tex
new file mode 100644
index 00000000000..6c3159da810
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/contents.tex
@@ -0,0 +1,30 @@
+% This file is public domain.
+%
+\input eplain
+
+\newcount\subsectionno
+
+\def\tocsubsectionentry#1#2#3{\leftline{Subsection #2.~#1\dotfill#3}}
+\let\tocentry = \tocsubsectionentry
+
+\readtocfile
+
+\subsectionno = 13
+
+\writetocentry{chapter}{beginning}
+\writetocentry{section}{subbeginning $\sin$}
+
+\advance\subsectionno by 1
+\writenumberedtocentry{subsection}{Subsection $\cos$ \#14}
+ {\the\subsectionno}
+
+\advance\subsectionno by 1
+\writenumberedtocentry{subsection}{Subsection \#15}{\the\subsectionno}
+
+% This doesn't expand \the\subsectionno -- only the first token gets
+% expanded. Its output line starts with \tocentry.
+\writenumberedtocentry{}{A toc entry}{1{\the\subsectionno}}
+
+%\loggingall
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/displine.tex b/Master/texmf-dist/source/eplain/base/test/displine.tex
new file mode 100644
index 00000000000..97730ede242
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/displine.tex
@@ -0,0 +1,36 @@
+% This file is public domain.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+\loggingall
+
+\leftdisplays
+\parindent=31pt
+
+A displaylines with an eqdef: text mre more more more more more more
+more more more more more more more more more more text.
+$$\displaylines{x=1 \eqdef{eqdef-displ}\cr}$$
+
+{\leftskip = 14pt
+\noindent
+And a indented normal equation:
+$$y=2\eqdef{foo}
+$$
+An indented displaylines with an eqdef:
+$$\displaylines{x=1 \eqdef{eqdef-displ}\cr}
+$$
+
+Now the same two with hangindent nonzero.
+\hangindent=17pt
+And a indented normal equation:
+$$y=2\eqdef{foo}
+$$
+An indented displaylines with an eqdef:
+$$\displaylines{x=1 \eqdef{eqdef-displ}\cr}
+$$
+\par}
+
+Well?
+
+\bye
+
diff --git a/Master/texmf-dist/source/eplain/base/test/double.tex b/Master/texmf-dist/source/eplain/base/test/double.tex
new file mode 100644
index 00000000000..aca6d6bb3e4
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/double.tex
@@ -0,0 +1,24 @@
+% This file is public domain.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+%\catcode`@ = 11
+%\input gcol
+%\catcode`@ = 12
+
+Here is a single-column line of text.
+%\vskip 6in
+%And another one.
+
+\doublecolumns
+\newcount \xxx
+\xxx=0
+\par
+\baselineskip = 2.5\baselineskip
+\loop
+ \hbox{Line \the\xxx.}
+ \ifnum \xxx < 3
+ \advance \xxx by 1
+\repeat
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/double2.tex b/Master/texmf-dist/source/eplain/base/test/double2.tex
new file mode 100644
index 00000000000..d1b794cad18
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/double2.tex
@@ -0,0 +1,163 @@
+% This file is public domain.
+%
+\input eplain
+
+\tolerance=2000
+
+\def\SP{\ }
+\def\throwaway#1{}
+\def\checkspace{\ifx \next\
+\let\result=\throwaway
+ \else \let\result=\ignorespaces \fi \result }
+\font\bigfont=cmr10 scaled \magstep5
+\def\bfl#1{\setbox0=\hbox {{\bigfont #1}\thinspace}
+ \noindent \hangindent \wd0 \hangafter -2
+ \llap {\vbox to \ht0{\kern\baselineskip \box0 \kern-\baselineskip}}%
+ \futurelet \next \checkspace}
+
+\parskip=10pt
+\hbadness = 1500
+\parindent=0pt
+
+\font\cmbig=cmr17
+\font\cmrbv=cmb10 scaled \magstep5
+\font\iti=cmbxti10 scaled \magstep2
+\font\erm=cmr8
+
+\doublecolumns
+
+%**************************************************************************
+% Generate a dummy first page for the twocol macro
+% The first page is to have the left column blank.
+
+\phantom{dummy first line} \vskip5truein
+ {\font\iti=cmti10 scaled \magstep1
+ \iti
+ \rightline{An abstract}
+ \rightline{goes}
+ \rightline{in here.}
+ }
+
+%karl \vfill
+%karl \eject
+
+%**************************************************************************
+
+\phantom{dummy first line} \vskip0.75truein
+
+\rightline{\cmrbv Title}
+\bigskip\bigskip
+\rightline{\iti Author}
+
+\bigskip\bigskip\bigskip
+%\rightline{\hrulefill}% width6.5truein}
+
+\nointerlineskip
+\moveleft 3.31truein
+\vbox{\hrule width6.5truein}
+\nointerlineskip
+
+\vskip0.75truein
+
+%**************************************************************************
+
+\bfl
+Xxxxxxx xxxxxx xxxxxx xxxxxxx xxxx xxx xxx\numberedfootnote{\erm Xxxxx xxxxx
+xxx xxxx Xxxxx xxxxx, Xxxxx xxxx Xxxxxx xxxxxx, xxxxxx xxxxx xx Xxxxxx Xxxxxx,
+Xxx., X.~X. Xxx~xxx, Xxxx Xxxxx, XX~xxxxx.} Xxxx Xxxxxxxxxx xxxxxxxx xxxx, Xxx
+xxxxx xxxxxx xx xxxxxxxx xx xxxxx xxxxxxx xxxxxxx xxxx xx xxxx xx xxxxxxx xx
+xxx xxxxx xx x xxx xxxxxxx xx xxxxx. Xx x/xxx xx x xxx xxxx xxxxxxx xxxxx
+xxxxxxx, Xxxxxx xxxxxxxxx xxxxx xxxxx x/xxx,xxx,xxx xx x xxxxxx. Xxxx xxxxx
+ xxxx xx xxxx xxxx Xxxxxx'x xxxxxxxx xx xxx xxxxxxx xxxxxxxx xxxxxx xx xxxxx
+ xx xxxx xxxxxxx xxx xxxxxx xxxx xx xxxxxxx xx xxxxxx x.xx xx x xxx, xxx x.xx
+xxx xxxxxx xxxxx xx~xxxxxxx. Xxxx xx x xxxxx xxxxxx xxx xxxxxxxxx xxxxxxxx xxx
+xxxxxxxx xxxx xxxxxxxx xxxxxxxxx xxx xxxxxx xxxxxx xxxx, xxx xxx xxxxxxxx
+xxxxxxxxx xx xxx xxxx xx xxxxxxxxxx xx x xxxx xxxxx xxxxxxxxxx.
+
+Xxxxx xxx xxxxxx xxx xxxxxx xx xxx xxxxx xx xxx xxx xxxxxxxxx (xxx XX-xxx
+xxxxx xxxxxx xxxxxxxx xx xxx Xxx Xxxxxxxxxx Xxxxxxxxxx), xx xxx xxxxxxx xxxx
+xx xxxxx xx xxxxxxxxxxx xx xxxxxxx x xxxxx xxxxxxx xxx xxxx xx xxxxx xxxx
+xxxxxx xx xxxx x xxxxxxxxxxx xxxxxx xxxx xxx xxxxxxx.
+
+Xxxxx x xxxxx xx xxx xxxx xx xxxxxxxxxx xxx xxxxxxxx xx xxx xxxxxxxxxx xxx
+xxxxxx xxxxxxxx xxx xxxx xxxxxx xxx xxxxx xxxx. Xxxx xxx xxxx xxxx xxxx xx
+xxxxx xxx xxxxxx'x xxxx xxxx xxxxxxxx, xxxx {xxx xxxxxxx} xx xxx xxxxxxx
+xxxxxxxxx, xxxxxxxx, xx x, xxx xxxxxxxx. Xxxxx xxxx xxxxxxxxx xxx xxxx (xxxx
+xxx Xxxx) xxx xxxxx xx Xxxxx~x.
+
+Xx xxxxxxxxxxx xx Xxxxx~x xxxxxxx xxxx xxx xxxxxxxx xx xxxxxxx xx xxxx xxxxxxx
+xxxxxxxx xxx xxx xx xxxxxxxxxx xx xxxxx xx xxxxxxxx. Xx xxxx, xx xxxxxxx xx
+xxxxxx xxx xxxxx xx xx xxxxx xxx xxx xxxxxxxxx xxx xxxxxxxx xxxxx xx Xxxxxx'x
+xxxxx xx Xxxxxx' xxxxxx xxxxxxx. Xxxx xxx xxxxxxxx xxxxx xxx xx xx xxxx, xxx
+xxxxxxxxx. Xxxxx~x xxxxxxxx xxx xxxxxxxxx xx xxxxxxx xx xxx xxxxxx xxxxxx xx
+xxxx xxxxxx xxxxxxxx xx xxxxxxxxx xx xxxxxxxxx.
+
+
+\singlecolumn
+\centerline{Table 1---Xxxxxxxxx Xxxx Xxxxxxxx xx Xxxxxxxx}
+\smallbreak
+\line \bgroup \hss
+ \vbox to 11\baselineskip{}
+\hss \egroup
+\doublecolumns
+
+
+Xxxx xxxxxx x xxxxxx xxxxxxx Xxxxxx'x xxxxxx xxxxxx xx xxx xxxxxx xxxxx xxxxxx
+xxx xxxx xxxxx xx Xxxxx~x, xxxx xxxx xxxxxx xx xxxxx xxxxxxx. Xx, xxx xxxxxxx,
+xx xxxxxxxxxx xxx xxxxxxxx xxxx xxxxxx xxxxxx, xx xxxxx xxxxx xx xxxxxxxxxxx,
+xxxxxxxxxx, xxx xxxxxxxxx, xxxxxxx xx xxx xxxxxxxx xx xxxx xxxxxx xxxx xxxxx
+xxxxxxx, xx xxxxx xxxxx xx xxx xxxxxxxx, xxxxx xxxxx, xxx xxxxxxxxx. Xxxx xxx
+xxxx xx xxxxxxxxx.
+
+\medskip\bigskip
+\centerline{Table 2---Xxxxxxx xx Xxxxxx'x Xxxxxx Xxxxxxx}
+\nobreak
+\centerline{(Xxxxxxx Xxxxxxxx)}
+\smallbreak
+\line \bgroup \hss
+ \vbox to 9\baselineskip{}
+\hss \egroup
+
+Xxxxxxxx xxx xxxx xxxx xxxxx xxxxx xx Xxxxx~x xxx xxx xxxx, xxxx xxx xxx xxxx
+xx xxx xxxxxxxx xxxxxxxx xxxxxxxxx xxxxx. Xx xxx x xxxxx xxxxxxx xx xxx xxxx
+xx xxxxxxx, xx xxx xxxxxxx xx xx x xxxxxx xxxxxx xx xxxxx xxxxxxx xx xxxxxx xx
+xxxx xxxxx xxxxxx x ``xxxxx xxxx'' xxxxxxxx. Xxxxx x xxxxx xx xxxx xxxxx xx
+xxx xxxx xx xxxxxxx xxx xxxxxxxx. Xxxx xxx xxxx xxxxxxxx xx xxxxx xxx xxxxxx'x
+xxxxxxxx xxxxxx xx xxxxx xxxxx, xxxxxxx xxx, xxx xxxxxx xxxx xxxx xxx xxxxx
+xxxxx xxxxxxxx xxx xxxxxxxx. Xxx xxxxxxx, xx xxx xxxxx xxxxx xxxxxx xxxx xxxx
+xxxxxx, xx xxx xxxx xxxxxx xxxxxxxx xxx xxx xxxxx. Xxx xxxxxxx xxx xxxxx xx
+Table~3.
+
+
+\font\eri=cmti8
+
+Xx xxxxxx xx xxxxxxxxxx xxxx xxxxx xxxxxx xxxx xxxxxxxx xxxx xxx xxx xxxxxxx
+xxxxx xx xxx xxxx xxxxx xxx xx xxx xx xxx xxx xxxxxxxxx xx xxxxxxx xxxx xx xxx
+xxx xxxxx xxxxx xxxxxx. Xxxxx~x xxxxxxx xxxx xxx xxxxx xxxxxxx, xx xx
+xxxxxxxxx xxxxxxxxx xx xxxxxxxx xx xxxx xxxx xxxxxxx xxxx xxx xxxx xxx xxxx
+xxxxxxxx xxxxxxxxxxx xxx xxx xxxxxx xx xx xxxxxxx. Xxxxxxxxx xxxxxxx xxxxx xxx
+xx xxxxxxxx xxxxxx xxxx xxx xxxx xxxxxxx xx x xxxxx xxxxxxxxx, xxx xxx
+xxxxxxxx xx xxx xxxxxxxxx? Xxx xxxx xxxxxxxx xxxxxxxxx xxxxxxxxx xxxxxxxxx xx
+XX-xxx, xxx xxxxxxxxx xx xxx {xxx Xxxxxx xxxxxx Xxxx
+xxx},\numberedfootnote{\erm Xxxx Xx xx xxx xxxx Xxxxxx Xxxxxxx xxxx xxxxx
+xxxx.} ``X xxxxxxx xxxxx xxxxxxxxx xxx Xxxxxx xxx xxx xxxx'x xxxxx xx xxxxxxxx
+xxxx xx xxxxxxxxx xxxxxx xxxxxx xxxx xxxxxx xxxx.'' Xxxx xxxxxx xxxxx xx x
+xxxxxxxx xxxx xxxxxxxx xxxxx xxxxxx xxx xxxxxxxx xxx xxx xxxxxxx xxx xx xxxx
+xxxxxxx xxx xxxxxx xxxxxx xxxxxxxx xxx xxxx xxxxxxxxxxx xxxx xxx xxx xxxxxxx
+xxx xxxxxx xxxxxx xx Xxxxxx xxxxx xx xxxx, xxx xxxxx xxx xxx xxxxxxxx xx x
+Xxxxxx xxxxxxx xxxx xxx xxxx? Xxx xxxxxx xxxxx xx xx xxxxxxxxx xxx xxxxxxx
+xxxx xxx xxxx xxxx xx Xxxxx~x xxx xxxxxx xxxx xxx xxxxxxx xxxx xxxxx xx
+xxxxxxx xx xxxxxx xxx xx xxxxx.
+
+\singlecolumn
+
+\medskip\bigbreak
+\midinsert
+\centerline{Table 3---Xxxxxxxxx Xxxx Xxxxxxxx xx Xxxxxxxx}
+\smallbreak
+\line \bgroup \hss
+ \vbox to11\baselineskip{}
+\hss \egroup
+\endinsert
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/dvipdfm.tex b/Master/texmf-dist/source/eplain/base/test/dvipdfm.tex
new file mode 100644
index 00000000000..0760afbe50b
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/dvipdfm.tex
@@ -0,0 +1,111 @@
+\input ../eplain
+%\enablehyperlinks[nolinks]
+%\enablehyperlinks[dvipdfm]
+\enablehyperlinks
+
+\beginpackages
+\usepackage[dvipsnames]{color}
+\endpackages
+
+% Execute #1 then print it verbatim and indented.
+\def\c{\cf\indent\relax}
+% Same as \c, but do not indent and at the end say \hlend.
+\def\f{\cf\noindent\hlend}
+%
+\def\cf#1#2#3{%
+ \def\temp{#3}%
+ \edef\cftemp{\sanitize\temp}%
+ #1#3\expandafter\verbatim\cftemp\endverbatim#2\par
+}
+%
+\newcount\destcount
+% Execute `#1{d\the\destcount}' then print it (`#1', `{d', and `}' are printed
+% verbatim; `\the\destcount' is expanded).
+\def\d{\dl\relax}
+% Same as \d, but at the end also say \hlend.
+\def\l{\dl\hlend}
+%
+\def\dl#1#2{%
+ \global\advance\destcount by1
+ \toks0={#2}%
+ \edef\temp{\the\toks0{d\the\destcount}}%
+ \edef\dltemp{\sanitize\temp}%
+ \noindent#2{d\the\destcount}\expandafter\verbatim\dltemp\endverbatim#1\par
+}
+
+
+
+\leftline{\bf Destinations}
+\medskip
+
+{\tt\global\parindent=4em}
+
+\d{\hldest{}{}}
+\c{\hldestopts{zoom=2345}}
+\d{\hldest{}{}}
+\medskip
+\c{\hldesttype{fitr}}
+\c{\hldestopts{left=36,bottom=420,right=360,top=720}}
+\d{\hldest{}{}}
+\c{\def\mydesttype{xyz}}
+\c{\def\myopts{left=72,top=648}}
+\d{\hldest{\mydesttype}{\myopts}}
+\medskip
+\c{\let\myopts\empty}
+\c{\hldestopts{raise=2\normalbaselineskip}}
+\d{\hldest{xyz}{\myopts,zoom=2500}}
+\c{\hldestopts{left=,bottom=,right=,top=}}
+\d{\hldest{xyz}{raise=\ht\strutbox,zoom=3000}}
+\medskip
+\makeatletter
+\c{\def\mydest{\special{pdf: dest (\@hllabel) [@thispage /FitBH @ypos]}}}
+\d{\hldest{raw}{cmd=mydest}}
+\resetatcatcode
+\medskip
+\d{\hldest{fit}{}}
+\d{\hldest{fith}{}}
+\d{\hldest{fitv}{}}
+\d{\hldest{fitb}{}}
+\d{\hldest{fitbh}{}}
+\d{\hldest{fitbv}{}}
+\vfil\eject
+
+
+
+\leftline{\bf Links}
+\medskip
+
+{\tt\global\parindent=4.5em}
+
+\destcount=0 % Reset destination count.
+\l{\hlstart{name}{}}
+\c{\hlopts{bstyle=U}}
+\l{\hlstart{name}{}}
+\l{\hlstart{}{bstyle=D,bdash=2 4,bcolor=1 0 0,hlight=I}}
+\l{\hlstart{}{bstyle=B,bwidth=3}}
+\c{\hlopts{bcolor=0 0 1}}
+\l{\hlstart{}{bstyle=I,bwidth=4}}
+\l{\hlstart{}{bstyle=U,bwidth=1}}
+\c{\hlopts{bstyle=S}}
+\l{\hlstart{}{hlight=I,bcolor=1 .2 .2,bwidth=2}}
+\l{\hlstart{}{hlight=N,bstyle=D,bwidth=3}}
+\l{\hlstart{}{hlight=O}}
+\l{\hlstart{}{hlight=P,bcolor=.3 .6 .7}}
+\l{\hlstart{}{bstyle=D,bdash=2 4 6}}
+\l{\hlstart{}{bwidth=0}}
+\l{\hlstart{}{bstyle=D,bdash=2 4 6 8}}
+\f{\hlstart{page}{pagefit=/FitH 600}{1}}
+\f{\hlstart{filename}{file=hlink.pdf,newwin=1}{eq1}}
+\f{\hlstart{filepage}{file=hlink.pdf,pagefit=/FitR 50 100 300 500}{1}}
+\f{\hlstart{filepage}{file=hlink.pdf,pagefit=/FitB}{2}}
+\f{\hlstart{url}{}{http://tug.org/eplain/}}
+\c{\def\c{\special{pdf:beginann<</Type/Annot/Subtype/Link/Dest[0/FitH @ypos]>>}}}
+\f{\hlstart{raw}{cmd=c}{}}
+
+
+
+\bye
+
+% Local variables:
+% compile-command: "(cd .. && make eplain.tex) && tex --interact=nonstopmode dvipdfm.tex && dvipdfm -p letter dvipdfm.dvi"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/ecommdiag.tex b/Master/texmf-dist/source/eplain/base/test/ecommdiag.tex
new file mode 100644
index 00000000000..562ad84ce00
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/ecommdiag.tex
@@ -0,0 +1,15 @@
+% This file is public domain.
+%
+\input ../eplain
+
+\fmtversion
+
+$$\commdiag{Y&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft{f_t}&\mapdown\cr
+Y\times I&\mapright^{\bar f_t}&X}$$
+
+\end
+
+From DYMACEK@fs.sciences.WLU.EDU Fri Apr 15 09:21:12 1994
+To: kb@cs.umb.edu
+From: "Wayne M. Dymacek" <DYMACEK@fs.sciences.WLU.EDU>
+Date: Fri, 15 Apr 1994 9:19:15 EDT
diff --git a/Master/texmf-dist/source/eplain/base/test/emergncy.tex b/Master/texmf-dist/source/eplain/base/test/emergncy.tex
new file mode 100644
index 00000000000..de1eeaefe6f
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/emergncy.tex
@@ -0,0 +1,19 @@
+% This file is public domain.
+%
+%\ifx\undefined\eplain \input eplain \fi
+
+\hsize = 32pc
+\emergencystretch = 8pc
+%\tolerance = 10000
+
+\def\code#1{{\tt #1}}
+\def\\{{\tt \char92}}
+
+You can make a new numbered theorem-like environment with
+\code{\\definenumberedtheorem}. This macro takes one argument, the name
+of the environment. The first letter of the name will be capitalized
+when it is typeset. Analogously, you can use
+\code{\\defineunnumberedtheorem} to make a new unnumbered theorem-like
+environment. These commands can only be used before \code{\\body}.
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/env.tex b/Master/texmf-dist/source/eplain/base/test/env.tex
new file mode 100644
index 00000000000..3b4cf56be66
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/env.tex
@@ -0,0 +1,42 @@
+% This file is public domain.
+%
+\input eplain
+
+First, let's make sure they work.
+
+\loggingall
+
+\environment{outer}
+ \environment{inner}
+ This is in the first inner.
+ \endenvironment{inner}
+
+ This is between inners.
+
+ \environment{inner}
+ This is in the second inner.
+
+ \environment{even-more-inner}
+ This is even more inner.
+ \endenvironment{even-more-inner}
+ \endenvironment{inner}
+\endenvironment{outer}
+
+This is after the outer.
+
+Now let's make some mistakes.
+
+%\environment{start-1}
+%\endenvironment{end-2}
+
+\endenvironment{where-is-the-start?}
+
+\begingroup
+\endenvironment{begingroup-started}
+
+\environment{endgroup-ended}
+\endgroup
+
+\environment{noend}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/eqdef.tex b/Master/texmf-dist/source/eplain/base/test/eqdef.tex
new file mode 100644
index 00000000000..8a72b874333
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/eqdef.tex
@@ -0,0 +1,15 @@
+% This file is public domain.
+%
+% Test empty eqdef's.
+\ifx\undefined\eplain \input eplain \fi
+
+\loggingall
+
+$$a = 1
+\eqdef{}
+$$
+
+$$b = 2
+\eqdef{}
+$$
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/eqref.tex b/Master/texmf-dist/source/eplain/base/test/eqref.tex
new file mode 100644
index 00000000000..8f0d4f8bb59
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/eqref.tex
@@ -0,0 +1,141 @@
+% This file is public domain.
+%
+% Test symbolic equation references.
+%
+\ifx\eplain\undefined \input eplain \fi
+
+\loggingall
+\leftdisplays
+
+An equation with a number in its name:
+$$ a+b=1\eqdef{line1}$$
+\line{did we mess up plain's line in equation \eqref{line1}?\hfil}
+
+\bye
+
+The first equation:
+$$x + y = 1 \eqdef{first}$$
+
+In equation \eqref{first}, we said that $x+y=1$.
+Now, in equation \eqref{second}, we say that $a+b=2$.
+
+$$a + b = 2 \eqdef{second}$$
+
+The next equation is unlabeled in the output, but we can still refer to
+it.
+$$c + d = 3 \eqdefn{*}$$
+
+And here's an equation whose text references another equation, namely,
+\eqref{first}:
+$$c=3\eqdef[\eqrefn{first}*]{first-star}$$
+And a reference to it: \eqref{first-star}.
+
+Here is the first of a group of equations: \eqdefn{group}
+$$a = 1\eqsubdef{group-1}$$
+and the invisible second, then the third of the group \eqsubdefn{group-invis}:
+$$b = 2\eqsubdef{group-2}$$
+We refer to the group as \eqref{group}, to the first as
+\eqref{group-1}, the third as \eqref{group-2}, and the invisible second
+as \eqref{group-invis}.
+
+Here's an equation labeled strangely:
+$$a=1\eqdef[\rm strange*]{foo}$$
+And let's refer to \eqref{foo}.
+
+Let's do subequations off that:
+$$b=2\eqsubdef{foo-1}$$
+And refer to it: \eqref{foo-1}.
+
+% We can't use \count255, since #1 might involve contortions which
+% trample it.
+\newcount\subrefcount
+\def\eqsubreftext#1#2{%
+ \subrefcount = #2
+ \advance\subrefcount by 96
+ #1\char\subrefcount
+}
+
+Let's try another group, with a different labelling scheme. Here is the
+first of this group2: \eqdefn{group2}
+$$a = 1\eqsubdef{group2-1}$$
+and the second of the group2 \eqsubdefn{group2-invis}:
+$$b = 2\eqsubdef{group2-2}$$
+We refer to the group2 as \eqref{group2}, to the first as
+\eqref{group2-1}, the third as \eqref{group2-2}, and the invisible second
+as \eqref{group2-invis}.
+
+Here is one done with displaylines:
+% The \hfill's and \llap make the equation numbers come out in the right
+% place if we are not doing \leftdisplays. (See the TeXbook, p.194.)
+%$$\displaylines{
+% \hfill x=1\hfill\llap{\eqdef{displayline-1}}\cr
+% \hfill y=2\hfill\llap{\eqdef{displayline-2}}\cr
+%}$$
+$$\displaylines{
+ x=1\eqdef{displayline-1}\cr
+ y=2\eqdef{displayline-2}\cr
+}$$
+
+Let's refer to each of the equations in the displaylines:
+\eqref{displayline-1}, \eqref{displayline-2}.
+
+And one with eqalignno:
+$$
+\eqalignno{
+ a+b&=c&\eqdef{eqalign-1}\cr
+ d+e&=f&\eqdef{eqalign-2}\cr
+}
+$$
+
+And one with leqalignno, and indented more:
+{\leftdisplayindent = 1in
+$$\leqalignno{
+ a+b &=c&\eqdef{leqalign-1}\cr
+ dt+eg&=f&\eqdef{leqalign-2}\cr
+}$$
+}
+
+And now let's refer to those: \eqref{eqalign-1}, \eqref{eqalign-2},
+\eqref{leqalign-1}, \eqref{leqalign-2}.
+
+
+
+\def\eqprint#1{[\rm A.#1]}
+
+From now on, all equation labels should be in brackets and preceded
+by `A.'. In \eqref{*}, we said that $c+d=3$. And in equation
+\eqref{undefined}, we say that $1+1=2$.
+
+\eqdefn{*x}
+\eqdefn{*y}
+
+We defined equation \eqref{*y}, although we didn't give an equation for
+it.
+This is a forward reference to equation \eqref{forward}.
+
+$$e + f = 4 \eqdef{forward}$$
+
+That equation above defines \eqref{forward}.
+
+
+\newcount\sectionnum \sectionnum = 1
+\def\eqconstruct#1{\the\sectionnum.#1}
+
+And now equation numbers should have a section number (which we start at
+one) preceding them.
+
+$$a+b=1 \eqdef{s-ab}$$
+
+That equation is \eqref{s-ab}. The one we'll define in the next section
+is \eqref{s-cd}.
+
+
+\advance\sectionnum by 1
+The equation in the previous section was \eqref{s-ab}. Let's define one
+in this section:
+
+$$c+d=3 \eqdef{s-cd}$$
+
+And refer to it: \eqref{s-cd}.
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/example.eps b/Master/texmf-dist/source/eplain/base/test/example.eps
new file mode 100644
index 00000000000..4074a32b458
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/example.eps
@@ -0,0 +1,389 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: MATLAB, The Mathworks, Inc.
+%%Title: example.eps
+%%CreationDate: 11/05/96 21:16:44
+%%DocumentNeededFonts: Helvetica
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%Pages: 1
+%%BoundingBox: 97 197 502 604
+%%EndComments
+
+%%BeginProlog
+
+% MathWorks dictionary
+/MathWorks 150 dict begin
+
+% definition operators
+/bdef {bind def} bind def
+/ldef {load def} bind def
+/xdef {exch def} bdef
+/xstore {exch store} bdef
+
+% operator abbreviations
+/c /clip ldef
+/cc /concat ldef
+/cp /closepath ldef
+/gr /grestore ldef
+/gs /gsave ldef
+/mt /moveto ldef
+/np /newpath ldef
+/cm /currentmatrix ldef
+/sm /setmatrix ldef
+/rc {rectclip} bdef
+/rf {rectfill} bdef
+/rm /rmoveto ldef
+/rl /rlineto ldef
+/s /show ldef
+/sc {setcmykcolor} bdef
+/sr /setrgbcolor ldef
+/w /setlinewidth ldef
+/j /setlinejoin ldef
+/cap /setlinecap ldef
+
+% page state control
+/pgsv () def
+/bpage {/pgsv save def} bdef
+/epage {pgsv restore} bdef
+/bplot /gsave ldef
+/eplot {stroke grestore} bdef
+
+% orientation switch
+/portraitMode 0 def
+/landscapeMode 1 def
+
+% coordinate system mappings
+/dpi2point 0 def
+
+% font control
+/FontSize 0 def
+/FMS {
+ /FontSize xstore %save size off stack
+ findfont
+ [FontSize 0 0 FontSize neg 0 0]
+ makefont
+ setfont
+ }bdef
+
+/reencode {
+exch dup where
+{pop load} {pop StandardEncoding} ifelse
+exch
+dup 3 1 roll
+findfont dup length dict begin
+ { 1 index /FID ne {def}{pop pop} ifelse } forall
+ /Encoding exch def
+ currentdict
+end
+definefont pop
+} bdef
+
+/isroman {
+findfont /CharStrings get
+/Agrave known
+} bdef
+
+/FMSR {
+3 1 roll 1 index
+dup isroman
+{reencode} {pop pop} ifelse
+exch FMS
+} bdef
+
+/csm {
+ 1 dpi2point div -1 dpi2point div scale
+ neg translate
+ landscapeMode eq {90 rotate} if
+ } bdef
+
+% line types: solid, dotted, dashed, dotdash
+/SO { [] 0 setdash } bdef
+/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+/DA { [6 dpi2point mul] 0 setdash } bdef
+/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+
+% macros for lines and objects
+/L {
+ lineto
+ stroke
+ } bdef
+/MP {
+ 3 1 roll moveto
+ 1 sub {rlineto} repeat
+ } bdef
+/AP {
+ {rlineto} repeat
+ } bdef
+/PP {
+ closepath fill
+ } bdef
+/DP {
+ closepath stroke
+ } bdef
+/MR {
+ 4 -2 roll moveto
+ dup 0 exch rlineto
+ exch 0 rlineto
+ neg 0 exch rlineto
+ closepath
+ } bdef
+/FR {
+ MR stroke
+ } bdef
+/PR {
+ MR fill
+ } bdef
+/L1i {
+ { currentfile picstr readhexstring pop } image
+ } bdef
+
+/tMatrix matrix def
+/MakeOval {
+ newpath
+ tMatrix currentmatrix pop
+ translate scale
+ 0 0 1 0 360 arc
+ tMatrix setmatrix
+ } bdef
+/FO {
+ MakeOval
+ stroke
+ } bdef
+/PO {
+ MakeOval
+ fill
+ } bdef
+
+/PD {
+ 2 copy moveto lineto stroke
+ } bdef
+
+
+currentdict end def
+%%EndProlog
+
+%%BeginSetup
+MathWorks begin
+
+0 cap
+
+end
+%%EndSetup
+
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 97 197 502 604
+MathWorks begin
+bpage
+%%EndPageSetup
+
+%%BeginObject: graph1 1
+bplot
+
+/dpi2point 12 def
+portraitMode 0216 7344 csm
+
+ 956 91 4862 4883 MR c np
+76 dict begin %Colortable dictionary
+/c0 { 0 0 0 sr} bdef
+/c1 { 1 1 1 sr} bdef
+/c2 { 1 0 0 sr} bdef
+/c3 { 0 1 0 sr} bdef
+/c4 { 0 0 1 sr} bdef
+/c5 { 1 1 0 sr} bdef
+/c6 { 1 0 1 sr} bdef
+/c7 { 0 1 1 sr} bdef
+%%IncludeResource: font Helvetica
+/Helvetica /ISOLatin1Encoding 144 FMSR
+
+1 j
+c1
+ 0 0 6912 5185 PR
+6 w
+DO
+4 w
+c0
+1463 4613 mt 1463 388 L
+1463 388 mt 1463 388 L
+2308 4613 mt 2308 388 L
+2308 388 mt 2308 388 L
+3153 4613 mt 3153 388 L
+3153 388 mt 3153 388 L
+3999 4613 mt 3999 388 L
+3999 388 mt 3999 388 L
+4844 4613 mt 4844 388 L
+4844 388 mt 4844 388 L
+5689 4613 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+5689 4613 mt 5689 4613 L
+1463 4191 mt 5689 4191 L
+5689 4191 mt 5689 4191 L
+1463 3768 mt 5689 3768 L
+5689 3768 mt 5689 3768 L
+1463 3346 mt 5689 3346 L
+5689 3346 mt 5689 3346 L
+1463 2923 mt 5689 2923 L
+5689 2923 mt 5689 2923 L
+1463 2501 mt 5689 2501 L
+5689 2501 mt 5689 2501 L
+1463 2078 mt 5689 2078 L
+5689 2078 mt 5689 2078 L
+1463 1655 mt 5689 1655 L
+5689 1655 mt 5689 1655 L
+1463 1233 mt 5689 1233 L
+5689 1233 mt 5689 1233 L
+1463 811 mt 5689 811 L
+5689 811 mt 5689 811 L
+1463 388 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+SO
+6 w
+1463 4613 mt 5689 4613 L
+1463 388 mt 5689 388 L
+5689 4613 mt 5689 388 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 4613 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 1463 4571 L
+1463 388 mt 1463 430 L
+1423 4782 mt
+(0) s
+2308 4613 mt 2308 4571 L
+2308 388 mt 2308 430 L
+2268 4782 mt
+(2) s
+3153 4613 mt 3153 4571 L
+3153 388 mt 3153 430 L
+3113 4782 mt
+(4) s
+3999 4613 mt 3999 4571 L
+3999 388 mt 3999 430 L
+3959 4782 mt
+(6) s
+4844 4613 mt 4844 4571 L
+4844 388 mt 4844 430 L
+4804 4782 mt
+(8) s
+5689 4613 mt 5689 4571 L
+5689 388 mt 5689 430 L
+5609 4782 mt
+(10) s
+1463 4613 mt 1505 4613 L
+5689 4613 mt 5647 4613 L
+1264 4666 mt
+(-1) s
+1463 4191 mt 1505 4191 L
+5689 4191 mt 5647 4191 L
+1144 4244 mt
+(-0.8) s
+1463 3768 mt 1505 3768 L
+5689 3768 mt 5647 3768 L
+1144 3821 mt
+(-0.6) s
+1463 3346 mt 1505 3346 L
+5689 3346 mt 5647 3346 L
+1144 3399 mt
+(-0.4) s
+1463 2923 mt 1505 2923 L
+5689 2923 mt 5647 2923 L
+1144 2976 mt
+(-0.2) s
+1463 2501 mt 1505 2501 L
+5689 2501 mt 5647 2501 L
+1348 2554 mt
+(0) s
+1463 2078 mt 1505 2078 L
+5689 2078 mt 5647 2078 L
+1228 2131 mt
+(0.2) s
+1463 1655 mt 1505 1655 L
+5689 1655 mt 5647 1655 L
+1228 1708 mt
+(0.4) s
+1463 1233 mt 1505 1233 L
+5689 1233 mt 5647 1233 L
+1228 1286 mt
+(0.6) s
+1463 811 mt 1505 811 L
+5689 811 mt 5647 811 L
+1228 864 mt
+(0.8) s
+1463 388 mt 1505 388 L
+5689 388 mt 5647 388 L
+1348 441 mt
+(1) s
+1463 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 388 L
+1463 388 mt 1463 388 L
+5689 388 mt 5689 388 L
+gs 1463 388 4227 4226 MR c np
+42 183 43 192 42 200 42 206 42 210 43 211 42 210 42 208
+42 204 43 196 42 188 42 177 42 165 43 151 42 135 42 119
+42 100 43 82 42 61 42 42 42 20 43 -1 42 -22 42 -43
+42 -63 43 -83 42 -102 42 -120 43 -137 42 -152 42 -166 42 -178
+43 -188 42 -197 42 -204 42 -208 43 -211 42 -211 42 -209 42 -206
+43 -199 42 -192 42 -182 42 -170 43 -157 42 -142 42 -126 42 -108
+43 -89 42 -70 42 -50 43 -29 42 -8 42 13 42 34 43 55
+42 75 42 94 42 113 43 130 42 146 42 160 42 173 43 185
+42 193 42 202 42 206 43 210 42 211 42 211 42 207 43 202
+42 195 42 186 42 176 43 162 42 149 42 132 43 116 42 97
+42 79 42 58 43 37 42 17 42 -4 42 -26 43 -46 42 -67
+42 -86 42 -105 43 -123 42 -139 42 -155 42 -168 43 -180 42 -190
+42 -198 42 -205 43 -209 1505 2290 100 MP stroke
+42 -211 1463 2501 2 MP stroke
+42 -106 43 -87 42 -67 42 -48 42 -26 43 -5 42 15 42 37
+42 57 43 78 42 96 42 115 42 132 43 148 42 162 42 175
+42 185 43 195 42 202 42 207 42 210 43 211 42 211 42 206
+42 202 43 194 42 185 42 174 43 161 42 146 42 131 42 113
+43 95 42 76 42 56 42 35 43 14 42 -7 42 -28 42 -49
+43 -69 42 -89 42 -107 42 -125 43 -141 42 -157 42 -169 42 -182
+43 -191 42 -199 42 -205 43 -210 42 -211 42 -210 42 -209 43 -204
+42 -197 42 -189 42 -179 43 -166 42 -153 42 -137 42 -121 43 -103
+42 -84 42 -64 42 -44 43 -22 42 -2 42 19 42 40 43 61
+42 81 42 99 42 118 43 135 42 150 42 164 43 177 42 187
+42 197 42 203 43 207 42 211 42 211 42 210 43 206 42 200
+42 193 42 183 43 172 42 158 42 144 42 128 43 110 42 92
+42 73 42 52 43 31 1505 399 100 MP stroke
+42 11 1463 388 2 MP stroke
+
+gr
+3194 4942 mt
+(\\tex[t][t]{$t$}) s
+1090 3419 mt -90 rotate
+(\\tex[B][B]{$\\sin\(t\)$, $\\cos\(t\)$}) s
+90 rotate
+2314 273 mt
+(\\tex[B][B]{Plot of $\\sin\(t\)$ and $\\cos\(t\)$}) s
+2689 2048 mt
+(p1) s
+3956 3343 mt
+(p2) s
+5224 1495 mt
+(p2) s
+3486 2178 mt -78 rotate
+(p3) s
+78 rotate
+
+end
+
+eplot
+%%EndObject graph 1
+
+epage
+end
+
+showpage
+
+%%Trailer
+%%EOF
diff --git a/Master/texmf-dist/source/eplain/base/test/filexist.tex b/Master/texmf-dist/source/eplain/base/test/filexist.tex
new file mode 100644
index 00000000000..e80485577a5
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/filexist.tex
@@ -0,0 +1,22 @@
+% This file is public domain.
+%
+% Test \testfileexistence.
+%
+\ifx\undefined\eplain \input eplain\fi
+
+\testfileexistence{tex}
+\iffileexists \else
+ \message{\jobname.tex does not exist, but it should.}
+\fi
+
+\testfileexistence[README]{}
+\iffileexists \else
+ \message{README does not exist, but it should.}
+\fi
+
+\testfileexistence[foo]{bar}
+\iffileexists
+ \message{foo.bar exists, but it shouldn't.}
+\fi
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/flynn.tex b/Master/texmf-dist/source/eplain/base/test/flynn.tex
new file mode 100644
index 00000000000..d5efea792cd
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/flynn.tex
@@ -0,0 +1,7 @@
+% This file is public domain.
+%
+\input eplain
+\loggingall
+\xrdef{foo}
+\xrdef{bar}
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/footnote.tex b/Master/texmf-dist/source/eplain/base/test/footnote.tex
new file mode 100644
index 00000000000..de30cc89de4
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/footnote.tex
@@ -0,0 +1,88 @@
+% This file is public domain.
+%
+\input eplain
+
+This is some text\numberedfootnote{And this is the first footnote.} and
+now some more text\numberedfootnote{The second.} and
+finally\numberedfootnote{the third} some
+more.\numberedfootnote{The fourth.} And again.
+
+\footnotenumber = 0
+
+\leftskip = 1in
+Let's do another, this one should be numbered one
+again\numberedfootnote{OK, here it is, numbered one}. This paragraph
+ends up being indented by one inch. But this time the
+footnote\numberedfootnote{This one should be like the others.} shouldn't be
+indented.
+
+\footnotemarkseparation = .16666em
+
+\numberedlist
+\li This is the first item in a list, and it has a
+footnote\numberedfootnote{See? With a separation less than the others, too}.
+
+This is the second paragraph of the first item, and it has
+one\numberedfootnote{This is in the second paragraph.} too.
+\endnumberedlist
+
+\leftskip = 0pt
+Now let's redefine the footnote command.
+\let\footnote = \numberedfootnote
+
+\everyfootnote = {\it\leftskip=1in}%
+
+And do one\footnote{This is it, should be indented by one inch and in
+italics.} footnote with that, which should also end up indented.
+
+\font\small = cmr7
+\everyfootnote = {\small \baselineskip = 7pt }
+Another paragraph\footnote{With a footnote in a smaller font, but make
+it more than one line long so we can see if the baselineskip change
+worked or not. Because it's a small font, it has to go on for ages,
+simply ages.\par}.
+
+\vfill\eject
+
+% Test the \footnoterule parameters.
+%
+\footnoterulewidth = 6in
+\footnoteruleheight = 4pt
+\belowfootnoterulespace = 6pt
+
+New page\footnote{This footnote should have a 4pt rule above it which 6 inches
+wide and has 6 points of space below it.} to test the footnote rule
+parameters.
+
+\vfill\eject
+
+\everyfootnote = {\bf}
+\interfootnoteskip = 8pt
+\footnoteruleheight = 0pt
+\belowfootnoterulespace = 0pt
+\skip\footins = 12pt
+
+Some more\footnote{In bold, indented by the usual parindent, with no
+extra space between it and the rule; in fact, no rule.} footnotes so we can
+test\footnote{In bold, with 8pt extra space above it.}
+interfootnoteskip.
+
+The big blank space following this will force a long footnote to be
+broken across pages.
+
+\vglue 41pc plus 1filll
+
+This is the last line on the page\footnote{And this is the last
+footnote; it should be like the last one. We are making this
+footnote pretty long, so that it won't all fit on one page. I hope that
+\TeX\ will break it across pages, so we see if the new footnote
+formatting parameters still work in that case. Oh, boy, I can see we
+should make this footnote really long; much longer than I can make up
+garbage sentences like this for. Well, maybe not. I can be pretty
+verbose when I have to be. I suppose anyone can. Did you notice I'm
+inconsistent about leaving one space or two after sentence-ending
+periods? Punctuation, really.}, and it should have 12pt
+(which is the footins skip) between it and the rule\footnote{I lied;
+{\it this} is the last footnote}.
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/frac.tex b/Master/texmf-dist/source/eplain/base/test/frac.tex
new file mode 100644
index 00000000000..f4f4cd565ab
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/frac.tex
@@ -0,0 +1,24 @@
+% This file is public domain.
+%
+\input eplain
+
+\obeylines %
+This is \frac 1/2 cup.
+This is \frac 2/3 cup.
+This is \frac 3/4 cup.
+This is \frac 5/6 cup.
+This is \frac 6/7 cup.
+This is \frac 7/8 cup.
+This is \frac 8/9 cup.
+This is \frac 9/{10} cup.
+This is \frac 10/{11} cup.
+
+\end
+
+
+
+
+
+
+
+
diff --git a/Master/texmf-dist/source/eplain/base/test/gcol.tex b/Master/texmf-dist/source/eplain/base/test/gcol.tex
new file mode 100644
index 00000000000..e44455ce0e7
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/gcol.tex
@@ -0,0 +1,218 @@
+% This file is public domain.
+%
+%Date: Thu, 16 May 91 14:59 PDT
+%From: David Guichard <GUICHARD%WHITMAN.BITNET@CORNELLC.cit.cornell.edu>
+%Subject: Re: eplain
+%To: karl@cs
+%
+%Karl--
+%
+%Here are my multi-column macros and a rewrite of the double columns section
+%of eplain.texinfo. I included a \quadcolumns because this seems potentially
+%useful on landscape pages.
+%
+%I ran into a couple of problems/bugs/features of the original macros that I
+%think I've fixed.
+%
+%First, if I started double columns and then returned to single column before
+%the output routine was invoked, but there was too much text in the columns to
+%fit on the current page, then all of the text was put on the next page, leaving
+%lots of blank space on the first page. I think I've fixed this by changing how
+%\vsize is defined.
+%
+%Next, unless I'm doing something screwy, it looks to me like eplain goofs up on
+%footnotes and topinserts issued in multicolumn mode. I think I've got things
+%changed around so they work.
+%
+%I also discovered that the "\vskip\interfootnoteskip" in the vfootnote macro
+%will produce a parskip even if the interfootnoteskip is 0---was this
+%intentional? If not, perhaps you'd like to add \parskip=0pt to vfootnote.
+%(I have already added it to the modified vfootnote in the columns macro).
+
+\newskip\abovecolumnskip \abovecolumnskip = \bigskipamount
+\newskip\belowcolumnskip \belowcolumnskip = \bigskipamount
+\newdimen\gutter \gutter = 2pc
+\newdimen\c@lumnhsize
+\newtoks\previousoutput
+\newcount\number@fcolumns
+\newbox\@partialpage
+\newdimen\singlec@lumnhsize
+\newdimen\singlec@lumnvsize
+\newtoks\previousoutput
+\let\@ndcolumns=\relax
+%
+% We have a few synonymous ways to refer to multiple column modes.
+%
+\def\doublecolumns{\@columns2}
+\def\triplecolumns{\@columns3}
+\def\quadcolumns{\@columns4}
+\def\begincolumns#1{\ifcase#1\relax \or \singlecolumn \or \@columns2 \or%
+ \@columns3 \or \@columns4 \else \relax \fi}
+\def\singlecolumn{\@ndcolumns\vskip\belowcolumnskip\nointerlineskip}
+\let\endcolumns=\singlecolumn
+%
+\def\@columns#1{%
+ \@ndcolumns%
+ \begingroup
+%
+% We redefine the main footnote macro so footnotes will extend across
+% the whole page, not just the width of a column. Likewise for @ins,
+% the insertion macro.
+%
+ \def\vfootnote##1{\insert\footins\bgroup\hsize=\singlec@lumnhsize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \advance\splittopskip by \interfootnoteskip
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+ \everypar = {}%
+ \parskip0pt
+ \the\everyfootnote
+ \vskip\interfootnoteskip
+ \indent\llap{##1\kern\footnotemarkseparation}\footstrut\futurelet\next\fo@t}
+ %
+ \def\@ins{\par\begingroup\setbox\z@\vbox\bgroup\hsize=\singlec@lumnhsize}
+ \global\let\@ndcolumns=\@@endcolumns
+ \global\number@fcolumns=#1
+ \global\c@lumnhsize = \hsize % If \hsize changed, get the new value.
+ \par % Shouldn't start in horizontal mode.
+ \global\previousoutput = \expandafter{\the\output}%
+ \global\advance\c@lumnhsize by -#1\gutter
+ \global\divide\c@lumnhsize by #1
+ \global\output = {%
+ \global\setbox\@partialpage =
+ \vbox{\unvbox255\vskip\abovecolumnskip}%
+ }%
+ \pagegoal = \pagetotal
+ \eject % Now expand the \output just above.
+ \global\output = {\c@lumnoutput}%
+ \global\singlec@lumnhsize = \hsize
+ \global\singlec@lumnvsize = \vsize
+ \hsize = \c@lumnhsize
+%
+% Compute the proper vsize based on what's already on the page
+% and the number of columns. Also change the mag factor for insertions.
+%
+ \global\advance\vsize by -\ht\@partialpage
+ \global\advance\vsize by -\ht\footins
+ \ifvoid\footins\else \global\advance\vsize by -\skip\footins \fi
+ \global\advance\vsize by -\ht\topins
+ \ifvoid\topins\else \global\advance\vsize by -\skip\topins \fi
+ \global\vsize = #1\vsize
+ \multiply\count\footins by #1 \multiply\count\topins by #1
+}%
+%
+% When this is invoked box 255 should contain just the right amount of
+% material, whether triggered by an output routine or a change in the
+% number of columns. Because columns have to contain a whole number of
+% lines of type, we take a bit of care with balancing the heights of the
+% columns to prevent either losing material or having a very short last
+% column.
+%
+% Note: when a page ends due to \bye or \eject, box 255 will contain lotsa
+% white space, so the columns will not look balanced. To fix this use
+% \singlecolumn before ending the page.
+%
+\def\@columnsplit{%
+ \splittopskip = \topskip
+ \splitmaxdepth = \baselineskip
+ \dimen0 = \ht255
+ \divide\dimen0 by \number@fcolumns
+ \begingroup % the balancing act
+ \vbadness = 10000 \loop \setbox8=\copy255
+ \global\setbox1 = \vsplit8 to \dimen0 \global\wd1 = \hsize
+ \global\setbox3 = \vsplit8 to \dimen0 \global\wd3 = \hsize
+ \ifnum\number@fcolumns>2%
+ \global\setbox5 = \vsplit8 to \dimen0
+ \global\wd5 = \hsize \fi
+ \ifnum\number@fcolumns>3%
+ \global\setbox7 = \vsplit8 to \dimen0
+ \global\wd7 = \hsize \fi
+ \ifdim\ht8>0pt \advance\dimen0 by 1pt \repeat
+ \endgroup
+ \global\setbox255 = \vbox{%
+ \unvbox\@partialpage
+ \ifcase\number@fcolumns \relax\or\relax\or%
+ \hbox to \singlec@lumnhsize{\box1\hfil\box3}\or%
+ \hbox to\singlec@lumnhsize{\box1\hfil\box3\hfil\box5}\or%
+ \hbox to\singlec@lumnhsize{\box1\hfil\box3\hfil\box5\hfil\box7}\or%
+ \else\relax\fi%
+ }%
+}%
+\def\c@lumnoutput{%
+ \@columnsplit
+ \hsize = \singlec@lumnhsize % Local to the \output group.
+ \vsize = \singlec@lumnvsize
+ \the\previousoutput
+%
+% Now the correct vsize is the original vsize times the
+% number of columns.
+%
+ \global\vsize=\number@fcolumns\singlec@lumnvsize
+}%
+\def\@@endcolumns{%
+ \global\let\@ndcolumns=\relax%
+ \par % Shouldn't start in horizontal mode.
+ \global\output = {\global\setbox1 = \box255}%
+ \pagegoal = \pagetotal
+ \eject
+ \global\setbox255 = \box1
+ \@columnsplit
+ \global\vsize = \singlec@lumnvsize
+ \global\output = \expandafter{\the\previousoutput}%
+ \endgroup
+ \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
+ \unvbox255
+}%
+
+\endinput
+
+@node Multiple columns, Footnotes, Margins, User definitions
+@section Multiple columns
+
+@cindex double column output
+@cindex triple column output
+@cindex quadruple column output
+@cindex multiple column output
+ Eplain provides for double, triple and quadruple
+column output: you just say
+@code{\doublecolumns},
+@findex doublecolumns
+@code{\triplecolumns}
+@findex triplecolumns
+or @code{\quadcolumns}
+@findex quadcolumns
+and from that point on, the manuscript will be
+set in columns. If you want to go back to one column, say
+@code{\singlecolumn}.
+@findex singlecolumn
+
+ The columns macros insert the value of the glue parameter
+@code{\abovecolumnskip}
+@findex abovecolumnskip
+before the multi-column text, and the value of the glue parameter
+@code{\belowcolumnskip}
+@findex belowcolumnskip
+after it. The default value for both of these parameters is
+@code{\bigskipamount}, i.e., one linespace.
+
+ The columns are separated by the value of the dimen parameter
+@code{\gutter}.
+@findex gutter
+The default value for @code{\gutter} is two picas.
+
+ The macros take into account only the insertion classes
+@cindex insertion classes
+defined by plain @TeX{}, namely, footnotes and @code{\topinsert}s. If
+you have defined additional insertion classes, you will need to change
+the macros which implement multi-column mode. Furthermore, the insertions
+do not respect the column widths; if you want them to, you have to
+change the way your output routine works. (Eplain uses whatever the
+current output routine is; it is not tied to @code{\plainoutput}.)
+@findex plainoutput
+
+@xx: \columnfill
+@xx: \singlecolumn to balance columns
+@xx: footnote/topinsert width of whole page
+@xx: \vfootnote resets \parskip
diff --git a/Master/texmf-dist/source/eplain/base/test/hlcite.tex b/Master/texmf-dist/source/eplain/base/test/hlcite.tex
new file mode 100644
index 00000000000..ec27c4e8fbe
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/hlcite.tex
@@ -0,0 +1,55 @@
+\input ../eplain
+%\enablehyperlinks[nolinks]
+%\enablehyperlinks[pdftex]
+%\enablehyperlinks[dvipdfm]
+\enablehyperlinks
+
+\ifpdf
+ \pdfpagewidth=8.5in
+ \pdfpageheight=11in
+\fi
+
+\beginpackages
+ \usepackage{color}
+\endpackages
+
+\hldestopts[bib]{raise=\ht\strutbox}
+\hlopts![cite]{bstyle=U}
+
+
+% Bibliography in front of the text.
+
+%\beginsection{References.}\par % Title for the bibliography.
+%\bibliography{knuth,xampl} % Use knuth.bib (from Eplain) and xampl.bib
+ % (from BibTeX) for the labels.
+%\bibliographystyle{plain}
+%\vfil\eject
+
+
+Two citations to Knuthian works:
+ \cite[note]{surreal,concrete-math}.
+
+
+\vfil\eject
+Three citations:
+ \cite[note]{surreal,article-crossref,whole-journal}.
+
+One citation:
+ \cite{article-crossref}.
+
+
+% Bibliography after the text.
+
+\vfil\eject
+\beginsection{References.}\par % Title for the bibliography.
+\bibliography{knuth,xampl} % Use knuth.bib (from Eplain) and xampl.bib
+ % (from BibTeX) for the labels.
+\bibliographystyle{plain}
+
+
+\bye
+
+% Local variables:
+% compile-command: "rm -f hlcite.aux hlcite.bbl && tex --interact=nonstopmode hlcite && bibtex hlcite && tex --interact=nonstopmode hlcite && tex --interact=nonstopmode hlcite && dvipdfm -p letter hlcite"
+% compile-command: "rm -f hlcite.aux hlcite.bbl && pdftex --interact=nonstopmode hlcite && bibtex hlcite && pdftex --interact=nonstopmode hlcite && pdftex --interact=nonstopmode hlcite"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/hlfoot.tex b/Master/texmf-dist/source/eplain/base/test/hlfoot.tex
new file mode 100644
index 00000000000..01fae52386b
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/hlfoot.tex
@@ -0,0 +1,47 @@
+\input ../eplain
+%\enablehyperlinks[nolinks]
+%\enablehyperlinks[pdftex]
+%\enablehyperlinks[dvipdfm]
+\enablehyperlinks
+
+\ifpdf
+ \pdfpagewidth=8.5in
+ \pdfpageheight=11in
+\fi
+
+\beginpackages
+ \usepackage{color}
+\endpackages
+
+% Set \normalbaselineskip for the sake of \hldestfootraise
+\everyfootnote = {\sevenrm \normalbaselineskip=9pt \normalbaselines}
+
+\hlopts![foot]{bstyle=U}
+\hldesttype[foot]{fitbh}
+\hlopts![footback]{bstyle=D,bdash=1 4}
+\hldesttype[footback]{fith}
+
+
+This\numberedfootnote{Footnote to `This'.} is a
+sentence\footnote*{Footnote to `sentence'.} with
+footnotes\footnote{**}{Footnote to `footnotes'.}.
+
+\medskip
+Now we say
+\verbatim\let\footnote=\numberedfootnote|endverbatim
+\let\footnote=\numberedfootnote\ and look what we get:
+
+This\footnote{Another footnote to `This'.} is another
+sentence\footnote{Another footnote to `sentence'.} with
+footnotes\footnote{Another footnote to `footnotes'.}.
+
+\vfil\eject
+Second page.
+
+
+\bye
+
+% Local variables:
+% compile-command: "tex --interact=nonstopmode hlfoot.tex && dvipdfm -p letter hlfoot.dvi"
+% compile-command: "pdftex --interact=nonstopmode hlfoot.tex"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/hlidx.mst b/Master/texmf-dist/source/eplain/base/test/hlidx.mst
new file mode 100644
index 00000000000..1f0813b806b
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/hlidx.mst
@@ -0,0 +1,2 @@
+delim_n "; "
+delim_r "\\thinspace--\\allowbreak\\thinspace "
diff --git a/Master/texmf-dist/source/eplain/base/test/hlidx.tex b/Master/texmf-dist/source/eplain/base/test/hlidx.tex
new file mode 100644
index 00000000000..2d177a9c6d2
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/hlidx.tex
@@ -0,0 +1,138 @@
+\input ../eplain
+
+% If you uncomment the optional arg, index hyperlinks will point to exact
+% locations of terms, but MakeIndex will regard _all_ index entries as distinct.
+% This can be partially cured by piping hlidx.idx through `util/idxuniq' script
+% before feeding it to MakeIndex (see the first compile-command at the end of
+% this file).
+\enablehyperlinks%[idxexact]
+%\enablehyperlinks[nolinks]
+%\enablehyperlinks[pdftex]
+%\enablehyperlinks[dvipdfm]
+
+\ifpdf
+ \pdfpagewidth=8.5in
+ \pdfpageheight=11in
+\fi
+
+\beginpackages
+ \usepackage{color}
+\endpackages
+
+\headline={\hrulefill}
+
+% Try to redefine the delimiters.
+\setidxpagelistdelimiter{; }
+\setidxpagerangedelimiter{\thinspace--\allowbreak\thinspace}
+
+% Underline and italisize a page number / page range, taking care not to
+% underline `--' in page range like `1--3'.
+%
+% Note that this definition is not enough if you don't use hyperlinks in index
+% (i.e., if you pass `idxnone' to \enablehyperlinks). Then page lists
+% like `1, 2' are not broken up by \hlidxpage, and the entire list may
+% be passed, which will be be italicized and underlined without being
+% split up. You can see the effect by commenting out
+% \enablehyperlinks above. In that case, you will have to do a more
+% sophisticated parsing using both \idxparserange and \idxparselist
+% (like in \@hlidxgetpages).
+\def\ituline#1{%
+ {\it
+ \idxparserange{#1}%
+ \ifx\idxpagei\empty
+ \underbar{#1}%
+ \else
+ \underbar{\idxpagei}\idxpagerangedelimiter\underbar{\idxpageii}%
+ \fi}%
+}
+
+
+\count0=-1
+
+% i
+\topglue12pt
+% \indent is needed to place hyperlink destination at the beginning of the first
+% line of the paragraph instead of vertical mode above the paragraph.
+\indent
+\sidx[pagemarkup=ituline]{truth}[definition of]
+Definition of truth, page~i.
+
+Another
+\sidx[pagemarkup=ituline]{truth}[definition of]
+definition of truth on page~i.
+\vfil\eject
+
+% ii
+\topglue24pt
+\indent
+\sidx[pagemarkup=ituline]{truth}[definition of]
+Definition of truth, page~ii.
+\vfil\eject
+
+% iii
+No index entries, page~iii.
+\vfil\eject
+
+\count0=1
+
+% 1
+\topglue36pt
+\indent
+\sidx[pagemarkup=ituline]{truth}[definition of]
+Definition of truth, page~1.
+\vfil\eject
+
+% 2
+\topglue24pt
+Beginning of
+\sidx[begin,pagemarkup=ituline]{truth}[definition of]
+definition of truth, page~2.
+\vfil\eject
+
+% 3
+\indent
+\sidx[pagemarkup=ituline]{truth}[definition of]
+Definition of truth that comes whithin an explicit range, page~3.
+\vfil\eject
+
+% 4
+End of
+\sidx[end]{truth}[definition of]
+definition of truth, page~4.
+\vfil\eject
+
+% 5
+\indent\idxname{Adrien-Marie}{Legendre} (September~18, 1752~-- January~10, 1833)
+was a French mathematician.
+
+Legendre integrals
+\sidx{Legendre\idxnameseparator Adrien-Marie!functions!F(k, phi), E(k,
+phi)@$F(k,\varphi)$, $E(k,\varphi)$}
+$F(k,\varphi)$ and $E(k,\varphi)$ are called {\it complete\/} when
+$\varphi=\pi/2$, in which case they are denoted by
+\sidx[pagemarkup=ituline]{Legendre\idxnameseparator Adrien-Marie!functions!K(k),
+E(k)@${\bf K}(k)$, ${\bf E}(k)$}
+${\bf K}(k)$ and ${\bf E}(k)$.
+
+\indent
+\sidx{semantic theory of truth@\leavevmode\hldest{}{}{idx:TSTT}semantic theory of truth}
+Semantic theory of truth was developed by Polish logician Alfred Tarski in the
+1930s.
+
+
+\sidx[seealso]{truth}[definition of]{\hlstart{}{}{idx:TSTT}semantic theory of
+truth\hlend}
+
+
+{\baselineskip=36pt
+\noindent\bf Index\par}
+
+\hookaction{beginindex}{\singlecolumn}
+\readindexfile{i}
+
+\bye
+
+% Local variables:
+% compile-command: "(cd .. && make eplain.tex) && rm -f hlidx.aux hlidx.ind hlidx.idx && tex --interact=nonstopmode hlidx && cat hlidx.idx | ../util/idxuniq | makeindex -s hlidx.mst > hlidx.ind && tex --interact=nonstopmode hlidx && dvipdfm -p letter hlidx.dvi"
+% compile-command: "(cd .. && make eplain.tex) && rm -f hlidx.aux hlidx.ind hlidx.idx && pdftex --interact=nonstopmode hlidx && makeindex -s hlidx.mst hlidx && pdftex --interact=nonstopmode hlidx"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/hlink.tex b/Master/texmf-dist/source/eplain/base/test/hlink.tex
new file mode 100644
index 00000000000..939a552ad3c
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/hlink.tex
@@ -0,0 +1,144 @@
+\input ../eplain
+%\enablehyperlinks[nolinks]
+%\enablehyperlinks[pdftex]
+%\enablehyperlinks[dvipdfm]
+\enablehyperlinks
+
+\beginpackages
+\usepackage[dvipsnames]{color}
+\endpackages
+
+\ifpdf
+ \pdfpagewidth=8.5in
+ \pdfpageheight=11in
+\fi
+
+\def\sectionword{Section}%
+\newcount\sectioncount
+\def\beginsection#1\par{%
+ \par
+ \advance\sectioncount by1
+ {\normalbaselineskip=3pc \normalbaselines
+ \noindent\definexref{sec\the\sectioncount}{\the\sectioncount}{section}%
+ {\bf Section~\the\sectioncount} #1\par}
+}%
+
+\def\deriv#1/#2{{{d#1}\over d#2}}%
+\def\vec#1#2{#1_1,#1_2,\ldots,#1_{#2}}%
+\def\cdotfill{\cleaders\hbox to 1em{\hss$\cdot$\hss}\hfill}%
+
+% Set defaults for hyperlink options.
+\hlopts{bstyle=U}% underlined border
+\hlopts{bwidth=2}%
+% Make \xrdef destinations make pages fit in the screen.
+\hldesttype[xrdef]{fit}% fit page
+% Set hyperlink options for various kinds of hyperlinks.
+\hlopts![ref]{bstyle=D,bdash=3,hlight=I}% dash border, invert box hlight
+\hlopts[ref]{bcolor=1 0 0,bwidth=1}% add options to the current list
+\hlopts![eq]{bcolor=0 1 0,hlight=O}% invert border hlight
+\hlopts![xref]{bstyle=I,bcolor=0 0 1,hlight=P,bwidth=4}% inset border, inset hlight
+
+
+Ordered list:
+\numberedlist
+\li[li1] Item 1
+\li[li2] \xrdef{li2:pg}Item 2
+ \numberedlist
+ \li[li2.a] subitem 2.a
+ \li[li2.b] subitem 2.b
+ \endnumberedlist
+\li Item 3
+\endnumberedlist
+
+Reference to \ref{li1}. Reference to {\let\reftie.\refn[item~\refn{li2}]{li2.b}}.
+
+\vskip\abovelistskipamount
+Unordered list:
+\unorderedlist
+\li[uli1] Item 1
+\li Item 2
+ \unorderedlist
+ \li[uli2.a] subitem 2.a
+ \li subitem 2.b
+ \endunorderedlist
+\endunorderedlist
+
+Refereneces to \ref[\sevenrm\lbrack dvipdfm will not make the \blackbox\ part of
+the link\rbrack]{uli1} and~\refn{uli2.a}.
+
+
+\beginsection \xrdef{sec1:pg}
+
+Reference to \ref{sec1} and forward reference to \ref{sec2}.
+
+
+
+\beginsection
+
+References to \refs{sec1} and~\refn{sec2}.
+
+\indent\ref{sec3} will start on \xref{sec3:pg}.
+$$\|A\| = \sup_{x\ne0} { \|Ax\| \over \|x\| }. \eqdef{eq1}$$
+Reference to \eqref{eq1}.
+$$\|A\| \ge {\|Ax\| \over \|x\|}. \eqsubdef{}$$
+Reference to \eqref[subequation]{}.
+$$\|Ax\| \le \|A\| \cdot \|x\|. \eqsubdef{subeq1.2}$$
+Reference to \eqref[subequation]{subeq1.2}. One more reference to
+\eqref[subequation]{}.
+
+\vfil\eject
+
+
+
+Forward reference to \eqref[equation]{subeq2.1}.
+$$\openup\jot
+\eqalignno{\eqdefn{eq2}% fake definition for \eqsubdef's to work
+ \deriv x/t &= 3x-2y,&\eqsubdef{subeq2.1}\cr
+ \deriv y/t &= 2x-y.&\eqsubdef{subeq2.2}\cr
+}$$
+References to equations \eqref{eq2}, \eqref{subeq2.1} and~\eqref{subeq2.2}.
+
+$$\hldestopts[eq]{raise=4.5\normalbaselineskip}
+\openup\jot
+\left.\,\eqalign{
+ \deriv x_1/t &= f_1(t,\vec xn),\cr
+ \deriv x_2/t &= f_2(t,\vec xn),\cr
+ \omit\span\omit\strut\cdotfill\cr
+ \deriv x_n/t &= f_n(t,\vec xn).\cr
+}\,\right\}\eqdef{eq3}$$
+Another notation for the \eqref[system]{eq3}:
+$$\deriv x_i/t=f_i(t,\vec xn)\quad
+(i=1,2,\ldots,n).\eqdef[\hbox{$\eqrefn{eq3}^*$}]{}$$
+Reference to \eqref[system]{}.
+
+Subequations in \verbatim\displaylines|endverbatim:
+$$\openup\jot
+\displaylines{
+ \eqsubdefn{eq3*.1}
+ \hfill\deriv x_2/t=f_2(t,\vec xn),\hfill\llap{\eqsubdef{eq3*.2}}\cr
+ \hfill\deriv x_3/t=f_3(t,\vec xn).\hfill\llap{\eqsubdef{eq3*.3}}\cr
+}$$
+References to \eqref{eq3*.1}, \eqref{eq3*.2} and~\eqref{eq3*.3}.
+
+\hloff[eq,]
+One more reference to \eqref[system]{}.
+\hlon
+And one more reference to \eqref[system]{}.
+
+\beginsection \xrdef{sec3:pg}
+
+\definecolor{mycolor}{rgb}{0,0,1}
+\hlopts{colormodel=,color=mycolor}
+
+Reference to \ref[item]{li2} on {\hloff\xref{li2:pg}}.
+
+\indent\ref{sec1} started on {\def\xrefpageword{page~}\xref[title]{sec1:pg}}.
+
+
+
+\bye
+
+% Local variables:
+% compile-command: "(cd .. && make eplain.tex) && rm -f hlink.aux && tex --interact=nonstopmode hlink.tex && tex --interact=nonstopmode hlink.tex && dvipdfm -p letter hlink.dvi"
+% compile-command: "(cd .. && make eplain.tex) && rm -f hlink.aux && pdftex --interact=nonstopmode hlink.tex && pdftex --interact=nonstopmode hlink.tex"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/ian.tex b/Master/texmf-dist/source/eplain/base/test/ian.tex
new file mode 100644
index 00000000000..95c254c6546
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/ian.tex
@@ -0,0 +1,28 @@
+% This file is public domain.
+%
+\input eplain
+
+\vsize 10cm \hsize 7cm
+
+Blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.
+
+\doublecolumns
+
+Blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.
+
+\singlecolumn
+
+Blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/index.tex b/Master/texmf-dist/source/eplain/base/test/index.tex
new file mode 100644
index 00000000000..0a039dec9c2
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/index.tex
@@ -0,0 +1,36 @@
+% This file is public domain.
+%
+\input eplain
+
+\indexproofingtrue
+\hsize = 5in
+
+\def\defn#1{{\sl #1\/}}
+\def\title#1{{\it #1\/}}
+
+\idx{term}
+\idxname{K. Elizabeth}{Tachikawa}
+\idxmarked\title{Strange Angels}
+\idxsubmarked{Anderson, Laurie}\defn{Strange Angels}
+\idx[begin]{range} starts.
+\sidx[begin]{home}
+
+\vfill\eject
+
+\sidx[pagemarkup=defn]{truth}
+\sidxname{Megan Anne}{Haney}
+
+\sidx[end]{home}
+\idx[end]{range} ends.
+
+\sidx[see]{beauty}[truthful]{Anderson, Laurie}
+\sidxmarked[seealso]\defn{Strange Angels}{\defn{Home of the Brave}}
+
+
+\leftline{\bf Index}
+
+\def\idxpreface{These words precede the index.}
+
+\readindexfile{i}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/jan.tex b/Master/texmf-dist/source/eplain/base/test/jan.tex
new file mode 100644
index 00000000000..b94ab34556f
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/jan.tex
@@ -0,0 +1,15 @@
+% This file is public domain.
+%
+\input eplain
+
+This gives \eqdefn{aa}
+$$1+2,\eqsubdef{op}$$
+and
+$$1+3.\eqsubdef{pp}$$
+And \eqref{aa} and \eqref{op} and \eqref{pp}.
+\bye
+
+From: deleeuw@laplace.sscnet.ucla.edu (Jan Deleeuw)
+Subject: batch mode
+To: karl@cs.umb.edu
+Date: Mon, 7 Jun 1993 20:26:22 -0700 (PDT)
diff --git a/Master/texmf-dist/source/eplain/base/test/justify.tex b/Master/texmf-dist/source/eplain/base/test/justify.tex
new file mode 100644
index 00000000000..232a6915064
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/justify.tex
@@ -0,0 +1,106 @@
+% This file is public domain.
+%
+\input eplain
+
+{\center foo
+bar
+}
+
+% Changing \parfillskip is OK, since the macros reset it.
+%\parfillskip = .75\hsize plus .06\hsize minus .75\hsize
+\loggingall
+
+Pre-text. These should be flush left:
+{\flushleft
+Here are a few
+lines that we are
+\vadjust{\bigskip}going to take {\it literally}. (with vadjusted space now)
+And a couple more
+of them.}
+
+Now we're back to normal.
+Now we're back to normal.
+Now we're back to normal.
+Pre-text. These should be flush right:
+
+{\it \flushright
+Here are a few italic
+lines that we are
+\vadjust{\bigskip}going to take literally.
+And a couple more
+of {\bf them.}
+
+In fact, let's do two paragraphs,
+this is so much fun. No, let's make it three.
+
+ For Dan
+ ---{\bf k.b.}
+}
+
+Now we're back to normal.
+Now we're back to normal.
+Now we're back to normal.
+These should be centered.
+
+{\center
+Here are a few
+lines that we are
+\vadjust{\bigskip}going to take literally.
+And a couple more
+of them.}
+
+Some centered paragraphs:
+{\center
+ Here is the first paragraph.
+
+ Here is the second.
+
+ Here is the third.
+}
+
+Now we're back to normal.
+Now we're back to normal.
+Now we're back to normal.
+These should be flush left again (two groups):
+
+{\flushleft
+ Here is the first paragraph.
+
+ Here is the second.
+}
+
+\blanklineskipamount = -.8\baselineskip
+{\flushleft
+ Here is the first paragraph.
+
+ Here is the second.
+
+ Here is the third
+}
+
+We changed the amount of space between the paragraphs in the second
+group so it was less than a full blank line. Did you notice?
+
+\scrollmode
+
+{\message{Now comes a mysterious error.} \center on first line---what happens?
+centered
+}
+
+\def\title{\begingroup\center}
+\def\endtitle{\endgroup}
+
+\title
+this should be centered
+by virtue of a macro
+\endtitle
+
+Back to normal.
+
+{\center
+centered
+\message{Now there should be an error:}%
+\flushleft % error
+}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/knuth.bib b/Master/texmf-dist/source/eplain/base/test/knuth.bib
new file mode 100644
index 00000000000..abdf6ddecfa
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/knuth.bib
@@ -0,0 +1,17 @@
+% This file is public domain.
+
+@book{surreal,
+ author = "Donald E. Knuth",
+ title = "Surreal Numbers",
+ year = 1974,
+ publisher = "Addison-Wesley",
+ address = "Reading, Massachusetts"
+}
+
+@book{concrete-math,
+ author = "Ronald L. Graham and Donald E. Knuth and Oren Patashnik",
+ title = "Concrete Mathematics",
+ year = 1989,
+ publisher = "Addison-Wesley",
+ address = "Reading, Massachusetts"
+}
diff --git a/Master/texmf-dist/source/eplain/base/test/label.tex b/Master/texmf-dist/source/eplain/base/test/label.tex
new file mode 100644
index 00000000000..348a7541711
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/label.tex
@@ -0,0 +1,8 @@
+% This file is public domain.
+%
+\ifx\undefined \eplain \input eplain \fi
+
+\xrdef{a1@$^ ~&_}
+\xref{a1@$^ ~&_}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/latexcite.tex b/Master/texmf-dist/source/eplain/base/test/latexcite.tex
new file mode 100644
index 00000000000..5ad031aa1a6
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/latexcite.tex
@@ -0,0 +1,9 @@
+% This file is public domain.
+%
+\documentstyle{article}
+\begin{document}
+\cite{chicago,texbook,prime-number-theorem,1234567890)(@!`['";:]|<>./?-=+_$^&}
+\cite{others,accented}
+\bibliographystyle{plain}
+\bibliography{cite}
+\end{document}
diff --git a/Master/texmf-dist/source/eplain/base/test/liang.tex b/Master/texmf-dist/source/eplain/base/test/liang.tex
new file mode 100644
index 00000000000..975fa83d020
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/liang.tex
@@ -0,0 +1,300 @@
+% This file is public domain.
+%
+% Test double columns with headlines, single-column material, and a
+% \topinsert.
+\ifx\undefined\eplain \input eplain \fi
+%\catcode`@=11
+%\input gcol
+%\catcode`@=12
+\magnification=\magstep1
+\parskip=10pt
+\gutter = 1pc
+\hyphenation{pour-ed}
+
+\headline = {This is the headline \hfil}
+
+{\center
+ A test file for eplain
+ Karl\footnote\dag{Credit in a footnote.}
+}
+
+\topinsert
+This should appear at the top of the page, since it's a topinsert.
+\endinsert
+
+Here the main document starts. It should be in double columns until
+further notice. It's all one paragraph. I am going to use Wuthering
+Heights, as usual.
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings.
+
+Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, pour\-ed forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes!
+
+
+\doublecolumns
+Here the main document starts. It should be in double columns until
+further notice. It's all one paragraph. I am going to use Wuthering
+Heights, as usual.
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces.
+
+Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, pour\-ed forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult?
+
+What had played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! Here the main document starts. It should be in double columns
+ until
+further notice. It's all one paragraph. I am going to use Wuthering
+Heights, as usual. With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, pour\-ed forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult?
+What had played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes!
+
+\singlecolumn % an extra insert of singlecolumn
+I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+\doublecolumns % an extra insert of doublecolumns
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, pour\-ed forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, repoured forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+With that concluding word, the whole assembly,
+exalting their pilgrim's staves, rushed round me in a body; and I,
+having no weapon to raise in self-defence, commenced grappling with
+Joseph, my nearest and most ferocious assailant, for his. In the
+confluence of the multitude several clubs crossed; blows aimed at me
+fell on other sconces. Presently the whole chapel resounded with
+rappings and counter-rappings. Every man's hand was against his
+neighbour; and Branderham, unwilling to remain idle, repoured forth his
+zeal in a shower of loud taps on the boards of the pulpit, which
+responded so smartly that at last, to my unspeakable relief, they woke
+me. And what was it that had suggested the tremendous tumult? What had
+played Jabes's part in the row? Merely the branch of a fir-tree that
+touched my lattice, as the blast wailed by, and rattled its dry cones
+against the panes! I listened doubtingly an instant, detected the
+disturber, then turned and dozed, and dreamt again---if possible, still
+more disagreeably than before. This time I remembered I was lying in
+the oak closet, and I heard distinctly the gusty wind and the driving of
+the snow. I heard also the fir-bough repeat its teasing sound, and
+ascribed it to the right cause. But it annoyed me so much that I
+resolved to silence it, if possible; and I thought I rose and
+endeavoured to unhasp the casement. The hook was soldered into the
+staple---a circumstance observed by me when awake, but forgotten. ``I
+must stop it, nevertheless!'' I muttered, knocking my knuckles through
+the glass, and stretching an arm out to seize the importunate branch;
+instead of which, my fingers closed on the fingers of a little, icecold
+hand!
+
+The intense horror of nightmare came over me. I tried to draw
+back my arm, but the hand clung to it, and a most melancholy voice
+sobbed, ``Let me in---let me in!'' ``Who are you?'' I asked, struggling,
+meanwhile, to disengage myself. ``Catherine Linton,'' it replied
+shiveringly. (Why did I think of Linton? I had read Earnshaw twenty
+times for Linton.) ``I'm come home. I'd lost my way on the moor.'' As
+it spoke, I discerned, obscurely, a child's face looking through the
+window. Terror made me cruel; and finding it useless to attempt shaking
+the creature off, I pulled its wrist on to the broken pane, and rubbed
+it to and fro till the blood ran down and soaked the bedclothes. Still
+it wailed, ``Let me in!'' and maintained its tenacious gripe, almost
+maddening me with fear. ``How can I?'' I said at length. ``Let me go,
+if you want me to let you in!''
+
+\singlecolumn
+Now we should be typesetting in a single column, i.e., normally. The
+fingers relaxed; I snatched mine through the hole, hurriedly piled the
+books up in a pyramid against it, and stopped my ears to exclude the
+lamentable prayer. I seemed to keep them closed above a quarter of an
+hour; yet the instant I listened again, there was the doleful cry
+moaning on! ``Begone!'' I shouted; ``I'll never let you in---not if you
+beg for twenty years.'' ``It is twenty years,'' mourned the
+voice---``twenty years. I've been a waif for twenty years!'' Thereat
+began a feeble scratching outside, and the pile of books moved as if
+thrust forward. I tried to jump up, but could not stir a limb, and so
+yelled aloud in a frenzy of fright. To my confusion, I discovered the
+yell was not ideal. Hasty footsteps approached my chamber door; somebody
+pushed it open with a vigorous hand, and a light glimmered through the
+squares at the top of the bed. I sat shuddering yet, and wiping the
+perspiration from my forehead. The intruder appeared to hesitate, and
+muttered to himself. At last he said in a half-whisper, plainly not
+expecting an answer, ``Is any one here?'' I considered it best to
+confess my presence, for I knew Heathcliff's accents, and feared he
+might search further if I kept quiet. With this intention I turned and
+opened the panels. I shall not soon forget the effect my action
+produced. Heathcliff stood near the entrance, in his shirt and
+trousers, with a candle dripping over his fingers, and his face as white
+as the wall behind him. The first creak of the oak startled him like an
+electric shock. The light leaped from his hold to a distance of some
+feet, and his agitation was so extreme that he could hardly pick it up.
+``It is only your guest, sir,'' I called out, desirous to spare him the
+humiliation of exposing his cowardice further. ``I had the misfortune
+to scream in my sleep, owing to a frightful nightmare. I'm sorry I
+disturbed you.''
+\end
+From: Jun-Jih Liang <cip224@wpax01.physik.uni-wuerzburg.de>
+Subject: A vbox underfull while using eplain.tex
+To: karl@cs.umb.edu
+Date: Wed, 10 Nov 93 11:47:39 MEZ
+
+Dear Karl:
+
+ I'd like to appreciate your kindness to put the "eplain.tex" in the public
+domain so that I can switch \doublecolumns and \singlecolumn in an article.
+After a little change in the file "column.tex" which is located at the
+subdirectory "/eplain-2.3/test" I have got an unexpected output. There is a
+"verticle underfull (Underfull \vbox ...)" at the first page. What I've done at
+the file are:
+
+1) magnify the text font at 1 step (\magnification=\magstep1)
+2) add an extra "\singlecolumn" and "\doublecolumns" after the first
+ "doublecolumn".
+
+ Would you please tell me how can I get rid of the verticle underfull and
+get the normal single- and doublecolumns output at the same page? Thank you for
+your helpness in advance!
+
+ Sincerely,
+ Jun-Jih Liang
+
+P.S. In the following two mails I attach the file "column.tex" which has
+changed by me in the first and a Postcript formated "column.ps" which is
+transformed from "column.dvi" in the second.
+
+
+
diff --git a/Master/texmf-dist/source/eplain/base/test/list.tex b/Master/texmf-dist/source/eplain/base/test/list.tex
new file mode 100644
index 00000000000..68775b3d822
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/list.tex
@@ -0,0 +1,90 @@
+% This file is public domain.
+%
+% Test file for lists.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+{\parindent = 0pt
+ \parskip = .5\baselineskip
+\unorderedlist
+ \li hello there
+
+ This item has two paragraphs since we want to see if it
+ works anywhere, and of course we want the paragraphs to be long.
+
+ \li We did this list with zero parindent and nonzero parskip.
+\endunorderedlist
+}
+
+\unorderedlist
+ \li hello there
+
+ This item has two paragraphs since we want to see if it
+ works anywhere, and of course we want the paragraphs to be long.
+
+ \li second item
+ \numberedlist
+ \li nested
+ \li and again.
+
+ This item has two paragraphs, also, since we want to see if it
+ works anywhere, and of course we want the paragraphs to be long.
+
+ \li and again
+ \numberedlist
+ \li I am going three-level with you.
+ \endnumberedlist
+ \unorderedlist
+ \li I'm not.
+
+ This item has two paragraphs, also, since we want to see if
+ it works anywhere, and of course we want the paragraphs to
+ be long.
+
+ In fact, maybe we better make it three paragraphs. What
+ will happen then? This should tell us.
+
+ \endunorderedlist
+ \endnumberedlist
+\endunorderedlist
+
+This is a paragraph between the lists. It should be indented. But we'll
+make it go on for more than one line, so we'll be able to see where the
+left margin is.
+
+\numberedlist
+ \li hello there
+
+ This item has two paragraphs. Isn't that annoying?
+ In fact, the second paragraph has more than one line, at least
+ I'm going to make it long enough so that that is true---I hope.
+
+ \li second item
+ \numberedlist
+ \li nested
+ \li and again
+ \li and again
+ \numberedlist
+ \li I am going three-level with you.
+ \endnumberedlist
+ \unorderedlist
+ \li I'm not.
+ \endunorderedlist
+ \endnumberedlist
+\endnumberedlist
+
+\listleftindent = 4pc
+\unorderedlist
+\li A shorter list, but with a bigger indent.
+\numberedlist \li A nested list.
+\endnumberedlist
+\li The second item.
+\endunorderedlist
+
+A list with an xref label:
+\numberedlist
+\li[listitem] This is the first.
+\endnumberedlist
+
+And now we can refer to that item: \xrefn{listitem}.
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/listing.tex b/Master/texmf-dist/source/eplain/base/test/listing.tex
new file mode 100644
index 00000000000..60ae74c9ef3
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/listing.tex
@@ -0,0 +1,10 @@
+% This file is public domain.
+%
+\input eplain
+
+\listing{verbatim.tex}
+
+\let\setuplistinghook = \linenumberedlisting
+\listing{verbatim.tex}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/logo.tex b/Master/texmf-dist/source/eplain/base/test/logo.tex
new file mode 100644
index 00000000000..5b137a56c46
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/logo.tex
@@ -0,0 +1,20 @@
+% This file is public domain.
+%
+\input eplain
+
+\xspaceskip = 2em
+Sentence-ending \TeX. And sentence \TeX\ middle. Sentence.
+
+\LaTeX
+
+\AMSTeX
+
+\LAMSTeX
+
+\BibTeX
+
+\MF
+
+\SLITEX
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/loop.tex b/Master/texmf-dist/source/eplain/base/test/loop.tex
new file mode 100644
index 00000000000..7f6b7bd4e89
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/loop.tex
@@ -0,0 +1,20 @@
+% This file is public domain.
+%
+\input eplain
+
+\def\iterate{%
+ \let\next\relax
+ \body
+ \let\next\iterate
+ \fi
+ \next
+}
+
+\count255 = 5
+\loop
+ loop iteration \number\count255 %\par
+ \ifnum\count255<3 \else
+ \advance\count255 by -1
+\repeat
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/loopnext.tex b/Master/texmf-dist/source/eplain/base/test/loopnext.tex
new file mode 100644
index 00000000000..8d77b8622bf
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/loopnext.tex
@@ -0,0 +1,21 @@
+% This file is public domain.
+%
+% Date: Tue, 2 May 2000 17:27:38 -0400
+% From: "Peter Kabal" <kabal@ece.mcgill.ca>
+% To: <karl@cs.umb.edu>
+% Subject: eplain interaction with TeXdraw
+%
+% A TeXdraw user alerted me to the fact that the TeXdraw routines gave a
+% warning message when used together with eplain. It seems that eplain
+% defines \iterate
+% differently than plain tex. Using plain TeX, there is no problem, but using
+% eplain one there is.
+
+\input eplain
+
+\input texdraw
+\btexdraw
+ \lpatt(0.1 0.1)
+\etexdraw
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/mag.tex b/Master/texmf-dist/source/eplain/base/test/mag.tex
new file mode 100644
index 00000000000..8704c008996
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/mag.tex
@@ -0,0 +1,14 @@
+% This file is public domain.
+%
+% \magnification=1200
+\input eplain.tex
+\paperheight=11truein
+\paperwidth=8.5truein
+\leftmargin=2.5truecm
+\rightmargin=2.5truecm
+\topmargin=2.5truecm
+\bottommargin=2.5truecm
+
+This is a test
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/makecol.tex b/Master/texmf-dist/source/eplain/base/test/makecol.tex
new file mode 100644
index 00000000000..4c0379a703d
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/makecol.tex
@@ -0,0 +1,17 @@
+% This file is public domain.
+%
+\input eplain
+
+Should have two columns with 1--3 in the first, and 4--6 in the second.
+
+\loggingall
+
+\makecolumns 6/2:
+one
+two
+three
+four
+five
+six
+I should be after the table.
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/margin.tex b/Master/texmf-dist/source/eplain/base/test/margin.tex
new file mode 100644
index 00000000000..8275e543326
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/margin.tex
@@ -0,0 +1,68 @@
+% This file is public domain.
+%
+\input marg
+
+\headline = {headline with descender: p\hfil}
+\parindent = 0pt
+
+% Assigning to \topskip increases the space at the top of the page,
+% between the headline and the text.
+%
+%\topskip = .5in
+
+
+\topmargin = 3in \leftmargin = 3in
+\bottommargin = 3in \rightmargin = 3in
+
+This is the first line of text. The top of it should be 3in from the
+top of the paper.
+\vfill
+This is in the middle. The left margin should be three inches, and so
+should the right margin (on the whole page, not just here, of course).
+\vfill
+The last line's baseline should be 3in from the bottom.
+(This page tested assignments that increase the margins.)
+\eject
+
+
+\advancetopmargin by -1in \advanceleftmargin by -1in
+\advancebottommargin by -1in \advancerightmargin by -1in
+
+This is the first line of text. The top of it should be 2in from the
+top of the paper.
+\vfill
+This is in the middle. The left and right margins should be two inches
+each.
+\vfill
+The last line's baseline should be 2in from the bottom.
+(This page tested advances that decreased the margins.)
+\eject
+
+
+\topmargin = .5in \leftmargin = .5in
+\bottommargin = .5in \rightmargin = .5in
+
+This is the first line of text. The top of it should be .5in from the
+top of the paper.
+\vfill
+This is in the middle. The left and right margins should be .5in each,
+just as you might expect by now, if you've been reading.
+\vfill
+The last line's baseline should be .5in from the bottom.
+(This page tested assignments that decreased the margins.)
+\eject
+
+
+\advancetopmargin by 1in \advanceleftmargin by 1in
+\advancebottommargin by 1in \advancerightmargin by 1in
+
+This is the first line of text. The top of it should be 1.5in from the
+top of the paper.
+\vskip0pt plus1filll
+I bet you can guess what the left and right margins should be: yup,
+1.5in. Let's make this line a little longer, so it will actually hit
+the margin.
+\vskip0pt plus1filll
+The last line's baseline should be 1.5in from the bottom.
+(This page tested assignments that increased the margins.)
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/matrix.tex b/Master/texmf-dist/source/eplain/base/test/matrix.tex
new file mode 100644
index 00000000000..4c966c312b4
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/matrix.tex
@@ -0,0 +1,18 @@
+% This file is public domain.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+This tests matrix inside eqalignno with leftdisplays.
+
+% $$\eqalignno{
+% \matrix{a \cr b\cr c} & = 1 & 1 \cr
+% }$$
+
+\loggingall
+
+\leftdisplays
+$$\eqalignno{
+ \matrix{a \cr b\cr c} & = 1 & 1 \cr
+}$$
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/mdisplay.tex b/Master/texmf-dist/source/eplain/base/test/mdisplay.tex
new file mode 100644
index 00000000000..96ed8543b9c
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/mdisplay.tex
@@ -0,0 +1,215 @@
+% This file is public domain.
+%
+% Test math displays.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+%\loggingall
+
+A simple one, done with plain, for comparison (it should come out
+centered). Because of the way that \TeX's modes work, you should never
+leave a blank line (i.e., cause a par command) before a display. When
+\TeX\ sees a \$ in vertical mode, it switches to horizontal mode; but
+then when the display starts, it goes back to vertical mode, thus
+causing an extraneous blank line before the display. (Plain \TeX\ sets
+abovedisplayskip to about a baselineskip, so you are going to get one
+blank line from that (unless the line above the display is short, in
+which case aboveshortdisplayskip is used, which is 3pt or some such);
+but if a par intervenes between the end of the paragraph and the
+beginning of the display, you get a second one.)
+$$x = y + z$$
+
+After a centereddisplays:
+\centereddisplays
+$$d+e+f$$
+
+Now starting leftdisplays.
+\leftdisplays
+
+No equation number:
+$$A = B + C$$
+
+Do another leftdisplays.
+\leftdisplays
+$$a+n=m$$
+
+Equation number on right:
+$$D = E + F\eqno (r)$$
+
+Equation number on left:
+$$G = H + I\leqno (l)$$
+
+Using eqdef:
+$$J = K + L\eqdef{hello}$$
+
+Here is one done with displaylines:
+$$\displaylines{x=1\cr}$$
+
+Let's do those again, indented by one inch plus the paragraph indentation:
+{\leftdisplayindent = 1in
+ No equation number:
+ $$A = B + C$$
+
+ Equation number on right:
+ $$D = E + F\eqno (r)$$
+
+ Equation number on left:
+ $$G = H + I\leqno (l)$$
+
+ Using eqdef:
+ $$J = K + L\eqdef{hello}$$
+
+ Here is one done with displaylines:
+ $$\displaylines{x=1\cr}$$
+}
+
+\hrule
+\smallskip
+The rule above just makes it easier to see the margins.
+
+Another displaylines, this one should end up on the right.
+$$\displaylines{\hfill y=2\cr}$$
+
+A displaylines with an eqno:
+$$\displaylines{x=1 \eqno{d}\cr}$$
+
+A displaylines with an eqdef:
+$$\displaylines{x=1 \eqdef{eqdef-displ}\cr}$$
+
+{\leftskip = 14pt
+An indented displaylines with an eqdef:
+$$\displaylines{x=1 \eqdef{eqdef-displ}\cr}$$
+
+}
+
+Here is one with done with eqalign (the ='s should line up):
+$$\eqalign{
+ a+b&=c\cr
+ dq+er&=f\cr
+}$$
+
+An eqalign with a noalign inside:
+$$\eqalign{
+ a+b&=c\cr
+ g+h&=i\cr
+}$$
+
+And one with eqalignno:
+$$\eqalignno{
+ a+b&=c&(1)\cr
+ d+e&=f&(1*)\cr
+ g+h&=i&\eqdef{eqdef-2}\cr
+}$$
+
+An eqalignno with a noalign inside:
+$$\eqalignno{
+ a+b&=c&(1)\cr
+\noalign{and}
+ g+h&=i&\eqdef{eqdef-2}\cr
+}$$
+
+And one (indented more) with leqalignno:
+{\leftdisplayindent = 1in
+$$\leqalignno{
+ a+b&=c&(1)\cr
+ dt+eg&=f&(1*)\cr
+ g+h&=i&\eqdef{eqdef-3}\cr
+}$$
+}
+
+A cases, from p.175 of the TeXbook.
+$$
+ |x| = \cases{x, &if $x\ge0$;\cr
+ -x, &otherwise.\cr
+}$$
+
+A pmatrix, from p.176.
+$$\pmatrix{
+ x-\lambda&1&0\cr
+ 0&x-\lambda&1\cr
+ 0&0&x-\lambda\cr
+}$$
+
+
+The rule below just makes it easier to see the margins.
+\smallskip
+\hrule
+\bigskip
+
+Back to centered displays now.
+\centereddisplays
+
+No equation number:
+$$A = B + C$$
+
+Equation number on right:
+$$D = E + F\eqno (r)$$
+
+Equation number on left:
+$$G = H + I\leqno (l)$$
+
+Using eqdef:
+$$J = K + L\eqdef{hello}$$
+
+Here is one done with displaylines:
+$$\displaylines{x=1\cr}$$
+
+\hrule
+\smallskip
+The rule above just makes it easier to see the margins.
+
+Another displaylines, this one should end up on the right.
+$$\displaylines{\hfill y=2\cr}$$
+
+Here is one with done with eqalign (the ='s should line up):
+$$\eqalign{
+ a+b&=c\cr
+ dq+er&=f\cr
+}$$
+
+And one with eqalignno:
+$$\eqalignno{
+ a+b&=c&(1)\cr
+ d+e&=f&(1*)\cr
+ g+h&=i&\eqdef{eqdef-2}\cr
+}$$
+
+An eqalignno with a noalign inside:
+$$\eqalignno{
+ a+b&=c&(1)\cr
+\noalign{and}
+ g+h&=i&\eqdef{eqdef-2}\cr
+}$$
+
+And one (indented more) with leqalignno:
+{\leftdisplayindent = 1in
+$$\leqalignno{
+ a+b&=c&(1)\cr
+ dt+eg&=f&(1*)\cr
+ g+h&=i&\eqdef{eqdef-3}\cr
+}$$
+}
+
+The rule below just makes it easier to see the margins.
+\smallskip
+\hrule
+\bigskip
+
+
+A cases, from p.175 of the TeXbook.
+$$
+ |x| = \cases{x, &if $x\ge0$;\cr
+ -x, &otherwise.\cr
+}$$
+
+A pmatrix, from p.176.
+$$\pmatrix{
+ x-\lambda&1&0\cr
+ 0&x-\lambda&1\cr
+ 0&0&x-\lambda\cr
+}$$
+
+Now after a second centereddisplays:
+\centereddisplays
+$$a + b = c$$
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/names.tex b/Master/texmf-dist/source/eplain/base/test/names.tex
new file mode 100644
index 00000000000..b996738a63a
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/names.tex
@@ -0,0 +1,21 @@
+% This file is public domain.
+%
+\input texnames.sty
+
+\parskip = \baselineskip
+\nopagenumbers
+
+\def\test{%
+ \AMSTeX\par
+ \BibTeX\par
+ \LAMSTeX\par
+ \LaTeX\par
+ \MF\par
+ \SLiTeX\par
+}
+
+\rm \test
+\it \test
+\bf \test
+\sl \test
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/noarrow.tex b/Master/texmf-dist/source/eplain/base/test/noarrow.tex
new file mode 100644
index 00000000000..f0379f7f813
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/noarrow.tex
@@ -0,0 +1,8 @@
+% This file is public domain.
+%
+\let\noarrow = t
+\input eplain
+
+\show\commdiag
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/nobib.tex b/Master/texmf-dist/source/eplain/base/test/nobib.tex
new file mode 100644
index 00000000000..e2586ecd8c2
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/nobib.tex
@@ -0,0 +1,10 @@
+% This file is public domain.
+%
+\let\nobibtex = t
+\ifx\eplain\undefined\input eplain \fi
+
+\tokstostring{abc}
+\xrdef{label}
+\xref{label}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/nonouter.tex b/Master/texmf-dist/source/eplain/base/test/nonouter.tex
new file mode 100644
index 00000000000..32aa5c9fee1
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/nonouter.tex
@@ -0,0 +1,11 @@
+% This file is public domain.
+%
+\outer\def\nonouterdef#1#2{\begingroup
+ \def\startdef{\def #1\bgroup}%
+% \expandafter\defstart \csname #2\endcsname\egroup
+ \def\outername{\csname #2\endcsname}%
+ \expandafter\startdef \outername \egroup
+\endgroup}
+
+\tracingall
+\nonouterdef\innernewwrite{newwrite}
diff --git a/Master/texmf-dist/source/eplain/base/test/optional.tex b/Master/texmf-dist/source/eplain/base/test/optional.tex
new file mode 100644
index 00000000000..f7cc917000e
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/optional.tex
@@ -0,0 +1,30 @@
+% This file is public domain.
+%
+% Test optional arguments.
+
+\ifx\undefined\eplain \input eplain \fi
+
+\catcode`@ = \letter
+\def\foo{\@getoptionalarg\finfoo}
+\def\finfoo#1{%
+ \edef\firstarg{\@optionalarg}
+ \edef\mandatoryarg{#1}%
+ \@getoptionalarg\finfinfoo
+}
+\def\finfinfoo{%
+ The first optional argument is `\firstarg', the mandatory argument
+ is `\mandatoryarg', and the second optional argument is `\@optionalarg'.
+ \par
+}
+
+\loggingall
+\foo[a {\cite[p.10]{xyz}} b]{mand2}
+
+\foo{mand}
+\foo[opt1]{mand}
+\foo{mand}[opt2]
+\foo[opt1]{mand}[opt2]
+\foo[opt1]{mand}
+ [opt2 on a separate line]
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/outer.tex b/Master/texmf-dist/source/eplain/base/test/outer.tex
new file mode 100644
index 00000000000..e424bebed12
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/outer.tex
@@ -0,0 +1,26 @@
+% This file is public domain.
+%
+% Test file to make sure all the inner allocation routines really are
+% inner.
+%
+\input eplain
+
+\def\foo{%
+ \innernewcount\a
+ \innernewdimen\b
+ \innernewskip\c
+ \innernewmuskip\d
+ \innernewbox\e
+ \innernewhelp\f{Help.}%
+ \innernewtoks\g
+ \innernewread\h
+ \innernewwrite\i
+ \innernewfam\j
+ \innernewlanguage\k
+ \innernewinsert\l
+ \innernewif\ifm
+}
+
+\foo
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/page.tex b/Master/texmf-dist/source/eplain/base/test/page.tex
new file mode 100644
index 00000000000..5112d5d9ed4
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/page.tex
@@ -0,0 +1,8 @@
+% This file is public domain.
+%
+\hrule
+top of page
+\vskip 0pt plus1filll
+bottom of page
+\hrule
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/path.tex b/Master/texmf-dist/source/eplain/base/test/path.tex
new file mode 100644
index 00000000000..8a891bd3623
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/path.tex
@@ -0,0 +1,25 @@
+% This file is public domain.
+%
+% Test the \path macro.
+
+\input eplain
+%\input path.sty
+
+This is a normal path: \path|karl@cs.umb.edu|. This is a somewhat
+longer path: \path|letters@kropotkin.gnu.ai.mit.edu|. This is a still
+longer path:
+\path|megan@agroecology.university-of-california-at-santa-cruz.edu|. I'm
+making this all one paragraph so the path macro will have a chance to
+show its stuff. This path has dollar signs and other strange characters
+(but no vertical bars) in it: \path|#$%^_<>|. Now I'm going to change
+the discretionaries to only be at !'s. \discretionaries|!| Now this path
+should break only at !'s: \path|-hello!..from!@@bang!land|. Now I'm
+going to change things so backslash is the delimiter.
+\specialpathdelimiterstrue
+\path\##hello!there!@.@again!...we!**still!_have!-bangs!\. That last
+was delimited by backslashes, now let's do one that isn't delimited by
+backslashes: \path@hi, there!this is fun!@. I'll go on for a little
+while not doing anything in particular, so \TeX\ will have a chance to
+break the paragraph nicely. That's all, folks!
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/pcol.tex b/Master/texmf-dist/source/eplain/base/test/pcol.tex
new file mode 100644
index 00000000000..52bfc2cc77d
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/pcol.tex
@@ -0,0 +1,183 @@
+% This file is public domain.
+%
+% These are the double-column macros from Paul Abrahams, Dec 1991
+% They add the following features:
+% \ifbalance (by default true, causes last page to be balanced)
+% \everycolumn (a token list, useful for marks)
+% \pageeject
+% \eject does a column eject
+
+\newtoks\mainoutput
+\newbox\partialpage
+\newdimen\fullvsize \newdimen \fullhsize
+\newbox\leftcolumn \newbox \rightcolumn
+\newbox\savefootins \newskip\footskip
+\newbox\savetopins \newskip\topinsskip
+\newif\ifbalance \balancetrue
+\newtoks\everycolumn
+
+
+\def\pageeject{\penalty -10005 }%
+
+\def\doublecolumns{%
+ \mainoutput = \output % Save the previous \output.
+ %
+ % This grabs any single-column material.
+ \output = {\global\setbox\partialpage = \vbox{\unvbox255}}%
+ \vskip\abovedoublecolumnskip
+ \par % \par updates \pagetotal
+ \pagegoal = \pagetotal
+ \break % Now expand the \output we assigned just above.
+ \output = {\doublecolumnoutput}%
+ %
+ % Set up \hsize and \vsize for double columns.
+ \fullvsize = \vsize
+ \fullhsize = \hsize
+ \advance\hsize by -\gutter
+ \divide \hsize by 2
+ \advance\vsize by -\ht\partialpage
+ %
+ % Take account of existing insertions.
+ \ifvoid\footins\else
+ \advance\vsize by -\ht\footins
+ \advance\vsize by -\skip\footins
+ \fi
+ \setbox\savefootins = \box\footins
+ \footskip = \skip\footins
+ %
+ \ifvoid\topins\else
+ \advance\vsize by -\ht\topins
+ \advance\vsize by -\skip\topins
+ \fi
+ \setbox\savetopins = \box\topins
+ \topinsskip = \skip\topins
+ %
+ % Start at the left, clear the existing columns.
+ \let\lr = L%
+ \setbox0 = \box\leftcolumn \setbox0 = \box\rightcolumn
+}%
+%
+% This routine actually does the outputting.
+\def\doublecolumnoutput{%
+ \ifbalance\else \ifnum \outputpenalty < -10000
+ \setbox255 = \vbox{\unvbox255 \vfil}%
+ \fi\fi
+ %
+ \the\everycolumn
+ \if \lr L%
+ \buildcolumn\leftcolumn
+ \global\let\lr = R%
+ \else
+ \buildcolumn\rightcolumn
+ \global\let\lr = L%
+ \fi
+ %
+ \ifnum \outputpenalty < -10000
+ \ifbalance
+ \ifdim \ht\leftcolumn > 8\baselineskip
+ \balancecolumns
+ \global \let \lr = L%
+ \fi\fi\fi
+ %
+ \if \lr L%
+ \setbox255 = \vbox{%
+ \unvbox\partialpage
+ \dimen0 = \ht\leftcolumn \dimen1 = \dp\leftcolumn
+ \joincolumns
+ \ifnum \outputpenalty = -10005 \vfil \fi
+ }%
+ % The restoration of the insertion boxes happens only once, since
+ % they are empty thereafter.
+ \setbox\footins = \box\savefootins
+ \setbox\topins = \box\savetopins
+ \vsize = \fullvsize % Because we've taken care of \partialoutput
+ \ifnum \outputpenalty = -10006
+ \unvbox255
+ \else
+ \the\mainoutput
+ \global\vsize = \fullvsize
+ \fi
+ \fi
+}%
+%
+%
+% \joincolumns joins \leftcolumn and \rightcolumn into a vbox that aligns
+% the tops of the two columns and has the depth of the deeper column.
+% It adds the resulting box to the main vertical list.
+%
+\def\joincolumns{%
+ \dimen0 = \dp\leftcolumn \dimen1 = \dp \rightcolumn
+ \setbox0 = \hbox to \fullhsize{%
+ \vtop to \ht\leftcolumn{\unvbox\leftcolumn}%
+ \hfil
+ \vtop to \ht\rightcolumn{\unvbox\rightcolumn}%
+ }%
+ \dimen2 = \boxmaxdepth % For restoring it later
+ \ifdim \dimen0 < \dimen1
+ \boxmaxdepth = \dimen1
+ \else
+ \boxmaxdepth = \dimen0
+ \fi
+ \setbox0 = \vbox{\box0}%
+ \boxmaxdepth = \dimen2
+ \box0 % Produce for the calling context
+}%
+
+\def\buildcolumn #1{%
+ \ifnum \outputpenalty < -9999
+ \global \setbox #1 = \vbox{\pagecontents}%
+ \else
+ \global \setbox #1 = \vbox to \vsize{\pagecontents}%
+ \fi
+}%
+%
+%
+% Go back to single-column typesetting. Unfortunately, we cannot start
+% a group in \doublecolumns and end it here, because some documents
+% might want double-column mode to continue to the end. So we have to
+% restore the things we've changed manually.
+%
+\def\singlecolumn{%
+ \penalty -10006
+ \output = \mainoutput
+ \hsize = \fullhsize
+ \vsize = \fullvsize
+ %
+ % Add \belowdoublecolumnskip if there's enough room, otherwise a \vfil
+ % to fill out the page.
+ \dimen0 = \pagetotal \advance \dimen0 by \belowdoublecolumnskip
+ \ifdim \dimen0 < \pagegoal
+ \vskip\belowdoublecolumnskip
+ \else
+ \vfil
+ \fi
+ \allowbreak
+}%
+%
+\def \balancecolumns{%
+ \setbox\leftcolumn = \vbox{\unvbox\leftcolumn \unskip}%
+ \setbox\rightcolumn = \vbox{\unvbox\rightcolumn \unskip}%
+ \setbox0 = \vbox{%
+ \dimen0 = \dp\leftcolumn
+ \unvbox \leftcolumn
+ \if \lr L
+ \kern -\dimen0
+ \vskip -\topskip
+ \vskip \baselineskip
+ \unvbox \rightcolumn
+ \fi
+ }%
+ \dimen0 = \ht0
+ \advance \dimen0 by \topskip \advance \dimen0 by -\baselineskip
+ \divide \dimen0 by 2 \splittopskip = \topskip
+ \count@ = \vbadness \vbadness = 10000
+ \loop
+ \setbox2 = \copy0
+ \setbox1 = \vsplit2 to \dimen0
+ \ifdim \ht2 > \dimen0
+ \advance \dimen0 by 1pt
+ \repeat
+ \vbadness = \count@
+ \setbox \leftcolumn = \vbox to \dimen0{\unvbox1}%
+ \setbox \rightcolumn = \vbox to \dimen0{\unvbox2}%
+}%
diff --git a/Master/texmf-dist/source/eplain/base/test/pdftex.tex b/Master/texmf-dist/source/eplain/base/test/pdftex.tex
new file mode 100644
index 00000000000..7aa765d2c89
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/pdftex.tex
@@ -0,0 +1,112 @@
+\input ../eplain
+%\enablehyperlinks[nolinks]
+%\enablehyperlinks[pdftex]
+\enablehyperlinks
+
+\beginpackages
+\usepackage[dvipsnames]{color}
+\endpackages
+
+% Execute #1 then print it verbatim and indented.
+\def\c{\cf\indent\relax}
+% Same as \c, but do not indent and at the end say \hlend.
+\def\f{\cf\noindent\hlend}
+%
+\def\cf#1#2#3{%
+ \def\temp{#3}%
+ \edef\cftemp{\sanitize\temp}%
+ #1#3\expandafter\verbatim\cftemp\endverbatim#2\par
+}
+%
+\newcount\destcount
+% Execute `#1{d\the\destcount}' then print it (`#1', `{d', and `}' are printed
+% verbatim; `\the\destcount' is expanded).
+\def\d{\dl\relax}
+% Same as \d, but at the end also say \hlend.
+\def\l{\dl\hlend}
+%
+\def\dl#1#2{%
+ \global\advance\destcount by1
+ \toks0={#2}%
+ \edef\temp{\the\toks0{d\the\destcount}}%
+ \edef\dltemp{\sanitize\temp}%
+ \noindent#2{d\the\destcount}\expandafter\verbatim\dltemp\endverbatim#1\par
+}
+
+\pdfpagewidth=8.5in
+\pdfpageheight=11in
+
+
+
+\leftline{\bf Destinations}
+\medskip
+
+{\tt\global\parindent=4em}
+
+\d{\hldest{}{}}
+\c{\hldestopts{zoom=2345}}
+\d{\hldest{}{}}
+\medskip
+\c{\hldesttype{fitr}}
+\c{\hldestopts{width=\hsize}}
+\d{\hldest{}{}}
+\c{\def\myopts{width=.5\hsize,depth=.25\hsize}}
+\d{\hldest{}{\myopts,height=.25\hsize}}
+\medskip
+\c{\let\myopts\empty}
+\c{\hldestopts{raise=2\normalbaselineskip}}
+\d{\hldest{xyz}{\myopts,zoom=2500}}
+\d{\hldest{xyz}{raise=\ht\strutbox,zoom=3000}}
+\medskip
+\makeatletter
+\c{\def\mydest{\pdfdest name{\@hllabel} xyz}}
+\d{\hldest{raw}{cmd=mydest}}
+\resetatcatcode
+\medskip
+\d{\hldest{fit}{}}
+\d{\hldest{fith}{}}
+\d{\hldest{fitv}{}}
+\d{\hldest{fitb}{}}
+\d{\hldest{fitbh}{}}
+\d{\hldest{fitbv}{}}
+\vfil\eject
+
+
+
+\leftline{\bf Links}
+\medskip
+
+{\tt\global\parindent=4.5em}
+
+\destcount=0 % Reset destination count.
+\l{\hlstart{name}{}}
+\c{\hlopts{bstyle=U}}
+\l{\hlstart{name}{}}
+\l{\hlstart{}{bstyle=D,bdash=2 4,bcolor=1 0 0,hlight=I}}
+\l{\hlstart{}{bstyle=B,bwidth=3}}
+\c{\hlopts{bcolor=0 0 1}}
+\l{\hlstart{}{bstyle=I,bwidth=4}}
+\l{\hlstart{}{bstyle=U,bwidth=1}}
+\c{\hlopts{bstyle=S}}
+\l{\hlstart{}{hlight=I,bcolor=1 .2 .2,bwidth=2}}
+\l{\hlstart{}{hlight=N,bstyle=D,bwidth=3}}
+\l{\hlstart{}{hlight=O}}
+\l{\hlstart{}{hlight=P,bcolor=.3 .6 .7}}
+\l{\hlstart{}{bstyle=D,bdash=2 4 6}}
+\l{\hlstart{}{bwidth=0}}
+\l{\hlstart{}{bstyle=D,bdash=2 4 6 8}}
+\f{\hlstart{page}{pagefit=/FitH 600}{1}}
+\f{\hlstart{filename}{file=hlink.pdf,newwin=1}{eq1}}
+\f{\hlstart{filepage}{file=hlink.pdf,pagefit=/FitR 50 100 300 500}{1}}
+\f{\hlstart{filepage}{file=hlink.pdf,pagefit=/FitB}{2}}
+\f{\hlstart{url}{}{http://tug.org/eplain/}}
+\c{\def\mycmd{\pdfstartlink goto page 1 {/Fit}}}
+\f{\hlstart{raw}{cmd=mycmd}{}}
+
+
+
+\bye
+
+% Local variables:
+% compile-command: "(cd .. && make eplain.tex) && pdftex --interact=nonstopmode pdftex.tex"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/psfont.map b/Master/texmf-dist/source/eplain/base/test/psfont.map
new file mode 100644
index 00000000000..6b25d458abb
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/psfont.map
@@ -0,0 +1,78 @@
+% This file is public domain.
+%
+% +--------------------------------------------------------------------+
+% | |
+% | Font mapping for Turing |
+% | ----------------------- |
+% | |
+% | Letter Font Letter Qualifier |
+% | ------ ------------ ------ ------------ |
+% | A Avant-Garde B Bold |
+% | B Bookman D Demi |
+% | C Courier I Italic |
+% | H Helvetica L Light |
+% | N New-Century M Medium |
+% | Schoolbook O Oblique |
+% | P Palatino R Roman |
+% | S Symbol S Small Caps |
+% | T Times |
+% | ZC Zapf Chancery |
+% | ZD Zapf Dingbats |
+% | |
+% +--------------------------------------------------------------------+
+
+ \def\SYSTEM{Turing}
+
+ \def\AB@#1pt{pagk at #1pt}
+ \def\ABO@#1pt{pagko at #1pt}
+ \def\AD@#1pt{pagd at #1pt}
+ \def\ADO@#1pt{pagdo at #1pt}
+
+ \def\BD@#1pt{pbkd at #1pt}
+ \def\BDI@#1pt{pbkdi at #1pt}
+ \def\BL@#1pt{pbkl at #1pt}
+ \def\BLI@#1pt{pbkli at #1pt}
+ \def\BO@#1pt{pbkro at #1pt}
+
+ \def\CB@#1pt{pcrb at #1pt}
+ \def\CBO@#1pt{pcrbo at #1pt}
+ \def\CM@#1pt{pccr at #1pt}
+ \def\CO@#1pt{pccro at #1pt}
+
+ \def\HB@#1pt{phvb at #1pt}
+ \def\HBO@#1pt{phvbo at #1pt}
+ \def\HM@#1pt{phvr at #1pt}
+ \def\HO@#1pt{phvro at #1pt}
+
+ \def\NB@#1pt{pncb at #1pt}
+ \def\NBI@#1pt{pncbi at #1pt}
+ \def\NI@#1pt{pncri at #1pt}
+ \def\NR@#1pt{pncr at #1pt}
+ \def\NO@#1pt{pncro at #1pt}
+
+ \def\PB@#1pt{pplb at #1pt}
+ \def\PBI@#1pt{pplbi at #1pt}
+ \def\PBO@#1pt{pplbo at #1pt}
+ \def\PI@#1pt{pplri at #1pt}
+ \def\PO@#1pt{pplro at #1pt}
+ \def\PR@#1pt{pplr at #1pt}
+
+ \def\TB@#1pt{ptmb at #1pt}
+ \def\TBI@#1pt{ptmbi at #1pt}
+ \def\TBO@#1pt{ptmbo at #1pt}
+ \def\TI@#1pt{ptmri at #1pt}
+ \def\TIU@#1pt{ptmru at #1pt}
+ \def\TO@#1pt{ptmro at #1pt}
+ \def\TR@#1pt{ptmr at #1pt}
+
+ \def\ZCMI@#1pt{pzcmi at #1pt}
+ \def\ZD@#1pt{pzdr at #1pt}
+
+ \def\S@#1pt{psyr at #1pt}
+ \def\SO@#1pt{psyro at #1pt}
+ \def\SX@#1pt{psyrx at #1pt}
+
+ \def\TRS@#1pt{ptmrc at #1pt}
+ \def\PRS@#1pt{pplrc at #1pt}
+ \def\NRS@#1pt{pncrc at #1pt}
+ \def\BS@#1pt{pblrc at #1pt}
diff --git a/Master/texmf-dist/source/eplain/base/test/rex.tex b/Master/texmf-dist/source/eplain/base/test/rex.tex
new file mode 100644
index 00000000000..7fc90ba9367
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/rex.tex
@@ -0,0 +1,277 @@
+% This file is public domain.
+%
+%Date: Fri, 08 May 92 12:28:17 PDT
+%From: Rex Shudde <0024P%NAVPGS.BITNET@CORNELLC.cit.cornell.edu>
+%Subject: Eplain document
+%To: karl berry <karl@cs.umb.edu>
+%
+%Karl,
+%
+%Attached is an emulation of my document. Re-iterating, (1) the title should be
+%on the first page with the abstract, and a horizontal rule should span the
+%entire first page, and (2) the second footnote is referenced in the second
+%column on third page.
+%
+%Undoubtedly I've violated some of the rules of either TeX or eplain, but I
+%don't know what.
+%
+%Again, many thanks.
+%
+%Rex
+%
+%Bitnet: 0024p@navpgs
+%Internet: 0024p@cc.nps.navy.mil
+%.............................................................................
+%\magnification=\magstep0
+\input eplain
+\input tables %This is Ferguson's INRSTeX Tables (a very old version).
+
+\hbadness = 100000 \vbadness = 10000 \hfuzz = \maxdimen
+\tolerance=2000
+
+\def\SP{\ }
+\def\throwaway#1{}
+\def\checkspace{\ifx \next\
+\let\result=\throwaway
+ \else \let\result=\ignorespaces \fi \result }
+\font\bigfont=cmr10 scaled \magstep5
+\def\bfl#1{\setbox0=\hbox {{\bigfont #1}\thinspace}
+ \noindent \hangindent \wd0 \hangafter -2
+ \llap {\vbox to \ht0{\kern\baselineskip \box0 \kern-\baselineskip}}%
+ \futurelet \next \checkspace}
+
+\parskip=10pt
+\parindent=0pt
+
+\font\cmbig=cmr17
+\font\cmrbv=cmb10 scaled \magstep5
+\font\iti=cmbxti10 scaled \magstep2
+\font\erm=cmr8
+
+\doublecolumns
+
+%**************************************************************************
+% Generate a dummy first page for the twocol macro
+% The first page is to have the left column blank.
+
+\phantom{dummy first line} \vskip5truein
+ {\font\iti=cmti10 scaled \magstep1
+ \iti
+ \rightline{An abstract}
+ \rightline{goes}
+ \rightline{in here.}
+ }
+
+\columnfill
+
+%**************************************************************************
+
+\phantom{dummy first line} \vskip0.75truein
+
+\rightline{\cmrbv Title}
+\bigskip\bigskip
+\rightline{\iti Author}
+
+\bigskip\bigskip\bigskip
+%\rightline{\hrulefill}% width6.5truein}
+
+\nointerlineskip
+\moveleft 3.31truein
+\vbox{\hrule width6.5truein}
+\nointerlineskip
+
+\vskip0.75truein
+
+%**************************************************************************
+
+\bfl
+Xxxxxxx xxxxxx xxxxxx xxxxxxx xxxx xxx xxx\numberedfootnote{\erm Xxxxx xxxxx
+xxx xxxx Xxxxx xxxxx, Xxxxx xxxx Xxxxxx xxxxxx, xxxxxx xxxxx xx Xxxxxx Xxxxxx,
+Xxx., X.~X. Xxx~xxx, Xxxx Xxxxx, XX~xxxxx.} Xxxx Xxxxxxxxxx xxxxxxxx xxxx, Xxx
+xxxxx xxxxxx xx xxxxxxxx xx xxxxx xxxxxxx xxxxxxx xxxx xx xxxx xx xxxxxxx xx
+xxx xxxxx xx x xxx xxxxxxx xx xxxxx. Xx x/xxx xx x xxx xxxx xxxxxxx xxxxx
+xxxxxxx, Xxxxxx xxxxxxxxx xxxxx xxxxx x/xxx,xxx,xxx xx x xxxxxx. Xxxx xxxxx
+ xxxx xx xxxx xxxx Xxxxxx'x xxxxxxxx xx xxx xxxxxxx xxxxxxxx xxxxxx xx xxxxx
+ xx xxxx xxxxxxx xxx xxxxxx xxxx xx xxxxxxx xx xxxxxx x.xx xx x xxx, xxx x.xx
+xxx xxxxxx xxxxx xx~xxxxxxx. Xxxx xx x xxxxx xxxxxx xxx xxxxxxxxx xxxxxxxx xxx
+xxxxxxxx xxxx xxxxxxxx xxxxxxxxx xxx xxxxxx xxxxxx xxxx, xxx xxx xxxxxxxx
+xxxxxxxxx xx xxx xxxx xx xxxxxxxxxx xx x xxxx xxxxx xxxxxxxxxx.
+
+Xxxxx xxx xxxxxx xxx xxxxxx xx xxx xxxxx xx xxx xxx xxxxxxxxx (xxx XX-xxx
+xxxxx xxxxxx xxxxxxxx xx xxx Xxx Xxxxxxxxxx Xxxxxxxxxx), xx xxx xxxxxxx xxxx
+xx xxxxx xx xxxxxxxxxxx xx xxxxxxx x xxxxx xxxxxxx xxx xxxx xx xxxxx xxxx
+xxxxxx xx xxxx x xxxxxxxxxxx xxxxxx xxxx xxx xxxxxxx.
+
+Xxxxx x xxxxx xx xxx xxxx xx xxxxxxxxxx xxx xxxxxxxx xx xxx xxxxxxxxxx xxx
+xxxxxx xxxxxxxx xxx xxxx xxxxxx xxx xxxxx xxxx. Xxxx xxx xxxx xxxx xxxx xx
+xxxxx xxx xxxxxx'x xxxx xxxx xxxxxxxx, xxxx {xxx xxxxxxx} xx xxx xxxxxxx
+xxxxxxxxx, xxxxxxxx, xx x, xxx xxxxxxxx. Xxxxx xxxx xxxxxxxxx xxx xxxx (xxxx
+xxx Xxxx) xxx xxxxx xx Xxxxx~x.
+
+Xx xxxxxxxxxxx xx Xxxxx~x xxxxxxx xxxx xxx xxxxxxxx xx xxxxxxx xx xxxx xxxxxxx
+xxxxxxxx xxx xxx xx xxxxxxxxxx xx xxxxx xx xxxxxxxx. Xx xxxx, xx xxxxxxx xx
+xxxxxx xxx xxxxx xx xx xxxxx xxx xxx xxxxxxxxx xxx xxxxxxxx xxxxx xx Xxxxxx'x
+xxxxx xx Xxxxxx' xxxxxx xxxxxxx. Xxxx xxx xxxxxxxx xxxxx xxx xx xx xxxx, xxx
+xxxxxxxxx. Xxxxx~x xxxxxxxx xxx xxxxxxxxx xx xxxxxxx xx xxx xxxxxx xxxxxx xx
+xxxx xxxxxx xxxxxxxx xx xxxxxxxxx xx xxxxxxxxx.
+
+
+\singlecolumn
+\centerline{Table 1---Xxxxxxxxx Xxxx Xxxxxxxx xx Xxxxxxxx}
+\smallbreak
+\line \bgroup \hss
+ \begintable
+ \begintableformat
+ & \center
+ \endtableformat
+ \-
+ \br{\::} : : \use{3} Xxxxxxxxxx Xxxxxxx:
+ : \use{3} Xxxxxx Xxxxxxn \er{:}
+ \br{\:} \zb{Xxxxxx} : \zb{Xxxx} : \use{3} \-
+ : \zb{Xxxx} : \use{3} \- \er{:}
+ \br{\::} : : -xxxxx " -xxxxx " -x :
+ : +xxxxx " +xxxxx " +x \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \br{\::} xxxxxxx : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx
+ : ~x-xx-xx : xxxxx " ~xxxxx " ~xxxxx \er{:}
+ \-
+ \endtable
+\hss \egroup
+\doublecolumns
+
+
+Xxxx xxxxxx x xxxxxx xxxxxxx Xxxxxx'x xxxxxx xxxxxx xx xxx xxxxxx xxxxx xxxxxx
+xxx xxxx xxxxx xx Xxxxx~x, xxxx xxxx xxxxxx xx xxxxx xxxxxxx. Xx, xxx xxxxxxx,
+xx xxxxxxxxxx xxx xxxxxxxx xxxx xxxxxx xxxxxx, xx xxxxx xxxxx xx xxxxxxxxxxx,
+xxxxxxxxxx, xxx xxxxxxxxx, xxxxxxx xx xxx xxxxxxxx xx xxxx xxxxxx xxxx xxxxx
+xxxxxxx, xx xxxxx xxxxx xx xxx xxxxxxxx, xxxxx xxxxx, xxx xxxxxxxxx. Xxxx xxx
+xxxx xx xxxxxxxxx.
+
+\medskip\bigskip
+\centerline{Table 2---Xxxxxxx xx Xxxxxx'x Xxxxxx Xxxxxxx}
+\nobreak
+\centerline{(Xxxxxxx Xxxxxxxx)}
+\smallbreak
+\line \bgroup \hss
+ \begintable
+ \begintableformat
+ & \center
+ \endtableformat
+ \-
+ \br{\::} Xxxx : xxxxxxxx " xxxxxxx " xxxxxx " xxx \er{:}
+ \-
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \-
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \-
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \-
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \br{\::} xxxx : xxxxxxxx " xxxxxxx " xxxxxx " $x''$ \er{:}
+ \-
+ \endtable
+\hss \egroup
+
+Xxxxxxxx xxx xxxx xxxx xxxxx xxxxx xx Xxxxx~x xxx xxx xxxx, xxxx xxx xxx xxxx
+xx xxx xxxxxxxx xxxxxxxx xxxxxxxxx xxxxx. Xx xxx x xxxxx xxxxxxx xx xxx xxxx
+xx xxxxxxx, xx xxx xxxxxxx xx xx x xxxxxx xxxxxx xx xxxxx xxxxxxx xx xxxxxx xx
+xxxx xxxxx xxxxxx x ``xxxxx xxxx'' xxxxxxxx. Xxxxx x xxxxx xx xxxx xxxxx xx
+xxx xxxx xx xxxxxxx xxx xxxxxxxx. Xxxx xxx xxxx xxxxxxxx xx xxxxx xxx xxxxxx'x
+xxxxxxxx xxxxxx xx xxxxx xxxxx, xxxxxxx xxx, xxx xxxxxx xxxx xxxx xxx xxxxx
+xxxxx xxxxxxxx xxx xxxxxxxx. Xxx xxxxxxx, xx xxx xxxxx xxxxx xxxxxx xxxx xxxx
+xxxxxx, xx xxx xxxx xxxxxx xxxxxxxx xxx xxx xxxxx. Xxx xxxxxxx xxx xxxxx xx
+Table~3.
+
+
+\font\eri=cmti8
+
+Xx xxxxxx xx xxxxxxxxxx xxxx xxxxx xxxxxx xxxx xxxxxxxx xxxx xxx xxx xxxxxxx
+xxxxx xx xxx xxxx xxxxx xxx xx xxx xx xxx xxx xxxxxxxxx xx xxxxxxx xxxx xx xxx
+xxx xxxxx xxxxx xxxxxx. Xxxxx~x xxxxxxx xxxx xxx xxxxx xxxxxxx, xx xx
+xxxxxxxxx xxxxxxxxx xx xxxxxxxx xx xxxx xxxx xxxxxxx xxxx xxx xxxx xxx xxxx
+xxxxxxxx xxxxxxxxxxx xxx xxx xxxxxx xx xx xxxxxxx. Xxxxxxxxx xxxxxxx xxxxx xxx
+xx xxxxxxxx xxxxxx xxxx xxx xxxx xxxxxxx xx x xxxxx xxxxxxxxx, xxx xxx
+xxxxxxxx xx xxx xxxxxxxxx? Xxx xxxx xxxxxxxx xxxxxxxxx xxxxxxxxx xxxxxxxxx xx
+XX-xxx, xxx xxxxxxxxx xx xxx {xxx Xxxxxx xxxxxx Xxxx
+xxx},\numberedfootnote{\erm Xxxx Xx xx xxx xxxx Xxxxxx Xxxxxxx xxxx xxxxx
+xxxx.} ``X xxxxxxx xxxxx xxxxxxxxx xxx Xxxxxx xxx xxx xxxx'x xxxxx xx xxxxxxxx
+xxxx xx xxxxxxxxx xxxxxx xxxxxx xxxx xxxxxx xxxx.'' Xxxx xxxxxx xxxxx xx x
+xxxxxxxx xxxx xxxxxxxx xxxxx xxxxxx xxx xxxxxxxx xxx xxx xxxxxxx xxx xx xxxx
+xxxxxxx xxx xxxxxx xxxxxx xxxxxxxx xxx xxxx xxxxxxxxxxx xxxx xxx xxx xxxxxxx
+xxx xxxxxx xxxxxx xx Xxxxxx xxxxx xx xxxx, xxx xxxxx xxx xxx xxxxxxxx xx x
+Xxxxxx xxxxxxx xxxx xxx xxxx? Xxx xxxxxx xxxxx xx xx xxxxxxxxx xxx xxxxxxx
+xxxx xxx xxxx xxxx xx Xxxxx~x xxx xxxxxx xxxx xxx xxxxxxx xxxx xxxxx xx
+xxxxxxx xx xxxxxx xxx xx xxxxx.
+
+\singlecolumn
+
+\medskip\bigbreak
+\midinsert
+\centerline{Table 3---Xxxxxxxxx Xxxx Xxxxxxxx xx Xxxxxxxx}
+\smallbreak
+\line \bgroup \hss
+ \begintable
+ \begintableformat
+ & \center
+ \endtableformat
+ \-
+ \br{\::} : : \use{3} Xxxxxxxxxx Xxxxxxx:
+ : \use{3} Xxxxxx Xxxxxxx \er{:}
+ \br{\:} \zb{Xxxxxx} : \zb{Xxxx} : \use{3} \-
+ : \zb{Xxxx} : \use{3} \- \er{:}
+ \br{\::} : : -xxxxxxx " -xxxxxxx " -xxxxxxx :
+ : +xxxxxxx " +xxxxxxx " +xxxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \br{\::} {xxx x} : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx
+ : ~x-xx-xx : xxxxxx " ~xxxxxx " ~xxxxxx \er{:}
+ \-
+ \endtable
+\hss \egroup
+\endinsert
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/rule.tex b/Master/texmf-dist/source/eplain/base/test/rule.tex
new file mode 100644
index 00000000000..7001ca9a368
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/rule.tex
@@ -0,0 +1,23 @@
+% This file is public domain.
+%
+\input eplain
+
+\hruledefaultheight = 4pt
+\hruledefaultdepth = 8pt
+
+\vruledefaultwidth = 36pt
+
+\vglue 1in
+
+\line{\leaders\ehrule\hfil gA}%
+
+\smallskip
+\ehrule
+\medskip
+
+\noindent \evrule \quad Greetings
+\smallskip
+\vbox to 3in{\leaders\evrule\vfil gB}
+
+\hbox to 40pt{\downbracefill} % uses \vrule
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/sidx.tex b/Master/texmf-dist/source/eplain/base/test/sidx.tex
new file mode 100644
index 00000000000..88041620f09
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/sidx.tex
@@ -0,0 +1,5 @@
+% This file is public domain.
+%
+\input eplain
+\sidx{help}
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/subdef.tex b/Master/texmf-dist/source/eplain/base/test/subdef.tex
new file mode 100644
index 00000000000..55d624b729a
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/subdef.tex
@@ -0,0 +1,24 @@
+% This file is public domain.
+%
+%Karl: on page 15 of the eplain manual (referring to subequation
+%formatting) you say
+% "Eplain's default definition just puts a period between them:"
+%However, when I run eplain (version 2.3 dated "Mon Mar 1 06:30:39 EST
+%1993") I get a colon ":" between the two. Below is a sample file.
+% Adam H. Lewenberg adam@math.uiuc.edu
+%%%%%%%%%%
+\input eplain %Version 2.3 "Mon Mar 1 06:30:39 EST 1993"
+
+$$5+5=10\eqdefn{ggg}$$
+$$4+5=10\eqsubdef{b-eq}$$
+
+\eqref{ggg} is correct and \eqrefn{b-eq} is incorrect.
+
+
+\end
+
+Date: Tue, 8 Jun 1993 09:46:11 -0500
+From: "Adam H. Lewenberg" <adam@symcom.math.uiuc.edu>
+To: karl@cs.umb.edu
+Subject: subeq referencing in eplain.tex (v. 2.3)
+Cc: adam@symcom.math.uiuc.edu
diff --git a/Master/texmf-dist/source/eplain/base/test/tenenb.tex b/Master/texmf-dist/source/eplain/base/test/tenenb.tex
new file mode 100644
index 00000000000..89cd534e55d
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/tenenb.tex
@@ -0,0 +1,48 @@
+% This file is public domain.
+%
+%Date: Sun, 7 Jan 2001 20:31:13 +0100
+%To: tex-eplain@tug.org
+%From: Gerald Tenenbaum <tenenb@arcturus.ciril.fr>
+%Subject: doublecolumns again
+%Cc:
+%Bcc:
+%X-Attachments:
+%
+%Hi,
+%
+%Here is a small file:
+%
+%*****************************
+\magnification1200
+\input eplain.tex
+\vsize30mm\hsize100mm
+
+This is an example of an apparent bug in {\tt $\backslash$doublecolumns}.
+This is an example of an apparent bug in {\tt
+$\backslash$doublecolumns}. This is
+an example of an apparent bug in {\tt $\backslash$doublecolumns}. This is an
+example of an apparent bug in {\tt $\backslash$doublecolumns}. This
+is an example
+of an apparent bug in {\tt $\backslash$doublecolumns}. This is an example of an
+apparent bug in {\tt $\backslash$doublecolumns}.
+\par
+\obeylines\doublecolumns
+item 1
+item 2
+item 3
+item 4
+item 5
+item 6
+ \singlecolumn
+\bye
+*************************************
+
+Has anyone an explanation for this bad behaviour and an idea for a fix?
+
+Best wishes,
+
+ Gérald
+
+
+
+
diff --git a/Master/texmf-dist/source/eplain/base/test/tenenb2.tex b/Master/texmf-dist/source/eplain/base/test/tenenb2.tex
new file mode 100644
index 00000000000..734299c3726
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/tenenb2.tex
@@ -0,0 +1,23 @@
+% This file is public domain.
+%
+% Gerald Tenenbaum, tenenb@arcturus.ciril.fr
+% 7 Jan 2001
+
+%\magnification 1200
+\input ../eplain
+\vsize 30mm
+\hsize 100mm
+
+This is an example of an apparent bug in double columns.
+This is an example of an apparent bug in double columns.
+This is an example of an apparent bug in double columns.
+This is an example of an apparent bug in double columns.
+This is an example of an apparent bug in double columns.
+This is an example of an apparent bug in double columns.
+This is an example of an apparent bug in double columns.
+
+\doublecolumns
+This is an example of an apparent bug in double columns.
+\singlecolumn
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/test.tex b/Master/texmf-dist/source/eplain/base/test/test.tex
new file mode 100644
index 00000000000..779d8adf662
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/test.tex
@@ -0,0 +1,14 @@
+% This file is public domain.
+%
+\input ../eplain
+\input asibook.gst
+
+\comment The title is actually irrelevant: we don't do the title page.
+\title{Wavelets and their applications}
+
+\comment The other front stuff happens in asibook.gst's \producepreliminary,
+\comment which is called by virtue of the \part here.
+
+\backthing{test.index}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/time.tex b/Master/texmf-dist/source/eplain/base/test/time.tex
new file mode 100644
index 00000000000..90751506091
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/time.tex
@@ -0,0 +1,10 @@
+% This file is public domain.
+%
+\input eplain
+
+\timestring
+
+\time = 68
+\timestring
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/truemarg.tex b/Master/texmf-dist/source/eplain/base/test/truemarg.tex
new file mode 100644
index 00000000000..b057a86b94f
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/truemarg.tex
@@ -0,0 +1,36 @@
+% This file is public domain.
+%
+% Some code to test margin-setting macros in concert with
+% \magnification.
+
+\input ../eplain % margin altered version
+
+%\magnification=\magstep0
+%\magnification=\magstep1
+%\magnification=\magstep2
+\magnification=\magstep3
+
+
+\nopagenumbers
+
+\paperheight=11truein
+\paperwidth=8.5truein
+
+\topmargin=1truein
+\leftmargin=1truein
+\rightmargin=6truein
+\bottommargin=3truein
+
+\parindent=0pt
+
+\vbox to \vsize{
+\hrule depth4truept
+\vfill
+\centerline{Magnification = \the\mag}
+\vfill
+\hrule height4truept
+}
+
+
+\bye
+
diff --git a/Master/texmf-dist/source/eplain/base/test/uscore.bib b/Master/texmf-dist/source/eplain/base/test/uscore.bib
new file mode 100644
index 00000000000..82b7bcb07b1
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/uscore.bib
@@ -0,0 +1,5 @@
+% This file is public domain.
+
+@misc{bib_uscore,
+ title = "Underscore label"
+}
diff --git a/Master/texmf-dist/source/eplain/base/test/uscore.tex b/Master/texmf-dist/source/eplain/base/test/uscore.tex
new file mode 100644
index 00000000000..097230596e0
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/uscore.tex
@@ -0,0 +1,14 @@
+% This file is public domain.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+Define a label with an underscore in it. \xrdef{u_score}
+Refer to it: \xref{u_score}.
+
+Make a citation, too: \cite{bib_uscore}.
+
+\bibliographystyle{plain}
+\bibliography{uscore}
+
+\bye
+
diff --git a/Master/texmf-dist/source/eplain/base/test/usepackage.tex b/Master/texmf-dist/source/eplain/base/test/usepackage.tex
new file mode 100644
index 00000000000..ab797823fe7
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/usepackage.tex
@@ -0,0 +1,146 @@
+% This file is public domain.
+%
+% Test \usepackage with packages: color, graphicx, autopict, psfrag, url.
+\input ../eplain
+
+\beginpackages
+ \usepackage[dvipsnames]{color}
+ %\usepackage[draft,hidescale]{graphicx,autopict}\let\ttfamily\relax
+ \usepackage{graphicx,autopict}
+ \usepackage{psfrag}
+ \usepackage[obeyspaces,spaces]{url}[2005/06/27]
+\endpackages
+
+%\enablehyperlinks
+
+\ifpdf
+ \pdfpagewidth=8.5in
+ \pdfpageheight=11in
+\fi
+
+% The following redefinition works around a bug in pdftex.def v0.03m
+% related to \pagecolor.
+\ifpdf
+\makeatletter
+\ifx\GPT@outputbox\undefined
+\def\set@page@color{%
+ \@ifundefined{GPT@outputbox}{%
+ % \newbox is outer in plain
+ \csname newbox\endcsname\GPT@outputbox
+ }{}%
+ \global\let\current@page@color\current@color
+ \@ifundefined{GPTorg@shipout}{%
+ \global\let\GPTorg@shipout\shipout
+ \gdef\shipout{%
+ \afterassignment\GPT@shipout
+ \global\setbox\GPT@outputbox=%
+ }%
+ \gdef\GPT@shipout{%
+ \ifvoid\GPT@outputbox\relax
+ \aftergroup\GPT@@shipout
+ \GPT@pageliteral
+ \else
+ \GPTorg@shipout\vbox{%
+ \GPT@pageliteral
+ \box\GPT@outputbox
+ }%
+ \fi
+ }%
+ \gdef\GPT@@shipout{%
+ \GPTorg@shipout\box\GPT@outputbox\relax
+ }%
+ \gdef\GPT@pageliteral{%
+ \pdfliteral direct{%
+ q % gsave
+ \current@page@color\space
+ n % newpath
+ 0 0 \strip@pt\pdfpagewidth\space
+ \strip@pt\pdfpageheight\space re % rectangle
+ % there is no need to convert to bp
+ f % fill
+ Q% grestore
+ }%
+ }%
+ }{}%
+}
+\fi
+\resetatcatcode
+\fi
+
+
+\pagecolor[rgb]{.3,.8,.95}
+
+\centerline{\bf URL, color, rotation and scaling tests:}
+\smallskip
+
+{\color[rgb]{1,0.2,0.3} RGB-colored text. }Non-colored text.\par
+{\color[cmyk]{.2,.7,.5,.1}CMYK-colored text. }Non-colored text.\par
+{\color[gray]{.4} GRAY-colored text. }Non-colored text.\par
+\definecolor{refcolor}{cmyk}{0.28,1,1,0.35}
+{\color{refcolor}Defined color. }Non-colored text.\par
+\colorbox{green}{Green-colored box.}\par
+\colorbox[rgb]{1,0,0}{Red-colored box.}\par
+%\fcolorbox doesn't work because plain TeX does not have LaTeX's \fbox
+What is this:
+\rotatebox[origin=c]{180}{\reflectbox{\color[rgb]{.5,.3,.3}%
+ \hloff[url]\url{http : // tug . org / eplain}}}\par
+Example of a line break inside a URL: \url{http://www.this.is.some/very.very.very.long.URL/which.goes.on/and.on/and.on.html}\par
+\textcolor{red}{Predefined color `{\tt red}'. }Non-colored text.\par
+\rotatebox{20}{\scalebox{2}[5]{\color[named]{DarkOrchid}Rotated,
+ scaled, and colored text.}}\par
+\resizebox{1in}{\height}{Some text $\sum$.}
+ \resizebox*{1in}{\height}{Some text $\sum$.}
+ \resizebox{1in}{!}{Some text $\sum$.}\par
+
+
+\bigskip
+\centerline{\bf \LaTeX's picture environment:}
+\smallskip
+
+\picture(50,50)
+ \color{red}
+ \thicklines
+ \put(0,0){\line(1,1){50}}
+ \color{blue}
+ \put(40,0){\circle{50}}
+ \put(0,0){\vector(1,0){50}}
+ \color{green}
+ \put(20,0){\circle*{12}}
+ \put(55,40){\oval(80,70)[t]}
+ \color{black}
+ \put(55,40){\oval(50,30)}
+ \bezier{0}(10,10)(40,90)(110,90)
+ %\qbezier does not work
+ %\qbezier[0](10,10)(40,90)(110,90)
+\endpicture
+
+\LaTeXbegin
+
+\begin{picture}(40,40)
+\put(0,0){\vector(1,1){40}}
+\multiput(0,5)(10,10){4}{a}
+\end{picture}
+
+\vfil\eject
+
+
+\pagecolor[named]{SkyBlue}
+
+\centerline{\bf PSfrag test (uses {\tt example.eps} from the PSfrag package):}
+\smallskip
+
+\centerline{\includegraphics[width=3.5in]{example.eps}
+\quad
+\psfragscanon
+\psfrag*{p1}[][l]{$\ast$}
+\psfrag{p2}[][l]{$\ast$}
+\psfrag{p3}{$\cos(t)$}
+\includegraphics[width=3.5in]{example.eps}}
+
+
+\bye
+
+% Local variables:
+% compile-command: "(cd .. && make eplain.tex) && pdftex --interact=nonstopmode usepackage.tex"
+% compile-command: "(cd .. && make eplain.tex) && tex --interact=nonstopmode usepackage.tex && dvips -t letter usepackage.dvi -o"
+% End:
diff --git a/Master/texmf-dist/source/eplain/base/test/verb2.tex b/Master/texmf-dist/source/eplain/base/test/verb2.tex
new file mode 100644
index 00000000000..b3c7c4ad54c
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/verb2.tex
@@ -0,0 +1,61 @@
+% This file is public domain.
+%
+% Date: Wed, 30 Mar 94 09:50:27 CST
+% From: dorai@cs.rice.edu (Dorai Sitaram)
+% To: karl@cs.umb.edu
+% Subject: eplain 2.4's \verbatim: problem & fix
+
+\input eplain
+
+Testing Eplain's \verbatim verbatim|endverbatim
+
+\def\junk{{\it Some obviously $a^2+b^2$ non-verbatim stuff}}
+
+\bigskip\bigskip
+
+First let's test if the default | works
+
+\verbatim
+verbatim starts
+Some special chars:
+ !@#$%^&*()_+
+Now test if doubling works:
+ This line ends with a single ||
+Now test if I can use || to get non-verbatim stuff:
+ \junk
+verbatim ends
+|endverbatim
+
+\bigskip\bigskip
+
+Now let's try the same with escape set to \#.
+\verbatimescapechar\#
+
+\verbatim
+verbatim starts
+Some special chars:
+ !@$%^&*()_+
+Now test if doubling works:
+ This line ends with a single ##
+Now test if I can use ## to get non-verbatim stuff:
+ #junk
+verbatim ends
+#endverbatim
+
+\bigskip\bigskip
+
+Now with @.
+\verbatimescapechar\@
+
+\verbatim
+verbatim starts
+Some special chars:
+ !#$%^&*()_+
+Now test if doubling works:
+ This line ends with a single @@
+Now test if I can use @@ to get non-verbatim stuff:
+ @junk
+verbatim ends
+@endverbatim
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/verbatim.tex b/Master/texmf-dist/source/eplain/base/test/verbatim.tex
new file mode 100644
index 00000000000..677d0f3b176
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/verbatim.tex
@@ -0,0 +1,65 @@
+% This file is public domain.
+%
+\input eplain
+
+Leading spaces:
+
+\verbatim
+---T--T----
+One
+
+ Two
+
+ Three
+
+ Four
+
+Five
+|endverbatim
+
+The same again with spaces on empty lines:
+
+\verbatim
+---T--T----
+One
+
+ Two
+
+ Three
+
+ Four
+
+Five
+|endverbatim
+
+Now for some tabs:
+
+\verbatim
+--------T-------T
+One
+
+ Two
+
+ Three
+
+ Four
+
+Five
+
+|endverbatim
+
+Here is how you can get vertical bars into verbatim:
+
+\verbatim
+||!@#$%^&*()_-+=\~`{}[]:'';'<>?,./
+|endverbatim
+
+And here's you can use it in a paragraph:
+\verbatim middle%%%%|endverbatim. And this is the example from the
+manual, quoted with a leading space: `\verbatim| ||\#%&!|endverbatim'.
+
+Now we change the escape character to @ and have a leading space:
+\verbatimescapechar @
+`\verbatim@ @@|my what big teeth you have!@endverbatim'.
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/vlach.tex b/Master/texmf-dist/source/eplain/base/test/vlach.tex
new file mode 100644
index 00000000000..1aa8262d1b6
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/vlach.tex
@@ -0,0 +1,258 @@
+% This file is public domain.
+%
+%Date: Sun, 29 Nov 92 18:21:53 EST
+%From: avlach@cleveland.next.nd.edu (alan vlach)
+%To: Karl Berry <karl@ra.cs.umb.edu>
+%Subject: Re: eplain
+%
+%My problem occurs when I try to call \singlecolumn too quickly after
+%I have called \doublecolumns, which is probably bad style anyway, but
+%here's a sample file (below) so you can see what's happening.
+%
+%Put \singlecolumn just one paragraph later and everything works OK.
+%
+%Thanks for looking at this.
+%
+%Sincerely,
+%Alan Vlach
+%alan.d.vlach.1@nd.edu
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\input eplain
+
+This is a dummy file just to show Karl Berry the problem I'm having.
+
+Here is a first paragraph of nonsense. Here is a first paragraph of
+nonsense. Here is a first paragraph of nonsense. Here is a first
+paragraph of nonsense. Here is a first paragraph of nonsense. Here is
+a first paragraph of nonsense. Here is a first paragraph of nonsense.
+Here is a first paragraph of nonsense. Here is a first paragraph of
+nonsense. Here is a first paragraph of nonsense. Here is a first
+paragraph of nonsense. Here is a first paragraph of nonsense. Here is
+a first paragraph of nonsense. Here is a first paragraph of nonsense.
+Here is a first paragraph of nonsense. Here is a first paragraph of
+nonsense.
+
+Here is another paragraph of nonsense. Here is another paragraph of
+nonsense. Here is another paragraph of nonsense. Here is another
+paragraph of nonsense. Here is another paragraph of nonsense. Here is
+another paragraph of nonsense. Here is another paragraph of nonsense.
+Here is another paragraph of nonsense. Here is another paragraph of
+nonsense. Here is another paragraph of nonsense. Here is another
+paragraph of nonsense. Here is another paragraph of nonsense. Here is
+another paragraph of nonsense. Here is another paragraph of nonsense.
+Here is another paragraph of nonsense. Here is another paragraph of
+nonsense. Here is another paragraph of nonsense. Here is another
+paragraph of nonsense. Here is another paragraph of nonsense. Here is
+another paragraph of nonsense. Here is another paragraph of nonsense.
+Here is another paragraph of nonsense. Here is another paragraph of
+nonsense. Here is another paragraph of nonsense. Here is another
+paragraph of nonsense. Here is another paragraph of nonsense. Here is
+another paragraph of nonsense. Here is another paragraph of nonsense.
+Here is another paragraph of nonsense. Here is another paragraph of
+nonsense. Here is another paragraph of nonsense. Here is another
+paragraph of nonsense.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+\doublecolumns
+
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+And here is where the double columns begin.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+\singlecolumn
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+The single column resumes. The single column resumes.
+
+
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+Here is the $n^{\rm th}$ paragraph of nonsense.
+
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+This is the final paragraph. This is the final paragraph.
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/whitespc.tex b/Master/texmf-dist/source/eplain/base/test/whitespc.tex
new file mode 100644
index 00000000000..eb3ca0d6b3b
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/whitespc.tex
@@ -0,0 +1,51 @@
+% This file is public domain.
+%
+\ifx\eplain\undefined \input eplain \fi
+
+\vbox{\obeywhitespace Does it work in vbox ?}
+
+This is some normal text, in a normal paragraph, that's been indented in
+the normal way. Isn't that nice? The lines after the first aren't
+indented, as usual.
+
+This line is the start of a paragraph; the obeyed material is next. And
+it continues on the same line.
+{\obeywhitespace This is the start of the obeyed stuff.
+ And this one by a couple spaces more than the indentation.
+Back to the normal indentation--- some extra space there, did you notice?
+That's it.
+}
+This is the end of the paragraph with the obeyed stuff, and it shouldn't
+be indented, but it should start at the beginning of the line, since it
+continues the paragraph.
+
+{\obeywhitespace This obeyed material starts a paragraph.
+That line should have the normal indentation (so should this one).
+And this line ends with the closing brace to the group.}
+And this line continues the paragraph.
+
+{\obeywhitespace
+Some more obeyed material (and a newline after the control sequence):
+
+That was a blank line above.
+}
+
+That time no normal stuff continued the paragraph. It shouldn't have
+made any difference.
+Some more normal text, with spaces treated normally again.
+
+Here is some {\obeywhitespace obeyed stuff} in the middle of a line.
+And this {\obeywhitespace more stuff} has multiple spaces before
+the `more', that should be ignored.
+
+{\blanklineskipamount = -.5\baselineskip
+\obeywhitespace The blank line after this line
+
+should be half as much as the blank lines above and below.
+}
+
+{\obeywhitespace And now we should be
+
+back to normal.}
+
+\bye
diff --git a/Master/texmf-dist/source/eplain/base/test/xampl.tex b/Master/texmf-dist/source/eplain/base/test/xampl.tex
new file mode 100644
index 00000000000..4b6eaab3f3e
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/xampl.tex
@@ -0,0 +1,13 @@
+% This file is public domain.
+%
+% Test xampl.bib.
+%
+%\ifx\undefined\eplain \input eplain \fi
+\input btxmac
+
+\bibliography{xampl}
+\bibliographystyle{apalike}
+
+\nocite{*}
+
+\end
diff --git a/Master/texmf-dist/source/eplain/base/test/xref.tex b/Master/texmf-dist/source/eplain/base/test/xref.tex
new file mode 100644
index 00000000000..70096bd29e9
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/test/xref.tex
@@ -0,0 +1,39 @@
+% This file is public domain.
+%
+% Test file for cross-references.
+%
+\ifx\undefined\eplain \input eplain \fi
+
+\catcode`\_ = 2
+
+defining ``foo bar'':
+\xrdef{foo bar}.
+
+and also a `sect' (make that word `Section') label `s' to be `3.1':
+\definexref{s}{3.1}{sect}.
+\def\sectword{Section}
+
+Let's also define two labels with a numbers, ``label1'' and ``label2'':
+\xrdef{label1}\xrdef{label2}
+
+\vfill\eject
+
+defining ``foo baz''.
+\xrdef{foo baz}
+\vfill\eject
+
+Define something with all the other characters, including unprintable
+ones: \xrdef{1234567890)(@!`['";:]|<>,./?À-=+}.
+
+
+using everything (these should be page 1 and page 2):
+\xref{foo bar} and \xref{foo baz}.
+
+And now the ones with numbers (page 1): \xref{label1} and \xref{label2}.
+
+And now the weird one (page 3): \xref{1234567890)(@!`['";:]|<>,./?À-=+}.
+
+ref, refn, and refs on s: \ref{s}, \refn{s}, \refs{s}.
+
+And an undefined one: \xref{undefined}.
+\end
diff --git a/Master/texmf-dist/source/eplain/base/util/idxuniq b/Master/texmf-dist/source/eplain/base/util/idxuniq
new file mode 100644
index 00000000000..6ee7d225f5c
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/util/idxuniq
@@ -0,0 +1,37 @@
+#!/usr/bin/awk -f
+
+# (This file is public domain.)
+
+# This script filters input lines (which are expected to be a list of
+# `\indexentry' lines for MakeIndex) eliminating matching lines. The comparison
+# is done without regard to hyperlink label names (in the form `IDX*', where `*'
+# stands for a non-negative integer).
+
+# This has to be done to avoid terms which differ only in hyperlink label names
+# embedded into them, because MakeIndex will treat these otherwise identical
+# terms as distinct, listing more than once a page number for equivalent terms
+# on the same page.
+
+# `stripped' array is indexed by `\indexentry' lines stripped off the hyperlink
+# label name. For each term, we use its stripped version as a key into the
+# `stripped' array to increment its element. This records the fact that we have
+# seen the term with such key. Also, we add the (full) `\indexentry' line to
+# the `terms' array, but only if we have not yet seen a term with such key.
+
+# The idea was borrowed from Edition 3 of `GAWK: Effective AWK Programming: A
+# User's Guide for GNU Awk', which contains the following credit:
+
+# histsort.awk --- compact a shell history file
+# Thanks to Byron Rakitzis for the general idea
+
+{
+ temp = $0
+ sub (/{IDX[[:digit:]]+}/, "", temp)
+ if (stripped[temp]++ == 0)
+ terms[++count] = $0
+}
+
+END {
+ for (i = 1; i <= count; i++)
+ print terms[i]
+}
diff --git a/Master/texmf-dist/source/eplain/base/util/trimsee b/Master/texmf-dist/source/eplain/base/util/trimsee
new file mode 100644
index 00000000000..8af5ebe6434
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/util/trimsee
@@ -0,0 +1,106 @@
+#!/bin/sh
+
+# (This file is public domain.)
+
+help ()
+{
+ cat <<EOF
+Usage: trimsee [-i IS] [-o OS] [-s SEE]
+ trimsee {-h|--help|-v|--version}
+Remove commas (or other page list separators) in front
+of see / see also commands in the output of MakeIndex.
+Input is read from stdin, output is directed to stdout.
+
+-i IS use IS as a regular expression matching separator
+ in front of see / see also commands in the input
+ (default: '$DEFAULT_IS')
+-o OS use OS as a separator to replace IS in front of
+ see / see also commands (default: '$DEFAULT_OS')
+-s SEE use SEE as a regular expression matching see /
+ see also commands (default: '$DEFAULT_SEE')
+-h, --help show this help message
+-v, --version show version
+EOF
+}
+
+check_missing_arg ()
+{
+ if (( $1 < 2 )); then
+ echo "Missing argument to option '$2'" 1>&2
+ exit 1
+ fi
+}
+
+VERSION='0.1'
+
+DEFAULT_SEE='\\indexsee'
+DEFAULT_IS=', \+'
+DEFAULT_OS=' '
+
+SEE=$DEFAULT_SEE
+IS=$DEFAULT_IS
+OS=$DEFAULT_OS
+
+while [ $# != 0 ]
+do
+ case "$1" in
+ -i)
+ check_missing_arg $# "$1"
+ IS=$2
+ shift
+ ;;
+ -o)
+ check_missing_arg $# "$1"
+ OS=$2
+ shift
+ ;;
+ -s)
+ check_missing_arg $# "$1"
+ SEE=$2
+ shift
+ ;;
+ -h | --help)
+ help
+ exit 0
+ ;;
+ -v | --version)
+ echo "trimsee version $VERSION"
+ exit 0
+ ;;
+ *)
+ echo "Unknown option '$1'" 1>&2
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+
+# The idea is to implement line output delayed by one line. When we
+# read next line, we check if it starts with a see/see also entry, and
+# if it does, we remove the comma at the end of the previous line
+# before printing it. We keep previous lines in the hold buffer.
+
+sed -n '
+
+# Remove all commas in front of see/see also inside each line.
+s/'"$IS$SEE/$OS$SEE"'/g
+
+# If this line does not start with see/see also, we will print the
+# previous line intact. NOTE: There are two characters inside the
+# brackets: a space and a tab.
+/^[ ]*'"$SEE"'/! { x; b PRINT; }
+
+# This line starts with see/see also, so remove comma at the end of
+# the previous line before we print it.
+x
+s/'"$IS"'$/'"$OS"'/
+
+# Print the previous line.
+:PRINT
+1! p
+
+# At the end of the input, print the last line.
+$ { x; p; }
+
+'
diff --git a/Master/texmf-dist/source/eplain/base/xeplain.tex b/Master/texmf-dist/source/eplain/base/xeplain.tex
new file mode 100644
index 00000000000..5464d27a82e
--- /dev/null
+++ b/Master/texmf-dist/source/eplain/base/xeplain.tex
@@ -0,0 +1,4783 @@
+% xeplain.tex: macros for nonformatting. Written 1989--94 by (mostly)
+% Karl Berry. Some additions/changes 1997--98 by Adam Lewenberg.
+% These macros are in the public domain.
+%
+% This is the ``extended plain'' TeX format that's described in
+% `eplain.texinfo', which you should have received with this file. We
+% assume plain has been loaded.
+%
+% N.B.: A version number is defined at the beginning and end of this file;
+% please change those numbers whenever the file is modified!
+% And it's best to rename the file if you're going to distribute a
+% modified version.
+%
+% Some macros were written and/or suggested by Paul Abrahams.
+% Other sources (e.g., The TeXbook) are cited at the appropriate places.
+%
+%% @texfile{
+%% author = "Karl Berry, Steven Smith, Oleg Katsitadze, and others",
+%% version = "REPLACE-WITH-VERSION",
+%% date = "REPLACE-WITH-DATE",
+%% filename = "xeplain.tex",
+%% email = "bug-eplain@tug.org",
+%% checksum = "REPLACE-WITH-CHECKSUM",
+%% codetable = "ASCII",
+%% supported = "yes",
+%% docstring = "This file defines macros that extend and expand on
+%% plain TeX. eplain.tex is xeplain.tex and the other
+%% source files with comments stripped; see the original
+%% files for author credits, etc. And please base diffs
+%% or other contributions on xeplain.tex, not the
+%% stripped-down eplain.tex.",
+%% }
+%
+%
+% Load eplain.tex only once (to avoid using up \new's).
+% \eplain is defined at the end of this file, so we can test \eplain to
+% detect whether eplain.tex has been loaded already or not.
+%
+% We use \expandafter because the merge script strips any lines
+% with an \endinput.
+%
+\ifx\eplain\undefined
+ \let\next\relax
+\else
+ \expandafter\let\expandafter\next\csname endinput\endcsname
+\fi
+\next
+% The ifpdf.sty file included below was written by Heiko Oberdiek.
+% See the complete source file (e.g., in this distribution) for
+% comments.
+%% [[[include ifpdf.sty]]]
+%
+%
+% Category codes, etc.
+%
+\def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
+\chardef\letter = 11
+\chardef\other = 12
+% The following two macros were adopted from miniltx.tex of graphics.
+\def\makeatletter{%
+ \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}%
+ \catcode`\@11\relax
+}%
+\def\makeatother{%
+ \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}%
+ \catcode`\@12\relax
+}%
+%
+%
+% So we can have user-inaccessible control sequences.
+%
+\edef\leftdisplays{\the\catcode`@}%
+\catcode`@ = \letter
+\let\@eplainoldatcode = \leftdisplays
+%
+% Save miniscule amounts of memory and time by writing \toks@ii instead
+% of \toks2.
+\toksdef\toks@ii = 2
+%
+%
+% This macro is defined in The TeXbook, but it never made it
+% into plain TeX. \dospecials is defined there, though.
+%
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1 = \other}%
+ \dospecials
+}%
+%
+%
+% Here is a way to do \let^^M = \cs, where the \let need not be global.
+{%
+ \makeactive\^^M %
+ \long\gdef\letreturn#1{\let^^M = #1}%
+}%
+%
+%
+% Swallow parameters, etc.
+%
+\let\@eattoken = \relax % Define this, so \eattoken can be used in \edef.
+\def\eattoken{\let\@eattoken = }%
+\def\gobble#1{}%
+\def\gobbletwo#1#2{}%
+\def\gobblethree#1#2#3{}%
+%
+% We can't just use \empty as the identity function, since then outer
+% braces which would supposedly delimit the argument would define a group.
+\def\identity#1{#1}%
+%
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+% Use notes:
+% So far, \ifempty works in the following cases:
+% 1. \ifempty{}\message{empty}\else\message{not empty}\fi --> empty
+% 2. \ifempty\undefined\message{empty}\else\message{not empty}\fi --> not empty
+% But does NOT work in the case
+% 3. \def\empty{}
+% \ifempty\empty\message{empty}\else\message{not empty}\fi --> not empty
+% Question: When should \ifempty be true?
+\def\@emptymarkA{\@emptymarkB}
+% The above line suggested by Stanislav Brabec.
+\def\ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
+\def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
+%
+% Turn a definition into the characters that compose it. See
+% ``Sanitizing control sequences under \write'', by Ron Whitney, TUGboat
+% 11(4), p.620.
+\def\@gobblemeaning#1:->{}%
+\def\sanitize{\expandafter\@gobblemeaning\meaning}%
+%
+%
+% From p.308 of the TeXbook. This cannot be used in places where TeX
+% might be skipping tokens, e.g., in conditionals.
+%
+\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}%
+%
+%
+% \csname constructions come up an awful lot, so we save typing with the
+% following. (But the extra macro expansion does take time, so we don't
+% use these in frequently-executed code.)
+%
+\def\csn#1{\csname#1\endcsname}%
+\def\ece#1#2{\expandafter#1\csname#2\endcsname}%
+%
+%
+% \expandonce{TOKEN} abbreviates \expandafter\noexpand TOKEN.
+%
+\def\expandonce{\expandafter\noexpand}%
+%
+%
+% Don't show our register allocations in the log.
+%
+\let\@plainwlog = \wlog
+\let\wlog = \gobble
+%
+%
+% Make it convenient to put newlines in error messages.
+%
+\newlinechar = `^^J
+%
+%
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+% Show the complete contents of boxes.
+%
+\def\tracingboxes{\showboxbreadth = \maxdimen \showboxdepth = \maxdimen}%
+%
+% Don't trace anything, except restore \showbox... to plain's values.
+%
+\def\gtracingoff{\begingroup \globaldefs = 1 \tracingoff \endgroup}%
+\def\tracingoff{\tracingonline\z@\tracingcommands\z@\tracingstats\z@
+ \tracingpages\z@\tracingoutput\z@\tracinglostchars\z@
+ \tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@
+ \showboxbreadth5 \showboxdepth3
+}%
+%
+%
+% Definitions to produce actual `{' (et al.) characters in an output
+% file via \write. We omit the line break after the first }, since we
+% have no comment character at that point.
+%
+\begingroup
+ \catcode`\{ = 12 \catcode`\} = 12
+ \catcode`\[ = 1 \catcode`\] = 2
+ \gdef\lbracechar[{]%
+ \gdef\rbracechar[}]%
+ \catcode`\% = \other
+ \gdef\percentchar[%]\endgroup
+%
+%
+% Leave horizontal mode (if we're in it), then insert a penalty.
+% And conversely.
+%
+\def\vpenalty{\ifhmode\par\fi \penalty}%
+\def\hpenalty{\ifvmode\leavevmode\fi \penalty}%
+%
+%
+% Make \else usable in \loop. From Victor Eijkhout's TeX by Topic (page
+% 104). See also Alois Kabelschacht, TUGboat 8(2), page 184.
+%
+\def\iterate{%
+ \let\loop@next\relax
+ \body
+ \let\loop@next\iterate
+ \fi
+ \loop@next
+}%
+%
+%
+% Add #2 (which is expanded in an \edef) to the end of the definition of
+% #1 (which must be a previously-defined control sequence). This is a
+% way to construct simple lists.
+%
+\def\edefappend#1#2{%
+ \toks@ = \expandafter{#1}%
+ \edef#1{\the\toks@ #2}%
+}%
+%
+%
+% \allowhyphens, from TeXbook, p. 395. Allows following & preceding word
+% to be hyphenated.
+%
+\def\allowhyphens{\nobreak\hskip\z@skip}%
+%
+%
+%
+% Hooks.
+%
+% \hookaction{HOOK}{TOKENS} adds TOKENS to the list of actions for
+% HOOK. We avoid defining a \toks register for each hook, although
+% maybe that isn't so important.
+%
+% \hookappend and \hookprepend add TOKENS specificially to the end or
+% the beginning. When the argument is used, \toks@ will be the previous
+% value of the hook, and \toks@ii the new tokens.
+%
+\long\def\hookprepend{\@hookassign{\the\toks@ii \the\toks@}}%
+\long\def\hookappend{\@hookassign{\the\toks@ \the\toks@ii}}%
+\let\hookaction = \hookappend % either one should be ok
+%
+%
+% \@hookassign{LAST-DEF}{HOOK}{TOKENS} makes \toks@ the previous value
+% of HOOK, and \toks@ii TOKENS, and then assigns the new value using
+% LASTDEF. We store the hook in a control sequence \@HOOKhook.
+%
+\long\def\@hookassign#1#2#3{%
+ % Make \toks@ be the expansion (to one level) of \@HOOKhook, or empty.
+ \expandafter\ifx\csname @#2hook\endcsname \relax
+ % If \@HOOKhook was undefined, let it be empty.
+ \toks@ = {}%
+ \else
+ % Otherwise, expand it to one level. We can't just assign from
+ % \expandafter{\csname ...} since then the \toks register would
+ % contain the control sequence, not its definition.
+ \expandafter\let\expandafter\temp \csname @#2hook\endcsname
+ \toks@ = \expandafter{\temp}%
+ \fi
+ \toks2 = {#3}% Don't expand the argument all the way.
+ \ece\edef{@#2hook}{#1}%
+}%
+%
+%
+% \hookactiononce{HOOK}\CS adds `\global\let\CS=\relax' to the
+% definition of \CS, then adds to HOOK. Thus, \CS is expanded the next
+% time HOOK is called, but then it goes away. This only works if \CS is
+% expandable, though.
+%
+\long\def\hookactiononce#1#2{%
+ \edefappend#2{\global\let\noexpand#2\relax}
+ \hookaction{#1}#2%
+}%
+%
+%
+% \hookrun{HOOKNAME} runs whatever actions have been defined for HOOK.
+%
+\def\hookrun#1{%
+ \expandafter\ifx\csname @#1hook\endcsname \relax \else
+ % Isn't this fun? We want to get rid of the \fi before expanding
+ % the actions, so that they can read what's coming up next.
+ \def\temp{\csname @#1hook\endcsname}%
+ \expandafter\temp
+ \fi
+}%
+%
+%
+%
+% Properties a la Lisp.
+%
+% \setproperty{ATOM}{PROPNAME}{VALUE} defines the property PROPNAME on the
+% ``atom'' ATOM to have VALUE.
+%
+\def\setproperty#1#2#3{\ece\edef{#1@p#2}{#3}}%
+\def\setpropertyglobal#1#2#3{\ece\xdef{#1@p#2}{#3}}%
+%
+%
+% \getproperty{ATOM}{PROPNAME} expands to the value of the property
+% PROPNAME on ATOM, or to nothing (i.e., \empty), if the property isn't
+% present.
+%
+\def\getproperty#1#2{%
+ \expandafter\ifx\csname#1@p#2\endcsname\relax
+ % then \empty
+ \else \csname#1@p#2\endcsname
+ \fi
+}%
+%
+%
+%
+% Macros to support BibTeX are in a separate file, btxmac.tex.
+%
+% (They are maintained separately, too, by Oren Patashnik,
+% opbibtex@cs.stanford.edu.) btxmac.tex also defines other macros we
+% want to use and make available.
+%
+% But not all people want to read the BibTeX macros, because of either
+% space or time considerations. Therefore, we look for \nobibtex,
+% which, if defined, causes btxmac.tex not to be read. But we still
+% have to get \tokstostring et al. defined---so eplain.tex contains
+% those definitions, automatically edited in from btxmac.tex. All the
+% documentation has been removed, so you must read btxmac.tex if you
+% want the comments.
+%
+%
+% We want to give a slightly different message than btxmac if no .aux
+% file exists (unless the person using us has already define some
+% message, possibly empty.)
+%
+\ifx\@undefinedmessage\@undefined
+ \def\@undefinedmessage
+ {No .aux file; I won't warn you about undefined labels.}%
+\fi
+%
+%
+% We use a token register to define all the BibTeX definitions, to avoid
+% problems with the \if... constructions when they are conditionally
+% read.
+%
+%% [[[here is the first set of common definitions from btxmac]]]
+\toks0 = {%
+ %% [[[here are the BibTeX-specific definitions from btxmac]]]
+}%
+\ifx\nobibtex\@undefined \the\toks0 \fi
+%% [[[here is the second set of common definitions from btxmac]]]
+%
+% Here are the control sequences that btxmac.tex defines using an @,
+% because btxmac.tex wants to absolutely minimize the chance of
+% conflicts. But these control sequence implement documented features
+% of eplain, so we want to allow people to use them without the @.
+%
+\let\auxfile = \@auxfile
+\let\for = \@for
+\let\futurenonspacelet = \@futurenonspacelet
+\def\iffileexists{\if@fileexists}%
+\let\innerdef = \@innerdef
+\let\innernewcount = \@innernewcount
+\let\innernewdimen = \@innernewdimen
+\let\innernewif = \@innernewif
+\let\innernewwrite = \@innernewwrite
+\let\linenumber = \@linenumber
+\let\readauxfile = \@readauxfile
+\let\spacesub = \@spacesub
+\let\testfileexistence = \@testfileexistence
+\let\writeaux = \@writeaux
+%
+%
+% btxmac.tex defines \innerdef. Let's use it to make an abbreviation
+% for \innerdef\inner<name>{<name>}.
+%
+\def\innerinnerdef#1{\expandafter\innerdef\csname inner#1\endcsname{#1}}%
+%
+% Use that in turn to make non-outer versions of the rest of plain TeX's
+% allocation macros. (btxmac.tex already did a few of them.)
+%
+\innerinnerdef{newbox}%
+\innerinnerdef{newfam}%
+\innerinnerdef{newhelp}%
+\innerinnerdef{newinsert}%
+\innerinnerdef{newlanguage}%
+\innerinnerdef{newmuskip}%
+\innerinnerdef{newread}%
+\innerinnerdef{newskip}%
+\innerinnerdef{newtoks}%
+%
+%
+% Besides doing a \write to the aux file, we also need to do an
+% \immediate\write.
+%
+\def\immediatewriteaux#1{%
+ \ifx\noauxfile\@undefined
+ \immediate\write\@auxfile{#1}%
+ \fi
+}%
+%
+%
+% We want \biblabelprint to define hyperlink destination. For that,
+% we save the label for the current bibliography entry from within
+% \bblitemhook.
+\def\bblitemhook#1{\gdef\@hlbblitemlabel{#1}}%
+%
+\def\biblabelprint#1{%
+ \noindent
+ \hbox to \biblabelwidth{%
+ \hldest@impl{bib}{\@hlbblitemlabel}%
+ \biblabelprecontents
+ \biblabelcontents{#1}%
+ \biblabelpostcontents
+ }%
+ \kern\biblabelextraspace
+}%
+% We want each citation item to be hyperlink to bibliography entry.
+% To avoid unnecessary warnings about undefined destinations (e.g.,
+% from pdfTeX), produce the link only when .bbl file (which does the
+% \hldest's) is present.
+\def\eplainprintcitepreitem#1{\hlstart@impl{cite}{#1}}%
+\def\eplainprintcitepostitem{\hlend@impl{cite}}%
+%
+%
+\def\printcitepreitem#1{%
+ \testfileexistence[\bblfilebasename]{bbl}%
+ \iffileexists
+ \global\let\printcitepreitem\eplainprintcitepreitem
+ \global\let\printcitepostitem\eplainprintcitepostitem
+ \else
+ \global\let\printcitepreitem\gobble
+ \global\let\printcitepostitem\relax
+ \fi
+ \printcitepreitem{#1}%
+}%
+%
+%
+%
+% Macros that produce output.
+%
+% \obeywhitespace makes both end-of-lines and spaces in the input be
+% respected in the output. Even spaces at the beginning of lines turn
+% into blank space the size of the natural space of the current font.
+% The reason why plain TeX's \obeyspaces does not do this last is that
+% it produces actual space characters, i.e., glue, and glue is discarded
+% at a(n output) line break, and so if line breaks in the input are
+% line breaks in the output...
+%
+% Tabs are not affected; they will still produce glue (a single space).
+%
+\begingroup
+ \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on.
+\gdef\obeywhitespace{%
+\makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}%
+\makeactive\ \let =\ %
+%
+% The group we use here is the one \obeywhitespace must be enclosed in.
+% If we don't do this, then if the obeyed stuff ends in a newline, the
+% indent produced by the definition of ^^M will make that line indented,
+% even if it isn't the end of the paragraph.
+\aftergroup\@removebox%
+\futurelet\next\@finishobeywhitespace%
+}%
+%
+% \@finishobeywhitespace eats any spaces and/or the end-of-line after
+% the \obeywhitespace command itself. The group here is the one that it
+% itself creates.
+%
+\gdef\@finishobeywhitespace{{%
+\ifx\next %
+\aftergroup\@obeywhitespaceloop%
+\else\ifx\next^^M%
+\aftergroup\gobble%
+\fi\fi}}%
+%
+% \@finishobeyedreturn is invoked at the end of every input line. We
+% check if the next thing is also a return, and, if so, insert extra
+% space. Then we start the next line.
+%
+\gdef\@finishobeyedreturn{%
+\ifx\next^^M\vskip\blanklineskipamount\fi%
+\indent%
+}%
+\endgroup
+%
+% The argument here is the space that we are supposed to eat after the
+% \obeywhitespace command.
+%
+\def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}%
+%
+%
+% This removes the last box, if it was a empty box of width \parindent.
+% We might have been called inside a \vbox, so we have to test if we are
+% in horizontal mode before using \lastbox.
+%
+\def\@removebox{%
+ \ifhmode
+ \setbox0 = \lastbox
+ \ifdim\wd0=\parindent
+ \setbox2 = \hbox{\unhbox0}%
+ \ifdim\wd2=0pt
+ % Don't put it back: it was an indentation box.
+ % This \ignorespaces ignores spaces after the group.
+ \ignorespaces
+ \else
+ \box2 % Put it back: it wasn't empty.
+ \fi
+ \else
+ \box0 % Put it back: it wasn't the right width.
+ \fi
+ \fi
+}%
+%
+% We allow for extra (possibly negative) space when we hit blank lines.
+%
+\newskip\blanklineskipamount
+\blanklineskipamount = 0pt
+%
+%
+% A good way to print fractions in text when you don't want
+% to use \over (which should be most of the time), and yet
+% just `1/2' doesn't look right. (From the TeXbook,
+% the answer to exercise 11.6, p.311.)
+%
+\def\frac#1/#2{\leavevmode
+ \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}%
+ \kern-.1em $/$%
+ \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}%
+}%
+%
+%
+% The `e' just means `Eplain', as in `Eplain's hrule'. The advantage
+% to using these is that you can change the default thickness.
+%
+\newdimen\hruledefaultheight \hruledefaultheight = 0.4pt
+\newdimen\hruledefaultdepth \hruledefaultdepth = 0.0pt
+\newdimen\vruledefaultwidth \vruledefaultwidth = 0.4pt
+%
+\def\ehrule{\hrule height\hruledefaultheight depth\hruledefaultdepth}%
+\def\evrule{\vrule width\vruledefaultwidth}%
+%
+%
+% The texnames.sty and path.sty files included below were originally
+% written by Nelson Beebe and Philip Taylor, respectively. See the
+% complete source files (e.g., in this distribution) for comments.
+%% [[[include texnames.sty]]]
+%% [[[include path.sty]]]
+%
+%
+% A square box, suitable for being a marker in lists.
+%
+\def\blackbox{\vrule height .8ex width .6ex depth -.2ex \relax}% square bullet
+%
+%
+% From p.311 of the TeXbook.
+%
+% Make an unfilled rectangle with the dimensions of \box0. #1 is the
+% height of the rules, #2 the depth (i.e., the thicknesses).
+%
+\def\makeblankbox#1#2{%
+ \ifvoid0
+ \errhelp = \@makeblankboxhelp
+ \errmessage{Box 0 is void}%
+ \fi
+ \hbox{\lower\dp0
+ \vbox{\hidehrule{#1}{#2}%
+ \kern -#1% overlap rules
+ \hbox to \wd0{\hidevrule{#1}{#2}%
+ \raise\ht0\vbox to #1{}% vrule height
+ \lower\dp0\vtop to #1{}% vrule depth
+ \hfil\hidevrule{#2}{#1}%
+ }%
+ \kern-#1\hidehrule{#2}{#1}%
+ }%
+ }%
+}%
+%
+\newhelp\@makeblankboxhelp{Assigning to the dimensions of a void^^J%
+ box has no effect. Do `\string\setbox0=\string\null' before you^^J%
+ define its dimensions.}%
+%
+%
+% Produce an hrule with height #1 and depth #2, and insert kerning so it
+% doesn't change the current position.
+%
+\def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2}%
+%
+% Produce a vrule with width #1+#2, kerning so as not to change the
+% current position.
+%
+\def\hidevrule#1#2{%
+ \kern-#1%
+ \dimen@=#1\advance\dimen@ by #2%
+ \vrule width\dimen@
+ \kern-#2%
+}%
+%
+%
+% The \boxit macro from the TeXbook, trivially generalized to allow
+% something other than 3pt around the TeX box being boxed.
+%
+\newdimen\boxitspace \boxitspace = 3pt
+%
+\long\def\boxit#1{%
+ \vbox{%
+ \ehrule
+ \hbox{%
+ \evrule
+ \kern\boxitspace
+ \vbox{\kern\boxitspace \parindent = 0pt #1\kern\boxitspace}%
+ \kern\boxitspace
+ \evrule
+ }%
+ \ehrule
+ }%
+}%
+%
+%
+% Produce the written-out form of a number.
+%
+\def\numbername#1{\ifcase#1%
+ zero%
+ \or one%
+ \or two%
+ \or three%
+ \or four%
+ \or five%
+ \or six%
+ \or seven%
+ \or eight%
+ \or nine%
+ \or ten%
+ \or #1%
+ \fi
+}%
+%
+% The following arrow macros were written by Steven Smith. See arrow.tex.
+\let\@plainnewif = \newif
+\let\@plainnewdimen = \newdimen
+\let\newif = \innernewif
+\let\newdimen = \innernewdimen
+\edef\@eplainoldandcode{\the\catcode`& }%
+\catcode`& = 11
+\toks0 = {%
+ %% [[[include arrow1]]]
+}%
+\catcode`& = 4
+\toks2 = {%
+ %% [[[include arrow2]]]
+}%
+\let\newif = \@plainnewif
+\let\newdimen = \@plainnewdimen
+\ifx\noarrow\@undefined \the\toks0 \the\toks2 \fi
+\catcode`& = \@eplainoldandcode
+%
+%
+%
+% Environments.
+%
+% Define an ``environment'': arbitrary text, enclosed by \begingroup and
+% \endgroup. But you get to label the group, so that if you forget an
+% \environment or an \endenvironment, you will probably get an error
+% message about it.
+%
+% Since the environment names appear in \errmessage arguments, it's best
+% to keep them to `letter' and `other' characters. I suppose we could
+% call \tokstostring to allow more general labels.
+%
+% These macros improve slightly on the answer to exercise 5.7 in
+% The TeXbook, by making some checks on \begingroup and \endgroup, as
+% well as just making sure \environment and \endenvironment's match.
+%
+%
+\def\environment#1{%
+ \ifx\@groupname\@undefined\else
+ % This gets invoked if we have two \environments (and no matching
+ % \endenvironment to the first) with an \endgroup in between.
+ \errhelp = \@unnamedendgrouphelp
+ \errmessage{`\@groupname' was not closed by \string\endenvironment}%
+ \fi
+ % Use \edef in case we are passed a macro that contains the name,
+ % instead of the name.
+ \edef\@groupname{#1}%
+ \begingroup
+ \let\@groupname = \@undefined
+}%
+%
+\def\endenvironment#1{%
+ \endgroup
+ \edef\@thearg{#1}%
+ \ifx\@groupname\@thearg
+ \else
+ \ifx\@groupname\@undefined
+ % Unfortunately, one gets an `extra \endgroup' message before
+ % seeing this. But we have to restore \@groupname, so I see no
+ % alternative.
+ \errhelp = \@isolatedendenvironmenthelp
+ \errmessage{Isolated \string\endenvironment\space for `#1'}%
+ \else
+ \errhelp = \@mismatchedenvironmenthelp
+ \errmessage{Environment `#1' ended, but `\@groupname' started}%
+ \endgroup % Probably a typo in the names.
+ \fi
+ \fi
+ \let\@groupname = \@undefined
+}%
+%
+\newhelp\@unnamedendgrouphelp{Most likely, you just forgot an^^J%
+ \string\endenvironment. Maybe you should try inserting another^^J%
+ \string\endgroup to recover.}%
+%
+\newhelp\@isolatedendenvironmenthelp{You ended an environment X, but^^J%
+ no \string\environment{X} to start it is anywhere in sight.^^J%
+ You might also be at an \string\endenvironment\space that would match^^J%
+ a \string\begingroup, i.e., you forgot an \string\endgroup.}%
+%
+\newhelp\@mismatchedenvironmenthelp{You started an environment named X, but^^J%
+ you ended one named Y. Maybe you made a typo in one^^J%
+ or the other of the names?}%
+%
+%
+% The above sort of environment allows nesting. But environments
+% shouldn't always be allowed to nest (like the \flushright,
+% \flushleft, and \center ones defined below). Here are some macros to
+% help deal with that.
+%
+% \checkenv goes at the beginning of a macro that is
+% going to define the environment.
+%
+\newif\ifenvironment
+\def\checkenv{\ifenvironment \errhelp = \@interwovenenvhelp
+ \errmessage{Interwoven environments}%
+ \egroup \fi
+}%
+%
+\newhelp\@interwovenenvhelp{Perhaps you forgot to end the previous^^J%
+ environment? I'm finishing off the current group,^^J%
+ hoping that will fix it.}%
+%
+%
+%
+% Mathematics displays.
+%
+% By default, TeX centers displayed material. To get left-justified
+% displays, say \leftdisplays. To go back to centered displays, say
+% \centereddisplays.
+%
+% This is based on an approach developed by Donald Arseneau,
+% asnd@triumfrg.bitnet.
+%
+\newtoks\previouseverydisplay
+% Here we want to make ordinary math displays flush left,
+% indented by the dimen \leftdisplayindent, which defaults
+% to \parindent.
+%
+% How do you want the first column aligned?
+\let\@leftleftfill\relax % as it was
+%\let\@leftleftfill\hfill % makes more sense, but could be too ugly
+%
+% Surely it makes more sense to not sum \leftdisplayindent+\parindent
+\newdimen\leftdisplayindent \leftdisplayindent=\parindent
+\newif\if@leftdisplays
+%
+\def\leftdisplays{%
+ \if@leftdisplays\else
+ \previouseverydisplay = \everydisplay
+ \everydisplay = {\the\previouseverydisplay \leftdisplaysetup}%
+ \let\@save@maybedisableeqno = \@maybedisableeqno
+ \let\@saveeqno = \eqno
+ \let\@saveleqno = \leqno
+ \let\@saveeqalignno = \eqalignno
+ \let\@saveleqalignno = \leqalignno
+ \let\@maybedisableeqno = \relax
+ \def\eqno{\hfill\textstyle\enspace}%
+ \def\leqno{%
+ \hfill
+ \hbox to0pt\bgroup
+ \kern-\displaywidth
+ % was: \kern-\displayindent % really \displayindent?
+ \kern-\leftdisplayindent % I'll use just \leftdisplayindent
+ $\aftergroup\@leftleqnoend % inserted after ending $
+ }%
+ \@redefinealignmentdisplays
+ \@leftdisplaystrue
+ \fi
+}%
+\newbox\@lignbox
+\newdimen\disprevdepth
+
+% In order to use $$ for left-aligned equation we have to
+% put something like \leftline{$\displaystyle ...$} in the
+% display. Then \eqno works basically like \hfill.
+% In order to make $$<assignments>\eqalignno{...}$$ work as
+% expected, including page breaks, we have to get rid of the
+% horizontal box, and un-vbox the alignment. Sadly, \unvbox
+% does not perform baselineskip handing, so we need to get
+% the \prevdepth ourselves...in order to get the prevdepth,
+% the outermost display must be an alignment display.
+% Therefore, an ordinary $$ a=b $$ becomes:
+% $$\halign{#\cr\noalign{\disprevdepth = \prevdepth
+% \leftline{$\displaystyle a=b$}
+% }}$$
+%
+\def\centereddisplays{%
+ % If \leftdisplays hasn't been called, don't try to restore all the
+ % stuff it changes.
+ %
+ \if@leftdisplays
+ \everydisplay = \previouseverydisplay
+ \let\@maybedisableeqno = \@save@maybedisableeqno
+ \let\eqno = \@saveeqno
+ \let\leqno = \@saveleqno
+ \let\eqalignno = \@saveeqalignno
+ \let\leqalignno = \@saveleqalignno
+ \@leftdisplaysfalse
+ \fi
+}%
+%
+\def\leftdisplaysetup{%
+% surely not this *and* \leftdisplayindent? : \dimen@ = \parindent
+ \dimen@ = \leftdisplayindent
+ \advance\dimen@ by \leftskip
+ \advance\displayindent by \dimen@
+ \advance\displaywidth by -\dimen@
+% this outermost alignment doesn't align anything.
+ \halign\bgroup##\cr \noalign\bgroup
+ \disprevdepth = \prevdepth
+ \setbox\z@ = \hbox to\displaywidth\bgroup
+ % Why strut?? \strut
+ % Why this?? \advance\hsize by -\displayindent
+ $\displaystyle
+ \aftergroup\@lefteqend % inserted after ending $
+}
+%
+\def\@lefteqend{% gets inserted between the ending $$
+ \hfil\egroup% end box 0
+ \@putdisplay}
+% gets inserted between trailing $$.
+\def\@leftleqnoend{\hss \egroup $}% end the \hbox to 0pt for \leqno, restore $
+%
+\def\@putdisplay{%
+ \ifvoid\@lignbox % Ordinary display; use it.
+ \moveright\displayindent\box\z@
+ \else % alignment display; unwrap alignment
+ \prevdepth = \dp\@lignbox % affects the skip *below*
+ \unvbox\@lignbox
+ \fi
+ \egroup\egroup % end \noalign, end outer \halign
+ $% restore first $ of trailing $$
+}
+%
+\def\@redefinealignmentdisplays{%
+ \def\displaylines##1{
+ \global\setbox\@lignbox\vbox{%
+ \prevdepth = \disprevdepth
+ \displ@y
+ \tabskip\displayindent
+ \halign{\hbox to\displaywidth
+ {$\@lign\displaystyle####\hfil$\hfil}\crcr
+ ##1\crcr}}}%
+ \def\eqalignno##1{%
+ \def\eqno{&}%
+ \global\setbox\@lignbox\vbox{%
+ \prevdepth = \disprevdepth
+ \displ@y
+ \advance\displaywidth by \displayindent
+ \tabskip\displayindent
+ \halign to\displaywidth{%
+ \hfil $\@lign\displaystyle{####}$\@leftleftfill\tabskip\z@skip
+ &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
+ &\llap{$\@lign####$}\tabskip\z@skip\crcr
+ ##1\crcr}}}%
+ \def\leqalignno##1{%
+ \def\eqno{&}%
+ \global\setbox\@lignbox\vbox{%
+ \prevdepth = \disprevdepth
+ \displ@y
+ \advance\displaywidth by \displayindent
+ \tabskip\displayindent
+ \halign to\displaywidth{%
+ \hfil $\@lign\displaystyle{####}$\@leftleftfill\tabskip\z@skip
+ &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
+ &\kern-\displaywidth
+% \showthe\displayindent \showthe\leftdisplayindent
+ \rlap{\kern\displayindent \kern-\leftdisplayindent$\@lign####$}%
+ \tabskip\displaywidth\crcr
+ ##1\crcr}}}%
+}%
+%
+% \noalign is typically used to insert a few words (`and', for example)
+% between two aligned equations. So I don't think the \noaligned
+% material should be indented. Since \noalign takes <vertical mode
+% material>, we would end up with double indentation, anyway: one
+% because we're indenting the whole display, and one at the start of the
+% <v.m.m.>. (If you want to change any of this, you can put something in
+% \@everynoalign.) So, we use this definition for \noalign in a
+% left-justified \eqalignno:
+%
+\let\@primitivenoalign = \noalign
+\newtoks\@everynoalign
+\def\@lefteqalignonoalign#1{%
+ \@primitivenoalign{%
+ % Is it right to set \leftskip=0pt first, thus perhaps making this
+ % work in lists and so forth? We just compensate for the other ways
+ % the display is indented here.
+ \advance\leftskip by -\parindent
+ \advance\leftskip by -\leftdisplayindent
+ \parskip = 0pt
+ %
+ % We use \parindent=0pt instead of \noindent because the latter
+ % starts unrestricted horizontal mode, which means the alignment
+ % we're inside will wind up being as wide as the page. When the arg
+ % is just vertical material, this is wrong. For example, using
+ % \matrix inside \eqalignno fails if \noindent is used.
+ \parindent = 0pt
+ \the\@everynoalign
+ #1%
+ }%
+}%
+%
+%
+%
+% Time macros.
+%
+% TeX sets \time, \day, \month, and \year when it begins. (And does not
+% update them as it runs!)
+%
+%
+% \monthname produces the name of the month, abbreviated to three
+% letters. The primitive \month should never be zero.
+%
+\def\monthname{%
+ \ifcase\month
+ \or Jan\or Feb\or Mar\or Apr\or May\or Jun%
+ \or Jul\or Aug\or Sep\or Oct\or Nov\or Dec%
+ \fi
+}%
+%
+% \fullmonthname is like \monthname, except it doesn't abbreviate.
+%
+\def\fullmonthname{%
+ \ifcase\month
+ \or January\or February\or March\or April\or May\or June%
+ \or July\or August\or September\or October\or November\or December%
+ \fi
+}%
+%
+% \timestring produces the current time, in a format like `1:14 p.m.'.
+%
+\def\timestring{\begingroup
+ \count0 = \time
+ \divide\count0 by 60
+ \count2 = \count0 % The hour, from zero to 23.
+ %
+ \count4 = \time
+ \multiply\count0 by 60
+ \advance\count4 by -\count0 % The minute, from zero to 59.
+ % But we need the minutes with a leading zero, if necessary.
+ \ifnum\count4<10
+ \toks1 = {0}%
+ \else
+ \toks1 = {}%
+ \fi
+ %
+ % Convert the hour into `a.m.' or `p.m.', and make it mod 12.
+ \ifnum\count2<12
+ \toks0 = {a.m.}%
+ \else
+ \toks0 = {p.m.}%
+ \advance\count2 by -12
+ \fi
+ %
+ % If it's midnight, call it `12', not `0'.
+ \ifnum\count2=0
+ \count2 = 12
+ \fi
+ %
+ % Produce the output.
+ \number\count2:\the\toks1 \number\count4 \thinspace \the\toks0
+\endgroup}%
+%
+%
+% \timestamp produces a text string for the whole thing like
+% `23 Apr 1964 1:14 p.m.'.
+%
+\def\timestamp{\number\day\space\monthname\space\number\year\quad\timestring}%
+%
+%
+% \today produces the current date, as in `23 April 1964'.
+%
+\def\today{\the\day\ \fullmonthname\ \the\year}%
+%
+%
+%
+% (Typographical) lists.
+%
+% These macros can produce numbered or unnumbered lists.
+%
+% You can change the spacing by assigning new values to these registers.
+% They are used by both kinds of lists. \listleftindent is relative to
+% the current paragraph indentation, while \listrightindent is an
+% absolute value. I do this for two reasons: (1) it is more useful, if not
+% more ``logical'', to make list indentation depend on the paragraph
+% indentation; (2) footnotes do not work if \parindent is zero, and
+% having a footnote in a list item is perfectly reasonable.
+%
+% If you change \baselineskip and want \abovelistskip and \belowlistskip
+% to retain their meanings here, you will have to reassign to them. The
+% \baselineskip here is the value at the time eplain.tex is read, i.e.,
+% 12pt (most likely).
+%
+% If the items in your lists are very long, you might want to
+% make \interitemskipamount nonzero.
+%
+\newskip\abovelistskipamount \abovelistskipamount = .5\baselineskip
+ \newcount\abovelistpenalty \abovelistpenalty = 10000
+ \def\abovelistskip{\vpenalty\abovelistpenalty \vskip\abovelistskipamount}%
+\newskip\interitemskipamount \interitemskipamount = 0pt
+ \newcount\belowlistpenalty \belowlistpenalty = -50
+ \def\belowlistskip{\vpenalty\belowlistpenalty \vskip\belowlistskipamount}%
+\newskip\belowlistskipamount \belowlistskipamount = .5\baselineskip
+ \newcount\interitempenalty \interitempenalty = 0
+ \def\interitemskip{\vpenalty\interitempenalty \vskip\interitemskipamount}%
+\newdimen\listleftindent \listleftindent = 0pt
+\newdimen\listrightindent \listrightindent = 0pt
+\let\listmarkerspace = \enspace
+%
+% To do arbitrary things at the start of each list:
+\newtoks\everylist
+%
+% If you want no space between items for a particular list
+% (perhaps because the items in it are short), you can say,
+% e.g., \numberedlist\listcompact.
+%
+\def\listcompact{\interitemskipamount = 0pt \relax}%
+%
+% This is called to set up the parameters by both sorts of lists.
+% Because we set \rightskip, we finish off the current paragraph.
+%
+\newdimen\@listindent
+%
+\def\beginlist{%
+ % Insert the space above this list, before we change \leftskip
+ % (because the \vskip in here might be what ends the paragraph).
+ \abovelistskip
+ %
+ \@listindent = \parindent
+ \advance\@listindent by \listleftindent
+ %
+ % \leftskip shifts nested lists to the right on the page.
+ \advance\leftskip by \@listindent
+ \advance\rightskip by \listrightindent
+ %
+ % We always need \itemnumber, so we can know whether an item is the
+ % first one or not.
+ \itemnumber = 1
+ %
+ \the\everylist
+}%
+%
+% A list item, for both kinds of lists.
+%
+\def\li{\@getoptionalarg\@finli}%
+\def\@finli{%
+ % Save \@optionalarg in case \interitemskip garble it.
+ \let\@lioptarg\@optionalarg
+ % Write xref definition but do not define hyperlink destination
+ % (\printitem will do it).
+ \ifx\@lioptarg\empty \else
+ \begingroup
+ \@@hldestoff
+ \expandafter\writeitemxref\expandafter{\@lioptarg}%
+ \endgroup
+ \fi
+ \ifnum\itemnumber=1 \else \interitemskip \fi
+ % Add hyperlink destination in front of \marker before doing \printitem.
+ \begingroup
+ \ifx\@lioptarg\empty \else
+ \toks@ = \expandafter{\@lioptarg}%
+ \let\li@nohldest@marker\marker
+ \edef\marker{\noexpand\hldest@impl{li}{\the\toks@}\noexpand\li@nohldest@marker}%
+ \fi
+ \printitem
+ \endgroup
+ \advance\itemnumber by 1
+ \advance\itemletter by 1
+ \advance\itemromannumeral by 1
+ %
+ % Just in case somebody creeps in with an argument or something.
+ \ignorespaces
+}%
+%
+% \writeitemxref{LABEL} writes out a definition for LABEL to be \marker
+% for the aux file.
+%
+\def\writeitemxref#1{\definexref{#1}\marker{item}}%
+%
+% \printitem is used to print items by both sorts of lists. A \par gets
+% produced before every item -- even the first one. We also want to
+% make paragraphs after the first appear to be indented -- i.e., they
+% will have double indentation. It is usually bad exposition to have
+% lists with multiparagraph items, but sometimes it is unavoidable.
+%
+\def\printitem{%
+ \par
+ \nobreak
+ \vskip-\parskip
+ \noindent
+ \printmarker\marker
+}%
+%
+% Output the list marker.
+%
+\def\printmarker#1{\llap{\marker \enspace}}%
+%
+% Common ending.
+%
+\def\endlist{\belowlistskip}%
+%
+%
+% \numberedlist produces items which are numbered sequentially, starting
+% from one. You start items with \li (`list item'). End the list with
+% \endnumberedlist.
+%
+% A nested \numberedlist produces items labelled `(a)', `(b)', etc. A
+% doubly (and deeper) nested \numberedlist labels items with `*'.
+%
+% These registers keep track of where we are.
+%
+\newcount\numberedlistdepth
+\newcount\itemnumber
+\newcount\itemletter
+\newcount\itemromannumeral
+%
+\def\numberedmarker{%
+ \ifcase\numberedlistdepth
+ (impossible)%
+ \or \printitemnumber
+ \or \printitemletter
+ \or \printitemromannumeral
+ \else *%
+ \fi
+}%
+%
+% These produce the text of the labels. We use \the\itemletter so that
+% the value will expand.
+%
+\def\printitemnumber{\number\itemnumber}%
+\def\printitemletter{\char\the\itemletter}%
+\def\printitemromannumeral{\romannumeral\itemromannumeral}%
+\def\numberedprintmarker#1{\llap{#1) \listmarkerspace}}%
+%
+\def\numberedlist{\environment{@numbered-list}%
+ % This is set back to zero by getting to the end of the group.
+ \advance\numberedlistdepth by 1
+ \itemletter = `a
+ \itemromannumeral = 1
+ \beginlist
+ \let\marker = \numberedmarker
+ \let\printmarker = \numberedprintmarker
+}%
+%
+\def\endnumberedlist{%
+ \par
+ \endenvironment{@numbered-list}%
+ \endlist
+}%
+%
+% Allow synonyms for \numberedlist.
+\let\orderedlist = \numberedlist
+\let\endorderedlist = \endnumberedlist
+%
+%
+%
+% \unorderedlist produces items which are labelled with bullets. You
+% start an item with \li, just as with numbered lists. You end the list
+% with \endunorderedlist.
+%
+% A nested \unorderedlist produces items labelled with em-dashes. A
+% doubly (and deeper) nested \unorderedlist uses `*'.
+%
+\newcount\unorderedlistdepth
+%
+\def\unorderedmarker{%
+ \ifcase\unorderedlistdepth
+ (impossible)%
+ \or \blackbox
+ \or ---%
+ \else *%
+ \fi
+}%
+\def\unorderedprintmarker#1{\llap{#1\listmarkerspace}}%
+%
+\def\unorderedlist{\environment{@unordered-list}%
+ \advance\unorderedlistdepth by 1
+ \beginlist
+ \let\marker = \unorderedmarker
+ \let\printmarker = \unorderedprintmarker
+}%
+%
+\def\endunorderedlist{%
+ \par
+ \endenvironment{@unordered-list}%
+ \endlist
+}%
+%
+%
+%
+% Verbatim listing.
+%
+% ... well, almost verbatim. We assume the font \tt has all the
+% characters that will appear. Control characters, except for tabs and
+% form feeds (and returns) won't produce anything useful. Tabs produce
+% a fixed amount of space, and form feeds produce a page break.
+%
+% This is based on Knuth's ideas in Appendix D of the TeXbook, p. 380.
+% The argument should be a filename.
+%
+% if you need to do something more for your particular fonts and/or
+% environment before the file is input, give a definition to
+% \setuplistinghook. If you want line numbers on the output, you can
+% say \let\setuplistinghook = \linenumberedlisting.
+%
+\def\listing#1{%
+ \par \begingroup
+ \@setuplisting
+ \setuplistinghook
+ \input #1
+ \endgroup
+}%
+%
+\let\setuplistinghook = \relax
+%
+\def\linenumberedlisting{%
+ \ifx\lineno\undefined \innernewcount\lineno \fi
+ \lineno = 0
+ \everypar = {\advance\lineno by 1 \printlistinglineno}%
+}%
+\def\printlistinglineno{\llap{[\the\lineno]\quad}}%
+%
+%
+% \uncatcodespecials must come before \obeywhitespace, lest a space
+% character in the input produce character 32 from the \tt font.
+% Ensure ^^L is active and non-outer.
+%
+{%
+ \makeactive\^^L
+ \let^^L = \relax
+ \gdef\@setuplisting{%
+ \uncatcodespecials
+ \obeywhitespace
+ \makeactive\`
+ \makeactive\^^I
+ \makeactive\^^L
+ \def^^L{\vfill\break}%
+ \parskip = 0pt
+ \listingfont
+ }%
+}%
+\def\listingfont{\tt}%
+%
+% Give definitions to the characters we want to be special.
+%
+% Do ` separately, so can use ` in the \catcode commands elsewhere.
+%
+{%
+ \makeactive\`
+ \gdef`{\relax\lq}% Defeat ligatures.
+}%
+{%
+ \makeactive\^^I
+ \gdef^^I{\hskip8\fontdimen2\font \relax}%
+}%
+%
+%
+% \verbatim ... |endverbatim typesets the ... in typewriter. To produce a |
+% in the ..., use ||. This macro was contributed by beebe@math.utah.edu.
+% Generalized to characters other than | by dorai@cs.rice.edu.
+%
+\def\verbatimescapechar#1{%
+ \gdef\@makeverbatimescapechar{%
+ \@makeverbatimdoubleescape #1%
+ \catcode`#1 = 0
+ }%
+}%
+\def\@makeverbatimdoubleescape#1{%
+ \catcode`#1 = \other
+ \begingroup
+ \lccode`\* = `#1%
+ \lowercase{\endgroup \ece\def*{*}}%
+}%
+\verbatimescapechar\| % initially escapechar is |
+%
+\def\verbatim{\begingroup
+ \uncatcodespecials
+ \makeactive\` % make space character a single space, not stretchable
+ \@makeverbatimescapechar
+ \tt\obeywhitespace}
+\let\endverbatim = \endgroup
+%
+%
+%
+% Table of contents, list of figures, etc.
+%
+% Entries for the table of contents are recorded in \jobname.toc, which
+% we open for writing at the first \writetocentry. Actually, we use
+% \tocfilebasename for the root of the filename to read; \jobname is
+% the default.
+%
+\def\definecontentsfile#1{%
+ \ece\innernewwrite{#1file}%
+ \ece\innernewif{if@#1fileopened}%
+ \ece\let{#1filebasename} = \jobname
+ \ece\def{open#1file}{\opencontentsfile{#1}}%
+ \ece\def{write#1entry}{\writecontentsentry{#1}}%
+ \ece\def{writenumbered#1entry}{\writenumberedcontentsentry{#1}}%
+ \ece\innernewif{ifrewrite#1file} \csname rewrite#1filetrue\endcsname
+ \ece\def{read#1file}{\readcontentsfile{#1}}%
+}%
+%
+% We provide \opentocfile, \readtocfile, etc., by default.
+\definecontentsfile{toc}%
+%
+% And `toc' is just the argument to this macro.
+\def\opencontentsfile#1{%
+ \csname if@#1fileopened\endcsname \else
+ \ece{\immediate\openout}{#1file} = \csname #1filebasename\endcsname.#1
+ \ece\global{@#1fileopenedtrue}%
+ \fi
+}%
+%
+% \writetocentry#1#2 produces a line in the .toc file that
+% looks like:
+% \toc#1entry{#2}{page number}
+% e.g.,
+% \tocchapterentry{Introduction}{2}
+% would be written by
+% \writetocentry{chapter}{Introduction}
+% if the chapter started on page two.
+%
+% Thus, #1 is intended to be something like `chapter' or `section', #2
+% to be the text of the title.
+%
+% Of course, if you want, you can \write\tocfile yourself with whatever
+% you like. In that case, you must also call \opentocfile.
+%
+% By the way, it would be wrong to put a \percentchar at the end of the
+% output line. Then, when the .toc file is read, if each line is turned
+% into a \leftline, say, there would be no legal breakpoint between the
+% boxes, and one extremely long line would result.
+%
+% `toc' is the first argument to this; \writetocentry is defined by
+% \definecontentsfile.
+\def\writecontentsentry#1#2#3{\writenumberedcontentsentry{#1}{#2}{#3}{}}%
+%
+% Sometimes you want the control sequence to take another number (e.g.,
+% a chapter number) as a parameter. (Although you can pass anything you
+% want as the third parameter, naturally.) The third parameter is
+% expanded at the point of the \writenumberedtocentry, not when the
+% \write actually happens. This makes the usual case---the third
+% parameter being \the\someregister---work.
+%
+% For example:
+% \writenumberedtocentry{chapter}{The second chapter}{2}
+% would produce:
+% \tocchapterentry{The second chapter}{2}{14}
+%
+% if the second chapter started on page 14.
+%
+% `toc' is the first argument, as above.
+\def\writenumberedcontentsentry#1#2#3#4{%
+ \csname ifrewrite#1file\endcsname
+ \csname open#1file\endcsname
+ \toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}%
+ \def\temp{#3}%
+ %
+ % Usually #4 is just `\the\register', which we want to expand. But
+ % if it's not a number at all -- e.g., if it's an author's name, we
+ % don't want to expand control sequences for accents and the like.
+ % So we play some games here.
+ \toks2 = \expandafter{#4}%
+ \edef\cs{\the\toks2}%
+ \edef\@wr{%
+ \write\csname #1file\endcsname{%
+ \the\toks0 % the \toc...entry control sequence
+ {\sanitize\temp}% the text
+ \ifx\empty\cs\else {\sanitize\cs}\fi % A secondary number, or nothing:
+ {\noexpand\folio}% the page number
+ }%
+ }%
+ \@wr
+ \fi
+ \ignorespaces
+}%
+%
+% The entries are read in when the user invokes \readtocfile (which
+% should be before the first \writetocentry). We do not open the .toc
+% file to allow reading it in twice to make a short contents or some
+% such. This should not cause any problems because each of
+% \writecontentsentry and \writenumberedcontentsentry open the .toc
+% file for writing (i.e., empty it) before trying to write to it.
+\def\readcontentsfile#1{%
+ \edef\temp{%
+ \noexpand\testfileexistence[\csname #1filebasename\endcsname]{#1}%
+ }\temp
+ \if@fileexists
+ \input \csname #1filebasename\endcsname.#1\relax
+ \fi
+}%
+%
+% Here are some sample definitions of the \toc...entry macros. Perhaps
+% you or your book designer can come up with a better way of handling
+% contents than leaders. These definitions are just examples, not
+% something you might want to actually use to print a document.
+\def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}%
+\def\tocsectionentry#1#2{\line{\quad\sl #1 \dotfill\ \rm #2}}%
+\def\tocsubsectionentry#1#2{\line{\qquad\rm #1 \dotfill\ #2}}%
+%
+%
+%
+% Cross-references.
+%
+% Definitions of references are recorded in \jobname.aux, called
+% \auxfile in the macros, which btxmac.tex has opened.
+%
+% When a label isn't defined, we only want to complain if
+% \xrefwarningtrue; btxmac uses \if@citewarning for this, so we have to
+% reuse that name. We can't just say \let\ifxrefwarning =
+% \if@citewarning, since then changes to the latter won't be reflected
+% in the former. On the other hand, we have to have a true \if...
+% command, so \if's and \fi's match properly. What a mess.
+%
+\let\ifxrefwarning = \iftrue
+\def\xrefwarningtrue{\@citewarningtrue \let\ifxrefwarning = \iftrue}%
+\def\xrefwarningfalse{\@citewarningfalse \let\ifxrefwarning = \iffalse}%
+%
+%
+% \xref{foo} produces ``p.\thinspace <page#>''. \xrefn{foo} produces
+% ``<page#>''. \xrdef{foo} produces nothing, but defines the label
+% `foo' to be on the current page.
+%
+% As usual, it takes two passes to get the cross-references right. I
+% would like to check for labels being defined twice, but I don't know
+% how to do that. If the cross-reference file has been read in, many
+% cross-references will be defined that I don't want to complain about.
+% It is only if two \xrdef commands are given to the same string that I
+% want to complain. I could define a new control sequence for each
+% cross-reference, and check that, but that seems like too high of a
+% price to pay.
+%
+%
+% \xrlabel{LABEL} expands to a cross-reference internal name. We append
+% an _ character to NAME, to help avoid conflicts. And we append an `x'
+% so that we don't redefine \_ on an empty label.
+%
+\begingroup
+ % Mike Spivak's MathTime macros for Times Roman fonts changes the
+ % catcode of _ to be active. Undo that. (From adam@symcom.math.uiuc.edu.)
+ \catcode`\_ = 8
+ \gdef\xrlabel#1{#1_x}%
+\endgroup
+%
+%
+% \xrdef{LABEL} defines LABEL to be the current page number. But we
+% don't define the label here, because the page number might be off: if
+% this is not the first time through, the label would already be
+% defined, and we would redefine it with the wrong information.
+%
+\def\xrdef#1{%
+ \begingroup
+ % Define hyperlink destination.
+ \hldest@impl{xrdef}{#1}%
+ % Define cross-reference but not hyperlink destination.
+ \begingroup
+ \@@hldestoff
+ \definexref{#1}{\noexpand\folio}{page}%
+ \endgroup
+ \endgroup
+}%
+%
+% \definexref{LABEL}{DEFINITION}{CLASS} defines a cross-reference named
+% LABEL of label class CLASS to be DEFINITION. (Or LABEL can be a
+% control sequence; it's expanded to get the label text.) To get a
+% possible page number right, we have to write the definition out to the
+% auxiliary file, instead of only defining it directly.
+%
+\def\definexref#1#2#3{%
+ % Define a hyperlink destination LABEL.
+ \hldest@impl{definexref}{#1}%
+ % Remember what we're given; it might be `\@optionalarg', which
+ % \readauxfile trashes. (No loss of generality here, since \csname
+ % will fully expand the label anyway.)
+ \edef\temp{#1}%
+ %
+ % Be sure we've read the aux file before we zap it:
+ \readauxfile
+ %
+ % When we read in the aux file next time, define the label:
+ \edef\@wr{\noexpand\writeaux{\string\@definelabel{\temp}{#2}{#3}}}%
+ \@wr
+ \ignorespaces
+}%
+%
+% \@definelabel{LABEL}{DEFINITION}{CLASS} actually defines LABEL of
+% label class CLASS to be DEFINITION.
+%
+\def\@definelabel#1#2#3{%
+ % Define the control sequence.
+ \expandafter\gdef\csname\xrlabel{#1}\endcsname{#2}%
+ %
+ % Remember what kind of label this is, so \ref will know what to do.
+% \global\setproperty{\xrlabel{#1}}{class}{#3}%
+ \setpropertyglobal{\xrlabel{#1}}{class}{#3}%
+}%
+%
+% \reftie is used by several cross-referencing macros to separate
+% optional text from label reference. \refspace is used by \ref to
+% separate optional text from \CLASSword and by \xref to separate
+% optional text from `p. '.
+%
+\def\reftie{\penalty\@M \ }% Do not rely on `~' being defined as a tie.
+\let\refspace\
+%
+% Typeset a reference to the label #1. If optional argument is
+% present it will be tied with \reftie to the reference and become
+% part of the hyperlink.
+%
+\def\xrefn{\@getoptionalarg\@finxrefn}%
+\def\@finxrefn#1{%
+ % Hyperlink and optional TEXT.
+ \hlstart@impl{ref}{#1}%
+ \ifx\@optionalarg\empty \else
+ % Save \@optionalarg before it is trashed by \readauxfile.
+ \let\@xrefnoptarg\@optionalarg
+ % Read .aux file -- \@optionalarg may contain cross-references.
+ \readauxfile
+ % Typeset the \@optionalarg
+ {\@@hloff\@xrefnoptarg}\reftie
+ \fi
+ % Typeset the reference.
+ \plain@xrefn{#1}%
+ \hlend@impl{ref}%
+}%
+% This is equivalent to \xrefn but without the hyperlink stuff and the
+% optional parameter so that its expansion does not contain the many
+% \let's, \def's and such which the expansion of \xrefn contains. It
+% is needed by \eqdefn and \eqsubdefn to be able to `cleanly' write
+% texts of equation labels to .aux file. It is also used when
+% functionality of \xrefn is needed without the hyperlink and the
+% optional parameter.
+\def\plain@xrefn#1{%
+ \readauxfile
+ %
+ \expandafter \ifx\csname\xrlabel{#1}\endcsname\relax
+ \if@citewarning
+ \message{\linenumber Undefined label `#1'.}%
+ \fi
+ %
+ % Give it a dummy definition, though, to stop multiple error messages.
+ \expandafter\def\csname\xrlabel{#1}\endcsname{%
+ `{\tt
+ \escapechar = -1
+ \expandafter\string\csname#1\endcsname
+ }'%
+ }%
+ \fi
+ \csname\xrlabel{#1}\endcsname % Always produce something.
+}%
+%
+% \refn is just a synonym.
+%
+\let\refn = \xrefn
+%
+% One common case: print `p. ' before the page number.
+%
+\def\xrefpageword{p.\thinspace}%
+%
+\def\xref{\@getoptionalarg\@finxref}%
+\def\@finxref#1{%
+ % Hyperlink and optional TEXT.
+ \hlstart@impl{xref}{#1}%
+ \ifx\@optionalarg\empty \else
+ {\@@hloff\@optionalarg}\refspace
+ \fi
+ % Typeset page reference but omit hyperlink.
+ \xrefpageword\plain@xrefn{#1}%
+ \hlend@impl{xref}%
+}%
+%
+% \ref[TEXT]{LABEL} typesets TEXT, \CLASSword for LABEL's class (if it's defined)
+% and then does \refn on LABEL. But amstex also has a \ref, so tell the
+% user if they try to use \ref and have loaded amsppt.sty.
+%
+% \refs{LABEL} is similar, but puts the letter `s' after the \...word, thus
+% producing (for example) `Figures 1.2' (presumably to be followed by
+% `and~\refn{fig-1.3}').
+%
+% Note that \ref takes an optional TEXT, while \refs does not. This
+% text (together with \CLASSword) will become part of the hyperlink
+% generated by \ref. \refs does not include \CLASSword in the
+% hyperlink.
+%
+\def\@maybewarnref{%
+ \ifundefined{amsppt.sty}%
+ % No amsppt.sty, so just use ours.
+ \else
+ \message{Warning: amsppt.sty and Eplain both define \string\ref. See
+ the Eplain manual.}%
+ % Remember their definition.
+ \let\amsref = \ref
+ \fi
+ \let\ref = \eplainref
+ \ref
+}
+\let\ref = \@maybewarnref
+%
+\def\eplainref{\@getoptionalarg\@fineplainref}%
+\def\@fineplainref{\@generalref{1}{}}%
+\def\refs{\let\@optionalarg\empty \@generalref{0}s}%
+%
+% #1 is an integer flag which tells whether hyperlink should include
+% \@optionalarg and class word (non-0) or not (0). #2 is the text to
+% follow the \...word. Both #1 and #2 are supplied by the macros
+% above. #3 comes from the document, and is the LABEL.
+%
+% \reftie separates \@optionalarg or \..word from \refn; \refspace
+% separates \@optionalarg from \..word.
+%
+\def\@generalref#1#2#3{%
+ % Save \@optionalarg before it is trashed by \readauxfile.
+ \let\@generalrefoptarg\@optionalarg
+ \readauxfile
+ % Maybe start hyperlink here.
+ \ifcase#1 \else \hlstart@impl{ref}{#3}\fi
+ % Get the class of the label.
+ \edef\temp{\getproperty{\xrlabel{#3}}{class}}%
+ % If the word for this class is not defined, don't complain.
+ \expandafter\ifx\csname \temp word\endcsname\relax
+ % Produce \@optionalarg followed by a \reftie, if \@optionalarg is
+ % not empty.
+ \ifx\@generalrefoptarg\empty \else {\@@hloff\@generalrefoptarg\reftie}\fi
+ \else
+ \begingroup
+ \@@hloff
+ % Produce \@optionalarg, if not empty, followed by a \refspace.
+ \ifx\@generalrefoptarg\empty \else \@generalrefoptarg \refspace \fi
+ % Produce the word.
+ \csname \temp word\endcsname
+ % Add the suffix and then put in a \reftie before the \refn.
+ #2\reftie
+ \endgroup
+ \fi
+ % Maybe start hyperlink here.
+ \ifcase#1 \hlstart@impl{ref}{#3}\fi
+ % Typeset the reference omitting hyperlinks.
+ \plain@xrefn{#3}%
+ \hlend@impl{ref}%
+}%
+%
+%
+% References to equations are similar.
+%
+% \eqref{foo} produces ``(<text for equation label foo>)''.
+% \eqdefn{foo} advances \eqnumber, resets \eqsubnumber, and defines
+% `foo' to be the new number.
+% \eqsubdefn{foo} advances \eqsubnumber and defines `foo'. \eqref works
+% for both equations and subequations,
+% \eqdef{foo} does \eqdefn, then inserts an \eqno and \eqref.
+% \eqsubdef{foo} does \eqsubdefn, then what \eqdef does.
+%
+% The non-``sub'' macros also take an optional argument; if it's
+% present, we use it as the text for the equation label, instead of the
+% various counters.
+%
+% Because there are no page break issues with equations, we can
+% immediately define the control sequence. But we also need to write
+% the definition out, in case the user wants to forward reference an
+% equation (bad style as that may be).
+%
+% The current equation number is in \eqnumber; we just advance it by one
+% for each \eqdef. You can handle fancier equation numbers (e.g., ones
+% that include a chapter number) by redefining \eqprint, below, and
+% using your own counters. We do provide for one level of substructure,
+% since that's more painful to implement than superstructures.
+%
+\newcount\eqnumber
+\newcount\subeqnumber
+%
+%
+% \eqdefn[TEXT]{LABEL} defines LABEL to be TEXT (if it's present),
+% otherwise it advances \eqnumber and defines LABEL to be that. It
+% doesn't produce anything.
+%
+\def\eqdefn{\@getoptionalarg\@fineqdefn}%
+\def\@fineqdefn#1{%
+ \ifx\@optionalarg\empty
+ \global\advance\eqnumber by 1
+ % We call \eqconstruct here instead of in \@eqdefn because we don't
+ % want to expand it for \eqsubdefn -- \eqsubdefn already includes an
+ % \eqrefn which includes the text of the label which was \eqconstructed.
+ \def\temp{\eqconstruct{\number\eqnumber}}%
+ \else
+ % In the next \def there is (I believe) a spurious \noexpand.
+ % I leave in the old definition, albeit commented out, in case the
+ % \noexpand really _is_ necessary. But I don't thikn so. Adam Lewenberg
+% \def\temp{\noexpand\@optionalarg}%
+ \def\temp{\@optionalarg}%
+ \fi
+ %
+ % Always reset the current subequation number:
+ \global\subeqnumber = 0
+ %
+ % Remember this label, so that we can define subequations:
+ \gdef\@currenteqlabel{#1}%
+ \toks0 = \expandafter{\@currenteqlabel}%
+ %
+ % Actually do the definition, replacing \xrefn and \eqrefn with
+ % \plain@xrefn and taking precautions not to expand \plain@xrefn
+ % in what we output to the aux file. \plain@xrefn expands to many things,
+ % including \count@'s and \edef's and the expansion of \xrlabel, and
+ % it's just a real mess.
+ \begingroup
+ \def\eqrefn{\noexpand\plain@xrefn}%
+ \def\xrefn{\noexpand\plain@xrefn}%
+ \edef\temp{\noexpand\@eqdefn{\the\toks0}{\temp}}%
+ \temp
+ \endgroup
+}%
+%
+%
+% \eqsubdefn defines its argument as a ``subequation'' of the last \eqdef.
+%
+\def\eqsubdefn#1{%
+ \global\advance\subeqnumber by 1
+ \toks0 = {#1}%
+ %
+ % Get the text of the label;
+ \toks2 = \expandafter{\@currenteqlabel}%
+ %
+ % We must expand \@currenteqlabel. We have to not expand
+ % \eqsubreftext here, as well as \plain@xrefn (which we substitute
+ % for \eqrefn and \xrefn), since the first arg to \eqsubreftext
+ % could also include lots of complicated things.
+ \begingroup
+ \def\eqrefn{\noexpand\plain@xrefn}%
+ \def\xrefn{\noexpand\plain@xrefn}%
+ \def\eqsubreftext{\noexpand\eqsubreftext}%
+ \edef\temp{%
+ \noexpand\@eqdefn
+ {\the\toks0}%
+ {\eqsubreftext{\eqrefn{\the\toks2}}{\the\subeqnumber}}%
+ }%
+ \temp
+ \endgroup
+}%
+%
+% \@eqdefn{LABEL}{REF-TEXT} actually handles the equation number
+% definitions and writing to the aux file.
+%
+% In contrast to \xrdef, we define LABEL right away (as REF-TEXT). We
+% can do this since we know right now what the right equation number is.
+% This eliminates some unnecessary warning. It also lets the user put
+% \eqdef{} on all equations and have it work, since then \eqref
+% refers to the just-defined new value.
+%
+\def\@eqdefn#1#2{%
+ % Define hyperlink destination taking care of empty LABEL.
+ \hl@define@eqlabel{#1}%
+ \hldest@impl{eq}{\hl@eqlabel}%
+ % Define cross-reference but not hyperlink destination.
+ \begingroup
+ \@@hldestoff
+ \definexref{#1}{#2}{eq}%
+ \endgroup
+ % Define the LABEL.
+ \@definelabel{#1}{#2}{eq}%
+}%
+%
+% \eqdef{LABEL} defines LABEL, with \eqdefn, then prints it. We allow
+% an optional argument to explicitly specify the text which we define
+% the label as.
+%
+\def\eqdef{\@getoptionalarg\@fineqdef}%
+\def\@fineqdef{%
+ \toks0 = \expandafter{\@optionalarg}%
+ \edef\temp{\noexpand\@eqdef{\noexpand\eqdefn[\the\toks0]}}%
+ \temp
+}%
+%
+% \eqsubdef is to \eqdef as \eqsubdefn is to \eqdefn. No optional
+% argument allowed here.
+%
+\def\eqsubdef{\@eqdef\eqsubdefn}%
+%
+% \@eqdef{DEFN-CMD}{LABEL} defines LABEL, using DEFN-CMD. Then it
+% inserts an \eqno (unless it's called when an \eqno would be invalid).
+% Then it prints the newly-defined value using \eqprint.
+%
+\def\@eqdef#1#2{%
+ % Define the label but not hyperlink destination (we want to define
+ % the destination after \eqno). Note that \@eqdefn will call
+ % \hl@define@eqlabel{#2}, so we won't call it again (definintions in
+ % \hl@define@eqlabel must be global to survive past the group).
+ \begingroup
+ \@@hldestoff
+ #1{#2}%
+ \endgroup
+ % Define hyperlink destination and print the text.
+ \@maybedisableeqno
+ \eqno % \hl@define@eqlabel already called in \@eqdefn.
+ \hldest@impl{eq}{\hl@eqlabel}%
+ \let\@optionalarg\empty % \@fineqref will examine \@optionalarg.
+ {\@@hloff\@fineqref{#2}}% No hyperlink here.
+ \@mayberestoreeqno
+ \ignorespaces
+}%
+%
+%
+% If we are in an alignment or some other inner place, \eqno won't work.
+%
+\let\@mayberestoreeqno = \relax
+%
+\def\@maybedisableeqno{%
+ \ifinner
+ \global\let\eqno = \relax
+ \global\let\@mayberestoreeqno = \@restoreeqno
+ \fi
+}%
+%
+% This makes `\eqno' mean \eqno again.
+%
+\let\@primitiveeqno = \eqno
+\def\@restoreeqno{%
+ \global\let\eqno = \@primitiveeqno
+ \global\let\@mayberestoreeqno = \empty
+}%
+%
+%
+% \eqrefn[TEXT]{LABEL} produces the text for the equation label LABEL, or
+% something suitable if LABEL is undefined. (It possibly issues a
+% warning in the latter case as well.) TEXT followed by a \reftie is
+% prepended to the equation text as part of the hyperlink.
+%
+\def\eqrefn{\@getoptionalarg\@fineqrefn}%
+\def\@fineqrefn#1{%
+ \eqref@start{#1}%
+ % Typeset the equation reference but do not produce hyperlink.
+ \plain@xrefn{#1}%
+ \hlend
+}%
+%
+% \eqref[TEXT]{LABEL} is the usual way to refer to equation labels; it
+% calls \eqprint on the text of LABEL, prepending it with TEXT and a
+% \reftie as part of the hyperlink.
+%
+\def\eqref{\@getoptionalarg\@fineqref}%
+\def\@fineqref#1{%
+ \eqref@start{#1}%
+ % Typeset the equation reference but do not produce hyperlink.
+ \eqprint{\plain@xrefn{#1}}%
+ \hlend@impl{eq}%
+}%
+% Common code executed at the start of \@fineqrefn and \@fineqref.
+\def\eqref@start#1{%
+ % Save \@optionalarg in case \phantomeqlabel is redefined by the
+ % user to something that trashes it.
+ \let\@eqrefoptarg\@optionalarg
+ % Hyperlink (fetch last `phantom' equation label if LABEL is empty).
+ \ifempty{#1}%
+ \hlstart@impl{eq}{\phantomeqlabel}%
+ \else
+ \hlstart@impl{eq}{#1}%
+ \fi
+ % Optional TEXT followed by a \reftie.
+ \ifx\@eqrefoptarg\empty \else
+ {\@@hloff\@eqrefoptarg\reftie}%
+ \fi
+}%
+%
+%
+% \eqconstruct{EQ-TEXT} constructs an equation number, i.e., the text to
+% be defined as the value of a label.
+%
+\let\eqconstruct = \identity
+%
+% \eqprint{EQ-TEXT} produces the typeset equation number EQ-TEXT.
+%
+\def\eqprint#1{(#1)}%
+%
+% \eqsubreftext{EQ-TEXT}{SUBEQ-TEXT} produces the text of a subequation
+% reference. (\eqprint is later called on the result of this to produce
+% output for subequations; I didn't define any \subeqprint.)
+%
+\def\eqsubreftext#1#2{#1.#2}%
+%
+%
+%
+% Indexing.
+%
+% \defineindex{PREFIX} defines an index with ``prefix'' PREFIX. The
+% prefix is used to construct the output filename and the various
+% commands. We just define all the index commands for this index to
+% call the general commands with PREFIX.
+%
+\let\extraidxcmdsuffixes = \empty
+%
+\outer\def\defineindex#1{%
+ \def\@idxprefix{#1}%
+ %
+ % Define the indexing commands for this prefix.
+ \for\@idxcmd:=,marked,submarked,name%
+ \extraidxcmdsuffixes\do
+ {%
+ \@defineindexcmd\@idxcmd
+ }%
+ %
+ % Allocate a stream for the output.
+ \ece\innernewwrite{@#1indexfile}%
+ %
+ % And a conditional to test whether we've opened the file.
+ \ece\innernewif{if@#1indexfileopened}%
+}%
+%
+%
+% \@defineindexcmd{SUFFIX} defines both silent and non-silent index
+% command for prefix \@idxprefix with suffix SUFFIX. That is, we define
+% both `\@idxprefix dxSUFFIX' and `\s\@idxprefix dxSUFFIX' to call the
+% corresponding generic command with \@idxprefix. \silentindexentry is
+% used to decide whether we should ignore following spaces.
+%
+\newif\ifsilentindexentry
+%
+\def\@defineindexcmd#1{%
+ \@defineoneindexcmd{s}{#1}\silentindexentrytrue
+ \@defineoneindexcmd{}{#1}\silentindexentryfalse
+}%
+%
+%
+% \@defineoneindexcmd{PREFIX}{SUFFIX}{PRECALL} does just one silent or
+% non-silent commands. We define the command `\@@PREFIXidxSUFFIX' to do
+% PRECALL, then define \@idxprefix, then call \@idxgetrange with an
+% argument of `\@@{,s}idxSUFFIX'. (So far every indexing command
+% should allow a range. If not, you could redefine `\@@{,s}idxSUFFIX'
+% after this macro is called.)
+%
+\def\@defineoneindexcmd#1#2#3{%
+ \toks@ = {#3}%
+ \edef\temp{%
+ \def
+ % We have to restrict expansion because the generic (\@@...)
+ % commands will be defined after the first call to \defineindex.
+ % Not expanding the user (\idx...) commands is unnecessary unless
+ % the user has defined some new commands, but may as well be cautious.
+ \expandonce\csname#1\@idxprefix dx#2\endcsname % e.g., \idx or \sidxname.
+ {\def\noexpand\@idxprefix{\@idxprefix}% define \@idxprefix
+ % call, e.g., \@@idx or \@@sidxname:
+ \expandonce\csname @@#1idx#2\endcsname
+ }%
+ \def
+ \expandonce\csname @@#1idx#2\endcsname{% e.g., \@@idx
+ % First do PRECALL.
+ \the\toks@
+ % Then call \@idxgetrange with, e.g., \@idx or \@sidxname as its arg.
+ \noexpand\@idxgetrange\expandonce\csname @#1idx#2\endcsname
+ }%
+ }%
+ \temp
+}%
+%
+%
+% \@idxwrite{TERM}{PAGENO} writes a general index entry for TERM on page
+% PAGENO to the index file `\@idxprefix indexfile'. We open the stream
+% as `\indexfilebasename.\@idxprefix dx' if it isn't already open.
+%
+\let\indexfilebasename = \jobname
+%
+\def\@idxwrite#1#2{%
+ % Be sure the file is opened.
+ \csname if@\@idxprefix indexfileopened\endcsname \else
+ \expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname =
+ \indexfilebasename.\@idxprefix dx
+ \expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname
+ \fi
+ %
+ % Save the index term.
+ \def\temp{#1}%
+ %
+ % Write the index term and page number.
+ \edef\@wr{%
+ \expandafter\write\csname @\@idxprefix indexfile\endcsname{%
+ \string\indexentry
+ {\sanitize\temp}%
+ {\noexpand#2}%
+ }%
+ }%
+ \@wr
+ %
+ % Marginalize the index term, if desired.
+ % (the \allowhyphens allows `infinitesimal' in \sidx{Infinitesimal}infinitesimal
+ % to be hyphenated.
+ \ifindexproofing \insert\@indexproof{\indexproofterm{#1}}\allowhyphens\fi
+ %
+ % We just appended at least one non-discardable item (namely, the
+ % whatsit from the \write) to the current list. So in case glue comes
+ % next (not unlikely), be sure we don't inadvertently make that glue a
+ % valid breakpoint, if it wouldn't have been without us.
+ \hookrun{afterindexterm}%
+ %
+ % This is the end of the index entry processing. If this was a silent
+ % entry, ignore following spaces.
+ \ifsilentindexentry \expandafter\ignorespaces\fi
+}%
+%
+%
+% If this conditional is true, we output the index terms on the page
+% where they occur.
+\newif\ifindexproofing
+%
+% We need a new insertion class to collect the proofed terms.
+\newinsert\@indexproof
+\dimen\@indexproof = \maxdimen % No limit on number of terms.
+\count\@indexproof = 0 \skip\@indexproof = 0pt % They take up no space.
+%
+% This actually typesets the proofed term. We don't go to any lengths
+% to provide nice-looking output; since the term might have all kinds of
+% weird characters in it, we just dump it in the smallest standard
+% Computer Modern typewriter font.
+%
+% We put the term in an \hbox, even though that might make the output
+% run off the page, since we don't really need to see all of it, and
+% I think it's better to opt for simplicity -- one term per line.
+\font\indexprooffont = cmtt8
+\def\indexproofterm#1{\hbox{\strut \indexprooffont #1}}%
+%
+%
+% If \output doesn't use \makeheadline, or redefines it, it's up to the
+% new \output to define index hyperlink destination and to call
+% \indexproofunbox.
+\let\@plainmakeheadline = \makeheadline
+\def\makeheadline{%
+ % Define index page destination only when this `cross-reference' is defined.
+ \expandafter\ifx\csname\xrlabel{\idxpagexref{\folio}}\endcsname\relax \else
+ % Say \@@hldeston in case a page break happened at an unfortunate
+ % time when user said \hldestoff.
+ {\@@hldeston \hldest@impl{idx}{\hlidxpagelabel{\folio}}}%
+ \fi
+ \indexproofunbox
+ \@plainmakeheadline
+}%
+%
+% We want to put the proof index terms in the margin, outside the
+% printed area. So if \outsidemargin (for odd pages) and \insidemargin
+% (for even pages) are undefined, we define them (both) to be the default
+% TeX margin -- one inch + \hoffset.
+\def\indexsetmargins{%
+ \ifx\undefined\outsidemargin
+ \dimen@ = 1truein
+ \advance\dimen@ by \hoffset
+ \edef\outsidemargin{\the\dimen@}%
+ \let\insidemargin = \outsidemargin
+ \fi
+}%
+%
+% We always put the terms in the right-hand margin, so long terms run
+% off the page, instead of into the text.
+\def\indexproofunbox{%
+ \ifvoid\@indexproof\else
+ \indexsetmargins
+ \rlap{%
+ \kern\hsize
+ \ifodd\pageno \kern\outsidemargin \else \kern\insidemargin \fi
+ \vbox to 0pt{\unvbox\@indexproof\vss}%
+ }\nointerlineskip
+ \fi
+}%
+%
+%
+% \@idxgetrange\CS parses an optional argument which, if present, should
+% be either `begin' or `end', marking the beginning or ending of a range
+% for the index entry. If we find this, we set the appropriate one of
+% \@idxrangestr. Then we call \CS.
+%
+% If the optional argument is `see' or `seealso' we read another
+% argument, namely, the entry to see.
+%
+\def\idxrangebeginword{begin}%
+\def\idxbeginrangemark{(}% the corresponding magic char to go in the idx file
+%
+\def\idxrangeendword{end}%
+\def\idxendrangemark{)}%
+%
+\def\idxseecmdword{see}%
+\def\idxseealsocmdword{seealso}%
+\newif\if@idxsee
+\newif\if@hlidxencap
+\let\@idxseenterm = \relax
+%
+\def\idxpagemarkupcmdword{pagemarkup}%
+\let\@idxpagemarkup = \relax
+%
+\def\@idxgetrange#1{%
+ \let\@idxrangestr = \empty
+ \let\@afteridxgetrange = #1%
+ \@getoptionalarg\@finidxgetopt
+}%
+\def\@finidxgetopt{%
+ \@hlidxencaptrue
+ %
+ \for\@idxarg:=\@optionalarg\do{%
+ % These are ordered by my guess at frequency of use.
+ \expandafter\@idxcheckpagemarkup\@idxarg=,%
+ %
+ \ifx\@idxarg\idxrangebeginword
+ \def\@idxrangestr{\idxencapoperator\idxbeginrangemark}%
+ \else
+ \ifx\@idxarg\idxrangeendword
+ \def\@idxrangestr{\idxencapoperator\idxendrangemark}%
+ \@hlidxencapfalse
+ \else
+ \ifx\@idxarg\idxseecmdword
+ \def\@idxpagemarkup{indexsee}%
+ \@idxseetrue
+ \@hlidxencapfalse
+ \else
+ \ifx\@idxarg\idxseealsocmdword
+ \def\@idxpagemarkup{indexseealso}%
+ \@idxseetrue
+ \@hlidxencapfalse
+ \else
+ \ifx\@idxpagemarkup\relax
+ \errmessage{Unrecognized index option `\@idxarg'}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ }%
+ % Stick hyperlink encapsulator into \@idxpagemarkup.
+ \ifnum\hldest@place@idx < 0 \else
+ \if@hlidxencap
+ \ifx\@idxpagemarkup\relax
+ % Even when user gives no pagemarkup command, we still do
+ % insert our hyperlink encapsulator.
+ \let\@idxpagemarkup\empty
+ \fi
+ \ifcase\hldest@place@idx \relax
+ % \hldest@place@idx = 0, dests point to a page with a term.
+ \edef\@idxpagemarkup{hlidxpage{\@idxpagemarkup}}%
+ % We want to define index \hldest's only on those
+ % pages which contain at least one index term, so this
+ % `cross-reference' will tell \makeheadline on which pages to
+ % generate an \hldest.
+ {\@@hldestoff \definexref{\idxpagexref{\folio}}{}{}}%
+ \else
+ % \hldest@place@idx = 1, dests point to exact location of a term.
+ \global\advance\hlidxlabelnumber by 1
+ \edef\@idxpagemarkup{hlidx{\hlidxlabel}{\@idxpagemarkup}}%
+ \hldest@impl{idx}{\hlidxlabel}%
+ \fi
+ \fi
+ \fi
+ %
+ \@afteridxgetrange
+}%
+%
+%
+% Check for a command of the form `pagemarkup=\cmd', and if found, set
+% \@idxpagemarkup to `cmd'.
+%
+\def\@idxcheckpagemarkup#1=#2,{%
+ \def\temp{#1}%
+ \ifx\temp\idxpagemarkupcmdword
+ \if ,#2, % If #2 is empty, complain.
+ \errmessage{Missing markup command to `pagemarkup'}%
+ \else
+ % Remove a trailing =.
+ \def\temp##1={##1}%
+ \edef\@idxpagemarkup{\temp\string#2}%
+ \fi
+ \fi
+}%
+%
+%
+% \hlidxpage and \hlidx are hyperlink encapsulators for the two types
+% of hyperlink destinations for index terms.
+%
+% \hldest@place@idx defines which type is selected. When defined to 0,
+% we generate destinations pointing to the page on which the indexed
+% term is located. When defined to 1, we generate destinations
+% pointing to exact location of the indexed term. When negative, we
+% generate no hyperlinks / destinations.
+\def\hldest@place@idx{-1}%
+% Name for a `cross-reference' which \makeheadline uses do decide on
+% which pages to generate \hldest.
+\def\idxpagexref#1{@@IDXPG@@#1}%
+% Hyperlink labels for both types of destinations.
+\newcount\hlidxlabelnumber
+\def\hlidxlabel{IDX\the\hlidxlabelnumber}%
+\def\hlidxpagelabel#1{IDXPG#1}%
+%
+% \hlidx{HYPERLINK-LABEL}{PAGEENCAP}{PAGESPEC}
+\def\hlidx#1#2#3{%
+ \hlstart@impl{idx}{#1}%
+ \csname #2\endcsname{#3}%
+ \hlend@impl{idx}%
+}%
+%
+% \hlidxpage{PAGEENCAP}{PAGESPEC}
+%
+% We expect PAGESPEC to be one of the following:
+% 14 (single page number)
+% 14, 15 (list of two consecutive page numbers)
+% 14--15 (page range)
+%
+% If you configure MakeIndex to use different page list separator
+% (delim_n parameter in .mst file) / different page range separator
+% (delim_r parameter), you should call \setidxpagelistdelimiter /
+% \setidxpagerangedelimiter to setup the new separators.
+%
+% In case of a single page number, we call \PAGEENCAP on the page
+% number and turn the result into a hyperlink.
+%
+% In case of a two-page list, we break the list, call \PAGEENCAP on
+% each of the page numbers separately, and turn each result into a
+% hyperlink, producing page list separator between the page numbers.
+%
+% In case of a page range, we do not break the range, call \PAGEENCAP
+% on the entire range and turn what results into a hyperlink for the
+% first of the page numbers.
+\def\hlidxpage#1#2{%
+ % Set \@idxpagei[i][ref] and \@idxpagesep
+ \@hlidxgetpages{#2}%
+ % Alias for \PAGEENCAP.
+ \expandafter\let\expandafter\@idxpageencap\csname #1\endcsname
+ % Now comes the first part, to be done in any of the three cases.
+ \hlstart@impl{idx}{\hlidxpagelabel{\@idxpageiref}}%
+ \expandafter\@idxpageencap\expandafter{\@idxpagei}%
+ \hlend@impl{idx}%
+ % The second part, to be done only if there is a second page number.
+ \ifx\@idxpageii\empty \else
+ \@idxpagesep
+ \hlstart@impl{idx}{\hlidxpagelabel{\@idxpageiiref}}%
+ \expandafter\@idxpageencap\expandafter{\@idxpageii}%
+ \hlend@impl{idx}%
+ \fi
+}%
+%
+% This macro parses PAGESPEC parameter to \hlidxpage. It sets
+% \@idxpagei to the first page number, \@idxpageii to the second (if
+% present; if not, \@idxpageii will be set to \empty). For the first
+% page number, use \@idxpageiref to construct hyperlink label; for
+% the second page number, use \@idxpageiiref. Use \@idxpagesep to
+% separate the two page numbers.
+%
+% NOTE: we use \@idxpagei[i], not \idxpagei[i], because the user may
+% use \idxparselist / \idxparserange in his \PAGEENCAP, in which case
+% our \idxpagei[i]'s will get garbled.
+\def\@hlidxgetpages#1{%
+ % Try to parse a two-page list.
+ \idxparselist{#1}%
+ \ifx\idxpagei\empty
+ % It is not a two-page list, try page range.
+ \idxparserange{#1}%
+ \ifx\idxpagei\empty
+ % It is neither a two-page list nor a page range, so we assume
+ % it is a single page number.
+ \def\@idxpageiref{#1}% Label for \hlstart.
+ \else
+ % It is a page range.
+ \let\@idxpageiref\idxpagei % Label for \hlstart.
+ \fi
+ \def\@idxpagei{#1}%
+ \let\@idxpageii\empty
+ \else
+ % It is a two-page list.
+ \let\@idxpagei\idxpagei
+ \let\@idxpageii\idxpageii
+ \let\@idxpageiref\idxpagei % Label for \hlstart.
+ \let\@idxpageiiref\idxpageii % Label for \hlstart.
+ \let\@idxpagesep\idxpagelistdelimiter
+ \fi
+}%
+%
+% Set up a macro \@idxparselist and user-accessible \idxparselist for
+% parsing two-page list. Takes list separator (which is saved in
+% \idxpagelistdelimiter). If the list is found, \@idxparselist will
+% set \idxpagei to the first page number, \idxpageii to the second;
+% if not found, it will set \idxpagei to \empty (this implies that
+% the list's first page number should never be empty).
+\def\setidxpagelistdelimiter#1{%
+ \gdef\idxpagelistdelimiter{#1}%
+ \gdef\@removepagelistdelimiter##1#1{##1}%
+ \gdef\@idxparselist##1#1##2\@@{%
+ \ifempty{##2}%
+ \let\idxpagei\empty
+ \else
+ \def\idxpagei{##1}%
+ \edef\idxpageii{\@removepagelistdelimiter##2}%
+ \fi
+ }%
+ \gdef\idxparselist##1{\@idxparselist##1#1\@@}%
+}%
+%
+% Same as previous, but \@idxparserange and \idxparserange will parse
+% page range, range separator is saved in \idxpagerangedelimiter.
+\def\setidxpagerangedelimiter#1{%
+ \gdef\idxpagerangedelimiter{#1}%
+ \gdef\@removepagerangedelimiter##1#1{##1}%
+ \gdef\@idxparserange##1#1##2\@@{%
+ \ifempty{##2}%
+ \let\idxpagei\empty
+ \else
+ \def\idxpagei{##1}%
+ \edef\idxpageii{\@removepagerangedelimiter##2}%
+ \fi
+ }%
+ \gdef\idxparserange##1{\@idxparserange##1#1\@@}%
+}%
+%
+% Set up the default delimiters.
+\setidxpagelistdelimiter{, }%
+\setidxpagerangedelimiter{--}%
+%
+%
+% \@idxtokscollect uses \@idxmaintoks as the token list for the main
+% part of an index entry and \@idxsubtoks for the subpart. Then it
+% calls \@idxwrite.
+%
+\def\idxsubentryseparator{!}%
+\def\idxencapoperator{|}%
+\def\idxmaxpagenum{99999}%
+%
+\newtoks\@idxmaintoks
+\newtoks\@idxsubtoks
+%
+\def\@idxtokscollect{%
+ % Remember the subentry.
+ \edef\temp{\the\@idxsubtoks}%
+ %
+ % We want to expand the conditions, but not the terms. The index
+ % entry starts simply with \@idxmaintoks and \@idxsubtoks.
+ \edef\@indexentry{%
+ \the\@idxmaintoks
+ \ifx\temp\empty\else \idxsubentryseparator\the\@idxsubtoks \fi
+ \@idxrangestr
+ }%
+ %
+ % If this is a `see' or `see also' entry, we need to read one more
+ % arg. We use a giant page number so the entry will be last (for the
+ % benefit of `see also's). MakeIndex rejects page numbers >=1000.
+ %
+ \if@idxsee
+ \@idxseefalse % Reset so the next term won't be a `see'.
+ \edef\temp{\noexpand\@finidxtokscollect{\idxmaxpagenum}}%
+ \else
+ \def\temp{\@finfinidxtokscollect\folio}%
+ \fi
+ \temp
+}%
+%
+%
+% \@finidxtokscollect{PAGENO}{REAL-TERM} reads the final term for
+% see/see also entries. We do not check if the person has put both a
+% range and a see in the same index term (which will confuse makeindex).
+%
+\def\@finidxtokscollect#1#2{%
+ \def\@idxseenterm{#2}%
+ \@finfinidxtokscollect{#1}%
+}%
+%
+% \@finfinidxtokscollect{PAGENO} writes \@indexentry for page PAGENO.
+% Besides \@indexentry, if \@idxpagemarkup is not \relax we output an
+% index entry \@indexentry|\@idxpagemarkup{PAGENO} (but omitting | if
+% this is a range term, because in that case | will have been added
+% together with \@idxrangestr in \@idxtokscollect). And if
+% \@idxseenterm is not \relax we output {\@idxseenterm} after the
+% \@idxpagemarkup. (This will become an argument to the ``markup''
+% command, which will be \indexsee or \indexseealso.)
+%
+\def\@finfinidxtokscollect#1{%
+ % If we've got a page markup command, append it.
+ \ifx\@idxpagemarkup\relax \else
+ \toks@ = \expandafter{\@indexentry}%
+ \edef\@indexentry{%
+ \the\toks@
+ % Add | only if this is not a range term, otherwise | has
+ % already been added with \@idxrangestr by \@idxtokscollect.
+ \ifx\@idxrangestr\empty \idxencapoperator \fi
+ \@idxpagemarkup
+ }%
+ \let\@idxpagemarkup = \relax
+ \fi
+ %
+ % If we've got an argument to the ``page markup'' command, append it.
+ \ifx\@idxseenterm\relax \else
+ \toks@ = \expandafter{\@indexentry}%
+ \edef\@indexentry{\the\toks@{\sanitize\@idxseenterm}}%
+ \let\@idxseenterm = \relax
+ \fi
+ %
+ % Finally, write what we've constructed.
+ \expandafter\@idxwrite\expandafter{\@indexentry}{#1}%
+}%
+%
+%
+% \@idxcollect{MAIN}{SUB} sets up the token registers
+% \@idx{main,sub}toks, then calls \@idxtokscollect. This is convenient
+% for some of the macros below.
+%
+\def\@idxcollect#1#2{%
+ \@idxmaintoks = {#1}%
+ \@idxsubtoks = {#2}%
+ \@idxtokscollect
+}%
+%
+%
+% Following are the TeX macros that correspond to the commands
+% that actually appear in the document.
+%
+% \@idx{TERM} produces TERM in the output and then makes the index entry
+% for TERM as usual. We don't allow a [SUBTERM] here since then we
+% would lose spaces after the command, which would be very inconvenient.
+%
+% As with all our index commands, we've already defined \@idxprefix (in
+% \idx or whatever), to save passing it around, and we've looked for a
+% range argument before TERM.
+%
+\def\@idx#1{%
+ #1% Produce TERM as output.
+ \@idxcollect{#1}{}%
+}%
+%
+% \@sidx{TERM}[SUBTERM] produces an index entry TERM and no output. If
+% SUBTERM is present, this is a subentry. (At the moment, I don't
+% provide for subsubentries, since I've never needed that.)
+%
+\def\@sidx#1{\@idxmaintoks = {#1}\@getoptionalarg\@finsidx}%
+\def\@finsidx{%
+ \@idxsubtoks = \expandafter{\@optionalarg}%
+ \@idxtokscollect
+}%
+%
+%
+% \@idxconstructmarked{TOKS-REG}\CS{TERM}
+%
+\def\idxsortkeysep{@}% This `@' is catcode 11, but it doesn't matter.
+%
+\def\@idxconstructmarked#1#2#3{%
+ \toks@ = {#2}% The control sequence.
+ \toks2 = {#3}% The term.
+ %
+ % Construct TERM@\CS{TERM} as the string to write.
+ \edef\temp{\the\toks2 \idxsortkeysep \the\toks@{\the\toks2}}%
+ %
+ % Save it in TOKS-REG.
+ #1 = \expandafter{\temp}%
+}%
+%
+%
+% \@idxmarked\CS{TERM} outputs \CS{TERM} and then calls the main part of
+% \@sidxmarked.
+%
+\def\@idxmarked#1#2{%
+ #1{#2}% Produce \CS{TERM} as output.
+ \@idxconstructmarked\@idxmaintoks{#1}{#2}%
+ \@idxsubtoks = {}%
+ \@idxtokscollect
+}%
+%
+% \@sidxmarked\CS{TERM}[SUBTERM] outputs an index entry sorted by TERM
+% but producing \CS{TERM}.
+%
+\def\@sidxmarked#1#2{%
+ \@idxconstructmarked\toks@{#1}{#2}%
+ \edef\temp{{\the\toks@}}%
+ \expandafter\@sidx\temp
+}%
+%
+%
+% \@idxsubmarked{TERM}\CS{SUBTERM} is like \@idxmarked, except that it's
+% SUBTERM that's marked instead of TERM.
+%
+\def\@idxsubmarked#1#2#3{%
+ #1 #2{#3}% produce `TERM \CS{SUBTERM} as output.
+ \@sidxsubmarked{#1}{#2}{#3}%
+}%
+%
+% \@sidxsubmarked{TERM}\CS{SUBTERM} is to \@sidxmarked as \@idxsubmarked
+% is to \@idxmarked.
+%
+\def\@sidxsubmarked#1#2#3{%
+ \@idxmaintoks = {#1}%
+ \@idxconstructmarked\@idxsubtoks{#2}{#3}%
+ \@idxtokscollect
+}%
+%
+%
+% \@idxcollectname{FIRST}{LAST} puts `LAST, FIRST' into \temp. (Well,
+% we use \idxnameseparator instead of hardwiring `, '.) If FIRST is
+% empty, don't include the separator.
+%
+\def\idxnameseparator{, }% as in `Tachikawa, Elizabeth'
+%
+\def\@idxcollectname#1#2{%
+ \def\temp{#1}%
+ \ifx\temp\empty
+ \toks@ = {}%
+ \else
+ \toks@ = {\idxnameseparator #1}%
+ \fi
+ \toks2 = {#2}%
+ %
+ \edef\temp{\the\toks2 \the\toks@}%
+}%
+%
+%
+% \@idxname{FIRST}{LAST} also produces `FIRST LAST' in the output and an
+% index entry for `LAST, FIRST'.
+%
+\def\@idxname#1#2{%
+ #1 #2% Separate the names by a space in the output.
+ \@idxcollectname{#1}{#2}%
+ \expandafter\@idxcollect\expandafter{\temp}{}%
+}%
+%
+% \@sidxname{FIRST}{LAST}[SUBTERM] is to \@sidx as \@idxname is to
+% \@idx.
+%
+\def\@sidxname#1#2{%
+ \@idxcollectname{#1}{#2}%
+ \expandafter\@sidx\expandafter{\temp}%
+}%
+%
+%
+% Now we come to actually producing the index, i.e., implementing the
+% formatting commands that MakeIndex outputs.
+%
+% \readindexfile is responsible for formatting and printing the index.
+% It reads \indexfilebasename.ind. We implement the same commands that
+% LaTeX does. I suppose we could allow for different indices having
+% different basenames, but I can't imagine when that would be useful.
+%
+\let\indexfonts = \relax
+%
+\def\readindexfile#1{%
+ \edef\@idxprefix{#1}%
+ %
+ % Does the output file exist?
+ \testfileexistence[\indexfilebasename]{\@idxprefix nd}%
+ \iffileexists \begingroup
+ % If no \begin or \end, define them. The argument will be `{theindex}'.
+ \ifx\begin\undefined
+ \def\begin##1{\@beginindex}%
+ \let\end = \@gobble
+ \fi
+ %
+ % Read the file:
+ \input \indexfilebasename.\@idxprefix nd
+ %
+ % \doublecolumns isn't affected by groups.
+ \singlecolumn
+ \endgroup
+ \else
+ \message{No index file \indexfilebasename.\@idxprefix nd.}%
+ \fi
+}%
+%
+% Here's the default for `\begin{theindex}', if \begin isn't defined.
+\def\@beginindex{%
+ % Define the commands MakeIndex outputs.
+ \let\item = \@indexitem
+ \let\subitem = \@indexsubitem
+ \let\subsubitem = \@indexsubsubitem
+ %
+ % Set up the default formatting:
+ \indexfonts
+ \doublecolumns
+ \parindent = 0pt
+ %
+ % Let the user override the defaults.
+ \hookrun{beginindex}%
+}%
+%
+% MakeIndex puts \indexspace between groups in the ind file.
+\let\indexspace = \bigbreak
+%
+% You can make \afterindexterm appear after the term and before the
+% first page with the following in the ist file:
+% delim_0 "\\afterindexterm "
+% delim_1 "\\afterindexterm "
+% delim_2 "\\afterindexterm "
+\let\afterindexterm = \quad
+%
+%
+% Top-level index entries start with \item.
+\newskip\aboveindexitemskipamount \aboveindexitemskipamount = 0pt plus2pt
+\def\aboveindexitemskip{\vskip\aboveindexitemskipamount}%
+%
+\def\@indexitem{\begingroup
+ \@indexitemsetup
+ \leftskip = 0pt
+ \aboveindexitemskip
+ \penalty-100 % Encourage page breaks before items.
+ %
+ % But forbid page breaks after items, in case a subitem follows.
+ \def\par{\endgraf\endgroup\nobreak}%
+}%
+%
+% Secondary index entries.
+\def\@indexsubitem{%
+ \@indexitemsetup
+ \leftskip = 1em
+}%
+%
+% And tertiary entries.
+\def\@indexsubsubitem{%
+ \@indexitemsetup
+ \leftskip = 2em
+}%
+%
+% Common setup for the formatting.
+\def\@indexitemsetup{%
+ \par
+ \hangindent = 1em
+ \raggedright
+ \hyphenpenalty = 10000
+ \hookrun{indexitem}%
+}%
+%
+%
+% \indexsee{TERM}{PAGENO} ignores PAGENO, and says `see TERM'.
+\def\seevariant{\it}%
+\def\indexseeword{see}%
+\def\indexsee#1#2{{\seevariant \indexseeword\/ }#1}%
+%
+% \indexseealso{TERM}{PAGENO} is similar.
+\def\indexseealsowords{see also}%
+\def\indexseealso#1#2{{\seevariant \indexseealsowords\/ }#1}%
+%
+%
+% We provide one index by default; commands are \idx, \sidx, etc.
+\defineindex{i}%
+%
+%
+%
+% Justification of multiple input lines.
+%
+% You use these by saying
+% {\flushright
+% <flush right text>
+% }
+%
+% and similarly for \flushleft and \center. The command must be
+% embedded in a group. The lines are set in paragraphs as usual, i.e.,
+% blank lines start a new paragraph (by virtue of the
+% \blanklineskipamount vertical glue being inserted).
+%
+% \environment ... \endenvironment isn't appropriate in this case, since
+% these ``environments'' can't be nested.
+%
+\begingroup
+ \catcode `\^^M = \active %
+ \gdef\flushleft{%
+ \def\@endjustifycmd{\@endflushleft}%
+ \def\@eoljustifyaction{\null\hfil\break}%
+ \let\@firstlinejustifyaction = \relax
+ \@startjustify %
+ }%
+ \gdef\flushright{%
+ \def\@endjustifycmd{\@endflushright}%
+ \def\@eoljustifyaction{\break\null\hfil}%
+ \def\@firstlinejustifyaction{\hfil\null}%
+ \@startjustify %
+ }%
+ \gdef\center{%
+ \def\@endjustifycmd{\@endcenter}%
+ \def\@eoljustifyaction{\hfil\break\null\hfil}%
+ \def\@firstlinejustifyaction{\hfil\null}%
+ \@startjustify %
+ }%
+ %
+ % We do this before starting any of the justification commands.
+ \gdef\@startjustify{%
+ \parskip = 0pt
+ \catcode`\^^M = \active %
+ \def^^M{\futurelet\next\@finjustifyreturn}%
+ %
+ % \@eateol is called at the beginning of each justified paragraph.
+ \def\@eateol##1^^M{%
+ \def\temp{##1}%
+ \@firstlinejustifyaction %
+ \ifx\temp\empty\else \temp^^M\fi %
+ }%
+ \expandafter\aftergroup\@endjustifycmd %
+ \checkenv \environmenttrue %
+ \par\noindent %
+ \@eateol %
+ }%
+ %
+ % If the next thing is a ^^M, insert \blanklineskipamount glue. Then
+ % do \@eoljustifyaction (which each justification command defines).
+ \gdef\@finjustifyreturn{%
+ \@eoljustifyaction %
+ \ifx\next^^M%
+ % Insert extra glue when the \@end... command does the \par.
+ \def\par{\endgraf\vskip\blanklineskipamount \global\let\par = \endgraf}%
+ \@endjustifycmd %
+ % Get back into horizontal mode for the next line.
+ \noindent %
+ \@firstlinejustifyaction %
+ \fi %
+ }%
+\endgroup
+%
+\def\@endflushleft{\unpenalty{\parfillskip = 0pt plus1fil\par}\ignorespaces}%
+\def\@endflushright{% Remove the \hfil\null\break we just put on.
+ \unskip \setbox0=\lastbox \unpenalty
+ % We have fil glue at the left of the line; \parfillskip shouldn't
+ % affect that.
+ {\parfillskip = 0pt \par}\ignorespaces
+}%
+\def\@endcenter{% Remove the \hfil\null\break we just put on.
+ \unskip \setbox0=\lastbox \unpenalty
+ % We have fil glue at the left of the line; \parfillskip must balance it.
+ {\parfillskip = 0pt plus1fil \par}\ignorespaces
+}%
+%
+%
+%
+% Automatically-columnated tables.
+%
+% \makecolumns N/K: organizes the entries on the following N lines into
+% K columns. If N is too small, some text beyond the end of the table
+% will be incorporated into the table, probably producing an error
+% message. If N is too large, some of the entries will appear after the
+% table, probably looking very out of place.
+%
+% You can adjust the position of the table on the page by changing
+% \parindent (space to the left of the block) and \hsize (distance from
+% the left margin to the right of the block). (No doubt inside a
+% group.) And you can allow a page break above the valign by changing
+% \abovecolumnspenalty.
+%
+\newcount\abovecolumnspenalty \abovecolumnspenalty = 10000
+\newcount\@linestogo % Lines remaining to process.
+\newcount\@linestogoincolumn % Lines remaining in column.
+\newcount\@columndepth % Number of lines in a column.
+\newdimen\@columnwidth % Width of each column.
+\newtoks\crtok \crtok = {\cr}%
+\newcount\currentcolumn
+%
+% The space matches an end-of-line that will probably be there.
+%
+\def\makecolumns#1/#2: {\par \begingroup
+ % Set \@columndepth to the number of items we will put in a column:
+ % ceiling(N/K), i.e. (N - 1) / K + 1.
+ \@columndepth = #1
+ \advance\@columndepth by -1
+ \divide \@columndepth by #2
+ \advance\@columndepth by 1
+ \@linestogoincolumn = \@columndepth
+ \@linestogo = #1
+ %
+ % We start in the first column.
+ \currentcolumn = 1
+ %
+ \def\@endcolumnactions{%
+ \ifnum \@linestogo<2
+ \the\crtok \egroup \endgroup \par % End \valign and \makecolumns.
+ \else
+ % We've done one more line out of the total.
+ \global\advance\@linestogo by -1
+ %
+ % How many left in the column?
+ %
+ \ifnum\@linestogoincolumn<2
+ % End this column, that was the last line.
+ \global\advance\currentcolumn by 1
+ \global\@linestogoincolumn = \@columndepth
+ \the\crtok
+ \else
+ % Still got more lines to go.
+ &\global\advance\@linestogoincolumn by -1
+ \fi
+ \fi
+ }%
+ %
+ % Set up to read the table.
+ %
+ \makeactive\^^M
+ \letreturn \@endcolumnactions
+ %
+ % Figure out how wide our columns are going to be; each column has
+ % exactly the same template, so we can use the feature described on
+ % p.241 of the TeXbook for repeating preambles.
+ %
+ \@columnwidth = \hsize
+ \advance\@columnwidth by -\parindent
+ \divide\@columnwidth by #2
+ \penalty\abovecolumnspenalty
+ \noindent % It's not a paragraph (usually).
+ \valign\bgroup
+ &\hbox to \@columnwidth{\strut \hsize = \@columnwidth ##\hfil}\cr
+ %
+ % The next end-of-line starts everything going.
+}%
+%
+%
+%
+% \numberedfootnote is like plain TeX's \footnote, but automatically
+% numbered. When you want to reset the footnote number, say
+% \footnotenumber = 0.
+%
+% We also provide for more general formatting than \footnote:
+% \footnotemarkseparation is the space between the reference mark and
+% the footnote text;
+% \interfootnoteskip is the space between footnotes;
+% \everyfootnote is expanded just before we typeset the footnote.
+%
+% The dimensions of the footnote rule are controlled by
+% \footnoterulewidth and \footnoteruleheight (the depth is always zero);
+% the space after the rule is \belowfootnoterulespace.
+%
+\newcount\footnotenumber
+\newcount\hlfootlabelnumber
+\newdimen\footnotemarkseparation \footnotemarkseparation = .5em
+\newskip\interfootnoteskip \interfootnoteskip = 0pt
+\newtoks\everyfootnote
+\newdimen\footnoterulewidth \footnoterulewidth = 2in
+\newdimen\footnoteruleheight \footnoteruleheight = 0.4pt
+\newdimen\belowfootnoterulespace \belowfootnoterulespace = 2.6pt
+%
+\let\@plainfootnote = \footnote
+\let\@plainvfootnote = \vfootnote
+% Hyperlink labels for forward and back references.
+\def\hlfootlabel{FOOT\the\hlfootlabelnumber}%
+\def\hlfootbacklabel{FOOTB\the\hlfootlabelnumber}%
+%
+\def\@eplainfootnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ \global\advance\hlfootlabelnumber by 1
+ \hlstart@impl{foot}{\hlfootlabel}%
+ \hldest@impl{footback}{\hlfootbacklabel}%
+ #1%
+ \hlend@impl{foot}%
+ \@sf\vfootnote{#1}%
+}%
+%
+\let\footnote\@eplainfootnote
+%
+\def\vfootnote#1{\insert\footins\bgroup
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \advance\splittopskip by \interfootnoteskip
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+ \everypar = {}%
+ \parskip = 0pt % because of the vskip
+ % Even if typesetting in multicolumns, do footnotes in normal page width.
+ % (We don't have any provision in the output routine for having
+ % footnotes per column, anyway.)
+ \ifnum\@numcolumns > 1 \hsize = \@normalhsize \fi
+ \the\everyfootnote
+ \vskip\interfootnoteskip
+ \indent\llap{%
+ \hlstart@impl{footback}{\hlfootbacklabel}%
+ \hldest@impl{foot}{\hlfootlabel}%
+ #1%
+ \hlend@impl{footback}%
+ \kern\footnotemarkseparation
+ }%
+ \footstrut\futurelet\next\fo@t
+}%
+%
+\def\footnoterule{\dimen@ = \footnoteruleheight
+ \advance\dimen@ by \belowfootnoterulespace
+ \kern-\dimen@
+ \hrule width\footnoterulewidth height\footnoteruleheight depth0pt
+ \kern\belowfootnoterulespace
+ \vskip-\interfootnoteskip
+}%
+%
+\def\numberedfootnote{%
+ \global\advance\footnotenumber by 1
+ \@eplainfootnote{$^{\number\footnotenumber}$}%
+}%
+%
+%
+%
+% Margins.
+%
+% TeX's primitives determine the type area. But some users prefer to
+% think in terms of margins. These definitions allow one to say, for
+% example, `\topmargin = 2in', instead of `\voffset=1in\advance\vsize by
+% -1in'. Constructions like `\advance\topmargin by 1in' give an error
+% message, though, since \topmargin is not a parameter. Instead, the
+% macro \advancetopmargin has to be used.
+%
+\newdimen\paperheight
+\ifnum\mag=1000
+ \paperheight = 11in % No magnification (yet).
+\else
+ \paperheight = 11truein % We already have a magnification.
+\fi
+%
+\def\topmargin{\afterassignment\@finishtopmargin \dimen@}%
+\def\@finishtopmargin{%
+ \dimen2 = \voffset % Remember the old \voffset.
+ \voffset = \dimen@ \advance\voffset by -1truein
+ \advance\dimen2 by -\voffset % Compute the change in \voffset.
+ \advance\vsize by \dimen2 % Change type area accordingly.
+}%
+\def\advancetopmargin{%
+ \dimen@ = 0pt \afterassignment\@finishadvancetopmargin \advance\dimen@
+}%
+\def\@finishadvancetopmargin{%
+ \advance\voffset by \dimen@
+ \advance\vsize by -\dimen@
+}%
+%
+%
+\def\bottommargin{\afterassignment\@finishbottommargin \dimen@}%
+\def\@finishbottommargin{%
+ \@computebottommargin % Result in \dimen2.
+ \advance\dimen2 by -\dimen@ % Compute the change in the bottom margin.
+ \advance\vsize by \dimen2 % Change the type area.
+}%
+\def\advancebottommargin{%
+ \dimen@ = 0pt \afterassignment\@finishadvancebottommargin \advance\dimen@
+}%
+\def\@finishadvancebottommargin{%
+ \advance\vsize by -\dimen@
+}%
+%
+% Find the current bottom margin, putting the result in \dimen2.
+%
+\def\@computebottommargin{%
+ \dimen2 = \paperheight % The total paper size.
+ \advance\dimen2 by -\vsize % Less the text size.
+ \advance\dimen2 by -\voffset % Less the offset at the top.
+ \advance\dimen2 by -1truein % Less the default offset.
+}%
+%
+%
+\newdimen\paperwidth
+\ifnum\mag=1000
+ \paperwidth = 8.5in % No magnification (yet).
+\else
+ \paperwidth = 8.5truein % We already have a magnification.
+\fi
+%
+\def\leftmargin{\afterassignment\@finishleftmargin \dimen@}%
+\def\@finishleftmargin{%
+ \dimen2 = \hoffset % Remember the old \hoffset.
+ \hoffset = \dimen@ \advance\hoffset by -1truein
+ \advance\dimen2 by -\hoffset % Compute the change in \hoffset.
+ \advance\hsize by \dimen2 % Change type area accordingly.
+}%
+\def\advanceleftmargin{%
+ \dimen@ = 0pt \afterassignment\@finishadvanceleftmargin \advance\dimen@
+}%
+\def\@finishadvanceleftmargin{%
+ \advance\hoffset by \dimen@
+ \advance\hsize by -\dimen@
+}%
+%
+%
+\def\rightmargin{\afterassignment\@finishrightmargin \dimen@}%
+\def\@finishrightmargin{%
+ \@computerightmargin % Result in \dimen2.
+ \advance\dimen2 by -\dimen@ % Compute the change in the right margin.
+ \advance\hsize by \dimen2 % Change the type area.
+}%
+\def\advancerightmargin{%
+ \dimen@ = 0pt \afterassignment\@finishadvancerightmargin \advance\dimen@
+}%
+\def\@finishadvancerightmargin{%
+ \advance\hsize by -\dimen@
+}%
+%
+% Find the current right margin, putting the result in \dimen2.
+%
+\def\@computerightmargin{%
+ \dimen2 = \paperwidth % The total paper size.
+ \advance\dimen2 by -\hsize % Less the text size.
+ \advance\dimen2 by -\hoffset % Less the offset at the left.
+ \advance\dimen2 by -1truein % Less the default offset.
+}%
+%
+% There is a potential problem when using the margin macros at a true
+% dimension and then calling \magnification. So we redefine
+% \magnification to address this.
+%
+\let\@plainm@g = \m@g
+\def\m@g{\@plainm@g \paperwidth = 8.5 true in \paperheight = 11 true in}%
+%
+%
+%
+% Double column output.
+%
+% \doublecolumns begins double column output. It can be called
+% in the midst of a page. \singlecolumn restores single column
+% output. (It would be wrong to require \enddoublecolumns, because
+% often one wants double column mode to continue to the end of
+% the document.)
+%
+% The basic approach is that of Appendix E of the TeXbook, p.417.
+% David Guichard made significant improvements to my original implementation.
+%
+% The glue here (the default is intended to be one linespace) is inserted
+% before double columns start, and after they end.
+%
+\newskip\abovecolumnskip \abovecolumnskip = \bigskipamount
+\newskip\belowcolumnskip \belowcolumnskip = \bigskipamount
+%
+% Space between the columns. It can be changed as desired.
+\newdimen\gutter \gutter = 2pc
+%
+% These registers are needed for dealing with switching back and forth.
+\newbox\@partialpage
+\newdimen\@normalhsize
+\newdimen\@normalvsize % The original (before multi-columns) \vsize.
+\newtoks\previousoutput
+%
+% Some synonymous ways to refer to multiple column modes.
+\def\quadcolumns{\@columns4}%
+\def\triplecolumns{\@columns3}%
+\def\doublecolumns{\@columns2}%
+\def\begincolumns#1{\ifcase#1\relax \or \singlecolumn \or \@columns2 \or
+ \@columns3 \or \@columns4 \else \relax \fi}%
+\def\endcolumns{\singlecolumn}%
+\let\@ndcolumns = \relax
+%
+% Set this by default so \vfootnote can unconditionally inspect it.
+\chardef\@numcolumns = 1
+%
+\mathchardef\@ejectpartialpenalty = 10141
+%
+%
+% \@columns: Start typesetting with #1 columns.
+%
+% Before we actually start, we have to make sure that there are at least
+\chardef\@col@minlines = 3
+% free lines.
+% (It could be 2, or even 1, but it might give ugly results; at least one
+% line is absolutely necessary, or the output routine might get confused.)
+% We have to be careful, so that eg.
+% \hbox{TITLE}
+% \nobreak
+% \doublecolumns
+% won't break between the title and the start of the columned output.
+%
+% To achieve this, we add vskip of fixed size equal to
+% @col@minlines * baselineskip
+% and then eject the page.
+% The output routine then catches the pages ejected:
+% 1) if it's a normal page, it is processed by previous output routine;
+% 2) if it's the last one, it is saved and the added skip is removed.
+%
+% When the box is processed according to 1), an underfull vbox can appear,
+% but it's not our problem, the manuscript (or it's macros) has to be fixed.
+%
+% Another note: all assignments are global; it is not possible to call
+% \doublecolumns in a group.
+%
+\def\@columns#1{%
+ \@ndcolumns
+ %
+ \global\let\@ndcolumns = \@endcolumns
+ \global\chardef\@numcolumns = #1
+ \global\previousoutput = \expandafter{\the\output}%
+ %
+ % Grab the page so far (i.e., the material BEFORE \@columns was called)
+ % and save it in \@partialpage.
+ \global\output = {%
+ \ifnum\outputpenalty = -\@ejectpartialpenalty
+ \dimen@ = \vsize
+ \advance\dimen@ by \@col@minlines\baselineskip
+ \global\setbox\@partialpage =
+ \vbox \ifdim \pagetotal > \vsize to \dimen@ \fi {%
+ \unvbox255 \unskip
+ }%
+ \else
+ \the\previousoutput
+ \fi
+ }%
+ %
+ \vskip \abovecolumnskip
+ \vskip \@col@minlines\baselineskip
+ % now execute the output routine:
+ \penalty -\@ejectpartialpenalty
+ %
+ % Reset \output to prepare for the first real page break.
+ \global\output = {\@columnoutput}%
+ %
+ \global\@normalhsize = \hsize
+ \global\@normalvsize = \vsize
+ %
+ % Figure out how wide the columns should be -- for n columns,
+ % decrement by n - 1 gutters.
+ \count@ = \@numcolumns
+ \advance\count@ by -1
+ \global\advance\hsize by -\count@\gutter
+ \global\divide\hsize by \@numcolumns
+ %
+ % Compute \vsize based on what's already on the page
+ % and the number of columns. Also change the mag factor for insertions.
+ %
+ \advance\vsize by -\ht\@partialpage
+ %
+ \advance\vsize by -\ht\footins
+ \ifvoid\footins\else \advance\vsize by -\skip\footins \fi
+ \multiply\count\footins by \@numcolumns
+ %
+ \advance\vsize by -\ht\topins
+ \ifvoid\topins\else \advance\vsize by -\skip\topins \fi
+ \multiply\count\topins by \@numcolumns
+ %
+ \global\vsize = \@numcolumns\vsize
+}%
+%
+% When this is invoked box 255 contains just the right amount of
+% material, whether triggered by an output routine or a change in the
+% number of columns. Because columns have to contain an integral number
+% of lines of type, we take a bit of care with balancing the heights of
+% the columns to prevent either losing material or having a very short
+% last column.
+%
+% When a page ends due to \bye or \eject, box 255 will contain lots of
+% white space, so the columns will not look balanced. To fix this use
+% \singlecolumn before ending the page.
+%
+% [gutterbox material added by AHL on 5 November 1997.]
+% \gutterbox is a hook to enable the placement of arbitrary vertical
+% material in the gutter between columns. For example, to put a
+% vertical line between the columns you could say
+%
+% \def\gutterbox{\vbox to \dimen0{\vfil\hbox{\vrule height\dimen0}\vfil}}%
+%
+% The dimension counter \dimen0 contains the height of the column.
+%
+% By default, we define \gutterbox to be "empty":
+\def\gutterbox{\vbox to \dimen0{\vfil\hbox{\hfil}\vfil}}%
+%
+% [This next paragraph added by AHL on 22 Sep 1996.]
+% There is a special case we have to worry about, namely when we
+% switch from multiple columns to single columns. In this case, we may
+% have a bit of text left over that doesn't fit evenly into the
+% multiple columns. In that case, we will have un-even columns. Not a
+% pretty solution, but I don't have a better one at the moment. The
+% conditional \if@forceextraline tests whether we are in this case.
+%
+\newif\if@forceextraline\@forceextralinefalse
+\def\@columnsplit{%
+ \splittopskip = \topskip
+ \splitmaxdepth = \baselineskip
+ %
+ % \dimen@ will be the height that the double-column material on this
+ % page should have, i.e., the height of the page (\singlecolumvsize)
+ % minus single-column material, which includes insertions. (If you
+ % want your insertions to respect the columns, you will have to
+ % change the output routine.) If you add more insertions, they
+ % should be taken into account both here and in \singlecolumn.
+ %
+ % Unfortunately, we lose on flexible glue because we must
+ % \vsplit to a <dimen>.
+ \dimen@ = \ht255
+ \divide\dimen@ by \@numcolumns
+ %
+ % If we are in an end-column mode and we need extra vertical space
+ % in the last column, advance \dimen@.
+ \if@forceextraline
+ \advance\dimen@ by \baselineskip
+ \fi
+ %
+ % Split the long scroll into columns.
+ \begingroup
+ % We do not want to see underfull \vbox messages unless the final
+ % page is underfull.
+ \vbadness = 10000
+ %
+ % The first (leftmost) column.
+ \global\setbox1 = \vsplit255 to \dimen@ \global\wd1 = \hsize
+ %
+ % The second column.
+ \global\setbox3 = \vsplit255 to \dimen@ \global\wd3 = \hsize
+ %
+ \ifnum\@numcolumns > 2
+ % The third column, if requested.
+ \global\setbox5 = \vsplit255 to \dimen@ \global\wd5 = \hsize
+ \fi
+ \ifnum\@numcolumns > 3
+ % The fourth column, likewise if requested.
+ \global\setbox7 = \vsplit255 to \dimen@ \global\wd7 = \hsize
+ \fi
+ \endgroup
+ \if@forceextraline % If this is the first time
+ \else % through, save the single
+ \setbox\@forcelinebox=\copy\@partialpage % column material.
+ \fi
+ %
+ % Set up \box255 with the real output page, as the previous output
+ % routine expects.
+ \setbox0 = \box255
+ \global\setbox255 = \vbox{%
+ \unvbox\@partialpage
+ \ifcase\@numcolumns \relax\or\relax
+ \or \hbox to \@normalhsize{\box1\hfil\gutterbox\hfil\box3}%
+ \or \hbox to \@normalhsize{\box1\hfil\gutterbox\hfil\box3%
+ \hfil\gutterbox\hfil\box5}%
+ \or \hbox to \@normalhsize{\box1\hfil\gutterbox\hfil\box3%
+ \hfil\gutterbox\hfil\box5%
+ \hfil\gutterbox\hfil\box7}%
+ \fi
+ }%
+ %
+ % Save what's left over in a private register before calling their
+ % output routine.
+ \setbox\@partialpage = \box0
+}%
+%
+% Our output routine splits the columns and then calls the previous one.
+%
+\def\@columnoutput{%
+ \@columnsplit
+ \@recoverclubpenalty
+ \hsize = \@normalhsize % Local to \output's group.
+ \vsize = \@normalvsize
+ \the\previousoutput
+ %
+ % Put back what didn't fit.
+ \unvbox\@partialpage
+ \penalty\outputpenalty
+ %
+ % The correct vsize is the original vsize times the
+ % number of columns.
+ \global\vsize = \@numcolumns\@normalvsize
+}%
+%
+% Go back to single-column typesetting. Assume \doublecolumns has
+% been called.
+%
+\def\singlecolumn{%
+ \@ndcolumns
+ \chardef\@numcolumns = 1
+ \vskip\belowcolumnskip
+ \nointerlineskip
+}%
+%
+\newbox\@forcelinebox
+\def\@endcolumns{%
+ \global\let\@ndcolumns = \relax
+ \par % Shouldn't start in horizontal mode.
+ %
+ \global\output = {\global\setbox1 = \box255}%
+ \pagegoal = \pagetotal
+ \break % Exercise the page builder, i.e., \output.
+ \setbox2 = \box1 % Save material in box2 in case of overflow.
+ \global\setbox255 = \copy2 % Retrieve what the fake \output set.
+ %
+ % \box255 now has the double-column material. On the page where we
+ % switch back to one column, the double-column material might not
+ % fill up the page. We want to split whatever is there.
+ \@columnsplit
+ %
+ % Check that \@columnsplit did not leave any lines in
+ % \@partialpage. If it did, do it again, but this time with longer
+ % columns.
+ \ifvoid\@partialpage
+ \else % There is some left-over.
+ \setbox0=\box\@partialpage % Merely to void \@partialpage
+ \global\setbox255 = \box2 % Retrieve what the fake \output set.
+ \@forceextralinetrue % Add \forcelinebox to \box255 to save single
+ \@columnsplit % column material.
+ \global\setbox255 = \vbox{\box\@forcelinebox\box255}%
+ \fi
+
+ \global\vsize = \@normalvsize
+ \global\hsize = \@normalhsize
+ \global\output = \expandafter{\the\previousoutput}%
+ %
+ \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
+ \unvbox255
+}%
+% [\columnfill]
+% We don't have any way to force a column eject, since the \output
+% routine is only prepared to split up a full page of material. Instead,
+% we provide the following as a guess at enough space to fill up the
+% current column.
+%
+% [April 30, 1998] This definition is from
+% Helmut Jarausch <jarausch@IGPM.Rwth-Aachen.DE> with some
+% modifications by A. Lewenberg <ahl@uakron.edu>.
+%
+% Here is the main difficulty: when \vsplitting the long page into the
+% component columns, \vsplit prepends to the top of each column glue
+% in the amount \topskip - (height of top box). But this happens
+% in the output routine _after_ the \columnfill does its
+% calculations. The result of this is that if we are not careful
+% \columnfill will insert too much space attempting to ``eject'' the
+% current column. There is no simple way around this, so what I have
+% done is have is make \columnfill insert less space than needed, and
+% then not allow any \club lines by setting \clubpenalty to its
+% maximum value. Not a pretty solution, but until something better
+% comes along, it will have to do.
+%
+\def\@saveclubpenalty{% save the current value of \clubpenalty
+ \edef\@recoverclubpenalty{%
+ \global\clubpenalty=\the\clubpenalty\relax%
+ \global\let\noexpand\@recoverclubpenalty\relax
+ }% the \noexpand handles infinite self-reference
+}%
+\let\@recoverclubpenalty\relax
+\newdimen\temp@dimen
+\def\columnfill{%
+ \par
+ \dimen@=\pagetotal % The height of the text set so far.
+ \temp@dimen = \vsize % = \@numcolumns * columnheight
+ \divide\temp@dimen by \@numcolumns % find out column height
+ \loop
+ \ifdim \dimen@ > \temp@dimen
+ \advance \dimen@ by -\temp@dimen
+ \advance \dimen@ by \topskip % fudge factor
+ \repeat
+ \advance \temp@dimen by -\dimen@
+ \advance \temp@dimen by -\prevdepth
+ \@saveclubpenalty
+ \clubpenalty=10000\relax
+ \hrule height\temp@dimen width0pt depth0pt\relax
+ \nointerlineskip
+ \par
+ \nointerlineskip
+ \penalty0\vfil % To allow a page break here.
+ \relax
+}%
+%
+%
+%
+% Hypertext links support.
+%
+% Hyperlink destinations (driver-independent code).
+%
+% \hldest{TYPE}{OPTIONS}{LABEL} defines a hyperlink destination
+% LABEL. OPTIONS is a comma-separated list of option assignments of
+% the form `opt=value'; permitted values for TYPE and OPTIONS depend
+% on selected hyperlink driver.
+%
+% \hldest will be \let to \@hldest by \enablehyperlinks. TYPE,
+% OPTIONS and LABEL will be read by \hl@getparam.
+\def\@hldest{%
+ \def\hl@prefix{hldest}%
+ \let\after@hl@getparam\hldest@aftergetparam
+ % Start the group which will isolate option settings. It will be
+ % ended in \hldest@aftergetparam
+ \begingroup
+ \hl@getparam
+}%
+% This actually produces hyperlink destination. It will be called at
+% the end of \hl@getparam, after the parameters are parsed.
+\def\hldest@aftergetparam{%
+ \ifvmode
+ % In vertical mode we don't raise the destination, so it can go
+ % directly into the vertical list.
+ \hldest@driver
+ \else
+ % In horizontal mode, the destination is raised \hldest@opt@raise
+ % above the baseline and placed inside a zero-width/height/depth
+ % box; the box is surrounded by \allowhyphens in case it is
+ % placed next to a word, to allow hyphenation of that word.
+ \allowhyphens
+ \smash{\ifx\hldest@opt@raise\empty \else \raise\hldest@opt@raise\fi
+ \hbox{\hldest@driver}}%
+ \allowhyphens
+ \fi
+ % End the group which was isolating option settings (it was started
+ % in \@hldest).
+ \endgroup
+}%
+%
+% Hyperlinks (driver-independent code).
+%
+% \hlstart{TYPE}{OPTIONS}{LABEL} starts a hyperlink to destination
+% LABEL. OPTIONS is a comma-separated list of option assignments of
+% the form `opt=value'; permitted values of TYPE and OPTIONS depend on
+% selected hyperlink driver. End the link with \hlend.
+%
+% \hlstart will be \let to \@hlstart by \enablehyperlinks. TYPE,
+% OPTIONS and LABEL will be read by \hl@getparam.
+\def\@hlstart{%
+ \leavevmode
+ \def\hl@prefix{hl}%
+ \let\after@hl@getparam\hlstart@aftergetparam
+ % Start the group which will isolate option settings and color
+ % changes. It will be ended in \@hlend
+ \begingroup
+ \hl@getparam
+}%
+%
+\def\hlstart@aftergetparam{%
+ % Set the color for the link.
+ \ifx\color\undefined \else
+ \ifx\hl@opt@color\empty \else
+ \ifx\hl@opt@colormodel\empty
+ \edef\temp{\noexpand\color{\hl@opt@color}}%
+ \else
+ \edef\temp{\noexpand\color[\hl@opt@colormodel]{\hl@opt@color}}%
+ \fi
+ \temp
+ \fi
+ \fi
+ % Call the driver.
+ \hl@driver
+}%
+% \hlend will be \let to \@hlend by \enablehyperlinks. \@hlend will
+% be defined by a driver.
+%
+% Macros which are used commonly by \hldest and \hlstart to parse and
+% save parameters. \hl@prefix must be set to `hldest' by \hldest and
+% to `hl' by \hlstart.
+%
+% \hl@getparam{TYPE}{OPTIONS}{LABEL} reads, parses and saves the
+% parameters for \hldest or \hlstart into \@hltype, \hl[dest]@opt@...
+% and \@hllabel. After doing that it calls \after@hl@getparam which
+% should be defined by \@hldest and \@hlstart to produce destination /
+% link using the saved parameters.
+\def\hl@getparam#1#2#3{%
+ % Save TYPE in \@hltype (use default if empty).
+ \edef\@hltype{#1}%
+ \ifx\@hltype\empty
+ \expandafter\let\expandafter\@hltype
+ \csname \hl@prefix @type\endcsname
+ \fi
+ % For each supported destination / link type TYPE, a driver should
+ % define \hl[dest]@typeh@TYPE handler.
+ \expandafter\ifx\csname \hl@prefix @typeh@\@hltype\endcsname \relax
+ \errmessage{Invalid type `\@hltype'}%
+ \fi
+ % \for will expand #2 once so user can pass a shortcut macro. We
+ % also ignore empty \hl@arg, so that the following
+ % \hldest{TYPE}{\myopt,height=200pt}{LABEL}
+ % would be legal even when \myopt happens to be empty.
+ \for\hl@arg:=#2\do{%
+ \ifx\hl@arg\empty \else
+ \expandafter\hl@set@opt\hl@arg=,%
+ \fi
+ }%
+ % Save LABEL in \@hllabel.
+ \edef\@hllabel{#3}%
+ % Execute the commands specific to destination / link
+ \after@hl@getparam
+ % Ignore spaces after \hlstart and \hldest.
+ \ignorespaces
+}%
+% Parse and set a (default, not a group) option.
+\def\hl@set@opt#1=#2,{%
+ % For each supported option OPTION, a driver should define
+ % \hl[dest]@opt@OPTION.
+ \expandafter\ifx\csname \hl@prefix @opt@#1\endcsname \relax
+ \errmessage{Invalid option `#1'}%
+ \fi
+ % Save the value of the option.
+ \if ,#2, % if #2 is empty, complain.
+ \errmessage{Missing value for option `#1'}%
+ \else
+ % Remove a trailing =.
+ \def\temp##1={##1}%
+ \expandafter\edef\csname \hl@prefix @opt@#1\endcsname{\temp#2}%
+ \fi
+}%
+% \hl{dest,start,end}@impl{GROUP}{LABEL} will generate `implicit' destination /
+% hyperlink, if the user has not turned off this kind of implicit
+% destinations / hyperlinks. This is used by Eplain's cross-reference
+% macros.
+\def\hldest@impl#1{%
+ \expandafter\ifcase\csname hldest@on@#1\endcsname
+ \relax\expandafter\gobble
+ \else
+ \toks@=\expandafter{\csname hldest@type@#1\endcsname}%
+ \toks@ii=\expandafter{\csname hldest@opts@#1\endcsname}%
+ \edef\temp{\noexpand\hldest{\the\toks@}{\the\toks@ii}}%
+ \expandafter\temp
+ \fi
+}%
+\def\hlstart@impl#1{%
+ \expandafter\ifcase\csname hl@on@#1\endcsname
+ % Still produce \leavevmode, to be consistent with \hloff.
+ \leavevmode\expandafter\gobble
+ \else
+ \toks@=\expandafter{\csname hl@type@#1\endcsname}%
+ \toks@ii=\expandafter{\csname hl@opts@#1\endcsname}%
+ \edef\temp{\noexpand\hlstart{\the\toks@}{\the\toks@ii}}%
+ \expandafter\temp
+ \fi
+}%
+\def\hlend@impl#1{%
+ \expandafter\ifcase\csname hl@on@#1\endcsname
+ \else
+ \hlend
+ \fi
+}%
+%
+% Setting options and types.
+%
+\def\hl@asterisk@word{*}%
+\def\hl@opts@word{opts}%
+\newif\if@params@override
+% We define hyperlink / destination groups. A group is a macro or a
+% group of macros which implicitly generate hyperlink / destination.
+% The user can set parameters for each group individually, as well as
+% the default parameters, with the macros defined below. Group
+% settings will override the default hyperlink / destination
+% parameters.
+\def\hldest@groups{definexref,xrdef,li,eq,bib,foot,footback,idx}%
+\def\hl@groups{ref,xref,eq,cite,foot,footback,idx,url}%
+% \hldesttype [GROUPS]{VALUE}
+% \hldestopts [GROUPS]{VALUE}
+% \hltype [GROUPS]{VALUE}
+% \hlopts [GROUPS]{VALUE}
+%
+% Set hyperlink or destination parameter (type / opts) to VALUE for
+% each group in GROUPS. An empty `group' will set default value for
+% the parameter. A star (*) `group' stands for all groups (exept the
+% empty `group'). If the macro is followed by an exclamation mark
+% (like \hlopts!...), the parameters will be overridden; otherwise,
+% they will be updated (this has effect only on group option list).
+\def\hldesttype{%
+ \def\hl@prefix{hldest}%
+ \def\hl@param{type}%
+ \let\hl@all@groups\hldest@groups
+ \futurelet\hl@excl\hl@param@read@excl
+}%
+\def\hldestopts{%
+ \def\hl@prefix{hldest}%
+ \def\hl@param{opts}%
+ \let\hl@all@groups\hldest@groups
+ \futurelet\hl@excl\hl@param@read@excl
+}%
+\def\hltype{%
+ \def\hl@prefix{hl}%
+ \def\hl@param{type}%
+ \let\hl@all@groups\hl@groups
+ \futurelet\hl@excl\hl@param@read@excl
+}%
+\def\hlopts{%
+ \def\hl@prefix{hl}%
+ \def\hl@param{opts}%
+ \let\hl@all@groups\hl@groups
+ \futurelet\hl@excl\hl@param@read@excl
+}%
+\def\hl@param@read@excl{%
+ \ifx!\hl@excl
+ \let\next\hl@param@read@opt@arg
+ \@params@overridetrue
+ \else
+ \def\next{\hl@param@read@opt@arg{!}}%
+ \@params@overridefalse
+ \fi
+ \next
+}%
+\def\hl@param@read@opt@arg#1{% #1 is the `!', ignore it.
+ \@getoptionalarg\hl@setparam
+}%
+% Set the parameter \hl@param to #1 for each group in \@optionalarg.
+\def\hl@setparam#1{%
+ \ifx\@optionalarg\empty
+ \hl@setparam@default{#1}% Set default.
+ \else
+ % If we find an asterisk in the list, we have no choice but to
+ % finish the list and then call \hl@setparam again, now with
+ % \hl@all@groups for the list of groups.
+ \let\hl@do@all@groups\gobble
+%
+ \for\hl@group:=\@optionalarg\do{%
+ \ifx\hl@group\hl@asterisk@word
+ \def\hl@do@all@groups{\let\@optionalarg\hl@all@groups \hl@setparam}%
+ \else
+ \hl@setparam@group{#1}%
+ \fi
+ }%
+%
+ \hl@do@all@groups{#1}%
+ \fi
+}%
+% Set a parameter (\hl@param) for one group (\hl@group) to the value
+% (#1). The group may be empty, in which case we call
+% \hl@setparam@default
+\def\hl@setparam@group#1{%
+ \ifx\hl@group\empty
+ \hl@setparam@default{#1}%
+ \else
+ \expandafter\ifx\csname\hl@prefix @\hl@param @\hl@group\endcsname\relax
+ \errmessage{Hyperlink group parameter `\hl@prefix:\hl@param:\hl@group' is not defined}%
+ \fi
+ \ifx\hl@param\hl@opts@word
+ % For the `opts' parameter, we want to expand the first token of
+ % #1 once, in case the user passed a macro containing the option
+ % list. We may need to either simply override the old option
+ % list, or to update it with the new option settings.
+ \if@params@override
+ \toks@=\expandafter{#1}%
+ \ece\edef{\hl@prefix @\hl@param @\hl@group}{\the\toks@}%
+ \else
+ \hl@update@opts@with@list{#1}% #1 will be used in the \for
+ % loop, so it will be expanded once.
+ \fi
+ \else
+ % Do not use \edef here to define the parameter, so the user can
+ % define it to, e.g., \normalbaselineskip, and make the parameter
+ % adjustable to a situation.
+ \ece\def{\hl@prefix @\hl@param @\hl@group}{#1}%
+ \fi
+ \fi
+}%
+% Set default parameter values. We have to treat `opts' (list of
+% options) specially, because for option defaults we don't store a
+% list of options (like we do for the group options) but set each
+% option individually.
+\def\hl@setparam@default#1{%
+ \ifx\hl@param\hl@opts@word
+ % `opts'.
+ \for\hl@opt:=#1\do{%
+ \ifx\hl@opt\empty \else
+ \expandafter\hl@set@opt\hl@opt=,%
+ \fi
+ }%
+ \else
+ % Everything except `opts'.
+ \expandafter\ifx\csname\hl@prefix @\hl@param\endcsname\relax
+ \message{Default parameter `\hl@prefix:\hl@param' is not defined}%
+ \fi
+ % Should not use \edef, so the user could define this to, e.g.,
+ % \normalbaselineskip, to make the parameter adjustable to a
+ % situation.
+ \ece\def{\hl@prefix @\hl@param}{#1}%
+ \fi
+}%
+% For each option in the list (#1), call \hl@update@with@opt to update
+% the group's option list (\csname\hl@prefix @opts@ \hl@group\endcsname)
+% with this new option.
+\def\hl@update@opts@with@list#1{%
+ % Start with the current list of the group.
+ \global\expandafter\let\expandafter\hl@update@new@list
+ \csname \hl@prefix @opts@\hl@group\endcsname
+ % We have to isolate the \for loop inside a (TeX) group, to avoid
+ % clashes with the loop in \hl@setparam
+ \begingroup
+ \for\hl@opt:=#1\do{%
+ \hl@update@opts@with@opt
+ }%
+ \endgroup
+ % Save the final list back in the option list for the group.
+ \ece\let{\hl@prefix @opts@\hl@group}\hl@update@new@list
+}%
+% Go through the option list (\hl@update@new@list) and construct the
+% new list (in \hl@update@new@list), replacing the old definition of
+% the option with the new one (\hl@opt).
+\def\hl@update@opts@with@opt{%
+ % Save the old list and the new option.
+ \global\let\hl@update@old@list\hl@update@new@list
+ \global\let\hl@update@new@list\empty
+ \global\let\hl@update@new@opt\hl@opt
+ % Get the key of the new option and save it.
+ \expandafter\hl@parse@opt@key\hl@opt=,%
+ \let\hl@update@new@key\hl@update@key
+ % We will set this to real comma after the first entry.
+ \global\let\hl@update@comma\empty
+ % We have to isolate the \for loop inside a (TeX) group, to avoid
+ % clashes with the loop in \hl@update@opts@with@list
+ \begingroup
+ \for\hl@opt:=\hl@update@old@list\do{%
+ \ifx\hl@opt\empty \else % Skip empty `options'.
+ % Get the key of this option.
+ \expandafter\hl@parse@opt@key\hl@opt=,%
+ % If the key matches, replace the option definition with the
+ % new definition, otherwise, repeat the old definition.
+ \toks@=\expandafter{\hl@update@new@list}%
+ \ifx\hl@update@key\hl@update@new@key
+ \ifx\hl@update@new@opt\empty \else % Skip multiple options.
+ \toks@ii=\expandafter{\hl@update@new@opt}%
+ \xdef\hl@update@new@list{\the\toks@\hl@update@comma\the\toks@ii}%
+ \global\let\hl@update@new@opt\empty
+ \global\def\hl@update@comma{,}%
+ \fi
+ \else
+ \toks@ii=\expandafter{\hl@opt}%
+ \xdef\hl@update@new@list{\the\toks@\hl@update@comma\the\toks@ii}%
+ \global\def\hl@update@comma{,}%
+ \fi
+ \fi
+ }%
+ \endgroup
+ % If nothing was replaced, add the new option to the end of the new list.
+ \ifx\hl@update@new@opt\empty \else
+ \toks@=\expandafter{\hl@update@new@list}%
+ \toks@ii=\expandafter{\hl@update@new@opt}%
+ \xdef\hl@update@new@list{\the\toks@\hl@update@comma\the\toks@ii}%
+ \fi
+}%
+% Parse the key of the option and save it in \hl@update@key
+\def\hl@parse@opt@key#1=#2,{\def\hl@update@key{#1}}%
+%
+% Default and group parameters (options and types).
+%
+% Option `raise' will determine how much to raise hyperlink
+% destinations above the baseline. It will be supported by all
+% drivers, since it is handled outside the drivers, in
+% \hldest@aftergetparam.
+\def\hldest@opt@raise{\normalbaselineskip}%
+% Options `colormodel' and `color' will also be handled outside the
+% drivers, in \hlstart@aftergetparam.
+\def\hl@opt@colormodel{cmyk}%
+\def\hl@opt@color{0.28,1,1,0.35}%
+%
+% Parameters for destinations and links produced implicitly by
+% cross-reference macros. Note that each driver will additionally
+% define \hldest@type and \hl@type parameters which will be used when
+% one of the below is empty, and default values for destination and
+% link options (which are driver-specific).
+%
+% Destination on/off flags (0=off, 1=on).
+\def\hldest@on@definexref{0}%
+\def\hldest@on@xrdef{0}%
+\def\hldest@on@li{0}%
+\def\hldest@on@eq{0}% \eqdef and friends
+\def\hldest@on@bib{0}% \biblabelprint (BibTeX)
+\def\hldest@on@foot{0}% \footnote / \numberedfootnote
+\def\hldest@on@footback{0}% back-ref for \footnote / \numberedfootnote
+\def\hldest@on@idx{0}% both `page' dests and `exact' dests
+% Types of destinations.
+\let\hldest@type@definexref\empty
+\let\hldest@type@xrdef\empty
+\let\hldest@type@li\empty
+\let\hldest@type@eq\empty % \eqdef and friends
+\let\hldest@type@bib\empty % \biblabelprint (BibTeX)
+\let\hldest@type@foot\empty % \footnote / \numberedfootnote
+\let\hldest@type@footback\empty % back-ref for \footnote / \numberedfootnote
+\let\hldest@type@idx\empty % both `page' dests and `exact' dests
+% Options for destinations.
+\let\hldest@opts@definexref\empty
+\let\hldest@opts@xrdef\empty
+\let\hldest@opts@li\empty
+\def\hldest@opts@eq{raise=1.7\normalbaselineskip}% \eqdef and friends
+\let\hldest@opts@bib\empty % \biblabelprint (BibTeX)
+\let\hldest@opts@foot\empty % \footnote / \numberedfootnote
+\let\hldest@opts@footback\empty % back-ref for \footnote / \numberedfootnote
+\let\hldest@opts@idx\empty % both `page' dests and `exact' dests
+%
+% Hyperlink on/off flags (0=off, 1=on).
+\def\hl@on@ref{0}% \refn and \xrefn, \ref, \refs
+\def\hl@on@xref{0}%
+\def\hl@on@eq{0}% \eqref and \eqrefn
+\def\hl@on@cite{0}% \cite (BibTeX)
+\def\hl@on@foot{0}% \footnote / \numberedfootnote
+\def\hl@on@footback{0}% back-reference for \footnote / \numberedfootnote
+\def\hl@on@idx{0}%
+\def\hl@on@url{0}% \url from url.sty
+% Types of links.
+\let\hl@type@ref\empty % \refn and \xrefn, \ref, \refs
+\let\hl@type@xref\empty
+\let\hl@type@eq\empty % \eqref and \eqrefn
+\let\hl@type@cite\empty % \cite (BibTeX)
+\let\hl@type@foot\empty % \footnote / \numberedfootnote
+\let\hl@type@footback\empty % back-reference for \footnote / \numberedfootnote
+\let\hl@type@idx\empty
+\let\hl@type@url\empty % \url from url.sty (this will be set to `url' by
+ % drivers which support the `url' type)
+% Options for links.
+\let\hl@opts@ref\empty % \refn and \xrefn, \ref, \refs
+\let\hl@opts@xref\empty
+\let\hl@opts@eq\empty % \eqref and \eqrefn
+\let\hl@opts@cite\empty % \cite (BibTeX)
+\let\hl@opts@foot\empty % \footnote / \numberedfootnote
+\let\hl@opts@footback\empty % back-reference for \footnote / \numberedfootnote
+\let\hl@opts@idx\empty
+\let\hl@opts@url\empty % \url from url.sty
+%
+% \@hlon[GROUPS]
+% \@hloff[GROUPS]
+% \@hldeston[GROUPS]
+% \@hldestoff[GROUPS]
+% \@@hlon
+% \@@hloff
+% \@@hldeston
+% \@@hldestoff
+%
+% Macros to switch hyperlinks / destinations on/off.
+%
+% The optional arg is the list of groups. It can contain a star (*)
+% which will make the macros affect all groups (but not the low-level
+% macros \hlstart, \hlend and \hldest).
+%
+% \@hlon, \@hldeston, \@hloff and \@hldestoff will turn low-level
+% macros on/off only when they are used either without the optional
+% arg or with an empty `group' in the optional arg, otherwise only the
+% specified groups are affected.
+%
+% The single-`@' variants (\@hl...) are for the user. In your macros,
+% if you want to (temporarily) turn low-level macros on/off, it's
+% better to use the double-`@' variants (\@@hl...), because they are
+% much faster and won't clobber \@optionalarg or anything else.
+%
+\def\@hlon{\@hlonoff@value@stub{hl}\@@hlon1 }%
+\def\@hloff{\@hlonoff@value@stub{hl}\@@hloff0 }%
+\def\@hldeston{\@hlonoff@value@stub{hldest}\@@hldeston1 }%
+\def\@hldestoff{\@hlonoff@value@stub{hldest}\@@hldestoff0 }%
+%
+\def\@hlonoff@value@stub#1#2#3{%
+ \def\hl@prefix{#1}%
+ \let\hl@on@empty#2%
+ \def\hl@value{#3}%
+ \expandafter\let\expandafter\hl@all@groups
+ \csname \hl@prefix @groups\endcsname
+ \@getoptionalarg\@finhlswitch
+}%
+%
+\def\@finhlswitch{%
+ \ifx\@optionalarg\empty
+ \hl@on@empty
+ \fi
+ % If we find an asterisk in the list, we have no choice but to
+ % finish the list and then call \@finhlswitch again, now with
+ % \hl@all@groups for the list of groups.
+ \let\hl@do@all@groups\relax
+%
+ \for\hl@group:=\@optionalarg\do{%
+ \ifx\hl@group\hl@asterisk@word
+ \let\@optionalarg\hl@all@groups
+ \let\hl@do@all@groups\@finhlswitch
+ \else
+ \ifx\hl@group\empty
+ \hl@on@empty
+ \else
+ \expandafter\ifx\csname\hl@prefix @on@\hl@group\endcsname \relax
+ \errmessage{Hyperlink group `\hl@prefix:on:\hl@group'
+ is not defined}%
+ \fi
+ \ece\edef{\hl@prefix @on@\hl@group}{\hl@value}%
+ \fi
+ \fi
+ }%
+%
+ \hl@do@all@groups
+}%
+% Turn low-level macros on/off.
+\def\@@hlon{%
+ \let\hlstart\@hlstart
+ \let\hlend\@hlend
+}%
+\def\@@hloff{%
+ \def\hlstart##1##2##3{\leavevmode\ignorespaces}%
+ \let\hlend\relax
+}%
+\def\@@hldeston{%
+ \let\hldest\@hldest
+}%
+\def\@@hldestoff{%
+ \def\hldest##1##2##3{\ignorespaces}%
+}%
+%
+% Hyperlink drivers.
+%
+% \enablehyperlinks[OPTIONS] will enable hyperlinks. OPTIONS is a
+% list of comma-separated options. An option is one of the following:
+%
+% idxexact Point index links to exact locations of the term
+% idxpage Point index links to pages with the term (default)
+% idxnone No links for index entries
+% <driver-name> Force the hyperlink driver
+%
+% If <driver-name> is omitted, appropriate driver will be detected, if
+% possible; if not, we fall back on `dvipdfm' (currently this means
+% `pdftex' when \ifpdf, and `dvipdfm' otherwise).
+\def\hl@idxexact@word{idxexact}%
+\def\hl@idxpage@word{idxpage}%
+\def\hl@idxnone@word{idxnone}%
+%
+\def\enablehyperlinks{\@getoptionalarg\@finenablehyperlinks}%
+\def\@finenablehyperlinks{%
+ \let\hl@selecteddriver\empty
+ % By default we generate `idxpage' index hyperlinks.
+ \def\hldest@place@idx{0}%
+ % Go through the option list.
+ \for\hl@arg:=\@optionalarg\do{%
+ \ifx\hl@arg\hl@idxexact@word
+ \def\hldest@place@idx{1}%
+ \else
+ \ifx\hl@arg\hl@idxnone@word
+ \def\hldest@place@idx{-1}%
+ \else
+ \ifx\hl@arg\hl@idxpage@word
+ \def\hldest@place@idx{0}%
+ \else
+ \let\hl@selecteddriver\hl@arg
+ \fi
+ \fi
+ \fi
+ }%
+ % Check the driver name.
+ \ifx\hl@selecteddriver\empty
+ % The user did not specify a driver, detect.
+ \ifpdf
+ \def\hl@selecteddriver{pdftex}%
+ \message{^^JUsing `pdftex' hyperlink driver.}%
+ \else
+ \def\hl@selecteddriver{dvipdfm}%
+ \message{^^JUsing `dvipdfm' hyperlink driver.}%
+ \fi
+ \else
+ % Check that the requested driver's initialization routine is
+ % available.
+ \expandafter\ifx\csname hldriver@\hl@selecteddriver\endcsname \relax
+ \errmessage{No hyperlink driver `\hl@selecteddriver' available}%
+ \fi
+ \fi
+ % Call the driver's initialization routine.
+ \csname hldriver@\hl@selecteddriver\endcsname
+ % Driver should not be changed later.
+ \def\@finenablehyperlinks{\errmessage{Hyperlink driver `\hl@selecteddriver'
+ already selected}}%
+ % Free memory taken up by the drivers.
+ \let\hldriver@nolinks\undefined
+ \let\hldriver@pdftex \undefined
+ \let\hldriver@dvipdfm\undefined
+ % The user can use these to turn the links / destinations on/off
+ % (see comments to the driver `nolinks').
+ \let\hloff\@hloff
+ \let\hlon\@hlon
+ \let\hldestoff\@hldestoff
+ \let\hldeston\@hldeston
+ % Turn everything on by default.
+ \hlon[*,]%
+ \hldeston[*,]%
+}%
+%
+% Driver `nolinks'.
+%
+% Select this driver to suppress any hyperlinks / destinations in your
+% document.
+%
+% NOTE: selecting this driver is quite different from not selecting
+% any driver at all, or from selecting some driver and then turning
+% off links and destinations for the entire document with \hloff and
+% \hldestoff.
+%
+% The purpose of \hldestoff and \hloff is to mark (parts) of document
+% where links should never appear. (Imagine you want to prevent a
+% cross-referencing macro from generating a link at a certain spot in
+% your document.)
+%
+% If instead you have prepared a document with links and just want to
+% compile a version without the links, it is better to select the
+% driver `nolinks'. This will ensure that spacing and pagebreaking
+% will be the same as what you were getting with hyperlinks enabled.
+%
+% The reason for this is that hyperlinks are produced by \special
+% commands. Each \special is placed inside a whatsit which may
+% introduce a legitimate breakpoint at places where none would exist
+% without the whatsit. The macros \hldestoff and \hloff disable
+% hyperlink macros so drastically that no whatsits are produced.
+%
+% On the other hand, `nolinks' driver does not completely disable
+% hyperlink macros. Instead, it defines them to write to the log
+% file (what gets written is not really important). This will produce
+% the whatsits imitating the whatsits from the \special's. (This
+% trick was borrowed from graphics bundle.)
+%
+% Another reason for using `nolinks' is that in horizontal mode
+% \hldest places destinations inside zero-width/height/depth boxes.
+% When you say \hldestoff, \hldest will omit both destination specs
+% and these boxes. The missing boxes can cause typesetting to be
+% inconsistent with what you were getting with destinations enabled.
+% Again, `nolinks' driver helps here by defining \hldest to still
+% produce the empty boxes.
+%
+\def\hldriver@nolinks{%
+ \def\@hldest##1##2##3{%
+ \ifvmode
+ \write-1{\string\hldest: ##3}%
+ \else
+ \allowhyphens
+ \smash{\write-1{\string\hldest: ##3}}%
+ \allowhyphens
+ \fi
+ \ignorespaces
+ }%
+ \def\@hlstart##1##2##3{%
+ \leavevmode
+ \begingroup % Start the color group.
+ \write-1{\string\hlstart: ##3}%
+ \ignorespaces
+ }%
+ \def\@hlend{\write-1{\string\hlend}\endgroup}% End the group from \@hlstart.
+}%
+%
+% Driver `pdftex'.
+%
+\def\hldriver@pdftex{%
+\ifpdf % PDF output is enabled.
+ \def\hl@raw@word{raw}%
+ %
+ % Hyperlink destinations.
+ %
+ % Default type.
+ \def\hldest@type{xyz}%
+ % Set defaults for the options and tell \hl@set@opt what options we
+ % support. (We do not define \hldest@opt@raise, \hl@opt@colormodel
+ % and \hl@opt@color, they are defined and used outside the drivers.)
+ \let\hldest@opt@width \empty
+ \let\hldest@opt@height \empty
+ \let\hldest@opt@depth \empty
+ \let\hldest@opt@zoom \empty
+ \let\hldest@opt@cmd \empty
+ % Multiplexer for all supported destination types.
+ \def\hldest@driver{%
+ % Special case for `raw' destinations.
+ \ifx\@hltype\hl@raw@word
+ \csname \hldest@opt@cmd \endcsname
+ \else
+ \pdfdest name{\@hllabel}\@hltype
+ \csname hldest@typeh@\@hltype\endcsname
+ \fi
+ }%
+ % Define handlers for each supported destination type.
+ \let\hldest@typeh@raw \empty
+ \let\hldest@typeh@fit \empty
+ \let\hldest@typeh@fith \empty
+ \let\hldest@typeh@fitv \empty
+ \let\hldest@typeh@fitb \empty
+ \let\hldest@typeh@fitbh \empty
+ \let\hldest@typeh@fitbv \empty
+ \def\hldest@typeh@fitr{%
+ \ifx\hldest@opt@width \empty \else width \hldest@opt@width \fi
+ \ifx\hldest@opt@height \empty \else height \hldest@opt@height \fi
+ \ifx\hldest@opt@depth \empty \else depth \hldest@opt@depth \fi
+ }%
+ \def\hldest@typeh@xyz{%
+ \ifx\hldest@opt@zoom\empty \else zoom \hldest@opt@zoom \fi
+ }%
+ %
+ % Hyperlinks.
+ %
+ % Default type.
+ \def\hl@type{name}%
+ % We support `url' hyperlinks, so set the `url' group type.
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ % Set defaults for the options and tell \hl@set@opt what options we
+ % support.
+ \let\hl@opt@width \empty
+ \let\hl@opt@height \empty
+ \let\hl@opt@depth \empty
+ \def\hl@opt@bstyle {S}%
+ \def\hl@opt@bwidth {1}%
+ \let\hl@opt@bcolor \empty
+ \let\hl@opt@hlight \empty
+ \let\hl@opt@bdash \empty
+ \let\hl@opt@pagefit \empty
+ \let\hl@opt@cmd \empty
+ \let\hl@opt@file \empty
+ \let\hl@opt@newwin \empty
+ % Multiplexer for all supported link types.
+ \def\hl@driver{%
+ % Special case for `raw' links.
+ \ifx\@hltype\hl@raw@word
+ \csname \hl@opt@cmd \endcsname
+ \else
+ % See if we will construct a /BS spec. We want to bother only
+ % if any of \hl@opt@bstyle, \hl@opt@bwidth and \hl@opt@bdash is
+ % not empty.
+ \let\hl@BSspec\relax % construct
+ \ifx\hl@opt@bstyle \empty
+ \ifx\hl@opt@bwidth \empty
+ \ifx\hl@opt@bdash \empty
+ \let\hl@BSspec\empty % don't construct
+ \fi
+ \fi
+ \fi
+ % Construct common preamble of a link.
+ \def\hlstart@preamble{%
+ \pdfstartlink
+ \ifx\hl@opt@width \empty \else width \hl@opt@width \fi
+ \ifx\hl@opt@height \empty \else height \hl@opt@height \fi
+ \ifx\hl@opt@depth \empty \else depth \hl@opt@depth \fi
+ attr{%
+ \ifx\hl@opt@bcolor\empty\else /C[\hl@opt@bcolor]\fi
+ \ifx\hl@opt@hlight\empty\else /H/\hl@opt@hlight\fi
+ \ifx\hl@BSspec\relax
+ /BS<<%
+ /Type/Border%
+ \ifx\hl@opt@bstyle\empty\else /S/\hl@opt@bstyle\fi
+ \ifx\hl@opt@bwidth\empty\else /W \hl@opt@bwidth\fi
+ \ifx\hl@opt@bdash\empty \else /D[\hl@opt@bdash]\fi
+ >>%
+ \fi
+ }%
+ }%
+ % Call the handler.
+ \csname hl@typeh@\@hltype\endcsname
+ \fi
+ }%
+ % Link type handlers
+ \let\hl@typeh@raw\empty
+ \def\hl@typeh@name{\hlstart@preamble goto name{\@hllabel}}%
+ \def\hl@typeh@num{\hlstart@preamble goto num \@hllabel}%
+ \def\hl@typeh@page{%
+ % PDF requires pages to start from 0, so adjust page number.
+ \count@=\@hllabel
+ \advance\count@ by-1
+ %
+ \hlstart@preamble
+ user{%
+ /Subtype/Link%
+ /Dest%
+ [\the\count@
+ \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]%
+ }%
+ }%
+ \def\hl@typeh@filename{\hl@file{(\@hllabel)}}%
+ \def\hl@typeh@filepage{%
+ % PDF requires pages to start from 0, so adjust page number.
+ \count@=\@hllabel
+ \advance\count@ by-1
+ %
+ \hl@file{%
+ [\the\count@ \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]%
+ }%
+ }%
+ \def\hl@file##1{%
+ \hlstart@preamble
+ user{%
+ /Subtype/Link%
+ /A<<%
+ /Type/Action%
+ /S/GoToR%
+ /D##1%
+ /F(\hl@opt@file)%
+ \ifx\hl@opt@newwin\empty \else
+ /NewWindow \ifcase\hl@opt@newwin false\else true\fi
+ \fi
+ >>%
+ }%
+ }%
+ \def\hl@typeh@url{%
+ \hlstart@preamble
+ user{%
+ /Subtype/Link%
+ /A<<%
+ /Type/Action
+ /S/URI%
+ /URI(\@hllabel)%
+ >>%
+ }%
+ }%
+ %
+ \def\@hlend{\pdfendlink\endgroup}% End the group from the \@hlstart.
+%
+\else % PDF output is not enabled.
+ \message{Warning: `pdftex' hyperlink driver: PDF output is
+ not enabled, falling back on `nolinks' driver.}%
+ \hldriver@nolinks
+\fi
+}%
+%
+% Driver `dvipdfm'.
+%
+\def\hldriver@dvipdfm{%
+ \def\hl@raw@word{raw}%
+ %
+ % Hyperlink destinations.
+ %
+ % Default type.
+ \def\hldest@type{xyz}%
+ % Set defaults for the options and tell \hl@set@opt what options we
+ % support. (We do not define \hldest@opt@raise, \hl@opt@colormodel
+ % and \hl@opt@color, they are defined and used outside the drivers.)
+ \let\hldest@opt@left \empty
+ \let\hldest@opt@top \empty
+ \let\hldest@opt@right \empty
+ \let\hldest@opt@bottom \empty
+ \let\hldest@opt@zoom \empty
+ \let\hldest@opt@cmd \empty
+ % Multiplexer for all supported destination types.
+ \def\hldest@driver{%
+ % Special case for `raw' destinations.
+ \ifx\@hltype\hl@raw@word
+ \csname \hldest@opt@cmd \endcsname
+ \else
+ % Construct common preamble of a destination.
+ \def\hldest@preamble{%
+ pdf: dest (\@hllabel) [@thispage
+ }%
+ % Call the handler.
+ \csname hldest@typeh@\@hltype\endcsname
+ \fi
+ }%
+ % Define handlers for each supported destination type.
+ \let\hldest@typeh@raw\empty
+ \def\hldest@typeh@fit{%
+ \special{\hldest@preamble /Fit]}%
+ }%
+ \def\hldest@typeh@fith{%
+ \special{\hldest@preamble /FitH
+ \ifx\hldest@opt@top\empty @ypos \else \hldest@opt@top \fi]}%
+ }%
+ \def\hldest@typeh@fitv{%
+ \special{\hldest@preamble /FitV
+ \ifx\hldest@opt@left\empty @xpos \else \hldest@opt@left \fi]}%
+ }%
+ \def\hldest@typeh@fitb{%
+ \special{\hldest@preamble /FitB]}%
+ }%
+ \def\hldest@typeh@fitbh{%
+ \special{\hldest@preamble /FitBH
+ \ifx\hldest@opt@top\empty @ypos \else \hldest@opt@top \fi]}%
+ }%
+ \def\hldest@typeh@fitbv{%
+ \special{\hldest@preamble /FitBV
+ \ifx\hldest@opt@left\empty @xpos \else \hldest@opt@left \fi]}%
+ }%
+ \def\hldest@typeh@fitr{%
+ \special{\hldest@preamble /FitR
+ \ifx\hldest@opt@left\empty @xpos\else\hldest@opt@left\fi\space
+ \ifx\hldest@opt@bottom\empty @ypos\else\hldest@opt@bottom\fi\space
+ \ifx\hldest@opt@right\empty @xpos\else\hldest@opt@right\fi\space
+ \ifx\hldest@opt@top\empty @ypos\else\hldest@opt@top \fi]}%
+ }%
+ \def\hldest@typeh@xyz{%
+ \begingroup
+ % Convert zoom factor: 12345 -> 12.345
+ \ifx\hldest@opt@zoom\empty
+ \count1=\z@ \count2=\z@
+ \else
+ \count2=\hldest@opt@zoom
+ \count1=\count2 \divide\count1 by 1000
+ \count3=\count1 \multiply\count3 by 1000
+ \advance\count2 by -\count3
+ \fi
+ \special{\hldest@preamble /XYZ
+ \ifx\hldest@opt@left\empty @xpos\else\hldest@opt@left\fi\space
+ \ifx\hldest@opt@top\empty @ypos\else\hldest@opt@top\fi\space
+ \the\count1.\the\count2]}%
+ \endgroup
+ }%
+ %
+ % Hyperlinks.
+ %
+ % Default type.
+ \def\hl@type{name}%
+ % We support `url' hyperlinks, so set `url' group type.
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ % Set defaults for the options and tell \hl@set@opt what options we
+ % support.
+ \def\hl@opt@bstyle {S}%
+ \def\hl@opt@bwidth {1}%
+ \let\hl@opt@bcolor \empty
+ \let\hl@opt@hlight \empty
+ \let\hl@opt@bdash \empty
+ \let\hl@opt@pagefit \empty
+ \let\hl@opt@cmd \empty
+ \let\hl@opt@file \empty
+ \let\hl@opt@newwin \empty
+ % Multiplexer for all supported link types.
+ \def\hl@driver{%
+ % Special case for `raw' links.
+ \ifx\@hltype\hl@raw@word
+ \csname \hl@opt@cmd \endcsname
+ \else
+ % See if we will construct a /BS spec. We want to bother only
+ % if any of \hl@opt@bstyle, \hl@opt@bwidth and \hl@opt@bdash is
+ % not empty.
+ \let\hl@BSspec\relax % construct
+ \ifx\hl@opt@bstyle \empty
+ \ifx\hl@opt@bwidth \empty
+ \ifx\hl@opt@bdash \empty
+ \let\hl@BSspec\empty % don't construct
+ \fi
+ \fi
+ \fi
+ % Construct common preamble of a link.
+ \def\hlstart@preamble{%
+ pdf: beginann
+ <<%
+ /Type/Annot%
+ /Subtype/Link%
+ \ifx\hl@opt@bcolor\empty\else /C[\hl@opt@bcolor]\fi
+ \ifx\hl@opt@hlight\empty\else /H/\hl@opt@hlight\fi
+ \ifx\hl@BSspec\relax
+ /BS<<%
+ /Type/Border%
+ \ifx\hl@opt@bstyle\empty\else /S/\hl@opt@bstyle\fi
+ \ifx\hl@opt@bwidth\empty\else /W \hl@opt@bwidth\fi
+ \ifx\hl@opt@bdash\empty \else /D[\hl@opt@bdash]\fi
+ >>%
+ \fi
+ }%
+ % Call the handler.
+ \csname hl@typeh@\@hltype\endcsname
+ \fi
+ }%
+ % Link type handlers.
+ \let\hl@typeh@raw\empty
+ \def\hl@typeh@name{\special{\hlstart@preamble /Dest(\@hllabel)>>}}%
+ \def\hl@typeh@page{%
+ % PDF requires pages to start from 0, so adjust page number.
+ \count@=\@hllabel
+ \advance\count@ by-1
+ %
+ \special{%
+ \hlstart@preamble
+ /Dest[\the\count@
+ \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]%
+ >>%
+ }%
+ }%
+ \def\hl@typeh@filename{\hl@file{(\@hllabel)}}%
+ \def\hl@typeh@filepage{%
+ % PDF requires pages to start from 0, so adjust page number.
+ \count@=\@hllabel
+ \advance\count@ by-1
+ %
+ \hl@file{%
+ [\the\count@ \ifx\hl@opt@pagefit\empty/Fit\else\hl@opt@pagefit\fi]%
+ }%
+ }%
+ \def\hl@file##1{%
+ \special{%
+ \hlstart@preamble
+ /A<<%
+ /Type/Action%
+ /S/GoToR%
+ /D##1%
+ /F(\hl@opt@file)%
+ \ifx\hl@opt@newwin\empty \else
+ /NewWindow \ifcase\hl@opt@newwin false\else true\fi
+ \fi
+ >>%
+ >>%
+ }%
+ }%
+ \def\hl@typeh@url{%
+ \special{%
+ \hlstart@preamble
+ /A<<%
+ /Type/Action
+ /S/URI%
+ /URI(\@hllabel)%
+ >>%
+ >>%
+ }%
+ }%
+ %
+ \def\@hlend{\special{pdf: endann}\endgroup}% End the group from \@hlstart.
+}%
+%
+% Internal hyperlink macros.
+%
+% \hl@define@eqlabel{LABEL} will define \hl@eqlabel to a non-empty
+% hyperlink label for an equation. The idea is to generate
+% (hopefully) unique label in cases when LABEL is empty (e.g., when
+% user says `\eqdef{}'). To customize the autogenerated labels
+% redefine \phantomeqlabel.
+%
+\newcount\phantomeqnumber
+\def\phantomeqlabel{PHEQ\the\phantomeqnumber}%
+%
+\def\hl@define@eqlabel#1{%
+ % Make all definitions global so they are not shadowed by groups
+ % (\@eqdef depends on this).
+ \ifempty{#1}%
+ \global\advance\phantomeqnumber by1
+ \xdef\hl@eqlabel{\phantomeqlabel}%
+ \else
+ \gdef\hl@eqlabel{#1}%
+ \fi
+}%
+%
+% Cross-reference macros call hyperlink macros, so define them to
+% produce nothing by default. However, we still want \hldest and
+% \hlstart to produce \leavevmode and/or \ignorespaces, to make
+% cross-reference macros consistent. Note that this, strictly
+% speaking, makes cross-reference macros incompatible with
+% pre-hyperlink releases of eplain, in cases where paragraph is
+% started by a cross-reference macro. It is quite unlikely though
+% that any problem will arise.
+\let\hldeston\relax \let\hldestoff\relax
+\let\hlon\relax \let\hloff\relax
+\@@hloff
+\@@hldestoff
+%
+%
+%
+% Support for LaTeX packages under plain TeX.
+%
+% We use miniltx.tex from the LaTeX graphics collection and build on
+% it to provide package options support, package version check,
+% recursive package loading with \RequirePackage, proper handling of
+% \AtBeginDocument and \AtEndOfPackage.
+%
+% Much of the following was borrowed from LaTeX.
+%
+% The internal variables are quite a mess, so here is a hint:
+%
+% - \usepkg@pkg, \usepkg@options, \usepkg@date are used by
+% \usepackage to save its parameters.
+%
+% - When \RequirePackage is called within a package, the above
+% variables are saved in \usepkg@save@VAR@RECURSIONLEVEL, where
+% VAR={pkg,options,date}, and RECURSIONLEVEL is incremented for
+% each nested package inclusion. This way the variables can be
+% restored after the (nested) package will have been loaded.
+%
+% - Options for package PACKAGE (no .sty extension) are accumulated
+% in \usepkg@options@PACKAGE.
+%
+% - For each declared option OPTION in package PACKAGE, we save the
+% code which enables OPTION in \usepkg@option@PACKAGE@OPTION.
+% There may be a star (`*') option declaration, the code from which
+% will be used to process options not declared by the package
+% (without it, an undeclared option will cause an error).
+%
+% - For each loaded PACKAGE / FILE.EXT we declare \ver@PACKAGE.sty /
+% \ver@FILE.EXT. We use \ver@PACKAGE.sty to detect reloading
+% of packages. Some packages also use these macros.
+%
+% - Calls to \AtBeginDocument accumulate the code in
+% \usepkg@at@begin@document. We will expand it at the end of the
+% \beginpackages...\endpackages `environment'.
+%
+% - Calls to \AtEndOfPackage accumulate the code in
+% \usepkg@at@end@of@package. We will expand it after the package
+% is loaded. To allow recursive package loading, \RequirePackage
+% saves \usepkg@at@end@of@package analogous to \usepkg@pkg.
+%
+\newif\ifusepkg@miniltx@loaded
+\newcount\usepkg@recursion@level
+\def\usepkg@rcrs{\the\usepkg@recursion@level}%
+\let\usepkg@at@begin@document\empty
+\let\usepkg@at@end@of@package\empty
+\def\usepkg@word@autopict{autopict}%
+\def\usepkg@word@psfrag{psfrag}%
+% \beginpackages...\endpackages
+%
+% All packages must be loaded within this `environment' (a kind of
+% LaTeX's preamble). This is so to give us a chance to expand the
+% accumulated \AtBeginDocument commands. Usually, you will want to
+% restrict all \usepackage's to a single \beginpackages...\endpackages,
+% just like in LaTeX, where you load all packages within a (single)
+% preamble.
+\long\def\beginpackages#1\endpackages{%
+ \let\usepackage\real@usepackage
+ #1%
+ \usepkg@at@begin@document
+ \global\let\usepkg@at@begin@document\empty
+ \global\let\usepackage\fake@usepackage
+}%
+% \fake@usepackage
+%
+% This is what \usepackage is defined to outside of
+% \beginpackages...\endpackages `environment'.
+\def\fake@usepackage{\errmessage{You should not use \string\usepackage\space outside of^^J
+ \@spaces\string\beginpackages...\string\endpackages\space environment}%
+}%
+% \RequirePackage[OPTIONS]{PACKAGES}[YYYY/MM/DD]
+%
+% Save parameters for the package being loaded and call \usepackage to
+% load PACKAGES. We depend on \usepackage to restore the saved
+% parameters. We allow for nested calls to \RequirePackage.
+\def\eplain@RequirePackage{%
+ \global\ece\let{usepkg@save@pkg\usepkg@rcrs}\usepkg@pkg
+ \global\ece\let{usepkg@save@options\usepkg@rcrs}\usepkg@options
+ \global\ece\let{usepkg@save@date\usepkg@rcrs}\usepkg@date
+ \global\ece\let{usepkg@at@end@of@package\usepkg@rcrs}\usepkg@at@end@of@package
+ \global\advance\usepkg@recursion@level by\@ne
+ \real@usepackage
+}%
+% \usepackage[OPTIONS]{PACKAGES}[YYYY/MM/DD]
+%
+% Load each of the PACKAGES with OPTIONS, checking that the package
+% date is at least YYYY/MM/DD; if it is not, issue a warning.
+\let\usepackage\fake@usepackage
+\def\real@usepackage{\@getoptionalarg\@finusepackage}%
+\def\@finusepackage#1{%
+ \let\usepkg@options\@optionalarg
+ \ifempty{#1}%
+ \errmessage{No packages specified}%
+ \fi
+ % Load miniltx.tex, if it is not loaded.
+ \ifusepkg@miniltx@loaded \else
+ \testfileexistence[miniltx]{tex}%
+ \if@fileexists
+ \input miniltx.tex
+ \global\usepkg@miniltx@loadedtrue
+ % Redefine some macros from miniltx.tex
+ \global\let\RequirePackage\eplain@RequirePackage
+ \global\let\DeclareOption\eplain@DeclareOption
+ \global\let\PassOptionsToPackage\eplain@PassOptionsToPackage
+ \global\let\ExecuteOptions\eplain@ExecuteOptions
+ \global\let\ProcessOptions\eplain@ProcessOptions
+ \global\let\AtBeginDocument\eplain@AtBeginDocument
+ \global\let\AtEndOfPackage\eplain@AtEndOfPackage
+ \global\let\ProvidesFile\eplain@ProvidesFile
+ \global\let\ProvidesPackage\eplain@ProvidesPackage
+ \else
+ \errmessage{miniltx.tex not found, cannot load LaTeX packages}%
+ \fi
+ \fi
+ % Read the trailing optional arg (YYYY/MM/DD).
+ \@ifnextchar[%]
+ {\@finfinusepackage{#1}}%
+ {\@finfinusepackage{#1}[]}%
+}%
+%
+\def\@finfinusepackage#1[#2]{%
+ \edef\usepkg@date{#2}%
+ % Load each package from the list. Do it outside the \for loop to
+ % avoid clashes with any \for loops executed by the package.
+ \let\usepkg@load@list\empty
+ \for\usepkg@pkg:=#1\do{%
+ \toks@=\expandafter{\usepkg@load@list}%
+ \edef\usepkg@load@list{%
+ \the\toks@
+ \noexpand\usepkg@load@pkg{\usepkg@pkg}%
+ }%
+ }%
+ \usepkg@load@list
+ % Restore parameters in case we were called from \RequirePackage.
+ \ifnum\usepkg@recursion@level>0
+ \global\advance\usepkg@recursion@level by\m@ne
+ \expandafter\let\expandafter\usepkg@pkg\csname usepkg@save@pkg\usepkg@rcrs\endcsname
+ \expandafter\let\expandafter\usepkg@options\csname usepkg@save@options\usepkg@rcrs\endcsname
+ \expandafter\let\expandafter\usepkg@date\csname usepkg@save@date\usepkg@rcrs\endcsname
+ \expandafter\let\expandafter\usepkg@at@end@of@package\csname usepkg@at@end@of@package\usepkg@rcrs\endcsname
+ % Free the memory.
+ \global\ece\let{usepkg@save@pkg\usepkg@rcrs}\undefined
+ \global\ece\let{usepkg@save@options\usepkg@rcrs}\undefined
+ \global\ece\let{usepkg@save@date\usepkg@rcrs}\undefined
+ \global\ece\let{usepkg@at@end@of@package\usepkg@rcrs}\undefined
+ \fi
+}%
+% Load one package. We assume packages have `sty' extension.
+\def\usepkg@load@pkg#1{%
+ % Special cases for `autopict' and `psfrag' packages:
+ % - `psfrag' is loaded by psfrag.tex.
+ % - `autopict' is loaded by picture.tex, but the package file is
+ % autopict.sty.
+ \def\usepkg@pkg{#1}%
+ \ifx\usepkg@pkg\usepkg@word@autopict
+ \testfileexistence[picture]{tex}%
+ \if@fileexists \else
+ \errmessage{Loader `picture.tex' for package `\usepkg@pkg' not found}%
+ \fi
+ \else
+ \ifx\usepkg@pkg\usepkg@word@psfrag
+ \testfileexistence[psfrag]{tex}%
+ \if@fileexists \else
+ \errmessage{Loader `psfrag.tex' for package `\usepkg@pkg' not found}%
+ \fi
+ \fi
+ \fi
+ % See if the package was loaded. If it was, we just bail out.
+ % (Maybe we should skip reloading it/warn? We don't want to go into
+ % checking that the package was first loaded with a subset of
+ % options which are requested now.) \ProvidePackage and
+ % \ProvideFile define the macro \ver@PACKAGE.sty (see
+ % \eplain@pr@videpackage below).
+ \ifundefined{ver@\usepkg@pkg.sty}\else
+ \errmessage{Package `\usepkg@pkg' already loaded}%
+ \fi
+ \testfileexistence[\usepkg@pkg]{sty}%
+ \if@fileexists \else
+ \errmessage{Package `\usepkg@pkg' not found}%
+ \fi
+ % Construct option list for the package. Include any options
+ % passed to us by \PassOptionsToPackage and \RequirePackage.
+ \expandafter\let\expandafter\temp\csname usepkg@options@\usepkg@pkg\endcsname
+ \ifx\temp\relax
+ \let\temp\empty
+ \fi
+ \ifx\temp\empty
+ \let\temp\usepkg@options
+ \else
+ \ifx\usepkg@options\empty \else
+ \edef\temp{\temp,\usepkg@options}%
+ \fi
+ \fi
+ \global\ece\let{usepkg@options@\usepkg@pkg}\temp
+ % For the duration of the package, we want any calls to \usepackage
+ % to be mapped to \RequirePackage, to allow nested package loads
+ % without clobbering up anything. (Maybe packages never use
+ % \usepackage instead of \RequirePackage, but this won't hurt.)
+ \let\usepackage\eplain@RequirePackage
+ % Clear \AtEndOfPackage commands (can be non-empty during recursive
+ % package loading).
+ \global\let\usepkg@at@end@of@package\empty
+ % Load the package. If the package asks to load other package,
+ % \RequirePackage will save our \usepkg@{pkg,options,date} and
+ % \AtEndOfPackage commands, and \usepackage will restore them after
+ % recursively loading that package, so we don't worry about our
+ % setup being clobbered.
+ \ifx\usepkg@pkg\usepkg@word@autopict
+ \input picture.tex
+ \else
+ \ifx\usepkg@pkg\usepkg@word@psfrag
+ \input \usepkg@pkg.tex
+ \else
+ \input \usepkg@pkg.sty
+ \fi
+ \fi
+ % Execute the accumulated \AtEndOfPackage commands, and reset them
+ % to free the memory.
+ \usepkg@at@end@of@package
+ \global\let\usepkg@at@end@of@package\empty
+ % Restore the `real' \usepackage definition.
+ \let\usepackage\real@usepackage
+ % Clear the option list for the loaded package (we won't load a
+ % second copy anyway).
+ \global\ece\let{usepkg@options@\usepkg@pkg}\undefined
+ % Set \Url@HyperHook for url.sty
+ \def\Url@HyperHook##1{\hlstart@impl{url}{\Url@String}##1\hlend@impl{url}}%
+ % We check package version in \ProvidePackage, before reading the
+ % rest of the package, so that in case of errors (which can be
+ % numerous) the warning hopefully comes before the errors.
+% \@ifl@ter{sty}\usepkg@pkg\usepkg@date{}%
+% {\message{Warning: you have requested package `\usepkg@pkg', version \usepkg@date,^^J
+% \@spaces but only version `\csname ver@\usepkg@pkg.sty\endcsname' is available.}}%
+}%
+% \DeclareOption{OPTION}{CODE}
+%
+% Save CODE in `usepkg@option@PACKAGE@OPTION'. Starred version is not
+% treated any different here, but when defined it will be used by
+% \ProcessOptions and \ExecuteOptions to process undeclared options.
+\def\eplain@DeclareOption#1#2{%
+ \toks@{#2}%
+ \expandafter\xdef\csname usepkg@option@\usepkg@pkg @#1\endcsname{\the\toks@}%
+}%
+% \PassOptionsToPackage{OPTIONS}{PACKAGES}
+%
+% Add OPTIONS to the option list for each of the PACKAGES.
+\def\eplain@PassOptionsToPackage#1#2{%
+ \ifempty{#1}\else
+ \for\usepkg@temp:=#2\do{%
+ \expandafter\let\expandafter\temp\csname usepkg@options@\usepkg@temp\endcsname
+ \ifx\temp\relax
+ \let\temp\empty
+ \fi
+ \ifx\temp\empty
+ \edef\temp{#1}%
+ \else
+ \edef\temp{\temp,#1}%
+ \fi
+ \global\ece\let{usepkg@options@\usepkg@temp}\temp
+ }%
+ \fi
+}%
+% \ExecuteOptions{OPTIONS}
+% \ProcessOptions
+%
+% \ExecuteOptions executes each option from OPTIONS, \ProcessOptions
+% executes each option from the option list for the current package.
+% If the star (`*') option is declared, it will be used to process
+% undeclared options; otherwise, undeclared option will cause an
+% error.
+\def\usepkg@exec@options#1{%
+ % The iterator \CurrentOption below was used purposely. Some
+ % packages use it in the argument to \DeclareOption.
+ \for\CurrentOption:=#1\do{%
+ \expandafter\let\expandafter\usepkg@temp
+ \csname usepkg@option@\usepkg@pkg @\CurrentOption\endcsname
+%
+ \ifx\usepkg@temp\relax
+ % Option is not declared. If a `default' option handler is
+ % declared, use it.
+ \expandafter\let\expandafter\temp\csname usepkg@option@\usepkg@pkg @*\endcsname
+ \ifx\temp\relax
+ \errmessage{Unknown option `\CurrentOption' to package `\usepkg@pkg'}%
+ \else
+ \temp
+ \fi
+ \else
+ % Option is declared.
+ \usepkg@temp
+ \fi
+ }%
+}%
+%
+\let\eplain@ExecuteOptions\usepkg@exec@options
+\def\eplain@ProcessOptions{%
+ \expandafter\usepkg@exec@options\csname usepkg@options@\usepkg@pkg\endcsname
+}%
+% \AtBeginDocument{CODE}
+% \AtEndOfPackage{CODE}
+%
+% miniltx.tex defines \AtBeginDocument to execute its parameter right
+% away, but some packages depend on \AtBeginDocument to be executed
+% after packages are processed. So we redefine \AtBeginDocument to
+% accumulate its argument, to be executed by us at the end of
+% \beginpackages...\endpackages. \AtEndOfPackage is not defined by
+% miniltx.tex at all; we define it similar to \AtBeginDocument.
+\def\usepkg@accumulate@cmds#1#2{%
+ \toks@=\expandafter{#1}%
+ \toks@ii={#2}%
+ \xdef#1{\the\toks@\the\toks@ii}%
+}%
+\def\eplain@AtBeginDocument{\usepkg@accumulate@cmds\usepkg@at@begin@document}%
+\def\eplain@AtEndOfPackage{\usepkg@accumulate@cmds\usepkg@at@end@of@package}%
+% \ProvidesFile{FILENAME.EXT}[VERSION]
+% \ProvidesPackage{PACKAGENAME}[VERSION]
+%
+% miniltx.tex defines \ProvidesFile and \ProvidesPackage to only log a
+% message. We want to define \ver@PACKAGE.sty / \ver@FILENAME.EXT, as
+% we depend on these to know when a package/file has been loaded, and
+% some packages depend on them, too.
+\def\eplain@ProvidesPackage#1{%
+ \@ifnextchar[%]
+ {\eplain@pr@videpackage{#1.sty}}{\eplain@pr@videpackage#1[]}%
+}%
+\def\eplain@pr@videpackage#1[#2]{%
+ \wlog{#1: #2}%
+ % This will flag the package as loaded.
+ \expandafter\xdef\csname ver@#1\endcsname{#2}%
+% \expandafter\edef\expandafter\temp{\csname usepkg@options@\usepkg@pkg\endcsname}%
+% \message{^^JPackage:\usepkg@pkg^^JOptions:\usepkg@options^^J+ passed options:\temp^^J}%
+ % Check package version.
+ \@ifl@t@r{#2}\usepkg@date{}%
+ {\message{Warning: you have requested package `\usepkg@pkg', version \usepkg@date,^^J
+ \@spaces but only version `\csname ver@#1\endcsname' is available.}}%
+}%
+%
+\def\eplain@ProvidesFile#1{%
+ \@ifnextchar[%]
+ {\eplain@pr@videfile{#1}}{\eplain@pr@videfile#1[]}%
+}%
+\def\eplain@pr@videfile#1[#2]{%
+ \wlog{#1: #2}%
+ % This will flag the file as loaded.
+ \expandafter\xdef\csname ver@#1\endcsname{#2}%
+ % We don't check file version. graphics calls \ProvideFile to
+ % \includegraphics, and it does not give any date at the beginning
+ % of #2, so checking the date will cause an error.
+}%
+% Check package version. From LaTeX.
+\def\@ifl@ter#1#2{%
+ \expandafter\@ifl@t@r
+ \csname ver@#2.#1\endcsname
+}%
+\def\@ifl@t@r#1#2{%
+ \ifnum\expandafter\@parse@version#1//00\@nil<%
+ \expandafter\@parse@version#2//00\@nil
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}%
+\def\@parse@version#1/#2/#3#4#5\@nil{#1#2#3#4 }%
+% Needed by some packages.
+\def\@spaces{\space\space\space\space}%
+\def\@inmatherr#1{%
+ \relax
+ \ifmmode
+ \errmessage{The command is invalid in math mode}%
+ \fi
+}%
+%
+%
+%
+\let\wlog = \@plainwlog
+\catcode`@ = \@eplainoldatcode
+%
+\def\fmtname{eplain}%
+\def\eplain{t}%
+{\edef\plainversion{\fmtversion}%
+ \xdef\fmtversion{REPLACE-WITH-VERSION: REPLACE-WITH-DAY-MONTH-YEAR (and plain \plainversion)}%
+}%
+%
+%
+%
+%
+% Local variables:
+% page-delimiter: "^% \f"
+% End: