summaryrefslogtreecommitdiff
path: root/macros/eplain
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/eplain
Initial commit
Diffstat (limited to 'macros/eplain')
l---------macros/eplain/README1
-rw-r--r--macros/eplain/doc/AUTHORS12
-rw-r--r--macros/eplain/doc/COPYING340
-rw-r--r--macros/eplain/doc/ChangeLog2596
-rw-r--r--macros/eplain/doc/INSTALL46
-rw-r--r--macros/eplain/doc/NEWS195
-rw-r--r--macros/eplain/doc/README35
-rw-r--r--macros/eplain/doc/demo/Makefile47
-rw-r--r--macros/eplain/doc/demo/lscommnt.tex47
-rw-r--r--macros/eplain/doc/demo/xhyper.tex190
-rw-r--r--macros/eplain/doc/eplain.187
-rw-r--r--macros/eplain/doc/eplain.html10762
-rw-r--r--macros/eplain/doc/eplain.info8325
-rw-r--r--macros/eplain/doc/eplain.man1.pdfbin0 -> 4313 bytes
-rw-r--r--macros/eplain/doc/eplain.pdfbin0 -> 734526 bytes
-rw-r--r--macros/eplain/doc/lscommnt.jpgbin0 -> 65795 bytes
-rwxr-xr-xmacros/eplain/doc/util/idxuniq39
-rwxr-xr-xmacros/eplain/doc/util/trimsee106
-rw-r--r--macros/eplain/doc/xhyper.jpgbin0 -> 13812 bytes
-rw-r--r--macros/eplain/source/xeplain.tex5568
-rw-r--r--macros/eplain/tex/arrow.tex597
-rw-r--r--macros/eplain/tex/btxmac.tex929
-rw-r--r--macros/eplain/tex/eplain.aux3
-rw-r--r--macros/eplain/tex/eplain.ini6
-rw-r--r--macros/eplain/tex/eplain.tex4135
25 files changed, 34066 insertions, 0 deletions
diff --git a/macros/eplain/README b/macros/eplain/README
new file mode 120000
index 0000000000..4baf2281ff
--- /dev/null
+++ b/macros/eplain/README
@@ -0,0 +1 @@
+doc/README \ No newline at end of file
diff --git a/macros/eplain/doc/AUTHORS b/macros/eplain/doc/AUTHORS
new file mode 100644
index 0000000000..ad73fefbe8
--- /dev/null
+++ b/macros/eplain/doc/AUTHORS
@@ -0,0 +1,12 @@
+Eplain was originally written mostly by Karl Berry. Some ideas were
+suggested by Paul Abrahams, who also wrote a few of the macros. Other
+macros are based on ones in The TeXbook.
+
+David Guichard and Adam Lewenberg improved the multicolumn macros.
+Stepan Kasal contributed several patches.
+Oleg Katsitadze added the hyperlink capabilities to Eplain.
+Oren Patashnik worked tirelessly on improving the BibTeX macros.
+Heiko Oberdiek wrote ifpdf.sty and pdfcrop.pl.
+Steven Smith wrote the commutative diagram macros.
+Philip Taylor wrote path.sty starting from an initial macro by Nelson Beebe.
+Nelson also collected the texnames.sty which Eplain incorporates.
diff --git a/macros/eplain/doc/COPYING b/macros/eplain/doc/COPYING
new file mode 100644
index 0000000000..3912109b5c
--- /dev/null
+++ b/macros/eplain/doc/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/macros/eplain/doc/ChangeLog b/macros/eplain/doc/ChangeLog
new file mode 100644
index 0000000000..2f515d382f
--- /dev/null
+++ b/macros/eplain/doc/ChangeLog
@@ -0,0 +1,2596 @@
+2019-05-31 Karl Berry <karl@freefriends.org>
+
+ * Version 3.9.
+
+ * Makefile (browse_dir): use -y to zip to preserve top-level
+ symlink for CTAN.
+
+ * btxmac.tex (\providecommand): forgot rename of \@continuenewcommand
+ to \@btxcontinuenewcommand, causing \@optionalusercs undefined error.
+ 0.99p. Also doc fixes.
+ https://tug.org/pipermail/tex-eplain/2019/000983.html
+
+2019-05-29 Karl Berry <karl@freefriends.org>
+
+ * doc/eplain.texi: version 3.9, May 2019.
+ * doc/hlink.texi (Making PDF outlines): new section,
+ following https://tug.org/pipermail/tex-eplain/2016/000911.html.
+ * doc/*.texi: typos, https.
+
+2019-05-28 Karl Berry <karl@freefriends.org>
+
+ * doc/hlink.texi (Introduction to hyperlinks):
+ option [dvipdfm] better for \enablehyperlinks example.
+
+2016-05-14 Karl Berry <karl@freefriends.org>
+
+ * Version 3.8.
+
+ * ifpdf.sty: sync with current oberdiek, 2016/04/04 v3.0.
+
+ * doc/userdef.texi (Packages known not to work): add microtype.
+
+2016-05-12 Karl Berry <karl@freefriends.org>
+
+ * btxmac.tex: rename \@newcommand and others to \@btx...,
+ to avoid conflicts with Babel's plain.def. Version 0.99o.
+
+2015-02-04 Karl Berry <karl@gnu.org>
+
+ * Version 3.7.
+
+2014-12-11 Karl Berry <karl@gnu.org>
+
+ * xeplain.tex: new macro \raggedleft a la plain's raggedright.
+ Suggested by Dorai Sitaram, 8 Dec 2014 18:22:35.
+ * doc/userdef.texi (Justification): document it.
+ * test/raggedleft.tex: test it.
+
+2014-12-09 Karl Berry <karl@gnu.org>
+
+ * doc/userdef.texi (Packages known to work): show \fbox
+ contributed by Dan and Helmut.
+
+2013-09-30 Karl Berry <karl@gnu.org>
+
+ * Version 3.6.
+ * NEWS: update.
+
+ * Makefile: redo dist targets for current CTAN conventions.
+
+ * doc/btxdoc.{bib,tex}: remove these copies of files from BibTeX.
+ * Makefile,
+ * doc/Makefile: remove references to them.
+
+ * doc/arrow.texi: must (re)set catcodes of ` and ' now.
+ * doc/texinfo.tex: update.
+
+ * btxmac.tex (\@@getoptionalarg): use \@futurenonspacelet, thus
+ ignoring spaces after optional arguments as well as before.
+ Suggestion from John Frampton.
+ (\@futurenonspacelet): make \long.
+ (\@optionaltemp): rename to \@optionalusercs for clarity.
+ * xeplain.tex (\defineindex): do not make \outer.
+ * doc/progdef.texi (Macro arguments): mention \futurenonspacelet.
+
+2013-02-14 Karl Berry <karl@gnu.org>
+
+ * Makefile (dist_browse): ln -s README.
+ (dist_tds): skip extra doc/doc level.
+
+2013-02-08 Karl Berry <karl@gnu.org>
+
+ * xeplain.tex (\columnfill): take \@col@extraheight into account.
+ Report from James Mckernon, 9 Oct 2012 12:04:55.
+ (Also add various %d(ebugging) messages.
+ * test/colfill.tex: the test file from James.
+ * doc/userdef.texi (Multiple columns): update \columnfill description
+ to be somewhat closer to reality.
+
+2013-02-07 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile (all): do not make btxdoc.
+
+ * doc/eplain.1: update.
+
+ * xeplain.tex (\beginpackages): at \endpackages, call
+ \resetatcatcode if defined.
+ * doc/userdef.texi (Environment for loading packages): mention this.
+
+ * btxmac.tex (\bbltextbf): define this, not \textbf, as was
+ intended all along.
+ * doc/userdef.texi (Commands from LaTeX): new node.
+
+ * btxmac.tex (\newcommand, \providecommand): make \long, like LaTeX.
+ (\@newcommand): use \def rather than \edef for \@startdef.
+ Report from Daniel Luecking, 12 Sep 2012 18:49:29.
+ * test/luacompat.tex: new file.
+
+2013-02-05 Karl Berry <karl@gnu.org>
+
+ * ifpdf.sty: import latest version from oberdiek.
+
+2011-04-11 Karl Berry <karl@gnu.org>
+
+ * path.sty: official version 3.05, with doc updates and merging
+ in Eplain changes. (But with blank lines and other spaces.)
+
+2010-02-24 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/eplain.1, Makefile, doc/Makefile: Added original Eplain
+ man page. Needs updating.
+
+2010-02-21 Oleg Katsitadze <olegkat@gmail.com>
+
+ * ChangeLog, Makefile, NEWS, doc/eplain.info, doc/eplain.pdf:
+ * doc/eplain.texi, eplain.tex:
+ Version 3.4.
+
+2010-02-15 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (\@finusepackage): Make \ProcessOptions accept (and
+ disregard) the optional star argument (patch by Dan Luecking).
+
+2009-09-07 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/progdef.texi (Macro arguments): Added examples of optional
+ arguments mixed with mandatory arguments.
+
+2009-07-21 Oleg Katsitadze <olegkat@gmail.com>
+
+ * NEWS, Makefile, eplain.tex, doc/eplain.info, doc/eplain.pdf:
+ * doc/eplain.texi:
+ Version 3.3.
+
+2009-07-18 Oleg Katsitadze <olegkat@gmail.com>
+
+ * util/mkdist-merge: Only unset world's and group's write
+ permission bit on the generated eplain.tex and leave user's bit
+ on.
+
+ * xeplain.tex (\idx@scanterm): Reset catcode of newline before
+ calling \scantokens, to work around a peculiarity of TeX/e-TeX
+ adding a trailing newline in \scantokens when newline's catcode is
+ 13 (active). Hopefully nobody will ever rely on unusual newline
+ catcode inside an index term.
+
+ * doc/userdef.texi (Packages known to work): Updated with the new
+ version of epstopdf (v2.2).
+
+ * xeplain.tex (\usepkg@load@pkg): Send the package reloading
+ warning to the log file only and not the terminal, for the sake of
+ epstopdf.sty which causes several such warnings.
+
+2009-07-12 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi (Verbatim listing): Added a note on extending
+ \dospecials when defining new special characters.
+ * doc/progdef.texi (Category codes): Refer to "Verbatim listing"
+ for the note on \dospecials.
+
+ * xeplain.tex (\@idxwrite): \sanitize the term before passing it
+ to \indexproofterm, to unactivate any active characters the user
+ hasn't bothered to add to \dospecials.
+
+2009-07-10 Karl Berry <karl@gnu.org>
+
+ * xeplain.tex (\beginpackages): Set \DoNotLoadEpstopdf,
+ for TL 2009 graphics.cfg.
+
+2009-07-05 Oleg Katsitadze <olegkat@gmail.com>
+
+ xeplain.tex (\eqnum, \eqalignnum, \lefteqnumbers, \righteqnumbers):
+ New macros. Suggested by Dan Luecking May 15 00:32:26 CEST 2009.
+ doc/userdef.texi (Displays): Documented \eqnum, \eqalignnum,
+ \lefteqnumbers and \righteqnumbers.
+ (Formatting displays): Removed stale reference to \generaldisplay.
+
+ xeplian.tex, doc/userdef.texi (Logos): Added eTeX, ExTeX, XeTeX
+ and XeLaTeX (from tugboat.dtx). Suggested by Dorai Sitaram Apr 12
+ 21:30:42 CEST 2009.
+
+2009-06-28 Oleg Katsitadze <olegkat@gmail.com>
+
+ (NEWS): News for the upcoming release.
+
+2009-06-26 Oleg Katsitadze <olegkat@gmail.com>
+
+ doc/hlink.texi (General hyperlinks, URL hyperlinks): Added
+ examples of mailto hyperlinks. Suggested by John Culleton Apr 22
+ 14:53:31 CEST 2009.
+
+2009-06-25 Oleg Katsitadze <olegkat@gmail.com>
+
+ demo/Makefile (ctan_lion_350x350.png): New target to notify about
+ the missing image file and how to obtain it.
+
+ Makefile (DIR_SOURCE, FILES_ZSOURCE): Renamed to DIR_ZSOURCE and
+ FILES_ZSOURCE ("zipped source").
+ (DIR_SOURCE, FILES_SOURCE): Targets for packaging unzipped source
+ files. Includes only xeplain.tex so far. Suggested by Jim
+ Diamond Jun 15 16:59:03 CEST 2009.
+
+2009-06-21 Oleg Katsitadze <olegkat@gmail.com>
+
+ * README.TDS, xeplain.tex, doc/invoke.texi: Added a note on how to
+ obtain Eplain's source files.
+
+ * ifpdf.sty: Updated.
+
+ * util/idxuniq, util/trimsee: Comment tweaks.
+
+2009-05-23 Karl Berry <karl@gnu.org>
+
+ * util/trimsee: use standard sh instead of bash ((...)), Frank K
+ tex-live mail 23 May 2009 19:30:06 +0200, debian#530199
+
+2009-03-28 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi (Indexing): Note on specifying output file for
+ MakeIndex (option -o) when using multiple indexes. Reported by
+ John Culleton Mar 24 15:30:47 CET 2009.
+
+2009-03-27 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (\@idxcollectname): Expand \idxnameseparator once,
+ so that the .idx file contains its contents. This ensures that
+ \idxname{John}{Smith} and \idx{Smith, John} don't end up as
+ separate index entries. Reported by John Culleton Mar 23 19:31:46
+ CET 2009.
+
+2008-03-30 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi: Note on writing .bbl by hand.
+
+2007-11-26 Oleg Katsitadze <olegkat@gmail.com>
+
+ * NEWS, Makefile, eplain.tex, doc/eplain.info, doc/eplain.pdf:
+ * doc/eplain.texi:
+ Version 3.2.
+ * NEWS: More news for 3.2.
+
+2007-11-23 Karl Berry <karl@gnu.org>
+
+ * doc/arrow.texi (Construction of commutative diagrams): use
+ @smallexample to avoid overfull box.
+ * doc/eplain.texi (@direntry): Switch to "TeX". Update comments.
+ * doc/userdef.texi: missing articles, etc.
+
+2007-11-20 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex: For each index with prefix N, added the \ifNdx
+ switch to control opening and writing of the index file for that
+ prefix.
+
+ * xeplain.tex (@idxwrite): Don't call \allowhyphens in vertical
+ mode, to avoid spurious whitespace.
+
+ * doc/userdef.texi (Formatting equation references): Added an
+ example on formatting equation numbers with optional part number.
+ (Indexing): Documented the \ifNdx switch.
+ (Modifying index entries): Clarified behavior of seealso entries.
+
+2007-09-30 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi: Added index entries.
+
+2007-09-17 Oleg Katsitadze <olegkat@gmail.com>
+
+ * Makefile, NEWS, eplain.tex, xeplain.tex:
+ Refined double-column macros to reduce the chance of producing a
+ spaced-out last column.
+ * xeplain.tex (@col@extraheight): New dimen. Used by the
+ double-column macros.
+
+2007-09-12 Oleg Katsitadze <olegkat@gmail.com>
+
+ * Makefile, btxmac.tex, eplain.tex, xeplain.tex:
+ Avoid save stack overflow when reading the .aux file with a large
+ number of label definitions.
+
+2007-09-07 Oleg Katsitadze <olegkat@gmail.com>
+
+ * eplain.tex, Makefile:
+ * xeplain.tex (@endcolumns, @columnsplit):
+ Modified column balancing macros to avoid losing material,
+ reported by GĂ©rald Tenenbaum 24 Aug 2007 14:56:00. Some other
+ refinements.
+ (@balancecolumns, dump@balanced@columns, test@spill@columns):
+ New macros.
+ (ifspill@columns): New switch.
+ * test/colinterline.tex, test/colinserts.tex, test/collost.tex:
+ * test/colpagetotal.tex:
+ New tests for the column balancing routines.
+
+2007-01-22 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-12-30 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-12-23 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-12-22 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-12-09 Oleg Katsitadze <olegkat@gmail.com>
+
+ * Makefile: Added explanatory comment to eplain.aux.
+
+2006-12-05 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-12-03 Oleg Katsitadze <olegkat@gmail.com>
+
+ * Makefile, doc/eplain.info, doc/eplain.pdf, doc/eplain.texi, eplain.tex:
+ Version 3.1.
+
+ * doc/intro.texi: Added link to the TUGboat article.
+
+ * NEWS: Reduced news for 3.1 a bit (it was way too long).
+
+ * doc/hlink.texi, doc/invoke.texi, doc/progdef.texi, doc/userdef.texi:
+ Formatting (mostly empty lines around @example's, @noindent's
+ afterwards).
+
+2006-12-01 Oleg Katsitadze <olegkat@gmail.com>
+
+ * Makefile, README.TDS:
+ Removed texmf/ prefix from the TDS dirs in the distro.
+
+ * doc/eplain.texi, doc/progdef.texi (Iteration): Updated node comment.
+
+ * Makefile: Put scripts in the doc/ within the distro.
+
+ * doc/userdef.texi (Customizing indexing):
+ trimsee is in util/, not test/.
+
+ * NEWS: News for the upcoming Eplain 3.1.
+
+2006-11-29 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (idxargopen, idxargclose): Removed obsolete comment.
+
+ * doc/userdef.texi: Added index terms for verbatim text in TOC
+ and index. (Writing the .toc file): Better rationale for
+ \writenumberedtocline.
+
+ * doc/progdef.texi (Iteration):
+ Documented \loop (with the \else extension).
+
+ * doc/userdef.texi (Packages known to work): Added soul.sty.
+
+2006-11-28 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi (Packages known not to work): Added hyperref.sty.
+
+ * doc/demo.texi, doc/hlink.texi, doc/install.texi, doc/intro.texi, doc/userdef.texi, doc/invoke.texi:
+ Added breaks (@/) to @url's.
+
+ * doc/eplain.texi, doc/userdef.texi (Index entries with special characters):
+ New node.
+
+ * test/for.tex: New file.
+
+ * doc/progdef.texi (Iteration): Documented \For. Correction
+ about expanding the first token of item list, not the entire
+ list.
+
+ * xeplain.tex (For): Modified to ignore _all_ leading spaces of
+ the items, not just the first space.
+
+ * test/href.tex: Added a "weird chars" test.
+
+ * doc/hlink.texi, doc/invoke.texi, doc/userdef.texi:
+ Added a bunch of @acronym's.
+
+ * doc/hlink.texi (Explicit hyperlinks): Note on special chars in
+ the label argument.
+
+ * doc/eplain.texi, doc/hlink.texi (General hyperlinks): New node.
+
+ * doc/progdef.texi (\ifinteger and \isinteger): Minor correction.
+
+2006-11-09 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-10-05 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-10-04 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/hlink.texi (Link types for hypertex, Link types for pdftex
+ and dvipdfm): Moved url link types toward beginnings of the
+ subsections.
+
+ * doc/progdef.texi: Minor correction.
+
+ * test/usepackage.tex: Test for LaTeX package reloading.
+
+ * eplain.tex, xeplain.tex (\usepkg@load@pkg): When reloading
+ LaTeX packages, warn and skip reloading, instead of giving an
+ error.
+
+ * test/href.tex: New file.
+
+ * doc/invoke.texi: Removed the note on touch'ing the .aux file
+ before running texi2dvi, texi2dvi can deal with this since
+ revision 1.90. (BTW, the problem was not with cross-references
+ but with citations.)
+
+2006-09-30 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/eplain.texi: Updated the master menu.
+
+ * doc/invoke.texi: Note on touch'ing the .aux file before running
+ texi2dvi.
+
+ * doc/userdef.texi (Contents): Split into subsections. Documented
+ \writenumberedtocline. Documented integer @var{part} arguments.
+
+ * doc/progdef.texi (\ifinteger and \isinteger): New subsection.
+
+2006-09-27 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/eplain.texi: Added nodes for "Loading LaTeX packages" to
+ the master menu.
+
+ * doc/userdef.texi (Verbatim listing): Documented
+ \nolastlinelisting and C-l (form feed).
+
+2006-09-25 Oleg Katsitadze <olegkat@gmail.com>
+
+ * eplain.tex, xeplain.tex (xrdef): Bug fix--\ignorespaces from
+ \definexref was masked off by \endgroup's.
+
+ * test/xkvtest.tex: New file.
+
+2006-08-27 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-08-08 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-07-15 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-06-19 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-06-02 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-05-29 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-05-07 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-05-07 Oleg Katsitadze <olegkat@gmail.com>
+
+ * eplain.tex, test/contents.tex, xeplain.tex (writenumberedcontentsline):
+ New macro.
+
+2006-05-05 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-05-02 Oleg Katsitadze <olegkat@gmail.com>
+
+ * eplain.tex, test/indexvrb.tex, xeplain.tex: Simplified
+ embedding `{' and `}' into index terms by managing catcodes of
+ \idxargopen and \idxargclose internally. Allow \verbatim inside
+ arguments of \indexsee and \indexseealso by reading their
+ arguments verbatim and then \scantokens'ing.
+
+ * doc/demo.texi, doc/eplain.info, doc/eplain.pdf, doc/eplain.texi, doc/hlink.texi, doc/userdef.texi:
+ Added the lscommnt.tex demo, tweaked some index terms.
+
+ * doc/progdef.texi (Category codes): \makeactive`\\ -> \makeactive\\.
+
+ * doc/userdef.texi (Packages known to work): Added warnings about
+ supp-mis.tex and \pagecolor (pdftex.def).
+
+2006-05-01 Oleg Katsitadze <olegkat@gmail.com>
+
+ * eplain.ini: New file (used by TeX Live to generate .fmt file).
+
+ * Makefile: Generate TDS-compliant distro. Added PDF and HTML to
+ the distro.
+ (eplain.tex): Updated location of mkdist-merge.
+
+ * doc/Makefile: Updated location of pdfcrop.pl. Use `-quality
+ 75' option to convert to reduce image sizes. Added lscommnt demo.
+ (eplain/index.html): Copy images to eplain/ instead of symlinking.
+ (clean, mostlyclean): Don't delete JPEG images, they are in the
+ distro.
+ (distclean): Don't delete PDF and HTML, they are in the distro.
+
+ * README.TDS: New file (README at the top of the distro tarball).
+
+ * add-date, add-version, fix-checksum, merge, pdfcrop.pl, util/mkdist-add-date, util/mkdist-add-version, util/mkdist-fix-checksum, util/mkdist-merge, util/pdfcrop.pl:
+ Moved the support scripts to util/.
+
+ * demo/Makefile, demo/lscommnt.pdf, demo/lscommnt.tex:
+ New demo (listings with highlighted comments).
+
+ * test/dvipdfm.tex, test/epstopdf.tex, test/hlcite.tex, test/hlfoot.tex, test/hlidx.mst, test/hlidx.tex, test/hlink.tex, test/hypertex.tex, test/indexvrb.tex, test/pdftex.tex, test/soultest.tex, test/xrefwarn.tex:
+ Added `public domain' header.
+
+2006-04-30 Oleg Katsitadze <olegkat@gmail.com>
+
+ * test/listing.tex: Added test for the \nolastlinelisting hook.
+ * xeplain.tex (nolastlinelisting): New listing hook to omit the
+ last (empty) line of the file.
+
+ * xeplain.tex (@removebox): Preserve \box0 and use it instead of
+ the constructed \box2, since the latter does not preserve the
+ effect of a possible \hbox to 0pt (produced by, e.g., \llap).
+
+ * test/contents.tex: Test for integer PARTs (\tocentry).
+ * xeplain.tex (ifinteger,isinteger): New macros.
+ (writenumberedcontentsentry): When PART argument is an integer,
+ write \tocentry{PART}... to the .toc file.
+
+ * test/indexvrb.tex: New file.
+ * xeplain.tex: Indexing macros now read TERM and SUBTERM
+ arguments verbatim, to allow catcode changes within the
+ arguments.
+
+2006-04-23 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (hlidx, hlidxpage): Do not rely on a CS with the
+ empty name to be undefined, instead check PAGEENCAP parameter
+ explicitly.
+
+2006-04-19 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (@@href): Got rid of \@hrefhash, made \hlhash
+ equivalent to \@hrefhash.
+
+2006-04-17 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (hldriver@pdftex, hldriver@dvipdfm):
+ Removed spurious spaces in \special's.
+
+2006-04-13 Oleg Katsitadze <olegkat@gmail.com>
+
+ * eplain.tex, xeplain.tex (href): New macro.
+
+2006-04-12 Oleg Katsitadze <olegkat@gmail.com>
+
+ * xeplain.tex (hl@getparam): Allow special chars (like # and ~)
+ in the LABEL argument (for URLs).
+
+ * doc/hlink.texi: Wrapped some long option lists.
+
+ * xeplain.tex: New \For loop, use it in hyperlink macros instead
+ of \for.
+
+2006-04-09 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/hlink.texi: Index terms.
+
+2006-04-09 Karl Berry <karl@gnu.org>
+
+ * doc/hlink.texi: xref for \hldest.
+
+2006-03-30 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/hlink.texi (URL hyperlinks: url): Note on automatic link
+ coloring.
+
+2006-03-26 Oleg Katsitadze <olegkat@gmail.com>
+
+ * test/hlidx.tex: Minor formatting.
+
+ * xeplain.tex: Don't use xrefs for defining index page anchors,
+ to avoid messages about redefined xref labels.
+
+ * test/hlfoot.tex: Select `pdftex' driver by default.
+ * test/dvipdfm.tex: Update: `dvipdfm' now is not the default driver.
+
+ * xeplain.tex: Made all user-visible \hl* macros report errors
+ until hyperlinks are enabled.
+
+ * eplain.tex, xeplain.tex (@fineqrefn):
+ Bugfix: \hlend -> \hlend@impl{eq}.
+
+ * test/xrefwarn.tex: New file.
+ * xeplain.tex: Added warnings about multiply defined xref labels
+ (from Tomas Penicka <tom.penicka@centrum.cz>).
+
+2006-03-25 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi (Environment for loading packages):
+ More details on \eplaininput.
+ * doc/userdef.texi (Packages known to work): \ttfamily.
+ * xeplain.tex: Correct definition of \ttfamily.
+
+ * doc/userdef.texi (Packages known to work): epstopdf.sty.
+ * test/epstopdf.tex: New file.
+
+ * demo/Makefile (xhyper.pdf): Added prerequisites.
+ (maintainer-clean): New rule.
+ * demo/xhyper.tex: graphics.sty -> graphicx.sty.
+
+ * doc/hlink.texi, doc/userdef.texi:
+ References to the `Demo files' section.
+
+ * doc/hlink.texi, test/hlfoot.tex, xeplain.tex:
+ Footnote hyperlinks are now off by default.
+
+ * doc/hlink.texi (URL hyperlinks: url): Older url.sty's do not work.
+
+ * doc/userdef.texi (Environment for loading packages):
+ \eplaininput, \packageinput
+ * xeplain.tex (\beginpackages): \eplain@input -> \eplaininput.
+
+ * doc/userdef.texi (Packages known to work):
+ Older versions of url.sty not working in plain TeX.
+
+2006-03-22 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-03-15 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi: Parenthesized the @pxref refs.
+
+ * doc/userdef.texi: Punctuation.
+
+ * doc/eplain.texi, doc/hlink.texi: Added doc on the hypertex driver.
+
+ * test/hypertex.tex: New file.
+
+ * xeplain.tex:
+ More defs for LaTeX: the `draft' option to graphic{s,x}.sty; and
+ warnings from epstopdf.sty when graphics.sty is not loaded.
+
+ * xeplain.tex:
+ Bugfix: the `nolinks' driver now redefines \hl@setparam so that
+ the macros \hldesttype, \hldestopts, \hltype and \hlopts avoid
+ error messages about "unknown" options and types.
+
+ * xeplain.tex: Added hypertex driver.
+
+2006-03-14 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-02-24 Oleg Katsitadze <olegkat@gmail.com>
+
+ * test/soultest.tex: New file.
+
+2006-02-14 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-01-27 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2006-01-13 Karl Berry <karl@gnu.org>
+
+ * doc/.cvsignore: .
+
+ * doc/eplain.texi, ChangeLog, doc/Makefile, doc/eplain.info, doc/eplain.pdf:
+ move contents
+
+2006-01-12 Karl Berry <karl@gnu.org>
+
+ * doc/eplain.texi: move @contents to front; also include
+ @shortcontents.
+ * doc/Makefile (eplain/index.html): don't try to create links if
+ they already exist.
+ * doc/.cvsignore: ignore links, etc.
+ And upload to lulu ...
+
+2006-01-06 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/progdef.texi (\ifempty): New subsection.
+
+2006-01-05 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/intro.texi: Reference to David Walden's article.
+
+ * INSTALL, doc/install.texi: Removed info on etex.fmt and emtex.
+ Updated recommended installation locations.
+
+ * doc/eplain.texi: Added variable index (for environment vars in
+ install.texi) and redirected program and variable indices into
+ concept index.
+
+ * Makefile: Removed etex.tex.
+ * etex.tex: Removed.
+
+ * xeplain.tex: Improved hyperlink messages.
+
+ * doc/Makefile: Use texi2dvi --pdf instead of texi2pdf.
+
+ * xeplain.tex (beginpackages): Save and restore \input to avoid
+ redefinition by miniltx.tex and packages (\packageinput stores the
+ redefinition).
+
+ * test/usepackage.tex: Added \enablehyperlinks (this test depends
+ on hyperlinks being enabled). Added test for \urldef from
+ url.sty.
+
+ * xeplain.tex: Added \protected@edef for \urldef from url.sty.
+ (hldriver@nolinks): The label argument to \hlstart and \hldest
+ must be passed to \write-1 _fully expanded_, otherwise macros that
+ the label uses may become redefined/undefined by the time the page
+ is shipped out and the \write is executed (this resulted in URLs
+ defined with \urldef to fail under the nolinks driver).
+ (@generalref): Use \@generalref@class instead of \temp, since
+ \@generalrefoptarg can possibly trash \temp.
+
+2005-12-26 Karl Berry <karl@freefriends.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2005-12-23 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi: Changed location of ltpictur.pdf.
+
+2005-12-21 Oleg Katsitadze <olegkat@gmail.com>
+
+ * demo/.cvsignore, demo/ctan_lion_350x350.png, demo/xhyper.pdf:
+ Image for the xhyper.tex demo and the output.
+
+ * doc/Makefile:
+ Added rules for creating JPG images from the demos (for the html
+ docs).
+
+2005-12-20 Oleg Katsitadze <olegkat@gmail.com>
+
+ * doc/userdef.texi (Contents): Tell that \writetocentry reads
+ \tocfilebasename only once.
+ (Tables): Corrected stale link to lifshitz.ph.utexas.edu.
+ (Packages known to work): Added link to Klaus Hoeppner's article
+ on LaTeX graphics.
+
+ * demo/xhyper.tex:
+ Input ../eplain instead of eplain, in case Eplain is not (yet)
+ properly installed.
+
+ * doc/Makefile:
+ Added _FLAG variables for each program used. Split targets like
+ `pdf eplain.pdf' and made pdf depend on eplain.pdf, etc. (otherwise
+ `make pdf' always rebuilds eplain.pdf). Added rules and dependencies
+ for the demo file images.
+ (ps): New target.
+
+ * Makefile:
+ Added demo subdir. Changed all calls to Make to use $(MAKE).
+ (ps): New target.
+
+ * pdfcrop.pl, demo/Makefile, doc/demo.texi: New files.
+
+ * AUTHORS: Added pdfcrop.pl.
+
+ * demo/xhyper.tex (Top comment):
+ \, only works in math mode in plain TeX (unlike in tugboat
+ format).
+
+ * doc/hlink.texi (URL hyperlinks):
+ Showed how to have colored links instead of boxed links.
+ (Footnote hyperlinks): Showed how to turn off footnote hyperlinks.
+ (Hyperlink driver nolinks): Showed the proper way to
+ \enablehyperlinks for the dual links/nolinks output.
+ (Setting default types and options): Example of how to turn off
+ boxes for the links.
+
+ * doc/eplain.texi: Changed the title. Included demo.texi.
+
+2005-12-14 Oleg Katsitadze <olegkat@gmail.com>
+
+ * demo/xhyper.tex: New file.
+
+2005-10-11 Karl Berry <karl@freefriends.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2005-10-09 Karl Berry <karl@freefriends.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2005-09-25 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * Makefile, doc/Makefile: Remove intermediate files from the
+ tarball. NOTE: It was agreed not to include aux, toc, and index
+ files into the tarball, because if the user compiles the manual
+ with the command `tex eplain.texi' for a different paper size
+ (specified, e.g., in texinfo.cnf), then the references, TOC and
+ indexes will be off without the user knowing about it.
+
+2005-09-23 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * Makefile:
+ Added intermediate files (aux, toc, ??, ??s) to MANUALS so that
+ they are included in the tarball (later reverted, see above).
+
+ * doc/Makefile:
+ (clean): Leave intermediate files (aux, toc, ??, ??s) in tarballs
+ so users can easily compile docs (later reverted, see above).
+ (distclean): Remove eplain.html.
+ (maintainer-clean): Remove the intermediate files.
+ (html): Build also --no-split doc.
+
+ * Version 3.0 (released 2005-09-20)
+
+ * Makefile: Added test/*.eps to the list of test files.
+
+2005-09-20 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * eplain.tex, Makefile, NEWS, doc/eplain.info, doc/eplain.pdf, doc/eplain.texi:
+ Version number update.
+
+ * doc/Makefile (info): Added --no-split option.
+
+ * doc/eplain.texi, doc/hlink.texi: New documentation for hyperlinks.
+
+ * doc/userdef.texi:
+ Added references to implicit hyperlink subsections. Punctuation
+ corrections by Karl Berry.
+
+ * doc/progdef.texi (Page list and page range parsers): New section.
+
+ * test/example.eps: New file (from PSfrag).
+
+ * test/dvipdfm.tex, test/hlcite.tex, test/hlfoot.tex, test/hlidx.tex, test/hlink.tex, test/pdftex.tex, test/usepackage.tex:
+ Updated to the changes.
+
+ * NEWS: Updated for the upcoming release 3.0.
+
+ * eplain.tex, xeplain.tex:
+ Added color support for hyperlinks. Completely reworked hyperlink
+ option setting (added \hl[dest]{type,opts}). Renamed `uri' link
+ types to `url'.
+
+2005-09-19 Karl Berry <karl@freefriends.org>
+
+ * AUTHORS: alphabetize
+
+2005-09-15 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/userdef.texi (Environment for loading packages):
+ Changed @emph{preamble} to @dfn{preamble}.
+
+ * doc/intro.texi, doc/userdef.texi:
+ Replaced a bunch of @w{foo bar} with foo@tie{}bar.
+
+2005-09-11 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * test/cite.tex, test/xampl.tex: Removed \mbox definitions.
+
+2005-09-07 Karl Berry <karl@freefriends.org>
+
+ * doc/invoke.texi: pxref in parens
+
+2005-09-07 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/invoke.texi:
+ Added ifpdf.sty and path.sty to the list of incorporated files.
+ Added reference to texi2dvi.
+
+ * doc/userdef.texi (Citations): (Indexing): Added references to texi2dvi.
+
+2005-09-03 Karl Berry <karl@freefriends.org>
+
+ * doc/invoke.texi: missing punct
+
+2005-08-30 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/userdef.texi:
+ Changed paths on CTAN hosts to actual links on www.ctan.org
+ (Packages known to work): Added reference to \begin{picture} and
+ \end{picture}
+
+ * doc/intro.texi:
+ Changed La@TeX{} to @LaTeX{}. Updated mailing list addresses.
+
+ * doc/arrow.texi: Changed La@TeX{} to @LaTeX{}.
+
+ * doc/eplain.texi, doc/userdef.texi (Equation references):
+ Added doc on referring to empty labels.
+ (Loading LaTeX packages): New section.
+
+ * test/usepackage.tex: New file.
+
+ * eplain.tex, xeplain.tex: Added \@inmatherr needed by autopict.sty
+
+2005-08-29 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * eplain.tex, xeplain.tex: Added support for LaTeX packages.
+
+2005-08-25 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/progdef.texi (Category codes): Corrections to the new doc
+ on \makeat{letter,other} (thanks to Karl Berry, as always).
+
+ * doc/progdef.texi, doc/eplain.info, doc/eplain.pdf (Category codes):
+ Added doc on \makeatletter and \makeatother.
+
+ * xeplain.tex: Added \makeatletter and \makeatother.
+
+2005-08-23 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/eplain.info, doc/eplain.pdf, doc/progdef.texi (Auxiliary files):
+ Added doc on optional arg to \testfileexistence.
+ (User-defined environments): Removed spurious indentation.
+
+2005-08-21 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * README: Added description of util dir.
+
+ * doc/eplain.info, doc/eplain.pdf, doc/userdef.texi (Page
+ references): Updated.
+ (Modifying index entries): Updated.
+ (Customizing indexing): Added docs on customizing see entries and
+ on trimsee.
+
+ * util/trimsee: Added --help and -v|--version options.
+
+ * xeplain.tex, eplain.tex: Added italics correction to
+ \indexsee[also] (thanks to Dan Luecking <luecking@uark.edu>),
+ downcased See.
+
+2005-08-20 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * Makefile: Added util and scripts.
+
+ * util/idxuniq, util/trimsee: New file.
+
+2005-08-19 Karl Berry <karl@freefriends.org>
+
+ * btxmac.tex: simplify license to be like plain.tex
+
+2005-08-18 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/eplain.pdf, doc/eplain.info, doc/eplain.texi, doc/userdef.texi (Equation references):
+ Made into section.
+ (Checking for pdfTeX...): New section (documents ifpdf.sty).
+
+2005-08-17 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * Makefile, doc/Makefile: Rearranged.
+
+ * manifest, tarchive: Removed (Makefile now does the packaging).
+
+ * MANIFESTO: Removed.
+
+2005-08-15 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * eplain.tex, xeplain.tex: Got rid of the homegrown \ifpdf.
+
+ * xeplain.tex, AUTHORS, eplain.tex, manifest, merge:
+ Added ifpdf.sty to Eplain.
+
+ * ifpdf.sty: New file.
+
+ * manifest: Removed intermediate doc/eplain.??s and multiple info
+ files.
+
+2005-08-15 Oleg Katsitadze <geolsoft@mail.ru>, Karl Berry <karl@freefriends.org>
+
+ * README: Updated; authorship info moved to AUTHORS.
+
+2005-08-15 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/Makefile (distclean): Do not delete eplain.pdf (it is now
+ part of distro).
+ (maintainer-clean): Delete eplain.pdf.
+
+ * doc/eplain.kys, doc/eplain.pgs, doc/eplain.tps, doc/eplain.vrs:
+ Removed.
+
+ * AUTHORS: New file.
+
+2005-08-15 Karl Berry <karl@freefriends.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+2005-08-15 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * manifest: Removed doc/*.t2p files (we don't use tex2page anymore).
+
+ * doc/eplain.t2p, doc/btxdoc.t2p, doc/texinfo.t2p: Removed (we
+ don't use tex2page anymore).
+
+ * manifest: Include .mst file(s) from test/ in tarball.
+
+ * test/dvipdfm.tex, test/hlcite.tex, test/hlfoot.tex, test/hlidx.mst, test/hlidx.tex, test/hlink.tex, test/pdftex.tex:
+ New test files for hyperlinks.
+
+ * btxmac.tex: Changes required to support hyperlinks in bibliography.
+
+ * xeplain.tex: Added hyperlink support.
+
+2005-08-14 Karl Berry <karl@freefriends.org>
+
+ * doc/.cvsignore, doc/eplain.info: clean
+
+ * doc/Makefile: eplain only
+
+ * doc/arrow.texi, doc/eplain.pdf, doc/eplain.texi, doc/gpl.texi, doc/index.texi, doc/install.texi, doc/intro.texi, doc/invoke.texi, doc/progdef.texi, doc/userdef.texi:
+ make most of the manual public domain
+
+2005-08-14 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/userdef.texi (Indexing): dropped reference to ftp.math.utah.edu
+
+2005-08-13 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/eplain.texi Removed pagesize specifications.
+ (@menu): Corrected nodes, added detailed node listing for Indexing.
+
+ * doc/userdef.texi (Indexing): Updated stale link to MakeIndex on
+ ftp.math.utah.edu
+ (@menu): Changed tabs to spaces in Indexing node.
+ (Indexing): changed references to MakeIndex from @xref to @url
+
+ * doc/Makefile (../INSTALL): Adjusted sed command to the new
+ output from makeinfo (old one resulted in empty ../INSTALL).
+
+ * ChangeLog: Merged with doc/ChangeLog (old doc entries at the bottom).
+
+ * doc/ChangeLog: Removed (merged with ChangeLog).
+
+2005-08-13 Karl Berry <karl@freefriends.org>
+
+ * doc/texinfo.tex: update from texinfo
+
+ * doc/progdef.texi: typo
+
+ * doc/.cvsignore, doc/eplain.cps, doc/eplain.fns, doc/eplain.info-1, doc/eplain.info-2, doc/eplain.info-3, doc/eplain.info-4, doc/texinfo.tex:
+ omit intermediate files and delete old info files from repository
+
+2005-08-13 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * arrow.tex, xeplain.tex: Header update.
+
+ * COPYING: Added GPL v.2 for arrow.tex
+
+ * ChangeLog, MANIFESTO, Makefile, NEWS, PROJECTS, README, add-date, add-version, fix-checksum, merge, tarchive, test/allref.tex, test/boxes.tex, test/boxit.tex, test/catcode.tex, test/center.tex, test/cite.bib, test/cite.tex, test/citeall.tex, test/citealph.tex, test/citeapa.tex, test/citebegin.tex, test/citecust.tex, test/citenote.tex, test/citex.tex, test/colfootn.tex, test/colrule.tex, test/column.tex, test/column2.tex, test/column3.tex, test/commdiags.tex, test/contents.tex, test/displine.tex, test/double.tex, test/double2.tex, test/ecommdiag.tex, test/emergncy.tex, test/env.tex, test/eqdef.tex, test/eqref.tex, test/filexist.tex, test/flynn.tex, test/footnote.tex, test/frac.tex, test/gcol.tex, test/ian.tex, test/index.tex, test/jan.tex, test/justify.tex, test/knuth.bib, test/label.tex, test/latexcite.tex, test/liang.tex, test/list.tex, test/listing.tex, test/logo.tex, test/loop.tex, test/loopnext.tex, test/mag.tex, test/makecol.tex, test/margin.tex, test/matrix.tex, test/mdisplay.tex, test/names.tex, test/noarrow.tex, test/nobib.tex, test/nonouter.tex, test/optional.tex, test/outer.tex, test/page.tex, test/path.tex, test/pcol.tex, test/psfont.map, test/rex.tex, test/rule.tex, test/sidx.tex, test/subdef.tex, test/tenenb.tex, test/tenenb2.tex, test/test.tex, test/time.tex, test/truemarg.tex, test/uscore.bib, test/uscore.tex, test/verb2.tex, test/verbatim.tex, test/vlach.tex, test/whitespc.tex, test/xampl.tex, test/xref.tex:
+ Added "public domain" note.
+
+ * test/nagflm.tex, test/nhm.style, test/nhm.tex, test/tables.tex:
+ Removed (non-public domain/outdated).
+
+2005-08-12 Karl Berry <karl@freefriends.org>
+
+ * xeplain.tex: header updates
+
+2005-08-12 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * Makefile (pdf): New target.
+ (html): No need for eplain.html, use html instead.
+ (info): Bug correction, there is no info dir.
+ (btxdoc): New target.
+
+ * 00Description: Removed.
+
+2005-08-12 Karl Berry <karl@freefriends.org>
+
+ * CVSROOT/checkoutlist, CVSROOT/commitinfo, CVSROOT/config, CVSROOT/cvswrappers, CVSROOT/editinfo, CVSROOT/loginfo, CVSROOT/modules, CVSROOT/notify, CVSROOT/rcsinfo, CVSROOT/taginfo, CVSROOT/verifymsg:
+ remove dup CVSROOT
+
+2005-08-12 Stepan Kasal <kasal@ucw.cz>
+
+ * xeplain.tex (^^L): Remove the redefinition.
+ (\@setuplisting): Fix the def in the case that ^^L is not
+ active.
+
+ * xeplain.tex (\readcontentsfile): Do not open toc file for
+ writing, to allow multiple contents
+
+2005-08-06 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * Imported sources into CVS on sarovar.org
+ (http://sarovar.org/projects/eplain)
+
+2004-09-05
+
+ * Version 2.8.4
+
+2004-08-31 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * xeplain.tex: \indexproofunbox: add \nointerlineskip
+
+ * xeplain.tex: \@idxwrite: Add \allowhyphens when under
+ \indexproofing, otherwise `infinitesimal' in
+ \sidx{Infinitesimal}infinitesimal won't be hyphenated.
+
+2004-08-31 Stepan Kasal <kasal@ucw.cz>
+
+ * xeplain.tex: \def\endcolumns{\singlecolumn} instead of \let...
+
+ * xeplain.tex: \makecolumns. Correct calculation of
+ items-per-column
+
+2004-07-26 Stepan Kasal <kasal@ucw.cz>, Karl Berry <karl@freefriends.org>
+
+ * Version 2.8.3
+ * README: Fix URL
+
+2004-07-26 Stepan Kasal <kasal@ucw.cz>
+
+ * xeplain.tex (\printitem): Add \nobreak before \vskip-\parskip and
+ (implicit) \vskip\parskip, so that a page break cannot appear
+ here, between the indexing \write at the start of the item.
+
+2004-02-28
+
+ * Version 2.8.2
+ * Updated texnames.sty, version 1.10
+
+2003-12-27 Stepan Kasal <kasal@ucw.cz>
+
+ * xeplain.tex (\@column): Make sure there is enough space before
+ we start columned output.
+ (\@col@minlines, \@ejectpartialpenalty): New constants.
+ (\@columnhsize): Removed.
+ (\@setuplisting, \@endcolumns): Use \break instead of \eject,
+ when we are sure TeX is in vertical mode.
+
+Tue Jul 15 xx:xx:xx 2003 Dorai Sitaram <dorai @ ccs.neu.edu>
+
+ * \setpropertyglobal, from
+ Oleg Katsitadze <geolsoft @sdf.lonestar.org>
+
+Mon Jan 30 xx:xx:xx 2001 Dorai Sitaram <ds26@gte.com>
+
+ * packaged for CTAN
+
+Sat Nov 11 20:00:00 2000 Dorai Sitaram <ds26@gte.com>
+
+ * Version 2.8.1
+
+ * \leftdisplays was not allowing pagebreaks
+ inside \eqalignno. Bug reported by Ludger Hentschel
+ <hentschel@simon.rochester.edu>. Fixed by
+ Donald Arsenau <ASND@erich.triumf.ca>.
+
+ * doc/btxdoc.bib included alongside doc/btxdoc.tex
+
+Sat Sep 2 13:20:00 2000 Dorai Sitaram <ds26@gte.com>
+
+ * Version 2.8
+
+Sun May 7 09:40:00 2000 Dorai Sitaram <ds26@gte.com>
+
+ * Fixed problem where Eplain's redefinition of \iterate
+ was causing nameclash of \next in a TeXdraw macro.
+ Suggested by TeXdraw author Peter Kabal
+ <kabal@ece.mcgill.ca>.
+
+Sat Apr 9 00:17:00 2000 Adam Lewenberg <adam@macrotex.net>
+
+ * xeplain.tex: Fixed problem introduced when double column uneven
+ bug was `fixed'.
+
+Sun Apr 25 22:30:00 1999 Adam Lewenberg <ahl@uakron.edu>
+
+ * doc/progdef.texi: Added a section on user-defined environments
+ to progdef.texi and fixed a few typos in documentation. Suggested
+ by Paul Abrahams.
+
+Thu May 14 11:30:00 1998 Adam Lewenberg <ahl@uakron.edu>
+
+ * xeplain.tex: Changed \columnfill after suggestion of
+ Helmut Jarausch <jarausch@IGPM.Rwth-Aachen.DE>.
+
+Wed Dec 5 09:10:00 1997 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * Version 2.7.
+
+ * xeplain.tex: Added the control sequence \gutterbox as a hook
+ to add arbitrary vertical material between columns in
+ multi-column mode.
+
+Wed Mar 26 07:17:00 1997 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * xeplain.tex: Moved an \obeywhitespace to the end of the
+ definition of \verbatim to remove spurious space.
+ Suggested by Dorai Sitaram.
+
+Wed Jan 28 08:00:00 1997 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * xeplain.tex: Added \def\@emptymarkA{\@emptymarkB} so that
+ \ifempty\undefined is false. Suggested by Stanislav Brabec.
+
+Sat Oct 5 18:11:00 1996 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * xeplain.tex: Changed a line in the definition of \@fineqdefn
+ to remove a \noexpand which seemed to be causing a problem
+ with \eqdef.
+
+Tue Sep 24 10:25:00 1996 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * xeplain.tex: Added some code to multiple columns so that
+ when switching from multi- to single-columns the last line or
+ so does not get lost. Let's hope it works; added a \newif.
+
+Wed Apr 1 10:11:00 1996 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * arrow.tex: changed \smash to \smash@@ (a synonym for plain's
+ smash) so that arrow.tex works with amstex.
+
+ * xeplain.tex: Put a test at the start so that eplain.tex is loaded
+ only once.
+
+ * xeplain.tex: changed -1in to -1truein in margin macros;
+ Macros affected:
+ \@finishtopmargin
+ \@finishleftmargin
+ \@computebottommargin
+ \@computerightmargin
+ \indexsetmargins.
+ Also, initialize \paperheight to 11truein and \paperwidth to
+ 8.5truein when \mag is not 1000.
+
+ These changes forced a redefinition of \magnification in the event
+ that \magnification is called AFTER eplain.tex is \input (in
+ particular, when \magnification is used with an eplain .fmt).
+
+ * xeplain.tex: changed {toc} to {#1} in the definition of
+ \readcontentsfile to allow more general use.
+
+ * merge: the merge script improperly replaced "xeplain" by "eplain"
+ in too many places.
+
+Mon Nov 13 14:14:28 1995 Karl Berry <karl@cs.umb.edu>
+
+ * btxmac.tex: Update for Oren's new 0.99k.
+
+Tue Mar 14 11:36:55 1995 Karl Berry <karl@cs.umb.edu>
+
+ * xeplain.tex: Doc fix.
+
+Sat Apr 30 05:58:31 1994 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.6.
+
+ * xeplain.tex (toc commands): Rewrite to allow general toc's.
+
+ * xeplain.tex: Include indexing commands.
+
+Sun Apr 24 14:59:59 1994 Kathy Hargreaves (karl@cs.umb.edu)
+
+ * xeplain.tex (\eqalignno): put \hfil back in (from plain) front of
+ first \@align, so lhs will be right justified.
+
+Fri Apr 15 17:46:39 1994 Karl Berry (karl@ra.cs.umb.edu)
+
+ * merge: Split arrow into pre- and post-catcode changes.
+ * xeplain.tex: Read both parts.
+
+Wed Mar 30 14:34:52 1994 Karl Berry (karl@ra.cs.umb.edu)
+
+ * xeplain.tex: Globally replace \dimen0 with \dimen@, why not.
+
+Wed Mar 30 13:19:59 1994 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.5.
+
+ * xeplain.tex (\@makeverbatimdoubleescape): New macro from
+ dorai@cs.rice.edu.
+ (\verbatimescapechar): Call it.
+
+Mon Mar 28 11:09:03 1994 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@maybewarnref): Call \ref at the end.
+
+Tue Mar 22 10:48:01 1994 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.4.
+
+Tue Mar 15 12:01:57 1994 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@maybewarnref): New macro.
+ (\ref): Define to that initially.
+ (\eplainref): Name the real definition this.
+
+Sat Mar 12 15:32:32 1994 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@columnsplit): Omit doing the looping; it causes
+ strange column splits on my index tests.
+
+Tue Mar 8 10:59:31 1994 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@columns): Correct for one too many gutters.
+
+Sat Mar 5 15:16:47 1994 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@numcolumns): Remove \newcount in favor of a \chardef.
+ (\columnfill): New macro.
+
+Thu Mar 3 14:31:16 1994 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@oldandcode, \@plainnew{if,dimen}): New control
+ sequences, so we can read arrow.tex conditionally a la bibtex.
+
+ * xeplain.tex (\@oldatcatcode): Rename to \@eplainoldatcode, so
+ btxmac and arrow's redefinitions don't affect us.
+
+Sat May 22 11:24:31 1993 Karl Berry (karl@cs.umb.edu)
+
+ * Makefile.in (dist): Run gzip -9.
+
+Sun Apr 11 15:19:18 1993 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@eqdefn): \@definelabel after the \definexref.
+
+ * xeplain.tex (\xrlabel): Append an `x' after the _.
+
+Mon Mar 15 08:42:49 1993 Karl Berry (karl@cs.umb.edu)
+
+ * btxmac.tex (\@readbblfile): Let our default \end be \@gobble.
+
+ * btxmac.tex (\@readbblfile): Don't define \begin and \end if
+ \begin is already defined.
+
+ * btxmac.tex (\@onecitation): Call \@printcitelabel.
+ (\@printcitelabel): New macro.
+
+Mon Mar 1 06:26:46 1993 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.3.
+
+Tue Feb 23 16:52:49 1993 Karl Berry (karl@cs.umb.edu)
+
+ * Makefile.in (dist): Copy info files to my local info directory.
+
+Sun Feb 21 11:07:38 1993 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\definexref, \ref, etc.): New macros.
+ (\@eqdefn, \writeitemxref, \xrdef): Use \definexref.
+
+ * xeplain.tex (\{set,get}property): New macros from generic.
+
+ * xeplain.tex (\tokstostring): This is no longer defined.
+
+Sat Feb 20 08:07:12 1993 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\hook{append,prepend,action,actiononce,run}): New
+ macros.
+
+ * xeplain.tex (\expandifdefined): Remove.
+
+ * Makefile (default): Change default to `eplain.tex'.
+
+ * xeplain.tex (\toks@ii): New definition.
+
+Fri Feb 5 08:07:21 1993 Karl Berry (karl@cs.umb.edu)
+
+ * Makefile (dist, eplain.tex): Pass version explicitly.
+
+Sun Jan 17 14:08:14 1993 Karl Berry (karl@cs.umb.edu)
+
+ * Makefile (dist): Copy add-version.
+
+Sun Dec 27 17:00:59 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\csn, \ece): New macros.
+
+Fri Dec 18 10:11:33 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\expandifdefined): New macro.
+
+Sun Nov 22 12:03:13 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\ifempty, \@@ifempty): Restore from an old btxmac,
+ as some people were using them.
+
+Wed Nov 18 11:15:16 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex: Doc fix.
+
+Thu Nov 12 17:52:24 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\if@leftdisplays): New conditional.
+ (\{left,centered}displays): Set it and test it appropriately.
+
+ * xeplain.tex (\displaysetup): Rename to \leftdisplaysetup.
+
+ * xeplain.tex (\centereddisplays): Don't set \displaysetup to
+ \relax, just go back to the \previouseverydisplay.
+
+Wed Nov 11 07:08:18 1992 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.2.
+
+Mon Nov 9 09:50:43 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\{,end}orderedlist): Synonyms for \{,end}numberedlist.
+
+Fri Nov 6 15:19:03 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\@removebox): Don't use \lastbox unless we're in
+ horizontal mode.
+ ( ): \let to `\ ', instead of \def.
+
+Mon Oct 19 09:10:56 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\boxit): Define to be \long.
+
+Fri Oct 9 10:19:05 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex (\everylist): New toks register.
+ (\beginlist): Expand it.
+
+Thu Oct 8 17:42:33 1992 Karl Berry (karl@cs.umb.edu)
+
+ * Makefile (topfiles): Add `NEWS'.
+
+ * xeplain.tex (\footnoterulewidth): Define as 2in, not 2true in.
+ Why did Knuth do this?
+
+Fri Oct 2 11:48:26 1992 Karl Berry (karl@cs.umb.edu)
+
+ * xeplain.tex: doc fix.
+
+Sat Sep 19 17:32:44 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\xrlabel): set the catcode of _ to 8 before the
+ definition, to protect ourselves. (From adam@symcom.math.uiuc.edu)
+
+Tue Aug 25 12:06:50 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex: save and restore the catcode of @ as we do with
+ btxmac.tex.
+
+Tue Aug 11 07:54:52 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\fmtversion): use `23 April 1964' style instead of
+ Unix-y timestamp style.
+
+Sat Aug 8 12:04:29 1992 Karl Berry (karl@hayley)
+
+ * Makefile (eplain.tex): depend on Makefile.
+
+Fri Aug 7 14:43:22 1992 Karl Berry (karl@Prometheus)
+
+ * xeplain.tex (\displayhook): remove this \newtoks.
+ (\leftdisplays): don't insert it into \everydisplay.
+
+Fri Jul 31 17:00:23 1992 Karl Berry (karl@hayley)
+
+ * Makefile (topfiles): use *.sty, not just texnames.sty.
+
+Sat Jul 25 17:23:10 1992 Karl Berry (karl@hayley)
+
+ * path.sty: new version (with Phil's blessing). Changes recorded
+ in the file itself.
+
+Fri Jun 19 09:17:04 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\@lefteqalignnonoalign): use \parindent=0pt instead
+ of \noindent to lose the indentation.
+
+Thu Jun 11 09:13:14 1992 Karl Berry (karl@hayley)
+
+ * arrow.tex: new version from Steven, changes only the license.
+
+Fri May 29 08:46:35 1992 Karl Berry (karl@hayley)
+
+ * Makefile (dist): include add-date.
+
+ * merge: include path.sty.
+ * xeplain.tex: leave marker.
+ * Makefile (eplain.tex): depend on path.sty.
+
+Mon May 25 11:16:15 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\writenumberedtocentry): only expand the ``number''
+ once, via \expandafter and \the\toks.
+
+Thu May 21 09:11:05 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\verbatim, \endverbatim): do not begin and end with
+ \par.
+
+Sat May 16 11:26:19 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\makeblankbox): assign to \errhelp before the
+ \errmessage.
+
+Sat May 9 06:42:57 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\writenumberedtocentry): \edef the extra number, so
+ \the<register> gets expanded.
+
+Wed May 6 15:46:52 1992 Karl Berry (karl@hayley)
+
+ * Makefile (realclean): separate from distclean, and remove INSTALL.
+
+Tue May 5 11:25:44 1992 Karl Berry (karl@hayley)
+
+ * Makefile (install): install eplain.tex.
+
+Tue Apr 28 08:28:29 1992 Karl Berry (karl@hayley)
+
+ * Makefile (distclean): new target.
+
+Sun Apr 19 08:18:22 1992 Karl Berry (karl@hayley)
+
+ * xeplain.tex (\expandonce): new macro from generic.
+
+ * xeplain.tex (\@setuplisting): set \parskip = 0pt.
+
+ * xeplain.tex (\@setuplisting): use `\listingfont' instead of \tt.
+ (\listingfont): new macro.
+
+Thu Apr 9 09:27:25 1992 Karl Berry (karl@hayley)
+
+ * Makefile: use $(MAKE) to do submakes.
+
+Tue Mar 31 14:10:45 1992 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\boxit): use \ehrule and \evrule.
+
+Wed Mar 25 09:27:51 1992 Karl Berry (karl at hayley)
+
+ * Version 2.1.
+
+ * xeplain.tex (^^I): don't do \tt while defining this, as we might
+ not have any fonts yet.
+
+Sun Mar 15 06:58:33 1992 Karl Berry (karl at hayley)
+
+ * Makefile: general cleanup.
+
+ * btxmac.tex: version 0.99j, from Oren.
+
+Thu Mar 5 13:53:06 1992 Karl Berry (karl at claude.cs.umb.edu)
+
+ * Version 2.0.
+
+ * New btxmac.tex from Oren.
+
+ * doc/eplain.texinfo: replace GPL.
+
+Mon Feb 17 14:19:27 1992 Karl Berry (karl at hayley)
+
+ * btxmac.tex (\newcommand): use \@getoptionalarg.
+ (\@continuenewcommand): rewrite accordingly.
+ (\@newcommandwithargs): delete.
+ (\bibitem, \@bibitem): likewise.
+
+ * btxmac.tex (\biblabelprint): use \p{re,ost}biblabelcontents
+ instead of hardwiring the \hss.
+ (\@readbblfile): in \@alphabibitem and \@numberedbibitem, define
+ the appropriate one to \hss to do the justification.
+
+ * btxmac.tex (\@readauxfile): improve comments.
+
+ * btxmac.tex (\biblabelprint): \kern\biblabelextrahang, instead of
+ \enspace.
+ (\@readbblfile): change comment at \biblabelextrahang.
+
+Fri Feb 7 08:11:07 1992 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Cross-references): bring the list of valid chars
+ in references up-to-date.
+
+Wed Feb 5 12:05:09 1992 Karl Berry (karl at hayley)
+
+ * xeplain.tex: remove spurious spaces from ends of definitions.
+
+ * xeplain.tex: marker for arrow.tex.
+ * merge: include arrow.tex in eplain.tex.
+ * arrow.tex: new file.
+
+Mon Jan 27 06:22:43 1992 Karl Berry (karl at hayley)
+
+ * xeplain.tex (*printmarker): use \listmarkerspace instead of
+ \enspace.
+ * eplain.texinfo (List formatting): document this.
+
+ * xeplain.tex (\linenumberedlisting, \printlistinglineno): new
+ macros, from FABROADI@CUGSBVM.BITNET.
+ * eplain.texinfo (Verbatim listing): document them.
+
+ * eplain.texinfo (Verbatim listing): document it.
+ * xeplain.tex (\verbatim): new macro, mostly from
+ beebe@math.utah.edu, to do inline verbatim mode.
+
+ * eplain.texinfo (Footnotes): say that the space above the rule
+ and below the text is \skip\footins.
+
+ * xeplain.tex (\center, \flush{left,right}): define with \gdef;
+ remove the \globaldefs = 1.
+
+ * eplain.texinfo (Logos): add some more.
+ * xeplain.tex: include texnames.sty.
+
+Thu Jan 23 08:35:43 1992 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\writenumberedtocentry): \sanitize the section
+ number (arg#3), in case it happens to have weird control
+ sequences in it (e.g., if it's an author's name instead of a
+ number).
+
+Wed Jan 15 10:52:32 1992 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Citations): document \bblfilebasename.
+
+ * eplain.texinfo (Contents): document this.
+ * xeplain.tex (\readtocfile, \opentocfile): use \tocfilebasename.
+ (\tocfilebasename): defaults to \jobname.
+
+Fri Dec 27 11:07:41 1991 Karl Berry (karl at Prometheus)
+
+ * btxmac.tex (\@getoptionalarg): set \@optionalnext to \relax
+ before using it as the arg to \@futurenonspacelet.
+
+Sat Dec 7 07:23:14 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqnofontfam): remove this. What was I thinking of?
+
+Fri Dec 6 12:57:16 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqnofontfam): change from \mit to \rm.
+ (\eqprint): enclose the font change in a group.
+
+ * xeplain.tex (\displaysetup): subtract \leftskip from
+ \displaywidth (on the umpteenth alternation here); also, don't
+ \hskip by \displaywidth after advancing by the extra parameters.
+ Instead, use a temporary. (Otherwise, we would \hskip by too much.)
+
+Mon Nov 18 06:57:33 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqprint): call \eqnofontfam first.
+ (\eqnofontfam): define to be \mit.
+
+ * xeplain.tex (\leftdisplays): decrease \hsize, so \noalign in
+ \eqalignno doesn't produce an overfull box.
+ (\eqalignno in \redefinealignmentdisplays): set \noalign to a new
+ definition.
+ (\@primitivenoalign): new synonym.
+ (\@lefteqalignnonoalign): new macro.
+
+ * btxmac.tex (\bibliography): do \nobreak before reading the bbl file.
+
+Mon Oct 28 10:01:39 1991 Karl Berry (karl at hayley)
+
+ * btxmac.tex (\@readbblfile): correct test for \@itemnum being
+ defined.
+
+ * xeplain.tex (\@eateol): if there's text on the line with the
+ justify command, do the right thing.
+ * eplain.texinfo (Justification): document these changes.
+
+ * xeplain.tex (\@finjustifyreturn): new macro to test for two
+ ^^M's in justified environments. If we find this, insert
+ \blanklineskipamount glue.
+ (\beforejustify): set up ^^M to call this; set up \@eateol.
+ (\flushleft, \flushright, \center): define \@eolaction instead of
+ defining ^^M directly; ditto for \@eateol.
+
+Sun Oct 6 12:02:46 1991 Karl Berry (karl at hayley)
+
+ * btxmac.tex (\@readbblfile): don't define \@itemnum if it's
+ already defined.
+
+Fri Oct 4 14:34:58 1991 Karl Berry (karl at hayley)
+
+ * btxmac.tex (\bblfilebasename): new macro, defaults to \jobname.
+ (\bibliography, \@readbblfile): use it.
+
+Sat Sep 28 11:46:10 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\unorderedprintmarker): new macro.
+ (\unorderedlist): set \printmarker to it.
+ (\writeitemxref): new macro, the xref-defining part from \@finli.
+
+ * xeplain.tex (\leftdisplays): don't save and restore \eqalign,
+ since we don't change it in \@redefinealignmentdisplays.
+
+Fri Sep 27 09:45:17 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\displaysetup): no, take \leftskip into account
+ after all. What's going on?
+
+Tue Sep 24 07:10:23 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\displaysetup): don't advance \displayindent by
+ \leftskip, since TeX already does.
+
+ * btxmac.tex (\nexttoken): rename to \@nexttoken.
+
+Fri Sep 20 10:45:23 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\displaysetup): don't subtract \leftskip when computing
+ \displaywidth; TeX already does that.
+
+ * xeplain.tex (\@finli): don't call \xrlabel on the arg to
+ \definexref; advance \itemromannumeral.
+
+Thu Sep 19 16:12:14 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\xrefn): remove spurious braces from warning.
+
+ * eplain.texinfo (Lists): document this.
+ * xeplain.tex (\{print,}itemromannumeral): new macros.
+ (\numberedmarker): use roman numerals for depth 3.
+
+Tue Sep 17 06:30:25 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\xrefn): remove calls to \tokstostring; \csname
+ works just as well.
+ * btxmac.tex (\@readauxfile): don't call \@setletters; only reset @.
+ (\@tokstostring): remove.
+ (\@cite...): remove calls to \@tokstostring
+
+ * xeplain.tex (\@finli): define the item cross-reference label, as
+ well as write it out; no, don't, the value might be a page number.
+
+ * xeplain.tex (\xrlabel): remove assignments, so it becomes
+ expandable. (This means control sequences are no longer allowed
+ in labels.) Change callers.
+
+Mon Sep 16 15:17:09 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqdefn): don't call \eqconstruct if we're given an
+ optional argument.
+
+Sun Sep 15 17:19:33 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Lists): document this.
+ * xeplain.tex (\beginlist): set \itemnumber=1; remove from \...list.
+ (\li): remove from the \...list macros and only
+ define once; allow an optional arg as a cross-reference label.
+ (\item{number,letter}out): rename to \print...; change caller.
+ (\printmarker): new macro to output the actual item marker.
+
+Sat Sep 14 15:55:39 1991 Karl Berry (karl at hayley)
+
+ * btxmac.tex (\@getoptionalarg): use \@futurenonspacelet.
+ (\@futurenonspacelet): move from xeplain.tex.
+ * eplain.texinfo (Macro arguments): document this.
+
+Mon Sep 9 10:25:51 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\@redefinealignmentdisplays): add another \hfil
+ outside math mode to the template for \displaylines.
+
+Sun Sep 8 06:31:50 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqdef): call \eqconstruct here.
+ (\eq@eqdefn): not here.
+
+ * eplain.texinfo: document all this.
+
+ * xeplain.tex (\beginlist): do the \abovelistskip first.
+
+ * xeplain.tex (\{v,h}penalty): new macros.
+
+ * xeplain.tex (\{above,below}listskipamount,
+ \interitemskipamount): rename from ...skip.
+ (\{above,below}listpenalty, \interitempenalty): new count
+ registers.
+ (\{above,below}listskip, \interitemskip): macros which skip by the
+ register and include the \...penalty.
+
+Sat Sep 7 07:29:12 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\gtracingoff, \gloggingall): new macros.
+ * eplain.texinfo (Diagnostics): document them.
+
+Fri Sep 6 13:40:11 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Diagnostics): new command \tracingoff.
+ * xeplain.tex (\tracingoff): define it.
+
+Thu Sep 5 10:19:49 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Tables): replace reference to INRSTeX, which
+ seems not to exist, with one to ruled.tex, available on ymir.
+
+Sun Sep 1 14:53:38 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex: change header comment.
+
+Thu Aug 29 16:01:43 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Formatting equation references): document
+ \eqconstruct.
+ * eplain.texinfo (Macro arguments): document \identity.
+
+ * xeplain.tex (\identity): new definition.
+ (\eqconstruct): new macro \let = \identity.
+ (\@eqdefn): call \eqconstruct to produce the final cross-reference
+ text.
+
+ * eplain.texinfo (Index): rename to `Concept index'.
+
+ * eplain.texinfo (Top): include version number.
+
+Sat Aug 24 07:09:23 1991 Karl Berry (karl at hayley)
+
+ * Makefile (dist): make a doc subdirectory in the distribution.
+ (dos): don't distribute all the test files.
+
+ * Makefile (install): install the info files.
+ (infodir): new variable.
+
+Fri Aug 23 11:48:40 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqsubdefn): expand \@currenteqlabel before
+ defining it.
+
+ * xeplain.tex (\xrlabel): use 95 instead of `\_, so \edef doesn't
+ break quite so badly.
+
+Thu Aug 22 14:42:45 1991 Karl Berry (karl at ra.cs.umb.edu)
+
+ * xeplain.tex (\@eqdef): new command for both \eqdef and \eqsubdef
+ to call.
+ (\eqrefn): new command to do what \eqref does, except omits the
+ call to \eqprint.
+ (\eqref): call \eqrefn.
+ (\eqdefn): allow an optional argument to specify the text of the
+ label, instead of always using numbers.
+ (\@currenteqlabel): defined by \eqdefn to be the last defined
+ label.
+ (\eqsubdefn): use \eqrefn of \@currenteqlabel to define the text
+ for the subequation label.
+ (\@eqdef): use \eqref to generate the printed material, instead of
+ writing the numbers.
+
+ * xeplain.tex (\xrlabel): remove grouping; use \count@ to save
+ \escapechar instead. Also, use \temp instead of \tts.
+ (\xrdef, \@eqdefn): remove grouping.
+
+ * btxmac.tex (\cite): do \printcitestart before \@nocite.
+
+ * merge: don't use /bin/date.
+
+Fri Aug 16 08:06:26 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo: fix node pointers.
+
+Wed Aug 14 14:53:10 1991 Karl Berry (karl at hayley)
+
+ * Makefile (etex.fmt): rm -f etex.aux before creating it.
+ (merge): assume fix-checksum is in PATH.
+
+Mon Aug 12 19:42:07 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Formatting displays): remove the stuff about
+ \generaldisplay, since that's gone.
+
+ * xeplain.tex (\eqsubdefn): new macro to define subequations.
+ (\eqsubdef): its companion.
+ (\eqsubreftext): macro to produce the text of such a reference.
+ (\@eqdefn): new subroutine for \eqsubdefn and \eqdefn.
+ (\subeqnumber): new count register.
+ * eplain.texinfo (Subequation references): new subsection to
+ describe all this.
+
+Mon Aug 5 07:08:55 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eattoken): use a private control sequence for
+ eating, to avoid conflicts.
+ (\@eattoken): \let = \relax.
+
+Sat Jul 20 06:39:48 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Copying): replace with version 2 of the GPL.
+
+ * eplain.texinfo (Local variables): remove this, since it's
+ standard now.
+
+Mon Jul 8 05:46:57 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\leftdisplays): new implementation.
+
+ * xeplain.tex (\eattoken): new macro.
+ * eplain.texinfo (Macro arguments): document it.
+
+Sun Jun 23 11:13:42 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\ifundefined): new macro.
+
+ * xeplain.tex (\blackbox): add \relax at the end.
+
+ * xeplain.tex (\BibTeX): use \TeX.
+ (\MF): use \rm instead of \tenrm.
+
+ * merge: automatically figure out the date, and version, and loop
+ on the checksum.
+ * xeplain.tex (\fmtversion): don't include real version numbers,
+ dates, or the checksum.
+
+ * xeplain.tex (\environment): define \@groupname with \edef
+ instead of \def.
+
+Sat Jun 22 08:23:05 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\@isolatedendenvironmenthelp): improve this message.
+
+Fri May 31 06:19:40 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo: do @finalout, to prevent overfull boxes.
+
+Sun May 19 07:01:12 1991 Karl Berry (karl at hayley)
+
+ * citecust.tex: define the \scriptfont for \ttfam, so that
+ undefined references work properly (found by
+ jxp@ccadfa.cc.adfa.oz.au).
+
+Wed May 15 06:52:20 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\writetocentry): pass in an empty arg to
+ \writenumberedtocentry, not \empty, so the \ifx works right
+ (found by Paul).
+
+Wed May 8 17:04:32 1991 Karl Berry (karl at hayley)
+
+ * Makefile (dos): put texinfo.tex in the DOS distribution.
+
+Tue May 7 12:19:24 1991 Karl Berry (karl at ra.cs.umb.edu)
+
+ * xeplain.tex (\xrefwarningfalse): forgot a \ in front of the \let
+ (found by Paul).
+
+Mon May 6 11:01:07 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\AMS): new macro from \AMSTeX.
+ (\AMSTeX): use it.
+ (\AMSLaTeX): new macro.
+ * eplain.texinfo (logos): document \AMSLaTeX.
+
+ * xeplain.tex (\today): new macro.
+ * eplain.texinfo (Time of day): document it.
+
+Fri Apr 26 08:29:08 1991 Karl Berry (karl at hayley)
+
+ * Makefile (dos): rename INSTALL, remove ORIG.
+
+ * Version 1.9.
+
+ * Makefile (clean): remove the .??O files that texi2dvi creates.
+ (eplain.dvi): use texi2dvi.
+
+ * Makefile (dist): create the file `INSTALL' after making the info
+ files.
+
+ * eplain.texinfo (Installation): bring up to date.
+ * README: likewise.
+
+ * btxmac.tex: final (for now) version.
+
+Mon Apr 22 09:53:53 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\@writeeqdef, \@writexrdef): we don't need a
+ \percentchar at the end of the lines we write anymore, since
+ btxmac.tex does \endlinechar = -1 before reading the aux file.
+
+ * allref.tex: new test file to test all kinds of reference
+ simultaneously.
+
+Mon Apr 15 09:15:51 1991 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Installation): describe \noauxfile.
+
+ * xeplain.tex (\singlecolumn): document (somewhat) better.
+
+ * btxmac.tex: new version from Oren.
+
+Sun Apr 7 14:54:05 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\boxit, \boxitspace): new macros from the TeXbook.
+ * eplain.texinfo (Boxes): document it.
+
+ * xeplain.tex (\hidevrule): remove a spurious space.
+
+ * xeplain.tex (\lbracechar, \rbracechar): new definitions.
+ * eplain.texinfo (Category codes): document them.
+
+Fri Mar 29 17:13:46 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\makecolumns): set the \hsize inside each entry.
+ (\currentcolumn): new register.
+
+ * xeplain.tex (\hidehrule, \hidevrule): comment these; remove a
+ group from \hidevrule.
+
+Tue Mar 26 12:20:35 1991 Karl Berry (karl at ra.cs.umb.edu)
+
+ * xeplain.tex (\linenumber): \let = \@linenumber.
+
+Mon Mar 25 05:52:27 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\writenumberedtocentry): don't test #3 with an
+ \ifx; define it in a control sequence first.
+
+Mon Mar 11 08:56:43 1991 Karl Berry (karl at hayley)
+
+ * Version 1.8.
+
+ * xeplain.tex (\environment, \endenvironment): don't ignore spaces
+ at the end.
+
+ * xeplain.tex (\@undefinedmessage): don't define it if it's
+ already defined.
+
+ * xeplain.tex (\everyjob): expand the old \everyjob.
+
+Fri Mar 8 08:03:50 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\writenumberedtocentry): \ignorespaces after the
+ \fi, not before (found by abrahams@mts.cc.wayne.edu).
+
+Tue Mar 5 08:33:16 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\makeblankbox): give an error message if \box0 is
+ void.
+ (\@makeblankboxhelp): new control sequence with help for the error
+ message.
+
+Mon Mar 4 07:10:10 1991 Karl Berry (karl at hayley)
+
+ * btxmac.tex (\linenumber): define this, and use it in the
+ undefined citation message.
+ * xeplain.tex: use \linenumber in the undefined messages.
+
+ * xeplain.tex: change all \undefined's to \@undefined's.
+
+Sun Mar 3 07:43:11 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex: put the BibTeX definitions in a token register;
+ expand it if \nobibtex is undefined.
+
+Fri Mar 1 16:00:38 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\@redefinealignmentdisplays): Make \displaylines
+ redefine \eqprint, so the equation number still comes out on the
+ right.
+
+ * Makefile (etex.fmt): cp /dev/null onto etex.aux, don't just
+ touch it.
+
+ * xeplain.tex (\if@nobibtex): remove this; just test
+ \ifx\nobibtex\@undefined instead.
+
+ * btxmac.tex (\@innernewdimen): define this.
+ (\if@notfirstcitation, \biblabelwidth, \biblabelextrahang,
+ \@numparams): define using \@inner..., since we include all of
+ btxmac.tex in an \if ... \fi construction in eplain.tex now.
+
+Wed Feb 27 08:02:24 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\@ddisplaytest): this time really remove the
+ trailing spaces; I didn't test it properly before.
+
+ * eplain.texinfo (Justification): remark that setting the
+ linespacing values inside \center et al. is useless.
+
+Sat Feb 23 08:42:12 1991 Karl Berry (karl at hayley)
+
+ * xeplain.toc (\opentocfile): make the \@tocfileopenedtrue be
+ \global (from Paul).
+
+ * xeplain.tex (\fullmonthname): new macro.
+ * eplain.texinfo (Time of day): document it.
+
+Fri Feb 22 15:11:14 1991 Karl Berry (karl at hayley)
+
+ * eqref.tex: say that the output of the \displaylines test should
+ look bad.
+
+ * xeplain.tex (\@displaytest, \@ldisplaytest): use \noexpand on
+ the argument, to prevent obscure errors (that might never
+ actually occur, I'm not sure).
+
+ * xeplain.tex (\@ddisplaytest): remove trailing spaces and/or
+ surrounding braces from the argument to \eqdef (from
+ jxp@ccadfa.cc.adfa.oz.au).
+ (\@removetrailingspaces): new macro.
+
+Sat Feb 2 09:25:30 1991 Karl Berry (karl at hayley)
+
+ * fileexist.tex: new file to test the various possibilities.
+
+ * btxmac.tex (\@testfileexistence): allow an optional argument
+ specifying the root name of the file.
+ (\@finishtestfileexistence): new macro.
+
+ * merge: merge all of btxmac into eplain.tex.
+ * xeplain.tex: rearrange slightly to accommodate this.
+
+Fri Jan 25 11:34:09 1991 Karl Berry (karl at hayley)
+
+ * Version 1.7 (released for ASI only).
+
+ * Makefile (dist): automatically include btxdoc.tex and
+ texinfo.tex in the distribution.
+
+ * Makefile (etex.fmt): don't print all the stupid \font... lines.
+
+ * contents.tex: make a subsection include \cos, to test the
+ non-expansion.
+ * xeplain.tex (\sanitize, \gobblemeaning): new macros from a
+ TUGboat article by Ron Whitney.
+ (\writenumberedtocentry, \writetocentry): do not expand the text
+ of the heading.
+ * eplain.texinfo (Contents): say that the title text is not
+ expanded.
+
+Thu Jan 3 09:07:05 1991 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\beginlist): don't set \parskip = 0pt, in case
+ \parindent is zero.
+ (\printitem): do \vskip-\parskip, so we don't get extra space if
+ \parskip is nonzero.
+
+ * list.tex: test a multiple-paragraph list item with \parindent=0
+ and \parskip nonzero.
+
+Mon Dec 17 12:57:41 1990 Karl Berry (karl at hayley)
+
+ * xeplain.tex (` ' in \obeywhitespace): define to be `\ ' using
+ \def instead of \let, to allow redefinition.
+
+Wed Dec 12 14:34:28 1990 Karl Berry (karl at aten)
+
+ * Version 1.6.
+
+ * eplain.texinfo (Formatting bibliographies): \biblabelextrahang
+ and \parskip must be set inside \bblhook.
+
+ * Makefile (etex.fmt): make sure etex.aux exists.
+
+Mon Dec 10 16:09:30 1990 Karl Berry (karl at aten)
+
+ * eplain.texinfo (Formatting bibliographies): describe
+ \biblabelextrahang and \bblsc.
+
+ * xref.tex: don't unconditionally input eplain.tex.
+
+ * xeplain.tex: don't set \@citewarningtrue after all; that makes
+ it so we always warn about labels.
+ * btxmac.tex (\@readauxfile): set \@citewarningtrue if there was
+ an aux file, so that we get warned about undefined references
+ when we make a format file.
+
+ * xeplain.tex: remove misplaced comment.
+
+Sun Dec 9 07:52:52 1990 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\blanklineskipamount, \@finishobeyedreturn): new
+ definitions to generalize the handling of blank lines in
+ \obeywhitespace.
+ * eplain.texinfo (Obeying spaces): document this.
+
+ * xeplain.tex (\obeywhitespace): use `\ ' instead of
+ `\alwaysspace', and remove the latter.
+ * eplain.texinfo (Obeying spaces): remove reference to \alwaysspace.
+
+ * xeplain.tex: set \@citewarningtrue after reading the stuff from
+ btxmac, so that we get undefined label messages when we use a
+ format file.
+
+Sat Dec 1 07:44:52 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Installation): refer to `\fmtversion', not
+ `\eplainversion'.
+
+ * btxmac.tex (\@getoptionalarg): new macro.
+ * xeplain.tex (\getoptionalarg): \let = to above.
+ * eplain.texinfo (Macro arguments): document it.
+
+ * xeplain.tex (\futurenonspacelet): new macro from the TeXbook.
+ * eplain.texinfo: document it.
+
+ * btxmac.tex (\@setletters): only check characters with codes
+ below 128 if we are the old TeX.
+
+ * xeplain.tex (\@ddisplaytest): omit extra braces around the call
+ to \eqdef.
+ (\eqdef, \eqdefn): ignore following spaces.
+
+ * xeplain.tex (\@undefinedmessage): change wording slightly.
+
+Fri Nov 30 10:51:02 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Installation): describe \eplain.
+
+ * eplain.texinfo (Citations): use @file instead of @t, and make
+ editorial changes.
+
+Wed Nov 28 06:57:24 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Cross-references): escapes are catcode 0, not 1.
+ Also, don't put a \ in the invalid example.
+
+ * eplain.texinfo (Allocation macros): use `proclaim' in the
+ example, not `innerproclaim'.
+
+ * xeplain.tex (\alwaysspace): use \font instead of \the\font.
+
+ * xeplain.tex (^^I): use \fontdimen2\font, instead of \tt, since
+ \tt might not be a font selector.
+
+ * Makefile (etex.fmt): remove etex.aux.
+
+ * xeplain.tex (\displayhook): new token register expanded at
+ \everydisplay time.
+ * eplain.texinfo (displays): document this.
+
+Tue Nov 27 08:24:41 1990 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqdef): make \eqno = \relax if we are inner.
+ * eplain.texinfo (Equation references): \eqdefn doesn't produce
+ anything.
+
+ * eqref.tex: test \eqdef inside \displaylines.
+
+ * xeplain.tex (\eplain): define to be `t'.
+
+Sun Nov 25 09:30:46 1990 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\eqref, \xrefn): no, that's not enough. Use
+ \if@citewarning here, so the \if's and \fi's match properly.
+ * eplain.texinfo (Citations): document \xrefwarningtrue.
+ (Cross-references): ditto.
+
+ * xeplain.tex (\ifxrefwarning): define to be \if@citewarning, so
+ changes to the latter are reflected in the former.
+
+Sat Nov 24 08:21:35 1990 Karl Berry (karl at hayley)
+
+ * xeplain.tex: say that we have two version numbers now in the
+ header comment.
+
+Thu Nov 22 10:48:35 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Equation references): \eqdef can be used in an
+ \eqalignno now, so \eqdefn is useful in even fewer sitations.
+
+Thu Nov 15 10:28:13 1990 Karl Berry (karl at hayley)
+
+ * Version 1.5.
+
+ * merge: remove comments from xeplain.tex as well as btxmac.tex,
+ and fix the checksum and filename in the final eplain.tex.
+
+ * xeplain.tex (\if@fileexists, ...): \let = \relax, in case the
+ file is being read twice.
+
+ * Makefile (etex.fmt): new rule.
+
+Wed Nov 14 19:02:28 1990 Karl Berry (karl at aten)
+
+ * eplain.texinfo (Iterations): fix syntax error in example (from
+ bsuggs@hac2arpa.hac.com).
+
+Mon Nov 12 10:34:37 1990 Karl Berry (karl at hayley)
+
+ * etex.tex: mention that plain should be loaded.
+ * eplain.texinfo (Installation): mention etex.tex.
+
+ * xeplain.tex (\ifnobibtex): set to true if \nobibtex is defined.
+ * eplain.texinfo (Installation): describe this.
+
+ * btxmac.tex: new version incorporating my changes from Oren.
+ \@citewarning has to be defined in the non-bibtex specific part.
+
+Sat Nov 10 08:49:07 1990 Karl Berry (karl at hayley)
+
+ * xeplain.tex (\xrlabel): explain how _ works.
+
+Wed Oct 31 06:24:56 1990 Karl Berry (karl at hayley)
+
+ * merge: make eplain.tex readonly after creating it.
+
+Tue Oct 30 07:52:07 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo: `eplain' changed to `Eplain' throughout; a few
+ other typos corrected.
+
+ * btxmac.tex (\@innerdef): new macro to give an inner definition
+ to an outer control sequence.
+ (\@innernewcount, \@innernewdimen, \@innernewif,
+ \@innernewwrite): use it to define these macros.
+ * xeplain.tex: make \innernewcount et al. synonyms for the above,
+ and also make inner versions of all the other plain TeX macros.
+ * eplain.texinfo (Allocation macros): new section to document this.
+
+ * xeplain.tex: rename \@xrlabel to \xrlabel.
+ * eplain.texinfo (Converting to characters): document \xrlabel.
+
+Sun Oct 28 08:35:20 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Cross-references): explain which characters are
+ valid.
+
+ * btxmac.tex (\@setletters): change all characters with category
+ code 12 into category code 11, instead of writing a list.
+ (Also change _.)
+ (@setmoreletters): remove.
+
+ * btxmac.tex (\@resetnumerals): also change the category codes of
+ ', `, and ".
+
+Sat Oct 27 09:46:54 1990 Karl Berry (karl at hayley)
+
+ * eplain.tex becomes xeplain.tex; a shell script `merge' puts
+ definitions from btxmac.tex that are used in the rest of eplain
+ into xeplain, creating eplain.tex. Also, a new conditional,
+ \ifnobibtex, determines whether we read btxmac.tex or not.
+ (Being able to not read btxmac suggested by Paul.)
+
+Sun Oct 21 14:03:31 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Cross-references): users should use
+ \@setmoreletters, not redefine \@setletters.
+
+Wed Oct 17 07:14:26 1990 Karl Berry (karl at hayley)
+
+ * eplain.tex (\eqdef): don't do \eqno if we're inner.
+
+Sat Oct 13 07:28:11 1990 Karl Berry (karl at hayley)
+
+ * eplain.tex (\leftdisplayindent): new \dimen parameter
+ (suggested by wiawkph@dutrun.tudelft.nl).
+ (\leftdisplays): use it.
+ * eplain.texinfo (Displays): document it.
+
+ * eplain.tex (\@ddisplaytest): new macro to find an \eqdef in a
+ display.
+ (displaysetup): call it.
+
+Fri Oct 12 06:27:52 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo: describe @menu entries.
+
+ * eplain.tex (\topmargin, et al.): new macros.
+ * eplain.texinfo (Margins): new section to document them.
+
+Thu Oct 11 06:30:54 1990 Karl Berry (karl at hayley)
+
+ * xref.tex: forgot \xref in front of {label2}.
+
+Tue Oct 9 06:48:08 1990 Karl Berry (karl at hayley)
+
+ * eplain.tex (\xrdef): use \@xrlabel, not \xrlabel.
+
+Tue Sep 25 17:55:32 1990 Karl Berry (karl at hayley)
+
+ * eplain.tex (\TeX): new macro, adds \null to plain's definition.
+
+Fri Sep 14 13:54:01 1990 Karl Berry (karl at hayley)
+
+ * eplain.tex (\writenumberedtocentry): expand the third parameter
+ now, instead of at the time of the \write.
+ * eplain.texinfo (Contents): document this.
+
+Thu Sep 13 08:09:25 1990 Karl Berry (karl at hayley)
+
+ * eplain.texinfo (Citations, Formatting citations, Formatting
+ bibliographies): emendations from Oren Patashnik
+ <opbibtex@neon.stanford.edu>.
+
+ * eplain.tex (\footnoterule): new macro from plain TeX,
+ generalized to arbitrary dimensions.
+ (\vfootnote): advance \splittopskip by \interfootnoteskip, so that
+ split footnotes have the right amount of space at the top.
+ * footnote.tex: test the new dimension parameters.
+ * eplain.texinfo (Footnotes): document all this.
+
+Fri Sep 7 06:38:49 1990 Karl Berry (karl at hayley)
+
+ * Version 1.4.
+
+2005-08-13 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/ChangeLog, doc/Makefile: Added "public domain" note.
+
+2005-08-12 Karl Berry <karl@freefriends.org>
+
+ * doc/userdef.texi, doc/eplain.info, doc/eplain.texi: wording
+
+2005-08-12 Oleg Katsitadze <geolsoft@mail.ru>
+
+ * doc/Makefile (doc): Added btxdoc prerequisite.
+ (pdf): New target.
+ (btxdoc): New target.
+ (eplain.html): No need for it, html is good enough.
+ (distclean): Brought up-to-date with the changes.
+
+ * doc/userdef.texi (Contents): \readtocfile does not wipe out toc
+ file any more, to allow multiple contents
+
+Sun Apr 25 22:30:00 1999 Adam Lewenberg <ahl@uakron.edu>
+
+ * doc/progdef.texi: Added a section on user-defined environments
+ to progdef.texi and fixed a few typos in documentation. Suggested
+ by Paul Abrahams.
+
+Sun Dec 7 18:29:00 1997 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * doc/eplain.texi: Force line length of documentation to be 6.5 inches
+ by adding a @changepagesizes command.
+
+Fri Dec 5 09:10:00 1997 Adam Lewenberg <adam@math.uiuc.edu>
+
+ * doc/userdef.texi: Added \gutterbox explanation to multicolumn
+ section.
+
+Sun Jun 2 09:30:00 1996 Adam Lewenberg (adam@math.uiuc.edu)
+
+ * doc/userdef.texi: added a missing word in section on path
+ command.
+
+Mon Apr 8 12:00:00 1996 Adam Lewenberg (adam@math.uiuc.edu)
+
+ * doc/userdef.texi: changed dimensions in section on margins from in to
+ true in.
+
+Thu Jul 28 15:41:40 1994 Karl Berry (karl@cs.umb.edu)
+
+ * doc/userdef.texi: \{above,below}doublecolumnskip =>
+ \{above,below}columnskip. From wiawkph@dutrun2.tudelft.nl.
+
+Sat Apr 30 17:51:52 1994 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.6.
+
+ * doc/userdef.tex (Indexing): New section.
+ (Contents): Describe new generic contents commands.
+
+Sun Apr 17 10:06:50 1994 Karl Berry (karl@ra.cs.umb.edu)
+
+ * doc/progdef.texi (Converting to characters): Remove spurious period.
+ * doc/userdef.tex (Verbatim listing, Cross-references): Fix other typos.
+ * doc/invoke.texi: Rewrite \nobibtex section.
+ From adam@symcom.math.uiuc.edu.
+
+Wed Mar 30 14:27:21 1994 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.5.
+
+ * doc/userdef.texi (Verbatim listing): Document \makeverbatimescapechar.
+
+Tue Mar 22 10:48:01 1994 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.4.
+
+Thu Mar 3 17:47:55 1994 Karl Berry (karl@cs.umb.edu)
+
+ * doc/invoke.texi (Invoking Eplain): Document \noarrow.
+
+ * doc/userdef.texi (Formatting bibliographies): Index extra space
+ between the items.
+
+Sun Apr 11 15:44:58 1993 Karl Berry (karl@cs.umb.edu)
+
+ * doc/userdef.texi (Equation references): Document empty equation labels.
+
+Sun Apr 4 13:21:12 1993 Karl Berry (karl@cs.umb.edu)
+
+ * doc/install.texi: Include information for emtex.
+
+ * doc/Makefile (TEX): Be sure .. is in TEXINPUTS.
+
+ * doc/Makefile (distclean): Remove empty .??s files.
+
+Mon Mar 1 06:26:51 1993 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.3.
+
+Fri Dec 18 10:14:25 1992 Karl Berry (karl@cs.umb.edu)
+
+ * doc/progdef.texi: Document \expandifdefined.
+
+Thu Nov 12 17:53:07 1992 Karl Berry (karl@cs.umb.edu)
+
+ * doc/userdef.texi (Formatting displays): \displaysetup is now
+ \leftdisplaysetup.
+
+Wed Nov 11 07:08:12 1992 Karl Berry (karl@cs.umb.edu)
+
+ * Version 2.2.
+
+Mon Nov 9 09:59:24 1992 Karl Berry (karl@cs.umb.edu)
+
+ * doc/Makefile (dist): Make the Info and index files after inserting
+ the new version number.
+
+Thu Oct 22 10:46:28 1992 Karl Berry (karl@cs.umb.edu)
+
+ * update.el (make-backup-files): Set to nil.
+
+Tue Aug 18 15:55:15 1992 Karl Berry (karl@hayley)
+
+ * doc/Makefile (INSTALL): `Node: Installation' does not begin a line.
+
+Fri Jul 31 19:18:12 1992 Karl Berry (karl@hayley)
+
+ * doc/userdef.texi (Verbatim): \verbatim doesn't work in macro definitions.
+
+Fri Jul 17 09:55:10 1992 Karl Berry (karl@hayley)
+
+ * doc/userdef.texi (Tables): update info for ruled.tex (from
+ mathew@bach.crhc.uiuc.edu).
+
+Fri May 29 09:35:59 1992 Karl Berry (karl@hayley)
+
+ * doc/userdef.texi (Paths): new section.
+
+Thu May 21 09:08:18 1992 Karl Berry (karl@hayley)
+
+ * doc/userdef.texi (Verbatim listing): had the example wrong.
+
+Tue May 12 15:28:04 1992 Karl Berry (karl@hayley)
+
+ * doc/userdef.texi (Cross-references): had sense of valid xref
+ catcodes inverted.
+
+Thu May 7 08:08:24 1992 Karl Berry (karl@hayley)
+
+ * doc/Makefile (dist): link the .texi files.
+
+Wed May 6 15:41:24 1992 Karl Berry (karl@hayley)
+
+ * doc/eplain.texi: add an `@paragraphindent'.
+
+Tue May 5 11:05:43 1992 Karl Berry (karl@hayley)
+
+ * doc/Makefile (install): use a loop to install the multiple info
+ files.
+ (eplain.info): depend on *.texi.
+ * doc/*.texi: split up eplain.texinfo.
+
+Tue Apr 28 08:23:30 1992 Karl Berry (karl@hayley)
+
+ * doc/Makefile (prefix, infodir, INSTALL_DATA): add definitions.
+ (distclean): new target.
+ (dist): put INSTALL in the distribution.
+
+Sun Apr 19 08:17:43 1992 Karl Berry (karl@hayley)
+
+ * doc/eplain.texinfo (\expandonce): new subsection.
+ (\futurenonspacelet): change to a subsection.
+ (\ifundefined): might as well document this here, also.
+ (Expansion): new section.
+
+ * doc/eplain.texinfo (Verbatim listing): document \listingfont.
+
+ * doc/Makefile (eplain.dvi): tex eplain.texinfo, not eplain.cps.
+
+Tue Mar 31 14:12:03 1992 Karl Berry (karl at hayley)
+
+ * doc/eplain.texinfo (Boxes): document \boxit using \e[hv]rule.
+
+Wed Mar 25 09:22:29 1992 Karl Berry (karl at hayley)
+
+ * Version 2.1.
+
+ * doc/eplain.texinfo: add section on patents and copyrights.
+
+Sun Mar 15 08:22:56 1992 Karl Berry (karl at hayley)
+
+ * doc/Makefile: new file.
+
+
+This file is public domain.
diff --git a/macros/eplain/doc/INSTALL b/macros/eplain/doc/INSTALL
new file mode 100644
index 0000000000..dcd705281b
--- /dev/null
+++ b/macros/eplain/doc/INSTALL
@@ -0,0 +1,46 @@
+Installation
+************
+
+Your TeX installation should already contain a version of Eplain
+(`eplain.tex') in its main `texmf' tree (usually under
+`/usr/share/texmf/tex/eplain/' on Unix systems). To install a newer
+version of Eplain, put the new `eplain.tex' (included in Eplain
+distributions) in the `tex/eplain/' subdirectory of your local `texmf'
+tree. The newer version you install in the local tree should override
+the older one in the main tree.
+
+ The location of the local `texmf' tree obviously depends on your
+operating system and TeX installation. On Unix systems the usual
+location is `/usr/local/share/texmf/'. If you don't have write
+permissions for `/usr/local/share/texmf/', many installations read the
+`texmf' tree in the user's home directory; `eplain.tex' then should go
+under `~/texmf/tex/eplain/'. For more information about TeX directory
+structure, please see
+`http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds'.
+
+ If you prefer to install `eplain.tex' in a non-standard place, set
+an environment variable (`TEXINPUTS' for the Web2C port of TeX to Unix)
+to tell TeX how to find it.
+
+ If you want, you can also create a format (`.fmt') file for Eplain,
+which will eliminate the time spent reading the macro source file with
+`\input'. You do this by issuing a sequence of Unix commands something
+like this:
+
+ prompt$ touch eplain.aux
+ prompt$ initex
+ This is TeX, ...
+ **&plain eplain
+ (eplain.tex)
+ *\dump
+ ... MESSAGES ...
+
+You must make sure that `eplain.aux' exists _before_ you run `initex';
+otherwise, warning messages about undefined labels will never be issued.
+
+ You then have to install the resulting `eplain.fmt' in your local
+`texmf' tree or set an environment variable to tell TeX how to find it.
+For the Web2C port of TeX to Unix, format files are usually installed
+under `/usr/local/share/texmf/web2c/' or `/var/lib/texmf/web2c/'; the
+environment variable is `TEXFORMATS'.
+
diff --git a/macros/eplain/doc/NEWS b/macros/eplain/doc/NEWS
new file mode 100644
index 0000000000..090c3eee8d
--- /dev/null
+++ b/macros/eplain/doc/NEWS
@@ -0,0 +1,195 @@
+$Id: NEWS 49 2019-05-31 16:20:41Z karl $
+This file records noteworthy changes. This file is public domain.
+
+ 3.9 (31 May 2019)
+* btxmac.tex missed one macro renaming, making \providecommand fail.
+* PDF bookmark/outlines example in documentation, and url updates.
+
+ 3.8 (12 May 2016)
+* btxmac.tex internal macros renamed to avoid conflict with babel's plain.def.
+* Update ifpdf.sty.
+
+ 3.7 (5 February 2015)
+* Add \raggedleft, analogous to plain's \raggedright.
+* Show a possible definition of \fbox in the manual,
+ as it is not defined by miniltx.
+
+ 3.6 (30 September 2013)
+* ignore spaces after optional arguments.
+
+ 3.5 (13 February 2013)
+* make \providecommand and \newcommand \long, like LaTeX.
+* restored the catcode of @ at \endpackages.
+* ifpdf.sty: update to latest version.
+
+ 3.4 (21 February 2010)
+* Eplain repository moved from cvs.sarovar.org:/cvsroot/eplain to
+ svn://tug.org/eplain/trunk.
+* Changed \ProcessOptions from miniltx.tex to gobble the optional star
+ argument, to accommodate the new version of epstopdf.sty.
+
+ 3.3 (21 July 2009)
+* New commands \eqnum and \eqalignnum, counterparts of \(l)eqno and
+ \(l)eqalignno, producing equation numbers which can be uniformly
+ transformed to right-aligned (\righteqnumbers) or left-aligned
+ (\lefteqnumbers).
+* Eplain has borrowed the eTeX, ExTeX, XeTeX and XeLaTeX logos from
+ tugboat.dtx.
+* \idxnameseparator is now expanded once so that the .idx file
+ contains its contents instead of the macro call.
+* Non-silent indexing macros have been fixed not to produce a spurious
+ newline when newline's catcode is 13 (active).
+* Eplain now takes care to unactivate any active characters before
+ typesetting index terms in the margin for proofing.
+* Updated ifpdf.sty.
+* LaTeX package reloading warnings are now not shown on the terminal.
+* Documentation improvements.
+
+ 3.2 (26 November 2007)
+* Fixed a bug which caused silent indexing macros to output spurious
+ space in vertical mode.
+* Added a switch to disable index file input/output.
+* Fixed xref and bibliography label definition macros so that reading
+ in a .aux file with a large number of label definitions does not
+ overflow the save stack.
+* Fixed double-column macros -- they were occasionally losing material
+ and producing columns too high to fit on a page. Also improved
+ appearance of the last column, which often came out spaced out.
+
+ 3.1 (3 December 2006)
+
+General:
+* Rearranged the distro to comply with TDS.
+* Distro now includes PDF, HTML and INFO versions of the manual.
+* Removed etex.tex.
+
+LaTeX packages under Eplain:
+* When reloading LaTeX packages, warn and skip reloading, instead of
+ giving an error. Suggested by Dan Luecking.
+* The primitive \input is now restored after loading LaTeX packages.
+* Added more "LaTeX" defs needed by: the `draft' option to
+ graphic{s,x}.sty; warnings from epstopdf.sty when graphics.sty is
+ not loaded.
+
+Hyperlinks:
+* Added the `hypertex' driver, and made it the default driver.
+* Made footnote hyperlinks off by default.
+* Added the \href macro. Suggested by Dorai Sitaram.
+* LABEL argument of the hyperlink macros now allow special characters
+ like # and ~ (useful for URLs). Suggested by Dorai Sitaram.
+* Fixed a hyperlink-related bug in equation macros.
+* Fixed a bug in the `nolinks' driver.
+* Added \writenumberedtocline macro, which is \writenumberedtocentry
+ with permuted parameters. Suggested by Dorai Sitaram.
+* Hyperlink macros now ignore leading spaces in option lists.
+* All hyperlink macros now report errors until links are enabled.
+
+Cross-references, TOC and indexing:
+* Added warnings about multiply defined xref labels. Suggested by
+ Tomas Penicka.
+* Fixed \definexref to (once again) ignore following spaces.
+* Indexing macros now read TERM, SUBTERM and SEE... arguments
+ verbatim, to allow special characters and catcode changes.
+ Suggested by Dorai Sitaram.
+* Extended the TOC macros: when given an integer for the type of a
+ TOC entry, they write \tocentry{NUM}... to the .toc file. Suggested
+ by Dorai Sitaram.
+
+Programming defs:
+* Added \ifinteger and \isinteger macros.
+* Added \For loop which strips off leading spaces from items.
+
+Manual:
+* Added demo subdir with demo files, and added new chapter `Demo
+ files' to the manual.
+* Documented \ifempty, the extended \loop macro, and the new macros.
+* Many small improvements and additions to the manual.
+
+Other:
+* Added new \nolastlinelisting listing hook which omits the last
+ (empty) line of the file.
+
+ 3.0 (20 September 2005)
+* Eplain now hosted at Sarovar: http://sarovar.org/projects/eplain/
+* Support for hyperlinks!
+* Support for (a few) LaTeX packages, notably graphicx and color.
+* Incorporated ifpdf.sty into eplain.tex [2005-08-15].
+* Many improvements of double-column macros by Stepan Kasal.
+* ConTeXt compatibility; do not wipe out toc file unnecessarily to
+ allow multiple contents. [2005-08-12].
+* Avoid pagebreak at the xref \write before a list item. [2004-07-26]
+* When under \indexproofing, allow hyphenation of indexed words and
+ avoid shift of page body. [2004-08-31]
+* New documentation for the hyperlinks and the LaTeX package support,
+ many improvements of the old docs.
+
+ 2.8 (2 September 2000)
+* Added a section on user-defined environments to progdef.texi and
+ fixed a few typos in documentation. Suggested by Paul Abrahams
+ [25 April 1999]
+* Added a fix to a buggy double-column macro that Adam Lewenberg
+ introduced when attempting to fix the balancing macros.
+ [9 April 2000]
+
+ 2.7 (14 January 1998)
+* Added the control sequence \gutterbox as a hook to add arbitrary
+ vertical material between columns in multi-column mode. [5 December 1997]
+* Removed spurious space in \verbatim macro. [26 March 1997]
+* Added some code to the multiple columns section so that when
+ switching from multi- to single-columns lines are not lost.
+ [22 September 1996].
+* Changed \smash to \smash@@ in arrow.tex to allow arrow.tex to work with
+ amstex. [2 March 1996].
+* Changed all dimension values in margin setting macros to 'true'; redefined
+ \magnification so that this works.
+
+ 2.6 (2 May 1994)
+* Indexing support (in conjunction with MakeIndex).
+* Generalization of .toc files for lists of figures/tables, etc.
+* \commdiag and other arrow macros work again.
+* \eqalignno right-justifies the first column in \leftdisplays, as in
+ non-leftdisplays.
+
+ 2.5 (31 March 1994)
+* Do not ignore first \ref command.
+* Make \verbatim (and the || feature) work again (thanks to Dorai Sitaram).
+
+ 2.4 (16 March 1994)
+* \catcode of @ properly restored (reported by adam@symcom.math.uiuc.edu).
+* `| ' in \verbatim argument documented (also reported by adam).
+* | not hardwired as the \verbatim escape character (thanks to
+ dorai@cs.rice.edu).
+* Defining \noarrow before eplain.tex is read omits arrow macros
+ (suggested by Rex Shudde <0024P@NAVPGS.BITNET> and
+ murray@macadam.mpce.mq.edu.au.)
+* Double column macros revamped (thanks to guichard@fermat.whitman.edu) so
+ \singlecolumn can be invoked on the same page as \doublecolumns.
+ 3- and 4-column typesetting also supported.
+ Column ejects also supported (sort of).
+* \parskip set to zero before each footnote (but not for the footnote text).
+* \ref and \cite conflicts with amstex described in manual.
+
+ 2.3 (1 March 1993)
+* New macros for arbitrary cross-references.
+* \iterate is redefined to allow \else in loops.
+* texnames.sty uses \spacefactor1000 instead of an empty hbox to handle
+ \TeX at the end of a sentence.
+* New macros for hooks and properties.
+* \centereddisplays and \leftdisplays can be repeated, and called in any
+ order.
+* New macros \csn and \ece to do common expansion things.
+
+ 2.2 (11 November 1992)
+* New \toks register \everylist, expanded at the start of every list.
+* \footnoterulewidth defined as 2in, not 2true in, thus allowing the use
+ of \mag after reading eplain.tex. The `2true in' was Knuth's, but I
+ don't know why he did it.
+* \obeywhitespace works inside a \vbox.
+* \boxit is \long, and uses \ehrule and \evrule.
+* \writenumberedtocentry expands the chapter number, so `\the
+ <register>' can be used.
+* \verbatim doesn't begin and end with \par, so it can be used in the
+ middle of a paragraph.
+* \pathafterhook added to \path in path.sty, so macros can execute
+ cleanup actions.
+* The \path command and friends are documented in the manual.
diff --git a/macros/eplain/doc/README b/macros/eplain/doc/README
new file mode 100644
index 0000000000..be08b77aa6
--- /dev/null
+++ b/macros/eplain/doc/README
@@ -0,0 +1,35 @@
+$Id: README 32 2016-05-14 15:28:35Z karl $
+(This file is public domain.)
+
+This file describes the Eplain (expanded or extended plain, take your
+pick) distribution. The current version number is at the beginning and
+end of eplain.tex, among other places.
+
+See INSTALL for installation and basic usage hints.
+
+eplain.tex is the macro file. This file is generated (by the Unix shell
+scripts in the util/ directory) from xeplain.tex, btxmac.tex, arrow.tex,
+and other files. Unless you are hacking the macros, you should have no
+need to regenerate the file; just use the one that's provided. If you
+do regenerate it, you will need a date program which understands the %B
+format (GNU date does).
+
+The doc subdirectory is documentation in various formats.
+
+The files in the test subdirectory are of course for testing of various
+features, but also provide some examples of usage.
+
+The util subdirectory contains scripts to help with "see" and "see also"
+index entries, and making index entries with hyperlinks.
+
+The original Eplain macros and most of the manual are in the public
+domain. Other pieces are covered by other licenses;
+see the file headers for specifics. It is entirely free software.
+
+Eplain was originally developed for the book TeX for the Impatient,
+published by Addison-Wesley in 1990. That book is now freely available,
+from http://www.gnu.org/software/teximpatient, along with several
+translations.
+
+Mailing list: http://lists.tug.org/bug-eplain (bug-eplain@tug.org)
+The Eplain home page is http://tug.org/eplain.
diff --git a/macros/eplain/doc/demo/Makefile b/macros/eplain/doc/demo/Makefile
new file mode 100644
index 0000000000..7a578663f3
--- /dev/null
+++ b/macros/eplain/doc/demo/Makefile
@@ -0,0 +1,47 @@
+# Makefile for the Eplain demos. This file is public domain.
+
+PDFTEX = pdftex
+DVIPDFM = dvipdfmx
+TEXI2PDF = texi2dvi --pdf
+
+
+.PHONY: all pdftex dvipdfm dvips mostlyclean clean distclean maintainer-clean
+
+
+all: pdftex dvipdfm dvips
+
+#
+# Documents which have to be processed with pdfTeX.
+#
+pdftex: xhyper.pdf lscommnt.pdf
+
+xhyper.pdf: xhyper.tex ctan_lion_350x350.png
+ PDFLATEX=$(PDFTEX) $(TEXI2PDF) xhyper.tex
+
+lscommnt.pdf: lscommnt.tex
+ PDFLATEX=$(PDFTEX) $(TEXI2PDF) lscommnt.tex
+
+ctan_lion_350x350.png:
+ @echo "Please download"
+ @echo " ftp://tug.ctan.org/ftpmaint/CTAN_lion/ctan_lion_350x350.png"
+ @echo "and place it in the demo subdirectory."
+ exit 1
+
+#
+# Documents which have to be processed with dvipdfm(x).
+#
+dvipdfm:
+
+#
+# Documents which have to be processed with dvips.
+#
+dvips:
+
+
+clean mostlyclean:
+ rm -f xhyper.{aux,log} lscommnt.log
+
+distclean: clean
+ rm -f xhyper.pdf lscommnt.pdf
+
+maintainer-clean: distclean
diff --git a/macros/eplain/doc/demo/lscommnt.tex b/macros/eplain/doc/demo/lscommnt.tex
new file mode 100644
index 0000000000..26d3ec7616
--- /dev/null
+++ b/macros/eplain/doc/demo/lscommnt.tex
@@ -0,0 +1,47 @@
+% (This file is public domain.)
+% Demonstrate how Eplain can be used to include a TeX source file
+% verbatim, typesetting comments in colored italic typewriter type.
+
+% Load Eplain and LaTeX's color.sty package.
+\input eplain
+\beginpackages \usepackage{color} \endpackages
+\nopagenumbers % Disable page numbers.
+\font\commentfont = cmitt10 % Font for the comments (italic \tt).
+% We'll define some `protected' macros with `@' in their names.
+\makeatletter
+% Define an equivalent of Eplain's \letreturn, to be able to assign
+% various actions to the (active) percent character.
+\begingroup \makeactive\%
+ \gdef\letpercent{\let%}
+\endgroup
+% The listing hook to be called in \setuplistinghook, see below. It
+% makes `%' active and assigns it a `start comment' action.
+\def\hlightcommentslisting{\makeactive\% \letpercent\start@comment}%
+% This is what `%' is aliased to before a comment is started.
+\def\start@comment{%
+ \leavevmode % Needed in the very first line of the input to process
+ % the new par (possibly inserting line number) before we
+ % kick in with the color and stuff.
+ \begingroup % Isolate color and font changes and the redefinitions.
+ \commentfont
+ \color[cmyk]{0.28,1,1,0.35}%
+ \percentchar % Produce the actual `%' and
+ \letpercent\percentchar % make all following `%'s do the same.
+ \letreturn\end@comment % Call \end@comment at end-of-line.
+}
+% \end@comment (alias for ^^M inside a comment) will end the comment
+% started by \start@comment. We make ^^M active temporarily so that
+% the active version of ^^M gets "frozen" into \end@comment.
+\begingroup \makeactive\^^M % Avoid ^^M's from here on.
+ \gdef\end@comment{\endgroup ^^M}%
+\endgroup
+\resetatcatcode % Make `@' again inaccessible for use in macro names.
+
+% Define \setuplistinghook to setup comments highlighting, line
+% numbering and omitting the last (empty) line of input.
+\def\setuplistinghook{\hlightcommentslisting \linenumberedlisting
+ \nolastlinelisting}
+% Isn't this fun? This file typesets itself, with the extra bonus of
+% the pretty-printed comments and numbered source lines!
+\listing{lscommnt}
+\bye
diff --git a/macros/eplain/doc/demo/xhyper.tex b/macros/eplain/doc/demo/xhyper.tex
new file mode 100644
index 0000000000..54742cb50b
--- /dev/null
+++ b/macros/eplain/doc/demo/xhyper.tex
@@ -0,0 +1,190 @@
+% (This file is public domain.)
+%
+% This file demonstrates the following features of Eplain:
+%
+% - explicit and implicit hyperlinks;
+% - symbolic cross-references;
+% - inserting external graphics using |\includegraphics| from
+% the \LaTeX\ package |graphicx.sty|.
+% - rotating text using |\rotatebox| from |graphicx.sty|.
+%
+% The compiled demo can be downloaded from
+%
+% http://tug.org/eplain/demo
+%
+% In order to compile this file yourself, you will need the CTAN lion
+% drawing by Duane Bibby from
+%
+% ftp://tug.ctan.org/ftpmaint/CTAN_lion/ctan_lion_350x350.png
+%
+% (thanks, |www.ctan.org|). Place the image file in the same
+% directory with this file, and change to that directory. Now, to
+% produce a PDF, run twice the command
+%
+% pdftex xhyper.tex
+%
+% During the first run, Eplain will write the information about the
+% cross-references into |xhyper.aux|, and during the second run this
+% information will be read by Eplain to typeset the references.
+%
+% Demo case:
+%
+% Suppose you are using pdf\TeX, have a figure you want to insert
+% scaled to $200\,pt$ horizontally, and you want this figure to
+% completely fill the PDF viewer's window whenever the reader
+% selects a link pointing to this figure. Additionally, you want to
+% typeset some text as live hyperlinks, clicking on which will start
+% a Web browser and open a URL.
+
+\input eplain
+
+% Load \LaTeX\ packages.
+\beginpackages
+ % |url.sty| provides the |\url| command which we will use to typeset
+ % a URL. We request that |url.sty| be the version from June~27,
+ % 2005, or later, because earlier versions had problems interacting
+ % with plain \TeX.
+ \usepackage{url}[2005/06/27]
+ % |color.sty| provides support for colored text; all hyperlinks are
+ % automatically colored by Eplain when this package is loaded. We give
+ % the |dvipsnames| option because we want to use named colors from the
+ % |dvips| graphics driver.
+ \usepackage[dvipsnames]{color}
+ % Finally, we load |graphicx.sty|, for the macros |\includegraphics|
+ % and |\rotatebox|.
+ \usepackage{graphicx}
+\endpackages
+
+% Remember that hyperlinks are off by default. Therefore, we need to
+% enable them.
+\enablehyperlinks
+
+% Customize some hyperlink options. First, we set border width to~$0$
+% for all links to get rid of the default boxes around links (we
+% prefer colored links over the boxed links). Next, we say that all
+% links created by the |url| hyperlink group (which means the |\url|
+% command from |url.sty|) must be colored using the named color
+% |BlueViolet|.
+\hlopts{bwidth=0}
+\hlopts[url]{colormodel=named,color=BlueViolet}
+
+% Inhibit page numbering (we have only one page).
+\nopagenumbers
+
+% Define a class word for the cross-reference class |figure|. This
+% word, when defined, will be automatically prepended by Eplain to the
+% reference created by |\ref| (read on to see its use).
+\def\figureword{fig.}
+
+% Allocate a count register for the figure's number, and a box
+% register which we'll use to measure dimensions of the image.
+\newcount\fignumber
+\newbox\imgbox
+
+% Now comes the fun part--constructing the figure for the image of the
+% \CTAN\ lion. We define a macro
+%
+% \fig{LABEL}{FILENAME}{CAPTION}{WIDTH}
+%
+% which creates a figure using LABEL for the cross-reference and
+% hyperlink label, reading the image from file FILENAME, using CAPTION
+% to name the figure, and WIDTH to scale the image horizontally.
+\def\fig#1#2#3#4{%
+ % Leave some space above the figure. This will also ensure that we
+ % are in the vertical mode before we produce a |\vbox|.
+ \medskip
+ % Advance the figure number. |\global| ensures that the change to
+ % the count register is global, even when |\fig| is buried inside a
+ % group.
+ \global\advance\fignumber by 1
+ % We use |\includegraphics| (from |graphicx.sty|) to load the image,
+ % scaled to the specified width, into our ``measuring'' box
+ % |\imgbox|.
+ \setbox\imgbox = \hbox{\includegraphics[width=#4]{#2}}%
+ % To make the demo even more exciting, let's put the figure's
+ % caption to the left of the image into the |\indent| space of the
+ % new paragraph, and rotate the caption~$90^\circ$.
+ \textindent{%
+ \rotatebox{90}{F{\sc IGURE}~\the\fignumber. #3}%
+ }%
+ % Continue the paragraph by constructing a |\vbox| with the image of
+ % the lion. We use |\definexref| to define the cross-reference
+ % label.
+ \vbox{%
+ % In addition to the cross-reference label, |\definexref| will
+ % create a hyperlink destination with the same label. Therefore,
+ % we customize this destination to do what we need. We say that
+ % destination type for the hyperlink group |definexref| (to which
+ % |\definexref| belongs) should be |fitr|. This destination type
+ % will magnify the rectangle specified by the options |width|,
+ % |height| and |depth| to the PDF viewer's window. Therefore, we
+ % set those options accordingly with |\hldestopts| (notice the use
+ % of |depth| instead of |height|---we will want the rectangle to
+ % extend {\it downward}, to cover the image which will come
+ % next). Notice that these settings will be isolated within the
+ % current group (i.e., the |\vbox| we're constructing).
+ \hldesttype[definexref]{fitr}%
+ \hldestopts[definexref]{width=\wd\imgbox,height=0pt,depth=\ht\imgbox}%
+ % We define a symbolic label so that we can later refer
+ % to the figure with |\ref|. The command |\definexref| does
+ % exactly that. The last argument to |\definexref| specifies
+ % class of the label, which determines the word used by |\ref| in
+ % front of the reference text (remember that we've defined
+ % |\figureword| above).
+ \definexref{#1}{\the\fignumber}{figure}%
+ % Finally, produce the image which we've been stashing in the box
+ % register |\imgbox|.
+ \box\imgbox
+ }%
+ \medskip
+}
+
+% Create the figure.
+\fig{CTANlion}{ctan_lion_350x350}{Lion in the archives}{200pt}
+
+% Finished with the fun part, we can relax and typeset some
+% hyperlinks. The easiest way to do that is to use the |\ref|
+% cross-reference command. We can even pass an optional argument
+% (|the lion in|), which will be placed before the class word (|fig.|)
+% and become part of the link (to make sure the reader does not have
+% to aim too hard).
+Show me \ref[the lion in]{CTANlion}.
+
+% If you are the restless kind, here's another way to create a
+% hyperlink to the image: we create a link explicitly by using
+% |\hlstart ... \hlend|. We don't specify the link type, therefore
+% the default type |name| will be used (these are ``named links'',
+% i.e., links pointing to destinations identified by labels). In the
+% options argument, we specify that the border of the link should be
+% inverted when the user clicks the link (|hlight=O|), and also set
+% special color for this link, overriding the default dark-red. The
+% label for the destination is the same as the cross-reference label,
+% |CTANlion|.
+Show me
+\hlstart{}{hlight=O,colormodel=named,color=OliveGreen}{CTANlion}
+ the CTAN lion\hlend.
+
+% Let's now point somewhere outside our document. Eplain homepage is
+% a good target. In the similar spirit, let's consider two
+% approaches. The easy one is to use the |\url| command from
+% |url.sty|. Remember that we have customized the color of |url|
+% hyperlinks, so this one will show up with a different color than the
+% default dark-red.
+Take me to \url{http://tug.org/eplain}.
+
+% The second approach is to create an explicit URL link. We specify
+% yet another border highlighting mode, |P|, which means that the
+% region underneath the bounding box of the link will be drawn inset
+% into the page. Also, let's set the color of the hyperlink to an RGB
+% color |0.4,0.1,0.4|. Since we cannot use commas to separate the
+% color elements inside the options parameter to |\hlstart| (commas
+% there separate options), we have to first create a user-defined
+% color with |\definecolor| from |color.sty|, and use that in
+% |\hlstart|.
+\definecolor{mycolor}{rgb}{0.4,0.1,0.4}
+
+Take me to
+\hlstart{url}{hlight=P,colormodel=,color=mycolor}{http://tug.org/eplain}
+ Eplain homepage\hlend.
+
+\bye
diff --git a/macros/eplain/doc/eplain.1 b/macros/eplain/doc/eplain.1
new file mode 100644
index 0000000000..b7d0d83fa1
--- /dev/null
+++ b/macros/eplain/doc/eplain.1
@@ -0,0 +1,87 @@
+.TH EPLAIN 1 "30 September 2013" "Eplain 3.6"
+.\"=====================================================================
+.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP
+.if n .ds TX TeX
+.ie t .ds OX \fIT\v'+0.25m'E\v'-0.25m'X\fP for troff
+.el .ds OX TeX for nroff
+.\" the same but obliqued
+.\" BX definition must follow TX so BX can use TX
+.if t .ds BX \fRB\s-2IB\s0\fP\*(TX
+.if n .ds BX BibTeX
+.\" LX definition must follow TX so LX can use TX
+.if t .ds LX \fRL\\h'-0.36m'\\v'-0.15v'\s-2A\s0\\h'-0.15m'\\v'0.15v'\fP\*(TX
+.if n .ds LX LaTeX
+.if t .ds AX \fRA\\h'-0.1667m'\\v'0.20v'M\\v'-0.20v'\\h'-0.125m'S\fP\*(TX
+.if n .ds AX AmSTeX
+.if t .ds AY \fRA\\h'-0.1667m'\\v'0.20v'M\\v'-0.20v'\\h'-0.125m'S\fP\*(LX
+.if n .ds AY AmSLaTeX
+.\"=====================================================================
+.SH NAME
+eplain \- expanded plain TeX
+.SH SYNOPSIS
+.B eplain
+[ first-line ]
+.\"=====================================================================
+.SH DESCRIPTION
+.B eplain
+is an extension of plain \*(TX originally described in the book
+.IR "\*(OX for the Impatient" .
+It adds these features (among others) to plain \*(TX:
+.TP \w'\(bu'u+2n
+\(bu
+left-justified displays
+.TP
+\(bu
+double-column output
+.TP
+\(bu
+tables of contents
+.TP
+\(bu
+.I \ehrule
+and
+.I \evrule
+with a different default than 0.4pt
+.TP
+\(bu
+time of day
+.TP
+\(bu
+verbatim file listing
+.TP
+\(bu
+generalized footnotes
+.TP
+\(bu
+blank and black boxes
+.TP
+\(bu
+citations using \*(BX
+.\"=====================================================================
+.SH FILES
+.TP
+.I eplain/doc/eplain.texi
+\*(TXable documentation of
+.B etex
+macros in
+.B texinfo
+format.
+.TP
+.I eplain.info*
+Online GNU Emacs
+.BR info (1)
+files produced from
+.IR eplain.texi .
+.\"=====================================================================
+.SH "SEE ALSO"
+.BR texinfo (5),
+.BR tex (1),
+.br
+Karl Berry,
+.IR eplain ,
+TUGboat 11(4), 571--572, 1990,
+http://tug.org/TUGboat/tb11-4/tb30resources.pdf.
+.br
+Paul W. Abrahams with Karl Berry and Kathryn A. Hargreaves,
+.IR "\*(OX for the Impatient" ,
+http://www.gnu.org/software/teximpatient.
diff --git a/macros/eplain/doc/eplain.html b/macros/eplain/doc/eplain.html
new file mode 100644
index 0000000000..c3ae5f8d1a
--- /dev/null
+++ b/macros/eplain/doc/eplain.html
@@ -0,0 +1,10762 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- This manual documents the Eplain macros, version 3.9,
+May 2019. Eplain provides functionality for plain TeX that
+is intended to be useful regardless of how your document is actually
+formatted.
+
+Most of this manual is in the public domain, like most of the Eplain
+code. It was originally written by Karl Berry, starting in 1989.
+Steven Smith wrote the documentation for the commutative diagram
+macros; this chapter is under the GNU General Public License. Adam
+Lewenberg has made additions and corrections. Oleg Katsitadze wrote
+the section on LaTeX packages and the chapter on hyperlinks, and
+updates throughout. -->
+<!-- Created by GNU Texinfo 6.6, http://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Eplain: Expanded Plain TeX</title>
+
+<meta name="description" content="Eplain: Expanded Plain TeX">
+<meta name="keywords" content="Eplain: Expanded Plain TeX">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<link href="#Top" rel="start" title="Top">
+<link href="#Macro-index" rel="index" title="Macro index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="http://tug.org/texinfohtml/" rel="up" title="(dir)">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">Eplain: Expanded Plain TeX</h1>
+
+
+
+
+
+
+
+
+<span id="SEC_Overview"></span>
+<h2 class="shortcontents-heading">Short Table of Contents</h2>
+
+<div class="shortcontents">
+<ul class="no-bullet">
+<li><a id="stoc-Introduction-1" href="#toc-Introduction-1">1 Introduction</a></li>
+<li><a id="stoc-Installation-1" href="#toc-Installation-1">2 Installation</a></li>
+<li><a id="stoc-Invoking-Eplain-1" href="#toc-Invoking-Eplain-1">3 Invoking Eplain</a></li>
+<li><a id="stoc-User-definitions-1" href="#toc-User-definitions-1">4 User definitions</a></li>
+<li><a id="stoc-Hyperlinks-1" href="#toc-Hyperlinks-1">5 Hyperlinks</a></li>
+<li><a id="stoc-Arrow-theoretic-diagrams-1" href="#toc-Arrow-theoretic-diagrams-1">6 Arrow theoretic diagrams</a></li>
+<li><a id="stoc-Programming-definitions-1" href="#toc-Programming-definitions-1">7 Programming definitions</a></li>
+<li><a id="stoc-Demo-files-1" href="#toc-Demo-files-1">8 Demo files</a></li>
+<li><a id="stoc-Macro-index-1" href="#toc-Macro-index-1">Macro index</a></li>
+<li><a id="stoc-Concept-index-1" href="#toc-Concept-index-1">Concept index</a></li>
+</ul>
+</div>
+
+<span id="SEC_Contents"></span>
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Introduction-1" href="#Introduction">1 Introduction</a></li>
+ <li><a id="toc-Installation-1" href="#Installation">2 Installation</a></li>
+ <li><a id="toc-Invoking-Eplain-1" href="#Invoking-Eplain">3 Invoking Eplain</a></li>
+ <li><a id="toc-User-definitions-1" href="#User-definitions">4 User definitions</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Diagnostics-1" href="#Diagnostics">4.1 Diagnostics</a></li>
+ <li><a id="toc-Rules-1" href="#Rules">4.2 Rules</a></li>
+ <li><a id="toc-Citations-1" href="#Citations">4.3 Citations</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Formatting-citations-1" href="#Formatting-citations">4.3.1 Formatting citations</a></li>
+ <li><a id="toc-Formatting-bibliographies-1" href="#Formatting-bibliographies">4.3.2 Formatting bibliographies</a></li>
+ <li><a id="toc-Commands-from-LaTeX-1" href="#Commands-from-LaTeX">4.3.3 Commands from LaTeX</a></li>
+ </ul></li>
+ <li><a id="toc-Displays-1" href="#Displays">4.4 Displays</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Formatting-displays-1" href="#Formatting-displays">4.4.1 Formatting displays</a></li>
+ </ul></li>
+ <li><a id="toc-Time-of-day-1" href="#Time-of-day">4.5 Time of day</a></li>
+ <li><a id="toc-Lists-1" href="#Lists">4.6 Lists</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Formatting-lists-1" href="#Formatting-lists">4.6.1 Formatting lists</a></li>
+ </ul></li>
+ <li><a id="toc-Verbatim-listing-1" href="#Verbatim-listing">4.7 Verbatim listing</a></li>
+ <li><a id="toc-Contents-1" href="#Contents">4.8 Contents</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Writing-the-_002etoc-file-1" href="#Writing-the-_002etoc-file">4.8.1 Writing the <tt>.toc</tt> file</a></li>
+ <li><a id="toc-Reading-the-_002etoc-file-1" href="#Reading-the-_002etoc-file">4.8.2 Reading the <tt>.toc</tt> file</a></li>
+ <li><a id="toc-Changing-the-_002etoc-file_0027s-root-name-1" href="#Changing-the-_002etoc-file_0027s-root-name">4.8.3 Changing the <tt>.toc</tt> file&rsquo;s root name</a></li>
+ <li><a id="toc-Alternative-contents-files-1" href="#Alternative-contents-files">4.8.4 Alternative contents files</a></li>
+ </ul></li>
+ <li><a id="toc-Cross_002dreferences-1" href="#Cross_002dreferences">4.9 Cross-references</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Defining-generic-references-1" href="#Defining-generic-references">4.9.1 Defining generic references</a></li>
+ <li><a id="toc-Using-generic-references-1" href="#Using-generic-references">4.9.2 Using generic references</a></li>
+ </ul></li>
+ <li><a id="toc-Page-references-1" href="#Page-references">4.10 Page references</a></li>
+ <li><a id="toc-Equation-references-1" href="#Equation-references">4.11 Equation references</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Formatting-equation-references-1" href="#Formatting-equation-references">4.11.1 Formatting equation references</a></li>
+ <li><a id="toc-Subequation-references-1" href="#Subequation-references">4.11.2 Subequation references</a></li>
+ </ul></li>
+ <li><a id="toc-Indexing-1" href="#Indexing">4.12 Indexing</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Indexing-terms-1" href="#Indexing-terms">4.12.1 Indexing terms</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Indexing-commands-1" href="#Indexing-commands">4.12.1.1 Indexing commands</a></li>
+ <li><a id="toc-Modifying-index-entries-1" href="#Modifying-index-entries">4.12.1.2 Modifying index entries</a></li>
+ <li><a id="toc-Index-entries-with-special-characters-1" href="#Index-entries-with-special-characters">4.12.1.3 Index entries with special characters</a></li>
+ <li><a id="toc-Proofing-index-terms-1" href="#Proofing-index-terms">4.12.1.4 Proofing index terms</a></li>
+ </ul></li>
+ <li><a id="toc-Typesetting-an-index-1" href="#Typesetting-an-index">4.12.2 Typesetting an index</a></li>
+ <li><a id="toc-Customizing-indexing-1" href="#Customizing-indexing">4.12.3 Customizing indexing</a></li>
+ </ul></li>
+ <li><a id="toc-Justification-1" href="#Justification">4.13 Justification</a></li>
+ <li><a id="toc-Tables-1" href="#Tables">4.14 Tables</a></li>
+ <li><a id="toc-Margins-1" href="#Margins">4.15 Margins</a></li>
+ <li><a id="toc-Multiple-columns-1" href="#Multiple-columns">4.16 Multiple columns</a></li>
+ <li><a id="toc-Footnotes-1" href="#Footnotes">4.17 Footnotes</a></li>
+ <li><a id="toc-Fractions-1" href="#Fractions">4.18 Fractions</a></li>
+ <li><a id="toc-Paths-1" href="#Paths">4.19 Paths</a></li>
+ <li><a id="toc-Logos-1" href="#Logos">4.20 Logos</a></li>
+ <li><a id="toc-Boxes-1" href="#Boxes">4.21 Boxes</a></li>
+ <li><a id="toc-Checking-for-PDF-output-1" href="#Checking-for-PDF-output">4.22 Checking for PDF output</a></li>
+ <li><a id="toc-Loading-LaTeX-packages-1" href="#Loading-LaTeX-packages">4.23 Loading LaTeX packages</a>
+ <ul class="no-bullet">
+ <li><a id="toc-The-_005cusepackage-command-1" href="#The-_005cusepackage-command">4.23.1 The <code>\usepackage</code> command</a></li>
+ <li><a id="toc-Environment-for-loading-packages-1" href="#Environment-for-loading-packages">4.23.2 Environment for loading packages</a></li>
+ <li><a id="toc-Packages-known-to-work-1" href="#Packages-known-to-work">4.23.3 Packages known to work</a></li>
+ <li><a id="toc-Packages-known-not-to-work-1" href="#Packages-known-not-to-work">4.23.4 Packages known not to work</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Hyperlinks-1" href="#Hyperlinks">5 Hyperlinks</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Introduction-to-hyperlinks-1" href="#Introduction-to-hyperlinks">5.1 Introduction to hyperlinks</a></li>
+ <li><a id="toc-Explicit-hyperlinks-1" href="#Explicit-hyperlinks">5.2 Explicit hyperlinks</a></li>
+ <li><a id="toc-Implicit-hyperlinks-1" href="#Implicit-hyperlinks">5.3 Implicit hyperlinks</a>
+ <ul class="no-bullet">
+ <li><a id="toc-General-hyperlinks_003a-hrefint_002c-hrefext" href="#General-hyperlinks">5.3.1 General hyperlinks: hrefint, hrefext</a></li>
+ <li><a id="toc-URL-hyperlinks_003a-url" href="#URL-hyperlinks">5.3.2 URL hyperlinks: url</a></li>
+ <li><a id="toc-Citation-hyperlinks_003a-cite_002c-bib" href="#Citation-hyperlinks">5.3.3 Citation hyperlinks: cite, bib</a></li>
+ <li><a id="toc-List-hyperlinks_003a-li" href="#List-hyperlinks">5.3.4 List hyperlinks: li</a></li>
+ <li><a id="toc-Cross_002dreference-hyperlinks_003a-definexref_002c-ref" href="#Cross_002dreference-hyperlinks">5.3.5 Cross-reference hyperlinks: definexref, ref</a></li>
+ <li><a id="toc-Page-reference-hyperlinks_003a-xrdef_002c-xref" href="#Page-reference-hyperlinks">5.3.6 Page reference hyperlinks: xrdef, xref</a></li>
+ <li><a id="toc-Equation-reference-hyperlinks_003a-eq" href="#Equation-reference-hyperlinks">5.3.7 Equation reference hyperlinks: eq</a></li>
+ <li><a id="toc-Index-hyperlinks_003a-idx" href="#Index-hyperlinks">5.3.8 Index hyperlinks: idx</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Exact-destinations-for-index-terms-1" href="#Exact-destinations-for-index-terms">5.3.8.1 Exact destinations for index terms</a></li>
+ <li><a id="toc-Page-destinations-for-index-terms-1" href="#Page-destinations-for-index-terms">5.3.8.2 Page destinations for index terms</a></li>
+ <li><a id="toc-Choosing-destination-placement-1" href="#Choosing-destination-placement">5.3.8.3 Choosing destination placement</a></li>
+ <li><a id="toc-Index-page-list-and-page-range-parsers-1" href="#Index-page-list-and-page-range-parsers">5.3.8.4 Index page list and page range parsers</a></li>
+ <li><a id="toc-Hyperlinks-in-see-and-see-also-entries-1" href="#Hyperlinks-in-see-and-see-also-entries">5.3.8.5 Hyperlinks in see and see also entries</a></li>
+ </ul></li>
+ <li><a id="toc-Footnote-hyperlinks_003a-foot_002c-footback" href="#Footnote-hyperlinks">5.3.9 Footnote hyperlinks: foot, footback</a></li>
+ <li><a id="toc-Contents-hyperlinks-1" href="#Contents-hyperlinks">5.3.10 Contents hyperlinks</a></li>
+ </ul></li>
+ <li><a id="toc-Hyperlink-drivers-1" href="#Hyperlink-drivers">5.4 Hyperlink drivers</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Options-supported-by-all-drivers-1" href="#Options-supported-by-all-drivers">5.4.1 Options supported by all drivers</a></li>
+ <li><a id="toc-Hyperlink-driver-hypertex-1" href="#Hyperlink-driver-hypertex">5.4.2 Hyperlink driver <code>hypertex</code></a>
+ <ul class="no-bullet">
+ <li><a id="toc-Destination-types-for-hypertex-1" href="#Destination-types-for-hypertex">5.4.2.1 Destination types for <code>hypertex</code></a></li>
+ <li><a id="toc-Destination-options-for-hypertex-1" href="#Destination-options-for-hypertex">5.4.2.2 Destination options for <code>hypertex</code></a></li>
+ <li><a id="toc-Link-types-for-hypertex-1" href="#Link-types-for-hypertex">5.4.2.3 Link types for <code>hypertex</code></a></li>
+ <li><a id="toc-Link-options-for-hypertex-1" href="#Link-options-for-hypertex">5.4.2.4 Link options for <code>hypertex</code></a></li>
+ </ul></li>
+ <li><a id="toc-Hyperlink-drivers-pdftex-and-dvipdfm-1" href="#Hyperlink-drivers-pdftex-and-dvipdfm">5.4.3 Hyperlink drivers <code>pdftex</code> and <code>dvipdfm</code></a>
+ <ul class="no-bullet">
+ <li><a id="toc-Destination-types-for-pdftex-and-dvipdfm-1" href="#Destination-types-for-pdftex-and-dvipdfm">5.4.3.1 Destination types for <code>pdftex</code> and <code>dvipdfm</code></a></li>
+ <li><a id="toc-Destination-options-for-pdftex-and-dvipdfm-1" href="#Destination-options-for-pdftex-and-dvipdfm">5.4.3.2 Destination options for <code>pdftex</code> and <code>dvipdfm</code></a></li>
+ <li><a id="toc-Link-types-for-pdftex-and-dvipdfm-1" href="#Link-types-for-pdftex-and-dvipdfm">5.4.3.3 Link types for <code>pdftex</code> and <code>dvipdfm</code></a></li>
+ <li><a id="toc-Link-options-for-pdftex-and-dvipdfm-1" href="#Link-options-for-pdftex-and-dvipdfm">5.4.3.4 Link options for <code>pdftex</code> and <code>dvipdfm</code></a></li>
+ </ul></li>
+ <li><a id="toc-Hyperlink-driver-nolinks-1" href="#Hyperlink-driver-nolinks">5.4.4 Hyperlink driver <code>nolinks</code></a></li>
+ </ul></li>
+ <li><a id="toc-Setting-hyperlink-types-and-options-1" href="#Setting-hyperlink-types-and-options">5.5 Setting hyperlink types and options</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Setting-default-types-and-options-1" href="#Setting-default-types-and-options">5.5.1 Setting default types and options</a></li>
+ <li><a id="toc-Setting-group-types-1" href="#Setting-group-types">5.5.2 Setting group types</a></li>
+ <li><a id="toc-Setting-group-options-1" href="#Setting-group-options">5.5.3 Setting group options</a></li>
+ </ul></li>
+ <li><a id="toc-Turning-hyperlinks-on_002foff-1" href="#Turning-hyperlinks-on_002foff">5.6 Turning hyperlinks on/off</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Turning-low_002dlevel-commands-on_002foff-1" href="#Turning-low_002dlevel-commands-on_002foff">5.6.1 Turning low-level commands on/off</a></li>
+ <li><a id="toc-Turning-hyperlinks-on_002foff-for-a-group-1" href="#Turning-hyperlinks-on_002foff-for-a-group">5.6.2 Turning hyperlinks on/off for a group</a></li>
+ </ul></li>
+ <li><a id="toc-Making-PDF-outlines-1" href="#Making-PDF-outlines">5.7 Making PDF outlines</a></li>
+ </ul></li>
+ <li><a id="toc-Arrow-theoretic-diagrams-1" href="#Arrow-theoretic-diagrams">6 Arrow theoretic diagrams</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Slanted-lines-and-vectors-1" href="#Slanted-lines-and-vectors">6.1 Slanted lines and vectors</a></li>
+ <li><a id="toc-Commutative-diagrams-1" href="#Commutative-diagrams">6.2 Commutative diagrams</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Arrows-and-morphisms-1" href="#Arrows-and-morphisms">6.2.1 Arrows and morphisms</a></li>
+ <li><a id="toc-Construction-of-commutative-diagrams-1" href="#Construction-of-commutative-diagrams">6.2.2 Construction of commutative diagrams</a></li>
+ <li><a id="toc-Commutative-diagram-parameters-1" href="#Commutative-diagram-parameters">6.2.3 Commutative diagram parameters</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Programming-definitions-1" href="#Programming-definitions">7 Programming definitions</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Category-codes-1" href="#Category-codes">7.1 Category codes</a></li>
+ <li><a id="toc-Allocation-macros-1" href="#Allocation-macros">7.2 Allocation macros</a></li>
+ <li><a id="toc-Iteration-1" href="#Iteration">7.3 Iteration</a></li>
+ <li><a id="toc-Macro-arguments-1" href="#Macro-arguments">7.4 Macro arguments</a></li>
+ <li><a id="toc-Converting-to-characters-1" href="#Converting-to-characters">7.5 Converting to characters</a></li>
+ <li><a id="toc-Expansion-1" href="#Expansion">7.6 Expansion</a>
+ <ul class="no-bullet">
+ <li><a id="toc-_005ccsn-and-_005cece-1" href="#g_t_005ccsn-and-_005cece">7.6.1 <code>\csn</code> and <code>\ece</code></a></li>
+ <li><a id="toc-_005cedefappend-1" href="#g_t_005cedefappend">7.6.2 <code>\edefappend</code></a></li>
+ <li><a id="toc-Hooks-1" href="#Hooks">7.6.3 Hooks</a></li>
+ <li><a id="toc-Properties-1" href="#Properties">7.6.4 Properties</a></li>
+ <li><a id="toc-_005cexpandonce-1" href="#g_t_005cexpandonce">7.6.5 <code>\expandonce</code></a></li>
+ <li><a id="toc-_005cifundefined-1" href="#g_t_005cifundefined">7.6.6 <code>\ifundefined</code></a></li>
+ <li><a id="toc-_005cifempty-1" href="#g_t_005cifempty">7.6.7 <code>\ifempty</code></a></li>
+ <li><a id="toc-_005cifinteger-and-_005cisinteger-1" href="#g_t_005cifinteger-and-_005cisinteger">7.6.8 <code>\ifinteger</code> and <code>\isinteger</code></a></li>
+ <li><a id="toc-_005cfuturenonspacelet-1" href="#g_t_005cfuturenonspacelet">7.6.9 <code>\futurenonspacelet</code></a></li>
+ </ul></li>
+ <li><a id="toc-Obeying-spaces-1" href="#Obeying-spaces">7.7 Obeying spaces</a></li>
+ <li><a id="toc-Writing-out-numbers-1" href="#Writing-out-numbers">7.8 Writing out numbers</a></li>
+ <li><a id="toc-Mode_002dspecific-penalties-1" href="#Mode_002dspecific-penalties">7.9 Mode-specific penalties</a></li>
+ <li><a id="toc-Auxiliary-files-1" href="#Auxiliary-files">7.10 Auxiliary files</a></li>
+ <li><a id="toc-User_002ddefined-environments-1" href="#User_002ddefined-environments">7.11 User-defined environments</a></li>
+ <li><a id="toc-Page-list-and-page-range-parsers-1" href="#Page-list-and-page-range-parsers">7.12 Page list and page range parsers</a></li>
+ </ul></li>
+ <li><a id="toc-Demo-files-1" href="#Demo-files">8 Demo files</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Hyperlinks-_0028xhyper_002etex_0029-1" href="#Hyperlinks-_0028xhyper_002etex_0029">8.1 Hyperlinks (<code>xhyper.tex</code>)</a></li>
+ <li><a id="toc-Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029-1" href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">8.2 Highlighting TeX comments in listings (<code>lscommnt.tex</code>)</a></li>
+ </ul></li>
+ <li><a id="toc-Macro-index-1" href="#Macro-index">Macro index</a></li>
+ <li><a id="toc-Concept-index-1" href="#Concept-index">Concept index</a></li>
+</ul>
+</div>
+
+
+<span id="Top"></span><div class="header">
+<p>
+Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Up: <a href="http://tug.org/texinfohtml/" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Eplain"></span><h1 class="top">Eplain</h1>
+
+<p>This manual documents the Eplain macros, version 3.9,
+May 2019. Eplain provides functionality for plain TeX that
+is intended to be useful regardless of how your document is actually
+formatted.
+</p>
+<p>Most of this manual is in the public domain, like most of the Eplain
+code. It was originally written by Karl Berry, starting in 1989.
+Steven Smith wrote the documentation for the commutative diagram
+macros; this chapter is under the GNU General Public License. Adam
+Lewenberg has made additions and corrections. Oleg Katsitadze wrote
+the section on LaTeX packages and the chapter on hyperlinks, and
+updates throughout.
+</p>
+<p>The Eplain home page is <a href="https://tug.org/eplain">https://tug.org/eplain</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Introduction" accesskey="1">Introduction</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Eplain&rsquo;s purpose and philosophy.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Installation" accesskey="2">Installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Installing Eplain.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Invoking-Eplain" accesskey="3">Invoking Eplain</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using Eplain from a TeX file.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#User-definitions" accesskey="4">User definitions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Macros to be used in a document.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlinks" accesskey="5">Hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing documents with hyperlinks.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Arrow-theoretic-diagrams" accesskey="6">Arrow theoretic diagrams</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Macros for commutative diagrams.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Programming-definitions" accesskey="7">Programming definitions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Macros to be used in writing other macros.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Demo-files" accesskey="8">Demo files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Sample documents demonstrating Eplain.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Macro-index" accesskey="9">Macro index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Entries for TeX and Eplain control sequences.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Concept-index">Concept index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">General index.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+</pre></th></tr><tr><th colspan="3" align="left" valign="top"><pre class="menu-comment"> &mdash; The Detailed Node Listing &mdash;
+
+User definitions
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Diagnostics">Diagnostics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Tracing information.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Rules">Rules</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the default rule dimensions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Citations">Citations</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using BibTeX and Eplain to make bibliographies.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Displays">Displays</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the formatting of math displays.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Time-of-day">Time of day</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing the time of day.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Lists">Lists</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing numbered and unordered lists.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Verbatim-listing">Verbatim listing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing text just as it appears.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Contents">Contents</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making a table of contents.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Cross_002dreferences">Cross-references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Symbolically referring to pages or equations.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-references">Page references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Symbolic references to page numbers.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Equation-references">Equation references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Symbolic references to equation numbers.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Indexing">Indexing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Creating and typesetting indexes.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Justification">Justification</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Left- or right-justification, or centering.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tables">Tables</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing ordered tables.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Margins">Margins</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the margins directly.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Multiple-columns">Multiple columns</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Getting output in two columns.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Footnotes">Footnotes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Autonumbered footnotes; changing formatting.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Fractions">Fractions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">A better way to produce fractions in text.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Paths">Paths</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Allowing line breaks in pathnames.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Logos">Logos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Various logos.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Boxes">Boxes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing filled or open rectangles.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Checking-for-PDF-output">Checking for PDF output</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Checking for pdfTeX in PDF mode.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Support for LaTeX packages under plain TeX.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Citations
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Formatting-citations">Formatting citations</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the way citations are printed.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Formatting-bibliographies">Formatting bibliographies</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the way bibliographies are printed.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Displays
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Formatting-displays">Formatting displays</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">General formatting of displays.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Lists
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Formatting-lists">Formatting lists</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing how the lists look.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Contents
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Reading-the-_002etoc-file">Reading the .toc file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Changing-the-_002etoc-file_0027s-root-name">Changing the .toc file's root name</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Alternative-contents-files">Alternative contents files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Cross-references
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Defining-generic-references">Defining generic references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Using-generic-references">Using generic references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Equation references
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Formatting-equation-references">Formatting equation references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Subequation-references">Subequation references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Indexing
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Indexing-terms">Indexing terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Specifying what to index.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Typesetting-an-index">Typesetting an index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Printing the sorted output.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Customizing-indexing">Customizing indexing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Creating commands and specifying extra actions.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Indexing terms
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Indexing-commands">Indexing commands</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making index entries.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Modifying-index-entries">Modifying index entries</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Ranges, see/see also, page number typesetting.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index-entries-with-special-characters">Index entries with special characters</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Proofing-index-terms">Proofing index terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Noting index entries in the margins.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Loading LaTeX packages
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#The-_005cusepackage-command">The \usepackage command</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Command to load packages.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Environment-for-loading-packages">Environment for loading packages</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Environment for the \usepackage commands.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Packages-known-to-work">Packages known to work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Supported packages.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Packages-known-not-to-work">Packages known not to work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Packages known not to work with Eplain.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Hyperlinks
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-drivers">Hyperlink drivers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Implicit hyperlinks
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#General-hyperlinks">General hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">hrefint, hrefext
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#URL-hyperlinks">URL hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">url
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Citation-hyperlinks">Citation hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">cite, bib
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#List-hyperlinks">List hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">li
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">definexref, ref
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">xrdef, xref
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">eq
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index-hyperlinks">Index hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">idx
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">foot, footback
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Contents-hyperlinks">Contents hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Index hyperlinks
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Choosing-destination-placement">Choosing destination placement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index-page-list-and-page-range-parsers">Index page list and page range parsers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Hyperlink drivers
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Hyperlink driver hypertex::
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Destination-options-for-hypertex">Destination options for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-types-for-hypertex">Link types for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-options-for-hypertex">Link options for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Hyperlink drivers pdftex and dvipdfm::
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Setting hyperlink types and options
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Setting-default-types-and-options">Setting default types and options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Setting-group-types">Setting group types</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Setting-group-options">Setting group options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Turning hyperlinks on/off
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Turning-hyperlinks-on_002foff-for-a-group">Turning hyperlinks on/off for a group</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Arrow theoretic diagrams
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Commutative-diagrams">Commutative diagrams</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Commutative diagrams
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Arrows-and-morphisms">Arrows and morphisms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Programming definitions
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Category-codes">Category codes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing category codes.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Allocation-macros">Allocation macros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Non-outer versions of \newcount et al.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Iteration">Iteration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Doing &lsquo;for&rsquo; and &lsquo;while&rsquo; loops in TeX.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Macro-arguments">Macro arguments</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Reading and ignoring them.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Converting-to-characters">Converting to characters</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Normalizing control sequences and spaces.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Expansion">Expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Controlling expansion.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Obeying-spaces">Obeying spaces</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making whitespace count anywhere.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Writing-out-numbers">Writing out numbers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making &lsquo;1&rsquo; into &lsquo;one&rsquo;.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Mode_002dspecific-penalties">Mode-specific penalties</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Auxiliary-files">Auxiliary files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Testing for their existence.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#User_002ddefined-environments">User-defined environments</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">User-defined environments.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Expansion
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#g_t_005ccsn-and-_005cece">\csn and \ece</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cedefappend">\edefappend</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hooks">Hooks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Manipulating and executing named actions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Properties">Properties</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Associating information with a csname.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cexpandonce">\expandonce</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cifundefined">\ifundefined</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cifempty">\ifempty</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cfuturenonspacelet">\futurenonspacelet</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+Demo files
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+
+<hr>
+<span id="Introduction"></span><div class="header">
+<p>
+Next: <a href="#Installation" accesskey="n" rel="next">Installation</a>, Previous: <a href="#Top" accesskey="p" rel="prev">Top</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Introduction-1"></span><h2 class="chapter">1 Introduction</h2>
+
+<span id="index-Eplain_002c-purpose-of"></span>
+
+<span id="index-xeplain_002etex"></span>
+<p>The <em>Eplain</em> macro package expands on and extends the definitions in
+plain TeX. Its home on the web is <a href="https://tug.org/eplain">https://tug.org/eplain</a>.
+</p>
+<p>This manual describes the definitions that you, as either an author or
+a macro writer, might like to use. It doesn&rsquo;t discuss the
+implementation; see comments in the source code (<samp>xeplain.tex</samp>)
+for that.
+</p>
+<p>Eplain is not intended to provide typesetting capabilities, as
+does LaTeX (originally written by Leslie Lamport)
+<span id="index-LaTeX"></span>
+<span id="index-Lamport_002c-Leslie"></span>
+and Texinfo
+<span id="index-Texinfo"></span>
+(Originally written by Richard Stallman).
+<span id="index-Stallman_002c-Richard"></span>
+<span id="index-rms"></span>
+Instead, it provides definitions that are intended to be useful
+regardless of the high-level commands that you use when you actually
+prepare your manuscript.
+</p>
+<p>For example, Eplain does not have a command <code>\section</code> to format
+section headings in an &ldquo;appropriate&rdquo; way, such as LaTeX&rsquo;s
+<code>\section</code>. The philosophy of Eplain is that some people will
+always need or want to go beyond the macro designer&rsquo;s idea of
+&ldquo;appropriate&rdquo;. Such canned macros are fine&mdash;as long as you are
+willing to accept the resulting output. If you don&rsquo;t like the
+results, or if you are trying to match a different format, you have to
+put in extra work to override the defaults.
+</p>
+<p>On the other hand, almost everyone would like capabilities such as
+cross-referencing by labels, so that you don&rsquo;t have to put actual page
+numbers in the manuscript. The author of Eplain
+<span id="index-Berry_002c-Karl"></span>
+is not aware of any generally available macro packages that (1)&nbsp;do
+not force their typographic style on an author, and yet (2)&nbsp;provide
+such capabilities.
+</p>
+<p>Besides such generic macros as cross-referencing, Eplain contains
+another set of definitions: ones that change the conventions of plain
+TeX&rsquo;s output. For example, math displays in TeX are, by
+default, centered. If you want your displays to come out
+left-justified, you have to plow through <cite>The TeXbook</cite> to find
+some way to do it, and then adapt the code to your own needs. Eplain
+tries to take care of the messy details of such things, while still
+leaving the detailed appearance of the output up to you.
+</p>
+<p>Finally, numerous definitions turned out to be useful as Eplain was
+developed. They are also documented in this manual, on the chance that
+people writing other macros will be able to use them.
+</p>
+<p>You can send bug reports or suggestions to
+<a href="mailto:tex-eplain@tug.org">tex-eplain@tug.org</a>. The current version number of Eplain is
+defined as the macro <code>\fmtversion</code>
+<span id="index-version-number"></span>
+<span id="index-fmtversion"></span>
+at the end of the source file <samp>eplain.tex</samp>. When corresponding,
+please refer to it.
+</p>
+<p>To get on this mailing list yourself, email
+<a href="mailto:tex-eplain-request@tug.org">tex-eplain-request@tug.org</a> with a message whose body contains
+a line
+</p>
+<div class="example">
+<pre class="example">subscribe <var>you@your.preferred.address</var>
+</pre></div>
+
+<p>or visit <a href="http://lists.tug.org/tex-eplain">http://lists.tug.org/tex-eplain</a>.
+</p>
+<span id="index-Walden_002c-David"></span>
+<p>David Walden had reported his experience with Eplain as a new user.
+The article is available online at
+<a href="https://tug.org/pracjourn/2005-4/walden">https://tug.org/pracjourn/2005-4/walden</a>. An introductory
+article (written for
+<span id="index-TUGboat"></span>
+<i>TUGboat</i>) is also available online at
+<a href="https://tug.org/eplain/misc/tb84katsi.pdf">https://tug.org/eplain/misc/tb84katsi.pdf</a>.
+</p>
+<hr>
+<span id="Installation"></span><div class="header">
+<p>
+Next: <a href="#Invoking-Eplain" accesskey="n" rel="next">Invoking Eplain</a>, Previous: <a href="#Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Installation-1"></span><h2 class="chapter">2 Installation</h2>
+
+<span id="index-Eplain_002c-installing"></span>
+<span id="index-installation"></span>
+<span id="index-Eplain_002c-upgrading"></span>
+<span id="index-upgrading"></span>
+<p>Your TeX installation should already contain a version of Eplain
+(<samp>eplain.tex</samp>) in its main <samp>texmf</samp> tree (usually under
+<samp>/usr/share/texmf/tex/eplain/</samp> on Unix systems). To install a
+newer version of Eplain, put the new <samp>eplain.tex</samp> (included in
+Eplain distributions) in the <samp>tex/eplain/</samp> subdirectory of your
+local <samp>texmf</samp> tree. The newer version you install in the local
+tree should override the older one in the main tree.
+</p>
+<p>The location of the local <samp>texmf</samp> tree obviously depends on your
+operating system and TeX installation. On Unix systems the usual
+location is <samp>/usr/local/share/texmf/</samp>. If you don&rsquo;t have write
+permissions for <samp>/usr/local/share/texmf/</samp>, many installations read
+the <samp>texmf</samp> tree in the user&rsquo;s home directory; <samp>eplain.tex</samp>
+then should go under <samp>~/texmf/tex/eplain/</samp>. For more information
+about TeX directory structure, please see
+<a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds</a>.
+</p>
+<span id="index-TEXINPUTS"></span>
+<p>If you prefer to install <samp>eplain.tex</samp> in a non-standard place, set
+an environment variable (<code>TEXINPUTS</code> for the Web2C port of TeX
+to Unix) to tell TeX how to find it.
+</p>
+<p>If you want, you can also create a format (<samp>.fmt</samp>)
+<span id="index-_002efmt-file"></span>
+<span id="index-format-file"></span>
+<span id="index-eplain_002efmt"></span>
+file for Eplain, which will eliminate the time spent reading the macro
+source file with <code>\input</code>. You do this by issuing a sequence of
+Unix commands something like this:
+</p>
+<div class="example">
+<pre class="example">prompt$ touch eplain.aux
+prompt$ initex
+This is TeX, ...
+**&amp;plain eplain
+(eplain.tex)
+*\dump
+... <var>messages</var> ...
+</pre></div>
+
+<span id="index-eplain_002eaux"></span>
+<span id="index-undefined-labels_002c-warnings-about"></span>
+<p>You must make sure that <samp>eplain.aux</samp> exists <em>before</em> you
+run <samp>initex</samp>; otherwise, warning messages about undefined labels
+will never be issued.
+</p>
+<span id="index-TEXFORMATS"></span>
+<p>You then have to install the resulting <samp>eplain.fmt</samp> in your local
+<samp>texmf</samp> tree or set an environment variable to tell TeX how to
+find it. For the Web2C port of TeX to Unix, format files are usually
+installed under <samp>/usr/local/share/texmf/web2c/</samp> or
+<samp>/var/lib/texmf/web2c/</samp>; the environment variable is
+<code>TEXFORMATS</code>.
+</p>
+<hr>
+<span id="Invoking-Eplain"></span><div class="header">
+<p>
+Next: <a href="#User-definitions" accesskey="n" rel="next">User definitions</a>, Previous: <a href="#Installation" accesskey="p" rel="prev">Installation</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Invoking-Eplain-1"></span><h2 class="chapter">3 Invoking Eplain</h2>
+
+<span id="index-Eplain_002c-invoking"></span>
+<p>The simplest way to use Eplain is simply to put:
+</p>
+<div class="example">
+<pre class="example">\input eplain
+</pre></div>
+
+<p>at the beginning of your input file. The macro file is small
+enough that reading it does not take an unbearably long time&mdash;at least on
+contemporary machines.
+</p>
+<p>In addition, if a format (<samp>.fmt</samp>)
+<span id="index-_002efmt-file-1"></span>
+file has been created for Eplain (see the previous section), you can
+eliminate the time spent reading the macro source file. You do this
+by responding <code>&amp;eplain</code> to TeX&rsquo;s &lsquo;<samp>**</samp>&rsquo; prompt. For
+example:
+</p>
+<div class="example">
+<pre class="example">initex
+This is TeX, ...
+**&amp;eplain myfile
+</pre></div>
+
+<p>Depending on the implementation of TeX which you are using, you might
+also be able to invoke TeX as <samp>eplain</samp> and have the format file
+automatically read.
+</p>
+<p>If you write something which you will be distributing to others, you
+won&rsquo;t know if the Eplain format will be loaded already. If it is, then
+doing <code>\input eplain</code> will waste time; if it isn&rsquo;t, then you must
+load it. To solve this, Eplain defines the control sequence
+<code>\eplain</code>
+<span id="index-eplain"></span>
+to be the letter <code>t</code> (a convention borrowed from Lisp; it doesn&rsquo;t
+actually matter what the definition is, only that the definition
+exists). Therefore, you can do the following:
+</p>
+<div class="example">
+<pre class="example">\ifx\eplain\undefined \input eplain \fi
+</pre></div>
+
+<p>where <code>\undefined</code> must never acquire a definition.
+</p>
+<p>Eplain consists of several source files:
+</p><dl compact="compact">
+<dt><samp>xeplain.tex</samp></dt>
+<dd><p>most of the macros;
+</p>
+</dd>
+<dt><samp>arrow.tex</samp></dt>
+<dd><p>commutative diagram macros (see <a href="#Arrow-theoretic-diagrams">Arrow theoretic diagrams</a>), written by
+Steven Smith;
+</p>
+</dd>
+<dt><samp>btxmac.tex</samp></dt>
+<dd><p>bibliography-related macros (see <a href="#Citations">Citations</a>);
+</p>
+</dd>
+<dt><samp>ifpdf.sty</samp></dt>
+<dd><p>sets the switch <code>\ifpdf</code>, which can be used to detect pdfTeX
+in PDF mode (see <a href="#Checking-for-PDF-output">Checking for PDF output</a>), written by Heiko
+Oberdiek;
+</p>
+</dd>
+<dt><samp>path.sty</samp></dt>
+<dd><p>macro for allowing line breaks at punctuation characters within long
+pathnames, electronic mail addresses, etc., (see <a href="#Paths">Paths</a>), written
+by Philip Taylor;
+</p>
+</dd>
+<dt><samp>texnames.sty</samp></dt>
+<dd><p>abbreviations for various TeX-related names (see <a href="#Logos">Logos</a>), edited
+by Nelson Beebe.
+</p>
+</dd>
+</dl>
+
+<p>The file <samp>eplain.tex</samp> is all of these files merged
+together, with comments removed. The original sources can be found in
+Eplain source zip archive in your TeX distribution, on <acronym>CTAN</acronym>
+or on Eplain&rsquo;s home page at <a href="https://tug.org/eplain">https://tug.org/eplain</a>.
+</p>
+<p>All of these files except <samp>xeplain.tex</samp> can be input individually,
+if all you want are the definitions in that file.
+</p>
+<p>Also, since the bibliography macros are fairly extensive, you might not
+want to load them, to conserve TeX&rsquo;s memory. Therefore, if the
+control sequence <code>\nobibtex</code>
+<span id="index-nobibtex"></span>
+is defined, then the bibliography definitions are skipped. You must set
+<code>\nobibtex</code> before <samp>eplain.tex</samp> is read, naturally. For
+example, you could start your input file like this:
+</p>
+<div class="example">
+<pre class="example">\let\nobibtex = t
+\input eplain
+</pre></div>
+
+<p>By default, <code>\nobibtex</code> is undefined, and so the
+bibliography definitions <em>are</em> made.
+</p>
+<span id="index-noarrow"></span>
+<p>Likewise, define <code>\noarrow</code> if you don&rsquo;t want to include the
+commutative diagram macros from <samp>arrow.tex</samp>, perhaps because you
+already have conflicting ones.
+</p>
+<p>If you don&rsquo;t want to read or write an <samp>aux</samp> file at all, for any
+kind of cross-referencing, define <code>\noauxfile</code>
+<span id="index-noauxfile"></span>
+before reading <samp>eplain.tex</samp>. This also turns off all warnings
+about undefined labels.
+</p>
+<span id="index-amsppt_002esty"></span>
+<span id="index-AMSTeX-conflicts"></span>
+<p>Eplain conflicts with AMSTeX (to be precise, with <samp>amsppt.sty</samp>):
+the macros <code>\cite</code> and <code>\ref</code> are defined by both.
+</p>
+<p>If you want to use AMSTeX&rsquo;s <code>\cite</code>, the solution is to define
+<code>\nobibtex</code> before reading Eplain, as described above.
+</p>
+<p>If you have <samp>amsppt.sty</samp> loaded and use <code>\ref</code>, Eplain writes
+a warning on your terminal. If you want to use the AMSTeX
+<code>\ref</code>, do <code>\let\ref = \amsref</code> after reading Eplain.
+To avoid the warning, do <code>\let\ref = \eplainref</code> after reading
+Eplain and before using <code>\ref</code>.
+</p>
+<span id="index-texi2dvi"></span>
+<span id="index-bibtex"></span>
+<span id="index-makeindex"></span>
+<p>Sometimes you may need to run TeX more then once on your
+<samp>.tex</samp> file in order to produce and typeset indexes, resolve
+undefined cross-references and/or citations. The shell script
+<code>texi2dvi</code> from the Texinfo documentation system (see
+<a href="http://www.gnu.org/software/texinfo">http://www.gnu.org/software/texinfo</a>) can automate this process:
+it runs BibTeX, MakeIndex and TeX as many times as needed to
+complete the compilation process. You will need to set the
+<code>LATEX</code> environment variable to &lsquo;<samp>tex</samp>&rsquo;. For example, in a
+Bourne-compatible shell, the following command will do all the work:
+</p>
+<div class="example">
+<pre class="example">prompt$ LATEX=tex texi2dvi file.tex
+</pre></div>
+
+<span id="index-pdftex"></span>
+<p>(Despite the name, <code>texi2dvi</code> can also produce
+<samp>.pdf</samp> files; just set &lsquo;<samp>LATEX=pdftex</samp>&rsquo;.) See the output from
+the command <code>texi2dvi --help</code> for invoking information and a
+full list of options.
+</p>
+<hr>
+<span id="User-definitions"></span><div class="header">
+<p>
+Next: <a href="#Hyperlinks" accesskey="n" rel="next">Hyperlinks</a>, Previous: <a href="#Invoking-Eplain" accesskey="p" rel="prev">Invoking Eplain</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="User-definitions-1"></span><h2 class="chapter">4 User definitions</h2>
+
+<p>This chapter describes definitions that are meant to be used directly
+in a document. When appropriate, ways to change the default
+formatting are described in subsections.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Diagnostics" accesskey="1">Diagnostics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Tracing information.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Rules" accesskey="2">Rules</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the default rule dimensions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Citations" accesskey="3">Citations</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using BibTeX and Eplain to make bibliographies.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Displays" accesskey="4">Displays</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the formatting of math displays.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Time-of-day" accesskey="5">Time of day</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing the time of day.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Lists" accesskey="6">Lists</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing numbered and unordered lists.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Verbatim-listing" accesskey="7">Verbatim listing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing text just as it appears.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Contents" accesskey="8">Contents</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making a table of contents.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Cross_002dreferences" accesskey="9">Cross-references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Symbolic references to equations, figures, etc.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-references">Page references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Symbolic references to page numbers.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Equation-references">Equation references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Symbolic references to equation numbers.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Indexing">Indexing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Creating and typesetting indexes.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Justification">Justification</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Ragged left, ragged right, centered.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tables">Tables</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing ordered tables.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Margins">Margins</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the margins directly.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Multiple-columns">Multiple columns</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Getting output in two columns.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Footnotes">Footnotes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Autonumbered footnotes; changing formatting.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Fractions">Fractions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">A better way to produce fractions in text.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Paths">Paths</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Allowing line breaks in pathnames.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Logos">Logos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Various logos.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Boxes">Boxes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing filled or open rectangles.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Checking-for-PDF-output">Checking for PDF output</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Checking for pdfTeX in PDF mode.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Support for LaTeX packages under plain TeX.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Diagnostics"></span><div class="header">
+<p>
+Next: <a href="#Rules" accesskey="n" rel="next">Rules</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Diagnostics-1"></span><h3 class="section">4.1 Diagnostics</h3>
+
+<span id="index-diagnostics"></span>
+<span id="index-tracing"></span>
+<p>Plain TeX provides the <code>\tracingall</code> command, to turn on the
+maximum amount of tracing possible in TeX. The (usually voluminous)
+output from <code>\tracingall</code> goes both on the terminal and into the
+transcript file.
+<span id="index-tracingall"></span>
+It is sometimes easier to have the output go only to the transcript
+file, so you can peruse it at your leisure and not obscure other output
+to the terminal. So, Eplain provides the command <code>\loggingall</code>.
+<span id="index-loggingall"></span>
+(For some reason, this command is available in Metafont, but not in
+TeX.)
+</p>
+<p>It is also sometimes useful to see the complete contents of boxes.
+<code>\tracingboxes</code> does this. (It doesn&rsquo;t affect whether or not the
+contents
+<span id="index-tracingboxes"></span>
+are shown on the terminal.)
+</p>
+<p>You can turn off all tracing with <code>\tracingoff</code>.
+<span id="index-tracingoff"></span>
+</p>
+<p>You can also turn logging on and off globally, so you don&rsquo;t have to
+worry about whether or not you&rsquo;re inside a group at the time of command.
+These variants are named <code>\gloggingall</code>
+<span id="index-gloggingall"></span>
+and <code>\gtracingall</code>.
+<span id="index-gtracingall"></span>
+</p>
+<p>Finally, if you write your own help messages (see <code>\newhelp</code>
+<span id="index-help-messages"></span>
+<span id="index-error-messages"></span>
+in <cite>The TeXbook</cite>), you want a convenient way to break lines in
+them. This is what TeX&rsquo;s <code>\newlinechar</code> parameter is for;
+<span id="index-newlinechar"></span>
+however, plain TeX doesn&rsquo;t set <code>\newlinechar</code>. Therefore,
+Eplain defines it to be the character <code>^^J</code>.
+</p>
+<p>For example, one of Eplain&rsquo;s own error messages is defined as follows:
+</p>
+<div class="example">
+<pre class="example">\newhelp\envhelp{Perhaps you forgot to end the previous^^J%
+ environment? I'm finishing off the current group,^^J%
+ hoping that will fix it.}%
+</pre></div>
+
+
+<hr>
+<span id="Rules"></span><div class="header">
+<p>
+Next: <a href="#Citations" accesskey="n" rel="next">Citations</a>, Previous: <a href="#Diagnostics" accesskey="p" rel="prev">Diagnostics</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Rules-1"></span><h3 class="section">4.2 Rules</h3>
+
+<p>The default dimensions of rules are defined in chapter&nbsp;21 of the
+<cite>The TeXbook</cite>. To sum up what is given there, the &ldquo;thickness&rdquo;
+of rules is
+<span id="index-rule-thickness"></span>
+0.4pt by default. Eplain defines three parameters that let you change
+this dimension: <code>\hruledefaultheight</code>, <code>\hruledefaultdepth</code>,
+<span id="index-hruledefaultheight"></span>
+<span id="index-hruledefaultdepth"></span>
+and <code>\vruledefaultwidth</code>. By default, they are defined as
+<span id="index-vruledefaultwidth"></span>
+<cite>The TeXbook</cite> describes.
+</p>
+<p>But it would be wrong to redefine <code>\hrule</code> and <code>\vrule</code>. For
+one thing, some macros in plain TeX depend on the default dimensions
+being used; for another, rules are used quite heavily, and the
+performance impact of making it a macro can be noticeable. Therefore,
+to take advantage of the default rule parameters, you must use
+<code>\ehrule</code>
+<span id="index-ehrule"></span>
+and <code>\evrule</code>.
+<span id="index-evrule"></span>
+</p>
+
+<hr>
+<span id="Citations"></span><div class="header">
+<p>
+Next: <a href="#Displays" accesskey="n" rel="next">Displays</a>, Previous: <a href="#Rules" accesskey="p" rel="prev">Rules</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Citations-1"></span><h3 class="section">4.3 Citations</h3>
+
+<span id="index-citations"></span>
+<span id="index-bibliographies"></span>
+<p>Bibliographies are part of almost every technical document. To handle
+them conveniently, you need two things: a program to do the tedious
+formatting, and a way to cite references by labels, rather than by
+numbers. The BibTeX program, written by Oren Patashnik, takes care
+<span id="index-BibTeX"></span>
+<span id="index-Patashnik_002c-Oren"></span>
+of the first item; the citation commands in LaTeX, written to be used
+<span id="index-LaTeX-1"></span>
+with BibTeX, take care of the second. Therefore,
+Eplain adopts the use of BibTeX, and virtually the same interface as
+LaTeX.
+</p>
+<p>The general idea is that you put citation commands in the text of your
+document, and commands saying where the bibliography data is. When you
+run TeX, these commands produce output on the file with the same root
+name as your document (by default) and the extension <samp>.aux</samp>.
+<span id="index-_002eaux-file"></span>
+<span id="index-jobname"></span>
+BibTeX reads this file. You should put the bibliography data in a
+file or files with the extension <samp>.bib</samp>. BibTeX writes out a
+file with the same root
+<span id="index-_002ebib-file"></span>
+name as your document and extension <samp>.bbl</samp>. Eplain reads this file
+<span id="index-_002ebbl-file"></span>
+the next time you run your document through TeX. (It takes
+multiple passes to get everything straight, because usually after seeing
+your bibliography typeset, you want to make changes in the <samp>.bib</samp>
+file, which means you have to run BibTeX again, which means you have
+to run TeX again&hellip;) An annotated example of the whole process is
+given below.
+</p>
+<p>If your document has more than one bibliography&mdash;for example, if it
+is a collection of papers&mdash;you can tell Eplain to use a different root
+name for the <samp>.bbl</samp> file by defining the control sequence
+<code>\bblfilebasename</code>.
+<span id="index-bblfilebasename"></span>
+The default definition is simply <code>\jobname</code>.
+</p>
+<p>On the other hand, if your document&rsquo;s bibliography is very simple, you
+may prefer to create the <samp>.bbl</samp> file yourself, by hand, instead of
+using BibTeX. An annotated example of this approach is also given
+below.
+</p>
+<p>See the document <cite>BibTeXing</cite> (whose text is in the file
+<samp>btxdoc.tex</samp>, which should be in the Eplain distribution you got)
+for information on how to write your <tt>.bib</tt> files. Both the
+BibTeX and the Eplain distributions contain several examples, also.
+</p>
+<p>The <code>\cite</code>
+<span id="index-cite"></span>
+command produces a citation in the text of your document. The exact
+printed form the citation will take is under your control
+(see <a href="#Formatting-citations">Formatting citations</a>). <code>\cite</code> takes one
+required argument, a comma-separated list of cross-reference labels
+(see <a href="#Cross_002dreferences">Cross-references</a>, for exactly what characters are allowed in
+such labels). Warning: spaces in this list are taken as part of the
+following label name, which is probably not what you expect.
+<span id="index-citations_002c-undefined"></span>
+The <code>\cite</code> command also produces a command
+in the <tt>.aux</tt> file that tells BibTeX to retrieve the given reference(s)
+from the <tt>.bib</tt> file. <code>\cite</code> also takes one optional argument,
+which you specify within square brackets, as in LaTeX. This text is
+simply typeset after the citations. (See the example below.)
+</p>
+<p>Eplain can create hypertext links for citations pointing to the relevant
+bibliography entries (see <a href="#Citation-hyperlinks">Citation hyperlinks</a>).
+</p>
+<p>Another command, <code>\nocite</code>,
+<span id="index-nocite"></span>
+puts the given reference(s) into the bibliography, but produces nothing
+in the text.
+</p>
+<p>The <code>\bibliography</code>
+<span id="index-bibliography"></span>
+command is next. It serves two purposes: producing the typeset
+bibliography, and telling BibTeX the root names of the <tt>.bib</tt>
+files. Therefore, the argument to <code>\bibliography</code> is a comma
+separated list of the <tt>.bib</tt> files (without the &lsquo;<samp>.bib</samp>&rsquo;). Again,
+spaces in this list are significant.
+</p>
+<p>You tell BibTeX the particular style in which you want your
+bibliography typeset with one more command:
+<code>\bibliographystyle</code>.
+<span id="index-bibliographystyle"></span>
+The argument to this is a single filename <var>style</var>, which tells
+BibTeX to look for a file <var>style</var><tt>.bst</tt>.
+<span id="index-_002ebst-files"></span>
+See the document <cite>Designing BibTeX styles</cite> (whose text is in the
+<samp>btxhak.tex</samp>) for information on how to write your own styles.
+</p>
+<p>Eplain automatically reads the citations from the <tt>.aux</tt> file when
+your job starts.
+</p>
+<p>If you don&rsquo;t want to see the messages about undefined citations, you
+can say <code>\xrefwarningfalse</code> before making any citations.
+<span id="index-xrefwarningfalse"></span>
+Eplain automatically does this if the <tt>.aux</tt> file does not exist.
+You can restore the default by saying <code>\xrefwarningtrue</code>.
+</p>
+<p>Here is a TeX input file that illustrates the various commands.
+</p>
+<div class="example">
+<pre class="example">\input eplain % Reads the .aux file.
+Two citations to Knuthian works:
+ \cite[note]{surreal,concrete-math}.
+\beginsection{References.}\par % Title for the bibliography.
+\bibliography{knuth} % Use knuth.bib for the labels.
+\bibliographystyle{plain} % Number the references.
+\end % End of the document.
+</pre></div>
+<span id="index-Knuth_002c-Donald-Ervin"></span>
+<span id="index-Graham_002c-Ronald-L_002e"></span>
+<span id="index-numbered-references"></span>
+<span id="index-references_002c-numbered"></span>
+
+<p>If we suppose that this file was named <samp>citex.tex</samp> and that the
+bibliography data is in <samp>knuth.bib</samp> (as the above
+<code>\bibliography</code> command says), the following commands do what&rsquo;s
+required. (&lsquo;<samp>$ </samp>&rsquo; represents the shell prompt.)
+</p>
+<div class="example">
+<pre class="example">$ tex citex <i>(produces undefined citation messages)</i>
+$ bibtex citex <i>(read knuth.bib and citex.aux, write citex.bbl)</i>
+$ tex citex <i>(read citex.bbl, still have undefined citations)</i>
+$ tex citex <i>(one more time, to resolve the references)</i>
+</pre></div>
+
+<span id="index-texi2dvi-1"></span>
+<p>The <code>texi2dvi</code> program can help you automate this
+process (see <a href="#Invoking-Eplain">Invoking Eplain</a>).
+</p>
+<p>For simple documents you might choose to write the <samp>.bbl</samp> file
+yourself, instead of running BibTeX. For this scenario, the
+following commands should suffice:
+</p>
+<div class="example">
+<pre class="example">$ tex citex <i>(read citex.bbl, produces undefined citation messages)</i>
+$ tex citex <i>(one more time, to resolve the references)</i>
+</pre></div>
+
+<p>The output looks something like (because we used the <tt>plain</tt>
+bibliography style):
+</p>
+<blockquote>
+<p>Two citations to Knuthian works: [2,1 note].
+</p>
+<p><b>References</b>
+</p>
+<p>[1] Ronald L. Graham, Donald E. Knuth, and Oren Patashnik. <i>Concrete
+Mathematics</i>. Addison-Wesley, Reading, Massachusetts, 1989.
+</p>
+<p>[2] Donald E. Knuth. <i>Surreal Numbers</i>. Addison-Wesley, Reading,
+Massachusetts, 1974.
+</p></blockquote>
+
+<p>See the BibTeX documentation for information on how to write the
+bibliography databases, and the bibliography styles that are available.
+(If you want your references printed with names, as in [Knu74], instead
+of numbered, the bibliography style is <code>alpha</code>.)
+<span id="index-alphanumeric-references"></span>
+<span id="index-references_002c-alphanumeric"></span>
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Formatting-citations" accesskey="1">Formatting citations</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the way citations are printed.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Formatting-bibliographies" accesskey="2">Formatting bibliographies</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the way bibliographies are printed.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Commands-from-LaTeX" accesskey="3">Commands from LaTeX</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">LaTeX commands defined by <samp>btxmac</samp>.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Formatting-citations"></span><div class="header">
+<p>
+Next: <a href="#Formatting-bibliographies" accesskey="n" rel="next">Formatting bibliographies</a>, Up: <a href="#Citations" accesskey="u" rel="up">Citations</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Formatting-citations-1"></span><h4 class="subsection">4.3.1 Formatting citations</h4>
+
+<span id="index-citations_002c-formatting"></span>
+
+<p>You may wish to change Eplain&rsquo;s formatting of citations; i.e., the
+result of your <code>\cite</code> commands. By default, the citation labels
+are printed one after another, separated by commas and enclosed in
+brackets, using the main text font. Some formats require other styles,
+such as superscripted labels. You can accommodate such formats by
+redefining the following macros.
+</p>
+<dl compact="compact">
+<dt><code>\printcitestart</code></dt>
+<dt><code>\printcitefinish</code></dt>
+<dd><span id="index-printcitestart"></span>
+<span id="index-printcitefinish"></span>
+<p>Eplain expands these macros at the beginning and end of the list of
+citations for each <code>\cite</code> command. By default, they produce a
+&lsquo;<samp>[</samp>&rsquo; and &lsquo;<samp>]</samp>&rsquo;, respectively.
+</p>
+</dd>
+<dt><code>\printbetweencitations</code></dt>
+<dd><span id="index-printbetweencitations"></span>
+<p>If a <code>\cite</code> command has multiple citations, as in
+<code>\cite{acp,texbook}</code>, Eplain expands this macro in between each
+pair of citations. By default, it produces a comma followed by a space.
+</p>
+</dd>
+<dt><code>\printcitenote</code></dt>
+<dd><span id="index-printcitenote"></span>
+<p>This macro takes one argument, which is the optional note to the
+<code>\cite</code> command. If the <code>\cite</code> command had no note, this
+macro isn&rsquo;t used. Otherwise, it should print the note. By default, the
+note is preceded with a comma and a space.
+</p></dd>
+</dl>
+
+
+<p>Here is an example, showing you could produce citations as
+superscripted labels, with the optional notes in parentheses.
+</p>
+<div class="example">
+<pre class="example">\def\printcitestart{\unskip $^\bgroup}
+\def\printbetweencitations{,}
+\def\printcitefinish{\egroup$}
+\def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
+</pre></div>
+
+
+<hr>
+<span id="Formatting-bibliographies"></span><div class="header">
+<p>
+Next: <a href="#Commands-from-LaTeX" accesskey="n" rel="next">Commands from LaTeX</a>, Previous: <a href="#Formatting-citations" accesskey="p" rel="prev">Formatting citations</a>, Up: <a href="#Citations" accesskey="u" rel="up">Citations</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Formatting-bibliographies-1"></span><h4 class="subsection">4.3.2 Formatting bibliographies</h4>
+
+<span id="index-bibliography_002c-formatting-the"></span>
+
+<p>You may wish to change Eplain&rsquo;s formatting of the bibliography,
+especially with respect to the fonts that are used. Therefore, Eplain
+provides the following control sequences:
+</p>
+<dl compact="compact">
+<dt><code>\biblabelwidth</code></dt>
+<dd><span id="index-biblabelwidth"></span>
+<p>This control sequence represents a <code>\dimen</code> register, and its value
+is the width of the widest label in the bibliography. Although it is
+unlikely you will ever want to redefine it, you might want
+to use it if you redefine <code>\biblabelprint</code>, below.
+</p>
+</dd>
+<dt><code>\biblabelprint</code></dt>
+<dd><span id="index-biblabelprint"></span>
+<p>This macro takes one argument, the label to print. By default, the
+label is put in a box of width <code>\biblabelwidth</code>, and is followed by
+an enspace. When you want to change the spacing around the labels, this
+is the right macro to redefine.
+</p>
+</dd>
+<dt><code>\biblabelcontents</code></dt>
+<dd><span id="index-biblabelcontents"></span>
+<p>This macro also takes one argument, the label to print. By default, the
+label is printed using the font <code>\bblrm</code> (below), and enclosed in
+brackets. When you want to change the appearance of the label, but not
+the spacing around it, this is the right macro to redefine.
+</p>
+</dd>
+<dt><code>\biblabelprecontents</code></dt>
+<dt><code>\biblabelpostcontents</code></dt>
+<dd><span id="index-biblabelprecontents"></span>
+<span id="index-biblabelpostcontents"></span>
+<p>Macros expanded before and after <code>\biblabelcontents</code>,
+respectively. For example, to get left-justified numeric labels (they
+are right-justified by default):
+</p>
+<div class="example">
+<pre class="example">\def\biblabelprecontents{\relax}
+\def\biblabelpostcontents{\hss}
+</pre></div>
+
+</dd>
+<dt><code>\bblrm</code></dt>
+<dd><span id="index-bblrm"></span>
+<span id="index-bibliography-fonts"></span>
+<p>The default font used for printing the bibliography.
+</p>
+</dd>
+<dt><code>\bblem</code></dt>
+<dd><span id="index-bblem"></span>
+<p>The font used for printing the titles and other &ldquo;emphasized&rdquo; material.
+</p>
+</dd>
+<dt><code>\bblemph</code></dt>
+<dd><span id="index-bblemph"></span>
+<span id="index-italic-correction"></span>
+<p>Typesets its argument using <code>\bblem</code>, then inserts an italic correction.
+</p>
+</dd>
+<dt><code>\bblsc</code></dt>
+<dd><span id="index-bblsc"></span>
+<p>In some styles, authors&rsquo; names are printed in a caps-and-small-caps
+font. In those cases, this font is used.
+</p>
+</dd>
+<dt><code>\bblnewblock</code></dt>
+<dd><span id="index-bblnewblock"></span>
+<p>This is invoked between each of the parts of a bibliography entry. The
+default is to leave some extra space between the parts; you could
+redefine it to start each part on a new line (for example). A part is
+simply a main element of the entry; for example, the author is a part.
+(It was LaTeX that introduced the (misleading, as far as I am
+concerned) term &lsquo;block&rsquo; for this.)
+</p>
+</dd>
+<dt><code>\biblabelextraspace</code></dt>
+<dd><span id="index-biblabelextraspace"></span>
+<p>Bibliography entries are typeset with a hanging indentation of
+<code>\biblabelwidth</code> plus this. The default is <code>.5em</code>, where the
+em width is taken from the <code>\bblrm</code> font. If you want to change
+this, you should do it inside <code>\bblhook</code>.
+</p>
+</dd>
+<dt><code>\bblhook</code></dt>
+<dd><span id="index-bblhook"></span>
+<span id="index-bibliography-items_002c-extra-space-between"></span>
+<p>This is expanded before reading the <tt>.bbl</tt> file. By
+default, it does nothing. You could, for example, define it to set the
+bibliography fonts, or produce the heading for the references. Two
+spacing parameters must be changed inside <code>\bblhook</code>:
+<code>\parskip</code>, which produces extra space between the items; and
+<code>\biblabelextraspace</code>, which is described above.
+(By the way, <code>\hookappend</code> won&rsquo;t work with <code>\bblhook</code>, despite
+the names. Just use <code>\def</code>.)
+</p>
+</dd>
+</dl>
+
+<p>If you are desperate, of course you can also hand-edit the <tt>.bbl</tt>
+file that BibTeX produces to do anything you wish.
+</p>
+
+<hr>
+<span id="Commands-from-LaTeX"></span><div class="header">
+<p>
+Previous: <a href="#Formatting-bibliographies" accesskey="p" rel="prev">Formatting bibliographies</a>, Up: <a href="#Citations" accesskey="u" rel="up">Citations</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Commands-from-LaTeX-1"></span><h4 class="subsection">4.3.3 Commands from LaTeX</h4>
+
+<span id="index-LaTeX-commands_002c-in-btxmac_002etex"></span>
+<p>Because of the historical connection between BibTeX and LaTeX,
+in practice many bibliography styles and bibliographies use LaTeX
+commmands that are not part of bibliography handling, per se.
+</p>
+<p>To support this, <samp>btxmac.tex</samp> (and thus Eplain) define the
+following. In all cases, an existing definition (e.g., from
+<samp>miniltx.tex</samp>, see <a href="#Loading-LaTeX-packages">Loading LaTeX
+packages</a>) will not be overwritten. Here is the list:
+</p>
+<dl compact="compact">
+<dt><code>\newcommand</code></dt>
+<dt><code>\renewcommand</code></dt>
+<dt><code>\providecommand</code></dt>
+<dd><span id="index-newcommand"></span>
+<span id="index-renewcommand"></span>
+<span id="index-providecommand"></span>
+<span id="index-_002a_002dform-of-LaTeX-commands"></span>
+<p>Defining new commands in various ways. The Eplain versions do not
+support the *-form of these; use <samp>miniltx</samp> for that.
+</p>
+</dd>
+<dt><code>\em</code></dt>
+<dt><code>\emph</code></dt>
+<dt><code>\sc</code></dt>
+<dt><code>\textbf</code></dt>
+<dd><span id="index-em"></span>
+<span id="index-emph"></span>
+<span id="index-sc"></span>
+<span id="index-textbf"></span>
+<p>Selecting fonts.
+</p>
+</dd>
+<dt><code>\mbox</code></dt>
+<dd><span id="index-mbox"></span>
+<p>A horizontal box.
+</p>
+</dd>
+<dt><code>\newblock</code></dt>
+<dd><span id="index-newblock"></span>
+<p>Starts elements of a bibliography entry.
+</p></dd>
+</dl>
+
+<p>For full information about these, see the LaTeX manual and sources.
+</p>
+
+<hr>
+<span id="Displays"></span><div class="header">
+<p>
+Next: <a href="#Time-of-day" accesskey="n" rel="next">Time of day</a>, Previous: <a href="#Citations" accesskey="p" rel="prev">Citations</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Displays-1"></span><h3 class="section">4.4 Displays</h3>
+
+<span id="index-displays_002c-left_002djustifying"></span>
+<span id="index-mathematics-displays_002c-formatting"></span>
+<span id="index-left_002djustification-of-displays"></span>
+<span id="index-equation-numbers_002c-left_002dalignment"></span>
+<span id="index-left_002dalignment-of-equation-numbers"></span>
+
+<p>By default, TeX centers displayed material. (Displayed material is
+just whatever you put between <code>$$</code>&rsquo;s&mdash;it&rsquo;s not necessarily
+mathematics.) Many layouts would be better served if the displayed
+material was left-justified. Therefore, Eplain provides the command
+<code>\leftdisplays</code>,
+<span id="index-leftdisplays"></span>
+which indents displayed material by <code>\parindent</code> plus
+<code>\leftskip</code>, plus <code>\leftdisplayindent</code>.
+<span id="index-leftdisplayindent"></span>
+</p>
+<p>You can go back to centering displays with <code>\centereddisplays</code>.
+<span id="index-centereddisplays"></span>
+(It is usually poor typography to have both centered and left-justified
+displays in a single publication, though.)
+</p>
+<p><code>\leftdisplays</code> also changes the plain TeX commands that deal
+with alignments inside math displays,
+<code>\displaylines</code>,
+<span id="index-displaylines"></span>
+<code>\eqalignno</code>,
+<span id="index-eqalignno"></span>
+and <code>\leqalignno</code>,
+<span id="index-leqalignno"></span>
+to produce left-justified text. You can still override this formatting
+by inserting <code>\hfill</code> glue, as explained in <cite>The TeXbook</cite>.
+</p>
+<span id="index-lefteqnumbers"></span>
+<span id="index-righteqnumbers"></span>
+<span id="index-eqnum"></span>
+<span id="index-eqalignnum"></span>
+<span id="index-eqno"></span>
+<span id="index-leqno"></span>
+<span id="index-eqalignno-1"></span>
+<span id="index-leqalignno-1"></span>
+<p>Eplain defines <code>\eqnum</code> and <code>\eqalignnum</code> which can be set
+up to produce either left-aligned or right-aligned equation numbers.
+<code>\lefteqnumbers</code> (<code>\righteqnumbers</code>) will define
+<code>\eqnum</code> to expand to <code>\eqno</code> (<code>\leqno</code>), and
+<code>\eqalignnum</code> to expand to <code>\eqalignno</code>
+(<code>\leqalignno</code>). Default is <code>\righteqnumbers</code>
+(right-aligned equation numbers).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Formatting-displays" accesskey="1">Formatting displays</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">General formatting of displays.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Formatting-displays"></span><div class="header">
+<p>
+Up: <a href="#Displays" accesskey="u" rel="up">Displays</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Formatting-displays-1"></span><h4 class="subsection">4.4.1 Formatting displays</h4>
+
+<p>If you want some other kind of formatting, you can write a definition
+of your own, analogous to <code>\leftdisplays</code>. You need only make sure
+that <code>\leftdisplaysetup</code>
+<span id="index-leftdisplaysetup"></span>
+is called at the beginning of every display (presumably by invoking it
+in TeX&rsquo;s <code>\everydisplay</code> parameter).
+</p>
+<p><code>\leftdisplays</code> expands the old value of <code>\everydisplay</code>
+before calling <code>\leftdisplaysetup</code>, so that any changes you have made
+to it won&rsquo;t be lost. That old token list as available as the value of
+the token register <code>\previouseverydisplay</code>.
+<span id="index-previouseverydisplay"></span>
+</p>
+
+<hr>
+<span id="Time-of-day"></span><div class="header">
+<p>
+Next: <a href="#Lists" accesskey="n" rel="next">Lists</a>, Previous: <a href="#Displays" accesskey="p" rel="prev">Displays</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Time-of-day-1"></span><h3 class="section">4.5 Time of day</h3>
+
+<span id="index-time-of-day"></span>
+<span id="index-date"></span>
+
+<p>TeX provides the day, month, and year as numeric quantities (unless
+your TeX implementation is woefully deficient). Eplain provides some
+control sequences to make them a little more friendly to humans.
+</p>
+<p><code>\monthname</code>
+<span id="index-monthname"></span>
+produces the name of the current month, abbreviated to three letters.
+</p>
+<p><code>\fullmonthname</code>
+<span id="index-fullmonthname"></span>
+produces the name of the current month, unabbreviated (in English).
+</p>
+<p><code>\timestring</code>
+<span id="index-timestring"></span>
+produces the current time, as in &lsquo;1:14 p.m.&rsquo;
+</p>
+<p><code>\timestamp</code>
+<span id="index-timestamp"></span>
+produces the current date and time, as in &lsquo;23 Apr 64 1:14 p.m.&rsquo;.
+(Except the spacing is slightly different.)
+</p>
+<p><code>\today</code>
+<span id="index-today"></span>
+produces the current date, as in &lsquo;23 April 1964&rsquo;.
+</p>
+
+<hr>
+<span id="Lists"></span><div class="header">
+<p>
+Next: <a href="#Verbatim-listing" accesskey="n" rel="next">Verbatim listing</a>, Previous: <a href="#Time-of-day" accesskey="p" rel="prev">Time of day</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Lists-1"></span><h3 class="section">4.6 Lists</h3>
+
+<span id="index-lists"></span>
+<span id="index-numbered-lists"></span>
+<span id="index-ordered-list"></span>
+<span id="index-unordered-lists"></span>
+
+<p>Many documents require lists of items, either numbered or simply
+enumerated. Plain TeX defines one macro to help with creating lists,
+<code>\item</code>, but that is insufficient in many cases. Therefore,
+Eplain provides two pairs of commands:
+</p>
+<dl compact="compact">
+<dt><code>\numberedlist &hellip; \endnumberedlist</code></dt>
+<dt><code>\orderedlist &hellip; \endorderedlist</code></dt>
+<dd><span id="index-numberedlist"></span>
+<span id="index-endnumberedlist"></span>
+<span id="index-orderedlist"></span>
+<span id="index-endorderedlist"></span>
+<p>These commands (they are synonyms) produce a list with the items
+numbered sequentially, starting from one. A nested <code>\numberedlist</code>
+labels the items with lowercase letters, starting with &lsquo;a&rsquo;. Another
+nested <code>\numberedlist</code> labels the items with roman numerals. Yet
+more deeply nested numbered lists label items with &lsquo;<samp>*</samp>&rsquo;.
+</p>
+</dd>
+<dt><code>\unorderedlist &hellip; \endunorderedlist</code></dt>
+<dd><span id="index-unorderedlist"></span>
+<span id="index-endunorderedlist"></span>
+<p>This produces a list with the items labelled with small black boxes
+(&ldquo;square bullets&rdquo;). A nested <code>\unorderedlist</code> labels items with
+em-dashes. Doubly (and deeper) nested unordered lists label items with
+&lsquo;*&rsquo;s.
+</p>
+</dd>
+</dl>
+
+<p>The two kinds of lists can be nested within each other, as well.
+</p>
+<p>In both kinds of lists, you begin an item with <code>\li</code>.
+<span id="index-li"></span>
+An item may continue for several paragraphs. Each item starts a
+paragraph.
+</p>
+<p>You can give <code>\li</code> an optional argument, a cross-reference label.
+It&rsquo;s defined to be the &ldquo;marker&rdquo; for the current item. This is useful
+if the list items are numbered. You can produce the value of the label
+with <code>\xrefn</code>. See <a href="#Cross_002dreferences">Cross-references</a>.
+</p>
+<p>Eplain can create hypertext links for the markers produced by
+<code>\xrefn</code> pointing to the relevant list item (see <a href="#List-hyperlinks">List hyperlinks</a>).
+</p>
+<p>You can also say <code>\listcompact</code>
+<span id="index-listcompact"></span>
+right after <code>\numberedlist</code> or <code>\unorderedlist</code>. The items in
+the list will then not have any extra space between them
+(see <a href="#Formatting-lists">Formatting lists</a>). You might want to do this if the items in
+this particular list are short.
+</p>
+<p>Here is an example:
+</p>
+<div class="example">
+<pre class="example">\numberedlist\listcompact
+\li The first item.
+\li The second item.
+
+The second paragraph of the second item.
+\endnumberedlist
+</pre></div>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Formatting-lists" accesskey="1">Formatting lists</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing how the lists look.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Formatting-lists"></span><div class="header">
+<p>
+Up: <a href="#Lists" accesskey="u" rel="up">Lists</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Formatting-lists-1"></span><h4 class="subsection">4.6.1 Formatting lists</h4>
+
+<span id="index-lists_002c-formatting"></span>
+
+<p>Several registers define the spacing associated with lists. It is
+likely that their default values won&rsquo;t suit your particular layout.
+</p>
+<dl compact="compact">
+<dt><code>\abovelistskipamount, \belowlistskipamount</code></dt>
+<dd><span id="index-abovelistskipamount"></span>
+<span id="index-belowlistskipamount"></span>
+<p>The vertical glue inserted before and after every list, respectively.
+</p>
+</dd>
+<dt><code>\interitemskipamount</code></dt>
+<dd><span id="index-interitemskipamount"></span>
+<p>The vertical glue inserted before each item except the first.
+<code>\listcompact</code> resets this to zero, as mentioned above.
+</p>
+</dd>
+<dt><code>\listleftindent, \listrightindent</code></dt>
+<dd><span id="index-listleftindent"></span>
+<span id="index-listrightindent"></span>
+<p><code>\listrightindent</code> is the amount of space by which the list is
+indented on the right; i.e., it is added to <code>\rightskip</code>.
+<code>\listleftindent</code> is the amount of space, <em>relative to</em>
+<code>\parindent</code>, by which the list is indented on the left. Why treat
+the two parameters differently? Because (a)&nbsp;it is more useful to
+make the list indentation depend on the paragraph indentation;
+(b)&nbsp;footnotes aren&rsquo;t formatted right if <code>\parindent</code> is reset
+to zero.
+</p>
+</dd>
+</dl>
+
+<p>The three vertical glues are inserted by macros, and preceded by
+penalties: <code>\abovelistskip</code>
+<span id="index-abovelistskip"></span>
+does <code>\vpenalty\abovelistpenalty</code>
+<span id="index-abovelistpenalty"></span>
+and then <code>\vskip\abovelistskip</code>. <code>\belowlistskip</code>
+<span id="index-belowlistskip"></span>
+and <code>\interitemskip</code>
+<span id="index-interitemskip"></span>
+are analogous.
+</p>
+<p>In addition, the macro <code>\listmarkerspace</code>
+<span id="index-listmarkerspace"></span>
+is called to separate the item label from the item text. This is set to
+<code>\enspace</code> by default.
+</p>
+<p>If you want to change the labels on the items, you can redefine these
+macros:
+<code>\numberedmarker</code>
+<span id="index-numberedmarker"></span>
+or <code>\unorderedmarker</code>.
+<span id="index-unorderedmarker"></span>
+The following registers might be useful if you do:
+</p>
+<dl compact="compact">
+<dt><code>\numberedlistdepth, \unorderedlistdepth</code></dt>
+<dd><span id="index-numberedlistdepth"></span>
+<span id="index-unorderedlistdepth"></span>
+<p>These keep track of the depth of nesting of the two kinds of lists.
+</p>
+</dd>
+<dt><code>\itemnumber, \itemletter</code></dt>
+<dd><span id="index-itemnumber"></span>
+<span id="index-itemletter"></span>
+<p>These keep track of the number of items that have been seen in the current
+numbered list. They are both integer registers. The difference is that
+<code>\itemnumber</code> starts at one, and <code>\itemletter</code> starts at 97,
+i.e., lowercase &lsquo;a&rsquo;.
+</p>
+</dd>
+</dl>
+
+<p>You can also redefine the control sequences that are used internally,
+if you want to do something radically different: <code>\beginlist</code>
+<span id="index-beginlist"></span>
+is invoked to begin both kinds of lists; <code>\printitem</code>
+<span id="index-printitem"></span>
+is invoked to print the label (and space following the label) for each
+item; and <code>\endlist</code>
+<span id="index-endlist"></span>
+is invoked to end both kinds of
+lists.
+<span id="index-item-labels_002c-changing"></span>
+<span id="index-labels-on-items_002c-changing"></span>
+</p>
+
+<hr>
+<span id="Verbatim-listing"></span><div class="header">
+<p>
+Next: <a href="#Contents" accesskey="n" rel="next">Contents</a>, Previous: <a href="#Lists" accesskey="p" rel="prev">Lists</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Verbatim-listing-1"></span><h3 class="section">4.7 Verbatim listing</h3>
+
+<span id="index-verbatim-listing"></span>
+<span id="index-listing-files"></span>
+<span id="index-files_002c-verbatim-listing-of"></span>
+<p>It is sometimes useful to include a file verbatim in your document;
+for example, part of a computer program. The <code>\listing</code>
+<span id="index-listing"></span>
+command is given one argument, a filename, and produces the contents of
+that file in your document. <code>\listing</code> expands <code>\listingfont</code>
+to set the current font. The default value of <code>\listingfont</code>
+<span id="index-listingfont"></span>
+is <code>\tt</code>.
+</p>
+<p>You can take arbitrary actions before reading the file by defining the macro
+<code>\setuplistinghook</code>.
+<span id="index-setuplistinghook"></span>
+This is expanded just before the file is input.
+</p>
+<p>If you want to have line numbers on the output, you can say
+<code>\let\setuplistinghook = \linenumberedlisting</code>.
+<span id="index-linenumberedlisting"></span>
+The line numbers are stored in the count register <code>\lineno</code> while
+the file is being read. You can redefine the macro
+<code>\printlistinglineno</code>
+<span id="index-printlistinglineno"></span>
+to change how they are printed.
+</p>
+<p>Normally, the <code>\listing</code> command will add a final empty line at
+the end of the output, even if the file does not end in a newline. To
+suppress this final line, you can say
+<code>\let\setuplistinghook = \nolastlinelisting</code>.
+<span id="index-nolastlinelisting"></span>
+This also works with line numbers (say
+<code>\def\setuplistinghook{\linenumberedlisting \nolastlinelisting}</code>),
+but only if <code>\printlistinglineno</code>
+<span id="index-printlistinglineno-1"></span>
+consists exclusively of boxes at the top level (i.e., any
+<code>\kern</code>s or glue should be wrapped up in a box).
+</p>
+<span id="index-form-feed-character_002c-and-verbatim-listing"></span>
+<span id="index-CTRL_002dL_002c-and-verbatim-listing"></span>
+<p>You can use the form feed control character (<acronym>ASCII</acronym>
+code&nbsp;12, typed as <kbd>CTRL-L</kbd>) in the file to force a page break
+in the output.
+</p>
+<p>You can produce in-line verbatim text in your document with <code>\verbatim</code>.
+<span id="index-verbatim"></span>
+End the text with <code>|endverbatim</code>. If you need a &lsquo;<samp>|</samp>&rsquo; in the text,
+double it. If the first character of the verbatim text is a space, use
+<code>| </code>. (<code>| </code> will work elsewhere in the argument, too, but
+isn&rsquo;t necessary.)
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\verbatim| ||\#%&amp;!|endverbatim
+</pre></div>
+
+<p>produces <code> |\#%&amp;!</code>.
+</p>
+<p>Line breaks and spaces in the verbatim text are preserved.
+</p>
+<span id="index-verbatimescapechar"></span>
+<span id="index-escape-character_002c-changing-verbatim"></span>
+<p>You can change the verbatim escape character from the default &lsquo;<samp>|</samp>&rsquo;
+with <code>\verbatimescapechar <var>char</var></code>; for example, this changes
+it to &lsquo;<samp>@</samp>&rsquo;.
+</p>
+<div class="example">
+<pre class="example">\verbatimescapechar \@
+</pre></div>
+
+<p>The backslash is not necessary in some cases, but is in
+others, depending on the catcode of the character. The argument to
+<code>\verbatimescapechar</code> is used as <code>\catcode `<var>char</var></code>, so
+the exact rules follow that for <code>\catcode</code>.
+</p>
+<span id="index-special-characters"></span>
+<span id="index-characters_002c-special"></span>
+<span id="index-uncatcodespecials"></span>
+<span id="index-dospecials"></span>
+<p>To reset the category code of all special characters to 12
+(&ldquo;other&rdquo;), <code>\verbatim</code> uses <code>\uncatcodespecials</code>
+(see <a href="#Category-codes">Category codes</a>). If you make additional characters
+&ldquo;special&rdquo;, you should extend <code>\dospecials</code> to include those
+characters, lest they be given special treatment inside verbatim
+environments. For example,
+</p>
+<div class="example">
+<pre class="example">\catcode`\A=\active
+% Try commenting out the following line.
+\expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\A}
+\verbatimA#$%_^|endverbatim
+</pre></div>
+
+<p>Because <code>\verbatim</code> must change the category code of special
+characters, calling inside a macro definition of your own does not work
+properly. For example:
+</p>
+<div class="example">
+<pre class="example">\def\mymacro{\verbatim &amp;#%|endverbatim}% Doesn't work!
+</pre></div>
+
+<p>To accomplish this, you must change the category codes yourself before
+making the macro definition. Perhaps <code>\uncatcodespecials</code> will
+help you (see <a href="#Category-codes">Category codes</a>).
+</p>
+
+<hr>
+<span id="Contents"></span><div class="header">
+<p>
+Next: <a href="#Cross_002dreferences" accesskey="n" rel="next">Cross-references</a>, Previous: <a href="#Verbatim-listing" accesskey="p" rel="prev">Verbatim listing</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Contents-1"></span><h3 class="section">4.8 Contents</h3>
+
+<span id="index-table-of-contents"></span>
+<span id="index-contents"></span>
+<p>Producing a table of contents that is both useful and aesthetic is one
+of the most difficult design problems in any work. Naturally, Eplain
+does not pretend to solve the design problem. Collecting the raw data
+for a table of contents, however, is much the same across documents.
+Eplain uses an auxiliary file with extension <samp>.toc</samp>
+<span id="index-_002etoc-file"></span>
+(and the same root name as your document) to save the information.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Writing-the-_002etoc-file" accesskey="1">Writing the .toc file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Reading-the-_002etoc-file" accesskey="2">Reading the .toc file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Changing-the-_002etoc-file_0027s-root-name" accesskey="3">Changing the .toc file's root name</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Alternative-contents-files" accesskey="4">Alternative contents files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Writing-the-_002etoc-file"></span><div class="header">
+<p>
+Next: <a href="#Reading-the-_002etoc-file" accesskey="n" rel="next">Reading the .toc file</a>, Up: <a href="#Contents" accesskey="u" rel="up">Contents</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Writing-the-_002etoc-file-1"></span><h4 class="subsection">4.8.1 Writing the <tt>.toc</tt> file</h4>
+
+<p>To write an entry for the table of contents, you say
+<code>\writetocentry{<var>part</var>}{<var>text</var>}</code>,
+<span id="index-writetocentry"></span>
+where <var>part</var> is the type of part this entry is, e.g.,
+&lsquo;<samp>chapter</samp>&rsquo;, and <var>text</var> is the text of the title.
+<code>\writetocentry</code> puts an entry into the <tt>.toc</tt> file that looks
+<span id="index-toc_2026entry"></span>
+like <code>\toc<var>part</var>entry{<var>text</var>}{<var>page number</var>}</code>
+(unless <var>part</var> is an integer, see below). The <var>text</var> is
+written unexpanded.
+</p>
+<span id="index-writenumberedtocentry"></span>
+<p>A related command, <code>\writenumberedtocentry</code>, takes one additional
+argument, the first token of which is expanded at the point of the
+<code>\writenumberedtocentry</code>, but the rest of the argument is not
+expanded. The usual application is when the parts of the document are
+numbered. On the other hand, the one-level expansion allows you to use
+the argument for other things as well (author&rsquo;s names in a proceedings,
+say), and not have accents or other control sequences expanded. The
+downside is that if you <em>want</em> full expansion of the third
+argument, you don&rsquo;t get it&mdash;you must expand it yourself, before you
+call <code>\writenumberedtocentry</code>.
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\writenumberedtocentry{chapter}{A $\sin$ wave}{\the\chapno}
+\writetocentry{section}{A section title}
+</pre></div>
+
+<p>Supposing <code>\the\chapno</code> expanded to &lsquo;<samp>3</samp>&rsquo; and that the
+<code>\write</code>&rsquo;s occurred on pages eight and nine, respectively, the
+above writes the following to the <tt>.toc</tt> file:
+</p>
+<div class="example">
+<pre class="example">\tocchapterentry{A $\sin$ wave}{3}{8}
+\tocsectionentry{A section title}{9}
+</pre></div>
+
+<span id="index-writenumberedtocline"></span>
+<p>A variation on <code>\writenumberedtocentry</code> is
+<code>\writenumberedtocline</code>, differing only in the order of the
+parameters it takes and writes for the <code>\toc<var>part</var>entry</code>
+control sequences. To continue the previous example:
+</p>
+<div class="example">
+<pre class="example">\writenumberedtocline{chapter}{\the\chapno}{A $\sin$ wave}
+</pre></div>
+
+<p>writes the following to the <tt>.toc</tt> file:
+</p>
+<div class="example">
+<pre class="example">\tocchapterentry{3}{A $\sin$ wave}{8}
+</pre></div>
+
+<p>Such ordering of the parameters allows the
+<code>\toc<var>part</var>entry</code> macros to typeset the text of the entry
+without actually reading it as an argument. This is required for
+entries which need to change character catcodes, e.g., to produce
+<span id="index-table-of-contents_002c-and-verbatim-text"></span>
+<span id="index-contents_002c-and-verbatim-text"></span>
+<span id="index-verbatim-text_002c-in-table-of-contents"></span>
+<span id="index-special-characters_002c-in-table-of-contents"></span>
+verbatim text (see <a href="#Verbatim-listing">Verbatim listing</a>).
+</p>
+<p>Each of <code>\writetocentry</code>, <code>\writenumberedtocentry</code> and
+<code>\writenumberedtocline</code> processes a numeric <var>part</var> argument
+specially. If you pass <var>part</var> expanding to an integer, these
+macros write into the <tt>.toc</tt> file an entry that starts with
+<span id="index-toc_2026entry-1"></span>
+<code>\tocentry{<var>part</var>}</code>. Thus, you can define a single
+<code>\tocentry</code> macro which formats all entries for a table of
+contents. To continue the previous examples:
+</p>
+<div class="example">
+<pre class="example">\writenumberedtocentry{1}{A $\sin$ wave}{\the\chapno}
+\writenumberedtocline{1}{\the\chapno}{A $\sin$ wave}
+\writetocentry{2}{A section title}
+</pre></div>
+
+<p>writes the following to the .toc file:
+</p>
+<div class="example">
+<pre class="example">\tocentry{1}{A $\sin$ wave}{3}{8}
+\tocentry{1}{3}{A $\sin$ wave}{8}
+\tocentry{2}{A section title}{9}
+</pre></div>
+
+
+<hr>
+<span id="Reading-the-_002etoc-file"></span><div class="header">
+<p>
+Next: <a href="#Changing-the-_002etoc-file_0027s-root-name" accesskey="n" rel="next">Changing the .toc file's root name</a>, Previous: <a href="#Writing-the-_002etoc-file" accesskey="p" rel="prev">Writing the .toc file</a>, Up: <a href="#Contents" accesskey="u" rel="up">Contents</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Reading-the-_002etoc-file-1"></span><h4 class="subsection">4.8.2 Reading the <tt>.toc</tt> file</h4>
+
+<span id="index-readtocfile"></span>
+<p>You read the <tt>.toc</tt> file with the command <code>\readtocfile</code>.
+Naturally, whatever <code>\toc&hellip; entry</code> commands that were written
+to the file must be defined when <code>\readtocfile</code> is invoked. Eplain
+has minimal definitions for <code>\tocchapterentry</code>,
+<code>\tocsectionentry</code>, and <code>\tocsubsectionentry</code>, just to prevent
+undefined control sequence errors in common cases. They aren&rsquo;t suitable
+for anything but preliminary proofs.
+</p>
+<p>Each of <code>\writetocentry</code>, <code>\writenumberedtocentry</code> and
+<code>\writenumberedtocline</code> opens
+the <tt>.toc</tt> file for writing, thereby deleting the information from the
+previous run. You should therefore arrange that <code>\readtocfile</code> be
+called <em>before</em> the first call to a <code>\writetoc&hellip;</code> macro.
+<code>\readtocfile</code> does not itself delete the information
+from the <tt>.toc</tt> file, so that you can call it several times,
+e.g., to create both a short
+<span id="index-table-of-contents_002c-short"></span>
+and normal table of contents. (To produce this in particular, define
+<code>\tocsectionentry</code> to produce nothing while you are reading
+<tt>.toc</tt> file for a short table of contents (see <a href="#Macro-arguments">Macro arguments</a>).)
+</p>
+<p>On the other hand, if you don&rsquo;t want to rewrite the <tt>.toc</tt> file at
+all, perhaps because you are only running TeX on part of your
+manuscript, you can set <code>\rewritetocfilefalse</code>.
+<span id="index-ifrewritetocfile"></span>
+<span id="index-rewritetocfile-_0028conditional_0029"></span>
+</p>
+
+<hr>
+<span id="Changing-the-_002etoc-file_0027s-root-name"></span><div class="header">
+<p>
+Next: <a href="#Alternative-contents-files" accesskey="n" rel="next">Alternative contents files</a>, Previous: <a href="#Reading-the-_002etoc-file" accesskey="p" rel="prev">Reading the .toc file</a>, Up: <a href="#Contents" accesskey="u" rel="up">Contents</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Changing-the-_002etoc-file_0027s-root-name-1"></span><h4 class="subsection">4.8.3 Changing the <tt>.toc</tt> file&rsquo;s root name</h4>
+
+<p>By default, the <samp>.toc</samp> file has the root <code>\jobname</code>. If your
+document has more than one contents&mdash;for example, if it is a collection
+of papers, some of which have their own contents&mdash;you can tell Eplain
+to use a different root name by defining the control sequence
+<code>\tocfilebasename</code>.
+<span id="index-tocfilebasename"></span>
+</p>
+<span id="index-writing-several-toc-files"></span>
+<span id="index-toc-files_002c-writing-several"></span>
+<p>Note that <code>\writetocentry</code>, <code>\writenumberedtocentry</code> and
+<code>\writenumberedtocline</code> will
+open the contents file for writing only at the first call, using the
+value of <code>\tocfilebasename</code> at that time. Changing the value of
+<code>\tocfilebasename</code> afterwards will not affect which file gets
+<em>written</em>, although it will affect which file gets <em>read</em> by
+<code>\readcontentsfile</code>. In case you need to write several contents
+files from a single TeX job, use <code>\definecontentsfile</code>
+(see <a href="#Alternative-contents-files">Alternative contents files</a>).
+</p>
+
+<hr>
+<span id="Alternative-contents-files"></span><div class="header">
+<p>
+Previous: <a href="#Changing-the-_002etoc-file_0027s-root-name" accesskey="p" rel="prev">Changing the .toc file's root name</a>, Up: <a href="#Contents" accesskey="u" rel="up">Contents</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Alternative-contents-files-1"></span><h4 class="subsection">4.8.4 Alternative contents files</h4>
+
+<span id="index-list-of-figures"></span>
+<span id="index-list-of-tables"></span>
+<span id="index-definecontentsfile"></span>
+<p>In addition to the usual table of contents, you may want to have a list
+of figures, list of tables, or other such contents-like list. You can do
+this with <code>\definecontentsfile{<var>abbrev</var>}</code>. All of the
+above commands are actually a special case that Eplain predefines with
+</p>
+<div class="example">
+<pre class="example">\definecontentsfile{toc}
+</pre></div>
+
+<p>The <var>abbrev</var> is used both for the file extension and in
+the control sequence names.
+</p>
+
+
+<hr>
+<span id="Cross_002dreferences"></span><div class="header">
+<p>
+Next: <a href="#Page-references" accesskey="n" rel="next">Page references</a>, Previous: <a href="#Contents" accesskey="p" rel="prev">Contents</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Cross_002dreferences-1"></span><h3 class="section">4.9 Cross-references</h3>
+
+<span id="index-cross_002dreferences"></span>
+<p>It is often useful to refer the reader to other parts of your document;
+but putting literal page, section, equation, or whatever numbers in the
+text is certainly a bad thing.
+</p>
+<p>Eplain therefore provides commands for symbolic cross-references. It
+uses an auxiliary file with extension <tt>.aux</tt>
+<span id="index-_002eaux-file-1"></span>
+(and the same root name as your document) to keep track of the
+information. Therefore, it takes two passes to get the cross-references
+right&mdash;one to write them out, and one to read them in. Eplain
+automatically reads the <tt>.aux</tt> file at the first reference; after
+reading it, Eplain reopens it for writing.
+</p>
+<p>You can control whether or not Eplain warns you about undefined
+labels. See <a href="#Citations">Citations</a>.
+</p>
+<span id="index-labels_002c-characters-valid-in"></span>
+<p>Labels in Eplain&rsquo;s cross-reference commands can use characters of
+category code eleven (letter), twelve (other), ten (space), three (math
+shift), four (alignment tab), seven (superscript), or eight (subscript).
+For example, &lsquo;<samp>(a1 $&amp;^_</samp>&rsquo; is a valid label (assuming the category
+codes of plain TeX), but &lsquo;<samp>%#\{</samp>&rsquo; has no valid characters.
+</p>
+<p>You can also do symbolic cross-references for bibliographic citations
+and list items. See <a href="#Citations">Citations</a>, and <a href="#Lists">Lists</a>.
+</p>
+<p>Eplain can create hypertext links for the cross-references
+(see <a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a>).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Defining-generic-references" accesskey="1">Defining generic references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Using-generic-references" accesskey="2">Using generic references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Defining-generic-references"></span><div class="header">
+<p>
+Next: <a href="#Using-generic-references" accesskey="n" rel="next">Using generic references</a>, Up: <a href="#Cross_002dreferences" accesskey="u" rel="up">Cross-references</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Defining-generic-references-1"></span><h4 class="subsection">4.9.1 Defining generic references</h4>
+
+<span id="index-defining-general-references"></span>
+<span id="index-references_002c-defining-general"></span>
+<span id="index-cross_002dreferences_002c-defining-general"></span>
+
+<span id="index-definexref"></span>
+<p>Eplain provides the command <code>\definexref</code> for general
+cross-references. It takes three arguments: the name of the label (see
+section above for valid label names), the value of the label (which can
+be anything), and the &ldquo;class&rdquo; of the reference&mdash;whether it&rsquo;s a
+section, or theorem, or what. For example:
+</p>
+<div class="example">
+<pre class="example">\definexref{sec-intro}{3.1}{section}
+</pre></div>
+
+<p>Of course, the label value is usually generated by another
+macro using TeX count registers or some such.
+</p>
+<p><code>\definexref</code> doesn&rsquo;t actually define <var>label</var>; instead, it
+writes out the definition to the <tt>.aux</tt> file, where Eplain will read
+it on the next TeX run.
+</p>
+<p>The <var>class</var> argument is used by the <code>\ref</code> and <code>\refs</code>
+commands. See the next section.
+</p>
+
+<hr>
+<span id="Using-generic-references"></span><div class="header">
+<p>
+Previous: <a href="#Defining-generic-references" accesskey="p" rel="prev">Defining generic references</a>, Up: <a href="#Cross_002dreferences" accesskey="u" rel="up">Cross-references</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Using-generic-references-1"></span><h4 class="subsection">4.9.2 Using generic references</h4>
+
+<span id="index-defining-general-references-1"></span>
+<span id="index-references_002c-defining-general-1"></span>
+<span id="index-cross_002dreferences_002c-defining-general-1"></span>
+
+<p>To retrieve the value of the label defined via <code>\definexref</code> (see
+the previous section), Eplain provides the following macros:
+</p>
+<dl compact="compact">
+<dd>
+<span id="index-refn"></span>
+</dd>
+<dt><code>\refn{<var>label</var>}</code></dt>
+<dd><span id="index-xrefn"></span>
+</dd>
+<dt><code>\xrefn{<var>label</var>}</code></dt>
+<dd><p><code>\refn</code> and <code>\xrefn</code> (they are synonyms) produce the bare
+definition of <var>label</var>. If <var>label</var> isn&rsquo;t defined, issue a
+warning, and produce <var>label</var> itself instead, in typewriter. (The
+warning isn&rsquo;t given if <code>\xrefwarningfalse</code>.)
+<span id="index-xrefwarning-conditional"></span>
+</p>
+<span id="index-ref"></span>
+</dd>
+<dt><code>\ref{<var>label</var>}</code></dt>
+<dd><p>Given the class <var>c</var> for <var>label</var> (see the description of
+<code>\definexref</code> in the previous section), expand the control sequence
+<code>\<var>c</var> word</code> (if it&rsquo;s defined) followed by a tie. Then call
+<code>\refn</code> on <var>label</var>. (Example below.)
+</p>
+<span id="index-refs"></span>
+</dd>
+<dt><code>\refs{<var>label</var>}</code></dt>
+<dd><p>Like <code>\ref</code>, but append the letter &lsquo;<samp>s</samp>&rsquo; to the
+<code>\&hellip;word</code>.
+</p>
+</dd>
+</dl>
+
+<p>The purpose of the <code>\&hellip;word</code> macro is to produce the word
+&lsquo;Section&rsquo; or &lsquo;Figure&rsquo; or whatever that usually precedes the actual
+reference number.
+</p>
+<p>Here is an example:
+</p>
+<div class="example">
+<pre class="example">\def\sectionword{Section}
+\definexref{sec-intro}{3.1}{section}
+\definexref{sec-next}{3.2}{section}
+See \refs{sec-intro} and \refn{sec-next} &hellip;
+</pre></div>
+
+<p>This produces &lsquo;See Sections 3.1 and 3.2 &hellip;&rsquo;
+</p>
+
+<hr>
+<span id="Page-references"></span><div class="header">
+<p>
+Next: <a href="#Equation-references" accesskey="n" rel="next">Equation references</a>, Previous: <a href="#Cross_002dreferences" accesskey="p" rel="prev">Cross-references</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Page-references-1"></span><h3 class="section">4.10 Page references</h3>
+
+<p>Eplain provides two commands for handling references to page numbers,
+one for definition and one for use.
+</p>
+<dl compact="compact">
+<dt><code>\xrdef{<var>label</var>}</code></dt>
+<dd><span id="index-xrdef"></span>
+<p>Define <var>label</var> to be the current page number. This produces no
+printed output, and ignores following spaces.
+</p>
+</dd>
+<dt><code>\xref{<var>label</var>}</code></dt>
+<dd><span id="index-xref"></span>
+<p>Produce the text &lsquo;p.&nbsp;<var>pageno</var>&rsquo;, which is the usual form for
+cross-references. The <var>pageno</var> is actually <var>label</var>&rsquo;s
+definition; if <var>label</var> isn&rsquo;t defined, the text of the label itself
+is printed. The &lsquo;p.&nbsp;&rsquo; prefix is defined by <code>\xrefpageword</code>.
+<span id="index-xrefpageword"></span>
+Its default definition is <code>p.\thinspace</code>.
+</p>
+</dd>
+</dl>
+
+<p>Eplain can create hypertext links for the page references (see <a href="#Page-reference-hyperlinks">Page reference hyperlinks</a>).
+</p>
+
+<hr>
+<span id="Equation-references"></span><div class="header">
+<p>
+Next: <a href="#Indexing" accesskey="n" rel="next">Indexing</a>, Previous: <a href="#Page-references" accesskey="p" rel="prev">Page references</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Equation-references-1"></span><h3 class="section">4.11 Equation references</h3>
+
+<span id="index-equations_002c-references-to"></span>
+<span id="index-equations_002c-numbering"></span>
+<p>Instead of referring to pages, it&rsquo;s most useful if equation labels
+refer to equation numbers. Therefore, Eplain reserves a <code>\count</code>
+register, <code>\eqnumber</code>,
+<span id="index-eqnumber"></span>
+for the current equation number, and increments it at each
+numbered equation.
+</p>
+<p>Here are the commands to define equation labels and then refer to them:
+</p>
+<dl compact="compact">
+<dt><code>\eqdef{<var>label</var>}</code></dt>
+<dd><span id="index-eqdef"></span>
+<span id="index-eqnum-1"></span>
+<p>This defines <var>label</var> to be the current value of <code>\eqnumber</code>,
+and, if the current context is not inner, then produces a <code>\eqnum</code>
+command (see <a href="#Displays">Displays</a>). (The condition makes it possible to use
+<code>\eqdef</code> in an
+<code>\eqalignno</code> construction, for example.) The text of the equation
+number is produced using <code>\eqprint</code>. See <a href="#Formatting-equation-references">Formatting equation references</a>.
+</p>
+<span id="index-empty-equation-labels"></span>
+<span id="index-labels_002c-empty-equation"></span>
+<span id="index-equations_002c-giving-numbers-to-all"></span>
+<p>If <var>label</var> is empty, you still get an equation number (although
+naturally you can&rsquo;t reliably refer to it). This is useful if you want
+to put numbers on all equations in your document, and you don&rsquo;t want to
+think up unique labels.
+</p>
+<span id="index-empty-equation-labels_002c-referring-to"></span>
+<span id="index-labels_002c-empty-equation_002c-referring-to"></span>
+<p>To refer to the last equation with the empty label, you use the empty
+label in one of the equation reference macros (see below). This can
+be handy when you want to refer to an equation shortly after its
+definition, say, in the sentence following the displayed equation, and
+do not intend to refer to the equation later. But use this trick with
+extreme caution: if later you change the text and insert another empty
+definition between the original definition and the reference, the
+reference will start to refer to the new empty-labeled equation.
+</p>
+</dd>
+<dt><code>\eqdefn{<var>label</var>}</code></dt>
+<dd><span id="index-eqdefn"></span>
+<span id="index-eqnum-2"></span>
+<p>This is like <code>\eqdef</code>, except it always omits the <code>\eqnum</code>
+command. It can therefore be used in places where <code>\eqdef</code> can&rsquo;t;
+for example, in a non-displayed equation. The text of the equation
+number is not produced, so you can also use it in the (admittedly
+unusual) circumstance when you want to define an equation label but not
+print that label.
+</p>
+</dd>
+<dt><code>\eqref{<var>label</var>}</code></dt>
+<dd><span id="index-eqref"></span>
+<p>This produces a formatted reference to <var>label</var>. If <var>label</var> is
+undefined (perhaps because it is a forward reference), it just produces
+the text of the label itself. Otherwise, it calls <code>\eqprint</code>.
+</p>
+</dd>
+<dt><code>\eqrefn{<var>label</var>}</code></dt>
+<dd><span id="index-eqrefn"></span>
+<p>This produces the cross-reference text for <var>label</var>. That is, it
+is like <code>\eqref</code>, except it doesn&rsquo;t call <code>\eqprint</code>.
+</p>
+</dd>
+</dl>
+
+<span id="index-equation-labels_002c-characters-valid-in"></span>
+<p>Equation labels can contain the same characters that are valid in
+general cross-references.
+</p>
+<p>Eplain can create hypertext links for the equation references
+(see <a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a>).
+</p>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Formatting-equation-references" accesskey="1">Formatting equation references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Subequation-references" accesskey="2">Subequation references</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Formatting-equation-references"></span><div class="header">
+<p>
+Next: <a href="#Subequation-references" accesskey="n" rel="next">Subequation references</a>, Up: <a href="#Equation-references" accesskey="u" rel="up">Equation references</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Formatting-equation-references-1"></span><h4 class="subsection">4.11.1 Formatting equation references</h4>
+
+<span id="index-equation-numbers_002c-formatting-of"></span>
+<p>Both defining an equation label and referring to it should usually
+produce output. This output is produced with the <code>\eqprint</code> macro,
+which takes one argument, the equation number being defined or referred
+to. By default, this just produces &lsquo;<samp>(<var>number</var>)</samp>&rsquo;, where
+<var>number</var> is the equation number. To produce the equation number in
+a different font, or with different surrounding symbols, or whatever,
+you can redefine <code>\eqprint</code>.
+<span id="index-eqprint"></span>
+For example, the following definition would print all equation numbers
+in italics. (The extra braces define a group, to keep the font change
+from affecting surrounding text.)
+</p>
+<div class="example">
+<pre class="example">\def\eqprint#1{{\it (#1)}}
+</pre></div>
+
+<p>In addition to changing the formatting of equation numbers, you might want
+to add more structure to the equation number; for example, you might
+want to include the chapter number, to get equation numbers like
+&lsquo;(1.2)&rsquo;. To achieve this, you redefine <code>\eqconstruct</code>.
+<span id="index-eqconstruct"></span>
+For example:
+</p>
+<div class="example">
+<pre class="example">\def\eqconstruct#1{\the\chapternumber.#1}
+</pre></div>
+
+<p>(If you are keeping the chapter number in a count register named
+<code>\chapternumber</code>, naturally.)
+</p>
+<p>The reason for having both <code>\eqconstruct</code> and <code>\eqprint</code> may
+not be immediately apparent. The difference is that <code>\eqconstruct</code>
+affects the text that cross-reference label is defined to be, while
+<code>\eqprint</code> affects only what is typeset on the page. The example
+just below might help.
+</p>
+<p>Usually, you want equation labels to refer to equation numbers. But
+sometimes you might want a more complicated text. For example, you
+might have an equation &lsquo;(1)&rsquo;, and then have a variation several pages
+later which you want to refer to as &lsquo;(1*)&rsquo;.
+</p>
+<p>Therefore, Eplain allows you to give an optional argument (i.e.,
+arbitrary text in square brackets) before the cross-reference label to
+<code>\eqdef</code>. Then, when you refer to the equation, that text is
+produced. Here&rsquo;s how to get the example just mentioned:
+</p>
+<div class="example">
+<pre class="example">$$&hellip;\eqdef{a-eq}$$
+&hellip;
+$$&hellip;\eqdef[\eqrefn{a-eq}*]{a-eq-var}$$
+In \eqref{a-eq-var}, we expand on \eqref{a-eq}, &hellip;
+</pre></div>
+
+<p>We use <code>\eqrefn</code> in the cross-reference text, not
+<code>\eqref</code>, so that <code>\eqprint</code> is called only once.
+</p>
+<p>As another example, consider the following requirement: we want to
+include chapter number in all equation references, and additionally we
+want to include the part number when referencing an equation from any
+part other than the one where the equation appears. For example,
+references to the third equation in chapter&nbsp;2 of part&nbsp;1
+should be typeset as &lsquo;(2.3)&rsquo; throughout part&nbsp;1, but as &lsquo;(I.2.3)&rsquo;
+in any other part. Let&rsquo;s assume we have the current chapter and part
+numbers in count registers <code>\chapnum</code> and <code>\partnum</code>,
+respectively.
+</p>
+<p>The idea is to have <code>\eqconstruct</code> store the part number of the
+equation (that is, the part number <em>at the time of definition</em>),
+so that later <code>\eqprint</code> can compare the stored number with the
+current part number (that is, the part number <em>at the time of
+reference</em>). The complicating factor is that internally, the result
+of <code>\eqconstruct</code> is both expanded and written out to the
+<samp>.aux</samp> file, <em>and</em> used to typeset the equation number, so
+the commands that store the part number should behave correctly in
+both situations. This is difficult to achieve with expandable
+commands; therefore, to avoid expansion problems, we are going to use
+only TeX primitives, which are non-expandable:
+</p>
+<div class="example">
+<pre class="example">\newcount\eqpartnum
+
+\def\eqconstruct#1{%
+ \global\eqpartnum=\the\partnum\relax
+ \number\chapnum.#1%
+}
+
+\def\eqprint#1{%
+ \setbox0=\hbox{#1}%
+ (\ifnum\partnum=\eqpartnum \else
+ \uppercase\expandafter{\romannumeral\eqpartnum}.%
+ \fi
+ \box0)%
+}%
+</pre></div>
+
+<p>In <code>\eqconstruct</code>, besides constructing the base equation number
+(e.g., &lsquo;1.2&rsquo;), we also store the part number of the equation in the
+count register <code>\eqpartnum</code> (<code>\the\partnum</code> is expanded when
+the equation number is written to the <samp>.aux</samp> file, so the
+equation label definition in the <samp>.aux</samp> file will contain the
+actual part number). In <code>\eqprint</code>, we need to know the
+equation&rsquo;s part number before we typeset the base equation number,
+therefore we first put the argument in a box, thus causing
+<code>\eqpartnum</code> to be set.
+</p>
+
+<hr>
+<span id="Subequation-references"></span><div class="header">
+<p>
+Previous: <a href="#Formatting-equation-references" accesskey="p" rel="prev">Formatting equation references</a>, Up: <a href="#Equation-references" accesskey="u" rel="up">Equation references</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Subequation-references-1"></span><h4 class="subsection">4.11.2 Subequation references</h4>
+
+<span id="index-equations_002c-groups-of"></span>
+<span id="index-subequations_002c-referring-to"></span>
+<p>Eplain also provides for one level of substructure for equations. That
+is, you might want to define a related group of equations with numbers
+like &lsquo;2.1&rsquo; and &lsquo;2.2&rsquo;, and then be able to refer to the group as a whole:
+&ldquo;&hellip; in the system of equations (2)&hellip;&rdquo;.
+</p>
+<p>The commands to do this are <code>\eqsubdef</code> and
+<span id="index-eqsubdef"></span>
+<code>\eqsubdefn</code>.
+<span id="index-eqsubdefn"></span>
+They take one <var>label</var> argument like their counterparts above,
+and generally behave in the same way. The difference is in how they
+construct the equation number: instead of using just <code>\eqnumber</code>,
+they also use another counter, <code>\subeqnumber</code>.
+<span id="index-subeqnumber"></span>
+This counter is advanced by one at every <code>\eqsubdef</code> or
+<code>\eqsubdefn</code>, and reset to zero at every <code>\eqdef</code> or
+<code>\eqdefn</code>.
+</p>
+<p>You use <code>\eqref</code> to refer to subequations as well as main
+equations.
+</p>
+<p>To put the two together to construct the text that the label will
+produce, they use a macro <code>\eqsubreftext</code>.
+<span id="index-eqsubreftext"></span>
+This macros takes two arguments, the &ldquo;main&rdquo; equation number (which,
+because the equation label can be defined as arbitrary text, as
+described in the previous section, might be anything at all) and the
+&ldquo;sub&rdquo; equation number (which is always just a number). Eplain&rsquo;s
+default definition just puts a period between them:
+</p>
+<div class="example">
+<pre class="example">\def\eqsubreftext#1#2{#1.#2}%
+</pre></div>
+
+<p>You can redefine <code>\eqsubreftext</code> to print however you
+like. For example, this definition makes the labels print as &lsquo;2a&rsquo;,
+&lsquo;2b&rsquo;, and so on.
+</p>
+<div class="example">
+<pre class="example">\newcount\subref
+\def\eqsubreftext#1#2{%
+ \subref = #2 % The space stops a &lt;number&gt;.
+ \advance\subref by 96 % `a' is character code 97.
+ #1\char\subref
+}
+</pre></div>
+
+<p>Sadly, we must define a new count register, <code>\subref</code>,
+instead of using the scratch count register <code>\count255</code>, because
+&lsquo;<samp>#1</samp>&rsquo; might include other macro calls which use <code>\count255</code>.
+</p>
+
+<hr>
+<span id="Indexing"></span><div class="header">
+<p>
+Next: <a href="#Justification" accesskey="n" rel="next">Justification</a>, Previous: <a href="#Equation-references" accesskey="p" rel="prev">Equation references</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Indexing-1"></span><h3 class="section">4.12 Indexing</h3>
+
+<span id="index-indexing"></span>
+<span id="index-sorting-an-index"></span>
+
+<p>Eplain provides support for generating raw material for an index, and
+for typesetting a sorted index. A separate program must do the actual
+collection and sorting of terms, because TeX itself has no support
+for sorting.
+</p>
+<p>Eplain can create hypertext links pointing from the index to the index
+terms (see <a href="#Index-hyperlinks">Index hyperlinks</a>).
+</p>
+<span id="index-makeindex-1"></span>
+<p>Eplain&rsquo;s indexing commands were designed to work with the program
+MakeIndex (<a href="https://ctan.org/pkg/makeindex">https://ctan.org/pkg/makeindex</a>); MakeIndex is also
+commonly included in prepackaged TeX distributions. It is beyond
+the scope of this manual to explain how to run MakeIndex, and all of
+its many options.
+</p>
+<p>The basic strategy for indexing works like this:
+</p>
+<ol>
+<li> <span id="index-_002eidx-files"></span>
+For a document <samp>foo.tex</samp>, Eplain&rsquo;s indexing commands (e.g.,
+<code>\idx</code>; see the section &lsquo;Indexing terms&rsquo; below) write the raw index
+material to <samp>foo.idx</samp>.
+
+</li><li> <span id="index-_002eind-files"></span>
+MakeIndex reads <samp>foo.idx</samp>, collects and sorts the index, and
+writes the result to <samp>foo.ind</samp>.
+
+</li><li> Eplain reads and typesets <samp>foo.ind</samp> on a subsequent run of
+TeX. See the section &lsquo;Typesetting an index&rsquo; below.
+
+</li></ol>
+
+<span id="index-texi2dvi-2"></span>
+<p>The <code>texi2dvi</code> program can help you automate this
+process (see <a href="#Invoking-Eplain">Invoking Eplain</a>).
+</p>
+<span id="index-multiple-indexes"></span>
+<span id="index-indexes_002c-multiple"></span>
+<span id="index-defineindex"></span>
+<p>If your document needs more than one index, each must have its own
+file. Therefore, Eplain provides the command <code>\defineindex</code>, which
+takes an argument that is a single letter, which replaces &lsquo;<samp>i</samp>&rsquo; in
+the filenames and in the indexing command names described below. For
+example,
+</p>
+<div class="example">
+<pre class="example">\defineindex{m}
+</pre></div>
+
+<p>defines the command <code>\mdx</code> to write to the file
+<samp>foo.mdx</samp>. Eplain simply does <code>\defineindex{i}</code> to define
+the default commands.
+</p>
+<p>Note that MakeIndex does not use the above naming scheme for multiple
+indexes. Unless instructed otherwise, MakeIndex always writes its
+output to a file with extension <samp>.ind</samp>. For example, if you
+define an additional index with the command <code>\defineindex{j}</code>,
+you&rsquo;ll need to run MakeIndex like this:
+</p>
+<div class="example">
+<pre class="example">$ makeindex book.jdx -o book.jnd
+</pre></div>
+
+<span id="index-indexes_002c-disabling"></span>
+<span id="index-disabling-indexes"></span>
+<span id="index-ifidx"></span>
+<p>For each index defined with <code>\defineindex{<var>n</var>}</code>, Eplain
+provides a switch <code>\if<var>n</var>dx</code> which controls whether indexing
+commands write index entries to the corresponding index file. However,
+even when index term writing is disabled, indexing commands still do
+all other processing of their arguments, including typesetting of
+proof index terms (see <a href="#Proofing-index-terms">Proofing index terms</a>.
+</p>
+<p>For example, if you write <code>\idxfalse</code> near the beginning of a
+document <samp>foo.tex</samp> (before the first indexing command), Eplain
+will not open the default index file (<samp>foo.idx</samp>) and the
+corresponding indexing commands (<code>\idx</code>, <code>\sidx</code>, etc.)
+will not write index entries there. This may be useful for draft
+compilations of a manuscript, e.g., to avoid the overhead of index
+file input/output.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Indexing-terms" accesskey="1">Indexing terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Specifying what to index.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Typesetting-an-index" accesskey="2">Typesetting an index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Printing the sorted output.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Customizing-indexing" accesskey="3">Customizing indexing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Creating commands and specifying extra actions.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Indexing-terms"></span><div class="header">
+<p>
+Next: <a href="#Typesetting-an-index" accesskey="n" rel="next">Typesetting an index</a>, Up: <a href="#Indexing" accesskey="u" rel="up">Indexing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Indexing-terms-1"></span><h4 class="subsection">4.12.1 Indexing terms</h4>
+
+<span id="index-indexing-terms"></span>
+<span id="index-silent-indexing"></span>
+
+<p>Indexing commands in Eplain come in pairs: one command that only
+writes the index entry to the &lsquo;<samp>.idx</samp>&rsquo; file (see above section), and
+one that also typesets the term being indexed. The former always starts
+with &lsquo;<samp>s</samp>&rsquo; (for &ldquo;silent&rdquo;). In either case, the name always includes
+&lsquo;<samp><var>I</var>dx</samp>&rsquo;, where <var>I</var> is the index letter, also described
+above. Eplain defines the index &lsquo;<samp>i</samp>&rsquo; itself, so that&rsquo;s what we&rsquo;ll
+use in the names below.
+</p>
+<span id="index-subterm-in-indexing"></span>
+<p>The silent form of the commands take a subterm as a trailing optional
+argument. For example, <code>\sidx{truth}[definition of]</code> on page 75
+makes an index entry that will eventually be typeset (by default) as
+</p>
+<div class="display">
+<pre class="display">truth
+ definition of, 75
+</pre></div>
+
+<span id="index-trailing-spaces-and-indexing-commands"></span>
+<span id="index-spaces_002c-trailing-and-indexing-commands"></span>
+<span id="index-indexing-and-trailing-spaces"></span>
+<p>Also, the silent commands ignore trailing spaces. The non-silent ones do not.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Indexing-commands" accesskey="1">Indexing commands</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making index entries.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Modifying-index-entries" accesskey="2">Modifying index entries</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Ranges, see/see also, page number typesetting.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index-entries-with-special-characters" accesskey="3">Index entries with special characters</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Proofing-index-terms" accesskey="4">Proofing index terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Noting index entries in the margins.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Indexing-commands"></span><div class="header">
+<p>
+Next: <a href="#Modifying-index-entries" accesskey="n" rel="next">Modifying index entries</a>, Up: <a href="#Indexing-terms" accesskey="u" rel="up">Indexing terms</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Indexing-commands-1"></span><h4 class="subsubsection">4.12.1.1 Indexing commands</h4>
+
+<span id="index-indexing-commands"></span>
+<p>Here are the commands.
+</p>
+<ul>
+<li> <span id="index-sidx"></span>
+<span id="index-idx"></span>
+<code>\sidx{<var>term</var>}[<var>subterm</var>]</code> makes an index entry for
+<var>term</var>, optionally with subterm <var>subterm</var>.
+<code>\idx{<var>term</var>}</code> also produces <var>term</var> as output. Example:
+
+<div class="example">
+<pre class="example">\sidx{truth}[beauty of]
+The beauty of truth is \idx{death}.
+</pre></div>
+
+<p>Subterms at the second and further levels can also be
+specified in <var>subterm</var>, using the
+<code>\idxsubentryseparator</code> character to separate
+them. This character is by default &lsquo;<samp>!</samp>&rsquo;.
+</p>
+</li><li> <span id="index-sidxname"></span>
+<span id="index-idxnameseparator"></span>
+<span id="index-idxname"></span>
+<code>\sidxname{<var>First M.</var>}{<var>von Last</var>}[<var>subterm</var>]</code>
+makes an index
+entry for &lsquo;<samp><var>von Last</var>, <var>First M.</var></samp>&rsquo;. You can change the
+&lsquo;<samp>, </samp>&rsquo; by redefining <code>\idxnameseparator</code>.
+<code>\idxname{<var>First M.</var>}{<var>von Last</var>}</code> also produces <var>First M. von
+Last</var> as output. (These commands are useful special cases of <code>\idx</code>
+and <code>\sidx</code>.) Example:
+
+<div class="example">
+<pre class="example">\sidxname{Richard}{Stark}
+\idxname{Donald}{Westlake} has written many kinds of novels, under
+almost as many names.
+</pre></div>
+
+</li><li> <span id="index-sidxmarked"></span>
+<span id="index-idxmarked"></span>
+<code>\sidxmarked\<var>cs</var>{<var>term</var>}[<var>subterm</var>]</code> makes an index
+entry for <code><var>term</var>[<var>subterm</var>]</code>, but <var>term</var> will be put
+in the index as <code>\<var>cs</var>{term}</code>, but still sorted as just
+<var>term</var>. <code>\idxmarked\<var>cs</var>{<var>term</var>}</code> also typesets
+<code>\<var>cs</var>{term}</code>. This provides for the usual ways of changing
+the typesetting of index entries. Example:
+
+<div class="example">
+<pre class="example">\def\article#1{``#1''}
+\sidxmarked\article{Miss Elsa and Aunt Sophie}
+Peter Drucker's \idxmarked\article{The Polanyis} is a remarkable
+essay about a remarkable family.
+</pre></div>
+
+</li><li> <span id="index-idxsubmarked"></span>
+<span id="index-sidxsubmarked"></span>
+<code>\sidxsubmarked{<var>term</var>}\<var>cs</var>{subterm}</code> makes an index
+entry for <var>term</var>, <var>subterm</var> as usual, but also puts <var>subterm</var> in
+the index as <code>\<var>cs</var>{term}</code>.
+<code>\idxsubmarked{<var>term</var>}\<var>cs</var>{subterm}</code> also typesets
+<code><var>term</var> \<var>cs</var>{subterm}</code>, in the unlikely event that your
+syntax is convoluted enough to make this useful. Example:
+
+<div class="example">
+<pre class="example">\def\title#1{{\sl #1}}
+\sidxsubmarked{Anderson, Laurie}\title{Strange Angels}
+The \idxsubmarked{Anderson}\title{Carmen} is a strange twist.
+</pre></div>
+
+</li></ul>
+
+<span id="index-index-entry-general-sorting"></span>
+<span id="index-sorting-of-index-entries"></span>
+<p>The commands above rely on MakeIndex&rsquo;s feature for separating sorting of
+an index entry&rsquo;s from its typesetting. You can use this directly by
+specifying an index entry as <code><var>sort</var>@<var>typeset</var></code>. For
+example:
+</p>
+<div class="example">
+<pre class="example">\sidx{Ap-weight@$A_\pi$-weight}
+</pre></div>
+
+<p>will sort as <code>Ap-weight</code>, but print with the proper math.
+The <code>@</code> here is MakeIndex&rsquo;s default character for this purpose.
+To make an index entry with an <code>@</code> in it, you have to escape it
+with a backslash; Eplain provides no macros for doing this.
+</p>
+<span id="index-afterindexterm-hook"></span>
+<span id="index-whatsits-made-by-index-entries"></span>
+<p>After any index command, Eplain runs
+<code>\hookaction{afterindexterm}</code>. Because the index commands always
+add a whatsit item to the current list, you may wish to preserve a
+penalty or space past the new item. For example, given a conditional
+<code>\if@aftersctnhead</code> set true when you&rsquo;re at a section heading, you
+could do:
+</p>
+<div class="example">
+<pre class="example">\hookaction{afterindexterm}{\if@aftersctnhead \nobreak \fi}
+</pre></div>
+
+
+<hr>
+<span id="Modifying-index-entries"></span><div class="header">
+<p>
+Next: <a href="#Index-entries-with-special-characters" accesskey="n" rel="next">Index entries with special characters</a>, Previous: <a href="#Indexing-commands" accesskey="p" rel="prev">Indexing commands</a>, Up: <a href="#Indexing-terms" accesskey="u" rel="up">Indexing terms</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Modifying-index-entries-1"></span><h4 class="subsubsection">4.12.1.2 Modifying index entries</h4>
+
+<span id="index-modifying-index-entries_0027-page-numbers"></span>
+<span id="index-index-entries_0027-page-numbers_002c-modifying"></span>
+
+<p>All the index commands described in the previous section take an initial
+optional argument before the index term, which modify the index entry&rsquo;s
+meaning in various ways. You can specify only one of the following in
+any given command, except that <code>begin</code> and <code>end</code> can be
+specified together with <code>pagemarkup=<var>cs</var></code> (separate them with
+a comma without a following space, like this:
+<code>[begin,pagemarkup=defn]</code>).
+</p>
+<p>These work via MakeIndex&rsquo;s &ldquo;encapsulation&rdquo; feature. See <a href="#Customizing-indexing">Customizing indexing</a>, if you&rsquo;re not using the default characters for the
+MakeIndex operators. The other optional argument (specifying a subterm)
+is independent of these.
+</p>
+<p>Here are the possibilities:
+</p>
+<dl compact="compact">
+<dt><code>begin</code></dt>
+<dt><code>end</code></dt>
+<dd><span id="index-begin-for-index-entries"></span>
+<span id="index-end-for-index-entries"></span>
+<span id="index-index-entries-and-ranges"></span>
+<span id="index-ranges-and-index-entry"></span>
+<p>These mark an index entry as the beginning or end of a range. The index
+entries must match exactly for MakeIndex to recognize them.
+Example:
+</p>
+<div class="example">
+<pre class="example">\sidx[begin]{future}[Cohen, Leonard]
+&hellip;
+\sidx[end]{future}[Cohen, Leonard]
+</pre></div>
+
+<p>will typeset as something like
+</p>
+<div class="display">
+<pre class="display">future,
+ Cohen, Leonard, 65&ndash;94
+</pre></div>
+
+</dd>
+<dt><code>see</code></dt>
+<dd><span id="index-see-for-index-entries"></span>
+<span id="index-see_002c-and-index-entries"></span>
+<span id="index-cross_002dreferencing-index-entries"></span>
+<span id="index-index-entries_002c-and-cross_002dreferencing"></span>
+<p>This marks an index entry as pointing to another; the real index term is
+an additional (non-optional) argument to the command. Thus you can
+anticipate a term readers may wish to look up, yet which you have
+decided not to index. Example:
+</p>
+<div class="example">
+<pre class="example">\sidx[see]{analysis}[archetypal]{archetypal criticism}
+</pre></div>
+
+<p>becomes
+</p>
+<div class="display">
+<pre class="display">analysis,
+ archetypal, <i>see</i> archetypal criticism
+</pre></div>
+
+</dd>
+<dt><code>seealso</code></dt>
+<dd><span id="index-seealso-for-index-entries"></span>
+<p>Similar to <code>see</code> (the previous item), but also allows for normal
+index entries of the referencing term. The normal index entries have
+to be created separately&mdash;<code>seealso</code> does <em>not</em> contribute a
+page number to the index entry. For example, if you have indexed a
+term on pages 75,&nbsp;97 and&nbsp;114, and then add a <code>seealso</code>
+entry for the term:
+</p>
+<div class="example">
+<pre class="example">\sidx[seealso]{archetypal criticism}[elements of]{dichotomies}
+</pre></div>
+
+<p>the index will contain
+</p>
+<div class="display">
+<pre class="display">archetypal criticism,
+ elements of, 75, 97, 114, <i>see also</i> dichotomies
+</pre></div>
+
+<p>(Aside for the academically curious: The archetypal critical book I
+took these dichotomous examples from is Laurence Berman&rsquo;s <cite>The
+Musical Image</cite>, which I happened to co-design and typeset.)
+</p>
+</dd>
+<dt><code>pagemarkup=<var>cs</var></code></dt>
+<dd><p>This puts <code>\<var>cs</var></code> before the page number in the typeset index,
+thus allowing you to underline definitive entries, italicize examples,
+and the like. You do <em>not</em> precede the control sequence <var>cs</var>
+with a backslash. (That just leads to expansive difficulties.) Naturally
+it is up to you to define the control sequences you want to use. Example:
+</p>
+<div class="example">
+<pre class="example">\def\defn#1{{\sl #1}}
+\sidx[pagemarkeup=defn]{indexing}
+</pre></div>
+
+<p>becomes something like
+</p>
+<div class="example">
+<pre class="example">indexing, <code>\defn{75}</code>
+</pre></div>
+
+</dd>
+</dl>
+
+
+<hr>
+<span id="Index-entries-with-special-characters"></span><div class="header">
+<p>
+Next: <a href="#Proofing-index-terms" accesskey="n" rel="next">Proofing index terms</a>, Previous: <a href="#Modifying-index-entries" accesskey="p" rel="prev">Modifying index entries</a>, Up: <a href="#Indexing-terms" accesskey="u" rel="up">Indexing terms</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Index-entries-with-special-characters-1"></span><h4 class="subsubsection">4.12.1.3 Index entries with special characters</h4>
+
+<span id="index-special-characters_002c-in-index-entries"></span>
+<span id="index-index-entries-with-special-characters"></span>
+
+<p>Indexing terms with special characters can become quite cumbersome
+because you have to keep both TeX and MakeIndex happy at the same
+time. For example, while &lsquo;<samp>!</samp>&rsquo; has no special meaning for TeX,
+it is a subentry separator for MakeIndex, therefore you&rsquo;d have to
+escape occurrences of literal &lsquo;<samp>!</samp>&rsquo; in index terms. Things get
+even more interesting with characters which are special in both TeX
+and MakeIndex.
+</p>
+<p>This in turn has some implications for the non-silent forms of the
+indexing commands (see <a href="#Indexing-terms">Indexing terms</a>), since TeX and MakeIndex
+use different conventions for escaping characters. For example, this
+will not typeset the exclamation point correctly within the text,
+while it will come out right inside the index, after MakeIndex strips
+the quoting character (&lsquo;<samp>&quot;</samp>&rsquo;):
+</p>
+<div class="example">
+<pre class="example">\idx{&quot;!}
+</pre></div>
+
+<p>This would have to be rewritten using the silent command:
+</p>
+<div class="example">
+<pre class="example">!\sidx{&quot;!}
+</pre></div>
+
+<p>In general, it is a good idea to eschew the non-silent
+commands whenever index term contains anything unusual.
+</p>
+<p>To understand this keep in mind that indexing commands read the terms
+verbatim so that the terms can embed almost any character, and that&rsquo;s
+what gets written into the <samp>.idx</samp> file. The non-silent forms
+then typeset the term by rescanning the verbatim copy, hence for
+the non-silent commands the term, besides being a valid MakeIndex
+input, must also represent a valid TeX input. The silent commands
+don&rsquo;t have this restriction&mdash;their terms only need to become valid
+TeX input <em>after</em> MakeIndex processes the <samp>.idx</samp> file and
+writes the <samp>.ind</samp> file. This is what makes the non-silent
+commands less powerful and more troublesome when dealing with special
+characters.
+</p>
+<span id="index-index-entries_002c-with-verbatim-text"></span>
+<span id="index-index_002c-and-verbatim-text"></span>
+<span id="index-verbatim-text_002c-in-index"></span>
+<p>Here&rsquo;s an example showing that terms for the silent commands can
+contain almost any character:
+</p>
+<div class="example">
+<pre class="example">\sidx[see]{comments}[with %@with \verbatim %&quot;|endverbatim]
+ {commenting with \verbatim %&quot;|endverbatim}
+</pre></div>
+
+<p>We didn&rsquo;t have to escape &lsquo;<samp>%</samp>&rsquo; in the sort string for
+MakeIndex, while we had to put it inside the verbatim environment
+(see <a href="#Verbatim-listing">Verbatim listing</a>) in the part which MakeIndex will pass back
+to TeX. Also, we had to escape the &lsquo;<samp>|</samp>&rsquo; character because it
+is special for MakeIndex. If you have trouble understanding the
+reasons for the different types of escaping used, it is best to
+examine the <samp>.idx</samp> and <samp>.ind</samp> files resulting from
+processing the above input.
+</p>
+<p>As was mentioned, index terms can embed &ldquo;almost any character&rdquo;, so
+now we&rsquo;ll describe the exceptions.
+</p>
+<p>The following characters are reset to their usual meanings because
+they are not useful verbatim: multiple consequent spaces are
+converted into a single space; <acronym>ASCII</acronym> tab characters are
+treated as spaces; <acronym>ASCII</acronym> return is treated as end-of-line
+(this means, among other things, that long terms can be broken across
+several lines).
+</p>
+<span id="index-braces_002c-inside-index-entries"></span>
+<span id="index-index-entries-containing-braces"></span>
+<p>You have to be careful with the begin- and end-group characters
+(&lsquo;<samp>{</samp>&rsquo; and &lsquo;<samp>}</samp>&rsquo; by default). If they are matched, you don&rsquo;t
+have to do anything special. For example:
+</p>
+<div class="example">
+<pre class="example">\sidx {braces {, }@braces
+ \verbatim {&quot;|endverbatim, \verbatim }&quot;|endverbatim}
+</pre></div>
+
+<p>However, if they are not matched you have two problems on
+hand. The first one is TeX&mdash;you have to instruct TeX to use
+something else as begin- and/or end-group characters. Eplain provides
+an easy way to do this: just define
+<span id="index-idxargopen"></span>
+<code>\idxargopen</code> and/or
+<span id="index-idxargclose"></span>
+<code>\idxargclose</code> to the begin- and end-group characters you are
+going to use with indexing macros, and use braces inside index terms
+without any restrictions. Here&rsquo;s an example:
+</p>
+<div class="example">
+<pre class="example">\def\idxargopen{`\&lt;}
+\def\idxargclose{`\&gt;}
+\sidx &lt;left brace &quot;{@left brace \verbatim &quot;{&quot;|endverbatim&gt;
+</pre></div>
+
+<p>In this example we&rsquo;ve also dealt with the second
+problem&mdash;braces are MakeIndex&rsquo;s grouping characters as well (by
+default), so we have escaped unmatched braces with &lsquo;<samp>&quot;</samp>&rsquo;.
+</p>
+<span id="index-brackets_002c-inside-index-entries"></span>
+<span id="index-index-entries-containing-brackets"></span>
+<p>And the final note: if you need a subentry containing brackets
+(&lsquo;<samp>[</samp>&rsquo; and &lsquo;<samp>]</samp>&rsquo;), avoid the optional argument of <code>\sidx</code>
+and friends, and use instead MakeIndex&rsquo;s subentry separator to create
+the subentry with the brackets in it:
+</p>
+<div class="example">
+<pre class="example">\sidx{entry!subentry with a bracket [}
+</pre></div>
+
+
+<hr>
+<span id="Proofing-index-terms"></span><div class="header">
+<p>
+Previous: <a href="#Index-entries-with-special-characters" accesskey="p" rel="prev">Index entries with special characters</a>, Up: <a href="#Indexing-terms" accesskey="u" rel="up">Indexing terms</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Proofing-index-terms-1"></span><h4 class="subsubsection">4.12.1.4 Proofing index terms</h4>
+
+<span id="index-proofing-index-terms"></span>
+<span id="index-index-entries_002c-proofing"></span>
+<span id="index-margins_002c-index-terms-in"></span>
+
+<p>As you are reading through a manuscript, it is helpful to see what terms
+have been indexed, so you can add others, catch miscellaneous errors,
+etc. (Speaking from bitter experience, I can say it is extremely
+error-prone to leave all indexing to the end of the writing, since it
+involves adding many TeX commands to the source files.)
+</p>
+<span id="index-ifindexproofing"></span>
+<span id="index-indexproofingtrue"></span>
+<span id="index-indexproofingfalse"></span>
+<span id="index-indexproofterm"></span>
+<span id="index-indexprooffont"></span>
+<span id="index-cmtt8"></span>
+<p>So Eplain puts index terms in the margin of each page, if you
+set <code>\indexproofingtrue</code>. It is <code>false</code> by default. The terms
+are typeset by the macro <code>\indexproofterm</code>, which takes a single
+argument, the term to be typeset. Eplain&rsquo;s definition of
+<code>\indexproofterm</code> just puts it into an <code>\hbox</code>, first doing
+<code>\indexprooffont</code>, which Eplain defines to select the font
+<code>cmtt8</code>. With this definition long terms run off the page, but
+since this is just for proofreading anyway, it seems acceptable.
+</p>
+<span id="index-pageno"></span>
+<span id="index-insidemargin"></span>
+<span id="index-hoffset"></span>
+<span id="index-outsidemargin"></span>
+<span id="index-indexsetmargins"></span>
+<p>On the other hand, we certainly don&rsquo;t want the index term to run into
+the text of the page, so Eplain uses the right-hand side of the page
+rather than the left-hand page (assuming a language read left to right
+here). So <code>\ifodd\pageno</code>, Eplain kerns by <code>\outsidemargin</code>,
+otherwise by <code>\insidemargin</code>. If those macros are undefined,
+<code>\indexsetmargins</code> defines them to be one inch plus <code>\hoffset</code>.
+</p>
+<span id="index-_0040indexproof-insertion-class"></span>
+<span id="index-indexproofunbox"></span>
+<span id="index-makeheadline"></span>
+<span id="index-output-routine-and-index-proofing"></span>
+<p>To get the proofing index entries on the proper page, Eplain defines a new
+insertion class <code>\@indexproof</code>. To unbox any index proofing
+material, Eplain redefines <code>\makeheadline</code> to call
+<code>\indexproofunbox</code> before the original <code>\makeheadline</code>. Thus,
+if you have your own output routine, that redefines or doesn&rsquo;t use
+<code>\makeheadline</code>, it&rsquo;s up to you to call <code>\indexproofunbox</code> at
+the appropriate time.
+</p>
+
+<hr>
+<span id="Typesetting-an-index"></span><div class="header">
+<p>
+Next: <a href="#Customizing-indexing" accesskey="n" rel="next">Customizing indexing</a>, Previous: <a href="#Indexing-terms" accesskey="p" rel="prev">Indexing terms</a>, Up: <a href="#Indexing" accesskey="u" rel="up">Indexing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Typesetting-an-index-1"></span><h4 class="subsection">4.12.2 Typesetting an index</h4>
+
+<span id="index-typesetting-an-index"></span>
+<span id="index-index-typesetting"></span>
+<span id="index-readindexfile"></span>
+
+<p>The command <code>\readindexfile{i}</code> reads and typesets the
+<samp>.ind</samp> file that MakeIndex outputs (from the <samp>.idx</samp> file which
+the indexing commands in the previous sections write). Eplain defines a
+number of commands that support the default MakeIndex output.
+</p>
+<span id="index-indexfilebasename"></span>
+<span id="index-jobname-1"></span>
+<p>More precisely, <code>\readindexfile</code> reads
+<code>\indexfilebasename.<var>index-letter</var>nd</code>, where the
+<var>index-letter</var> is the argument. <code>\indexfilebasename</code> is
+<code>\jobname</code> by default, but if you have different indexes in
+different parts of a book, you may wish to change it, just as with
+bibliographies (see <a href="#Citations">Citations</a>).
+</p>
+<span id="index-begin_007btheindex_007d"></span>
+<span id="index-end_007btheindex_007d"></span>
+<p>MakeIndex was designed to work with LaTeX; therefore, by default the
+<samp>.ind</samp> file starts with <code>\begin{theindex}</code> and ends with
+<code>\end{theindex}</code>. If no <code>\begin</code> has been defined, Eplain
+defines one to ignore its argument and set up for typesetting the index
+(see below), and also defines a <code>\end</code> to ignore its argument. (In
+a group, naturally, since there is a primitive <code>\end</code>).
+</p>
+<span id="index-parindent-in-indexes"></span>
+<span id="index-index-fonts"></span>
+<span id="index-indexfonts"></span>
+<span id="index-double-columns-in-indexes"></span>
+<p>Eplain calls <code>\indexfonts</code>, sets <code>\parindent = 0pt</code>, and does
+<code>\doublecolumns</code> (see <a href="#Multiple-columns">Multiple columns</a>) at the
+<code>\begin{theindex}</code>. <code>\indexfonts</code> does nothing by default;
+it&rsquo;s just there for you to override. (Indexes are usually typeset in
+smaller type than the main text.)
+</p>
+<span id="index-beginindex-hook"></span>
+<p>It ends the setup with <code>\hookrun{beginindex}</code>, so you can
+override anything you like in that hook (see <a href="#Hooks">Hooks</a>). For example:
+</p>
+<div class="example">
+<pre class="example">\hookaction{beginindex}{\triplecolumns}
+</pre></div>
+
+<span id="index-item-in-indexes"></span>
+<span id="index-subitem-in-indexes"></span>
+<span id="index-subsubitem-in-indexes"></span>
+<span id="index-index-entry-formatting"></span>
+<span id="index-formatting-index-entries"></span>
+<span id="index-space-above-index-entries"></span>
+<span id="index-continued-index-entries"></span>
+<span id="index-index-entry-continuations"></span>
+<p>MakeIndex turns each main index entry into an <code>\item</code>, subentries
+into <code>\subitem</code>, and subsubentries into <code>\subsubitem</code>. By
+default, the first line of main entries are not indented, and subentries
+are indented 1em per level. Main entries are preceded by a <code>\vskip</code>
+of <code>\aboveitemskipamount</code>, <code>0pt plus2pt</code> by default. Page
+breaks are encouraged before main entries (<code>\penalty -100</code>), but
+prohibited afterwards&mdash;Eplain has no provision for &ldquo;continued&rdquo;
+index entries.
+</p>
+<p>All levels do the following:
+</p>
+<span id="index-hangindent-for-index-entries"></span>
+<span id="index-raggedright-for-index-entries"></span>
+<span id="index-hyphenpenalty-for-index-entries"></span>
+<div class="example">
+<pre class="example">\hangindent = 1em
+\raggedright
+\hyphenpenalty = 10000
+</pre></div>
+
+<span id="index-indexitem-hook"></span>
+<p>Each entry ends with <code>\hookrun{indexitem}</code>, so you can change any
+of this. For example, to increase the allowable rag:
+</p>
+<div class="example">
+<pre class="example">\hookaction{indexitem}{\advance\rightskip by 2em}
+</pre></div>
+
+<span id="index-indexspace"></span>
+<span id="index-index-groupings"></span>
+<p>Finally, MakeIndex outputs <code>\indexspace</code> between each group of
+entries in the <samp>.ind</samp> file. Eplain makes this equivalent to
+<code>\bigbreak</code>.
+</p>
+
+<hr>
+<span id="Customizing-indexing"></span><div class="header">
+<p>
+Previous: <a href="#Typesetting-an-index" accesskey="p" rel="prev">Typesetting an index</a>, Up: <a href="#Indexing" accesskey="u" rel="up">Indexing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Customizing-indexing-1"></span><h4 class="subsection">4.12.3 Customizing indexing</h4>
+
+<span id="index-customizing-indexing"></span>
+
+<span id="index-afterindexterm"></span>
+<span id="index-commas-after-index-terms"></span>
+<span id="index-after-index-terms"></span>
+<p>By default, MakeIndex outputs &lsquo;<samp>, </samp>&rsquo; after each term in the index. To
+change this, you can add the following to your MakeIndex style
+(<samp>.ist</samp>) file:
+</p>
+<div class="example">
+<pre class="example">delim_0 &quot;\\afterindexterm &quot;
+delim_1 &quot;\\afterindexterm &quot;
+delim_2 &quot;\\afterindexterm &quot;
+</pre></div>
+
+<p>Eplain makes <code>\afterindexterm</code> equivalent to
+<code>\quad</code>.
+</p>
+<p>You can also change the keywords Eplain recognizes (see <a href="#Modifying-index-entries">Modifying index entries</a>):
+</p>
+<dl compact="compact">
+<dt><code>\idxrangebeginword</code></dt>
+<dd><span id="index-idxrangebeginword"></span>
+<p>&lsquo;begin&rsquo;
+</p>
+</dd>
+<dt><code>\idxrangeendword</code></dt>
+<dd><span id="index-idxrangeendword"></span>
+<p>&lsquo;end&rsquo;
+</p>
+</dd>
+<dt><code>\idxseecmdword</code></dt>
+<dd><span id="index-idxseecmdword"></span>
+<p>&lsquo;see&rsquo;
+</p>
+</dd>
+<dt><code>\idxseealsocmdword</code></dt>
+<dd><span id="index-idxseealsocmdword"></span>
+<p>&lsquo;seealso&rsquo;
+</p>
+</dd>
+</dl>
+
+<p>You can also change the magic characters Eplain puts into the
+<samp>.idx</samp> file, in case you&rsquo;ve changed them in the <code>.ist</code> file:
+</p>
+<dl compact="compact">
+<dt><code>\idxsubentryseparator</code></dt>
+<dd><span id="index-idxsubentryseparator"></span>
+<p>&lsquo;<samp>!</samp>&rsquo;
+</p>
+</dd>
+<dt><code>\idxencapoperator</code></dt>
+<dd><span id="index-idxencapoperator"></span>
+<p>&lsquo;<samp>|</samp>&rsquo;
+</p>
+</dd>
+<dt><code>\idxbeginrangemark</code></dt>
+<dd><span id="index-idxbeginrangemark"></span>
+<p>&lsquo;<samp>(</samp>&rsquo;
+</p>
+</dd>
+<dt><code>\idxendrangemark</code></dt>
+<dd><span id="index-idxendrangemark"></span>
+<p>&lsquo;<samp>)</samp>&rsquo;
+</p>
+</dd>
+</dl>
+
+<p>There is no macro for the <code>actual</code> (&lsquo;<samp>@</samp>&rsquo; by default)
+character, because it&rsquo;s impossible to make it expand properly.
+</p>
+<span id="index-idxpagenum"></span>
+<span id="index-see-also-index-entries-and-sorting"></span>
+<p>You can change the (imaginary) page number that &ldquo;see also&rdquo;
+entries sort as by redefining <code>\idxmaxpagenum</code>. This is 99999 by
+default, which is one digit too many for old versions of MakeIndex.
+</p>
+<span id="index-indexseeword"></span>
+<span id="index-indexseealsowords"></span>
+<span id="index-seevariant"></span>
+<span id="index-indexsee"></span>
+<span id="index-indexseealso"></span>
+<p>The words output by Eplain for &ldquo;see&rdquo; and &ldquo;see also&rdquo; index entries
+are defined by <code>\indexseeword</code> and <code>\indexseealsowords</code>
+respectively. You can change the typeface used for these words by
+redefining <code>\seevariant</code>. And finally, the macros
+<code>\indexsee</code> and <code>\indexseealso</code> actually produce the &ldquo;see
+&hellip;&rdquo; entries, so you can redefine them if you want something
+entirely different. If you do redefine them, make them take two
+parameters, the term being referenced and the <code>\idxmaxpagenum</code>
+(the latter should normally be ignored). See the example below.
+</p>
+<span id="index-see-for-index-entries-1"></span>
+<span id="index-see_002c-and-index-entries-1"></span>
+<span id="index-cross_002dreferencing-index-entries-1"></span>
+<span id="index-index-entries_002c-and-cross_002dreferencing-1"></span>
+<span id="index-commas-in-cross_002dreferencing-index-entries"></span>
+<p>Unfortunately, it is impossible to reliably control the commas
+produced by MakeIndex in front of &ldquo;see &hellip;&rdquo; entries in the
+<samp>.ind</samp> file, either at MakeIndex level or at Eplain level.
+However, the
+<span id="index-sed"></span>
+<code>sed</code> script contained in <code>trimsee</code>
+<span id="index-trimsee"></span>
+distributed with Eplain in the <samp>util</samp> directory can be used to
+filter out these commas from the output of MakeIndex. For example,
+suppose you want the following style for your &ldquo;see &hellip;&rdquo; entries:
+</p>
+<div class="display">
+<pre class="display">analysis,
+ archetypal (<i>see</i> archetypal criticism)
+archetypal criticism,
+ elements of, 75, 97, 114 (<i>see also</i> dichotomies)
+</pre></div>
+
+<p>You would need to redefine these macros in your TeX
+file:
+</p>
+<div class="example">
+<pre class="example">\def\indexsee#1#2{({\seevariant \indexseeword\/ }#1)}
+\def\indexseealso#1#2{({\seevariant \indexseealsowords\/ }#1)}
+</pre></div>
+
+<p>and then filter out the commas in front of the &ldquo;see &hellip;&rdquo;
+entries by running the following command to produce the <samp>.ind</samp>
+file (assuming the name of the <samp>.idx</samp> file is <samp>myfile.idx</samp>
+and the <samp>trimsee</samp> script is placed in the current directory):
+</p>
+<div class="example">
+<pre class="example">prompt$ cat myfile.idx | makeindex | ./trimsee &gt; myfile.ind
+</pre></div>
+
+<p>By default, <samp>trimsee</samp> uses default page list separators and
+default &ldquo;see &hellip;&rdquo; command names. If you set up MakeIndex to use
+different page list separator or change the names of <code>\indexsee</code>
+and <code>\indexseealso</code> commands, it is possible to adjust the
+<samp>trimsee</samp> script through its command line options, which are the
+following:
+</p>
+<dl compact="compact">
+<dt><samp>-i <var>is</var></samp></dt>
+<dd><p>Use <var>is</var> as a regular expression matching separator before &ldquo;see
+&hellip;&rdquo; commands in the input (default: &lsquo;<samp>, \+</samp>&rsquo;).
+</p>
+</dd>
+<dt><samp>-o <var>os</var></samp></dt>
+<dd><p>Use <var>os</var> as a separator to replace <var>is</var> before &ldquo;see &hellip;&rdquo;
+commands (default: &lsquo;<samp> </samp>&rsquo;).
+</p>
+</dd>
+<dt><samp>-s <var>see</var></samp></dt>
+<dd><p>Use <var>see</var> as a regular expression matching &ldquo;see &hellip;&rdquo;
+commands (default: &lsquo;<samp>\\indexsee</samp>&rsquo;).
+</p>
+</dd>
+<dt><samp>-h</samp></dt>
+<dt><samp>--help</samp></dt>
+<dd><p>Print a usage message.
+</p>
+</dd>
+<dt><samp>-v</samp></dt>
+<dt><samp>--version</samp></dt>
+<dd><p>Print version.
+</p></dd>
+</dl>
+
+<p><samp>trimsee</samp> reads input from the standard input, and directs its
+output to the standard output.
+</p>
+
+<hr>
+<span id="Justification"></span><div class="header">
+<p>
+Next: <a href="#Tables" accesskey="n" rel="next">Tables</a>, Previous: <a href="#Indexing" accesskey="p" rel="prev">Indexing</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Justification-1"></span><h3 class="section">4.13 Justification</h3>
+
+<span id="index-centering"></span>
+<span id="index-left_002djustification"></span>
+<span id="index-right_002djustification"></span>
+<span id="index-justification"></span>
+<p>Eplain defines three commands to conveniently justify multiple
+lines of text: <code>\flushright</code>, <code>\flushleft</code>, and
+<code>\center</code>.
+<span id="index-flushright"></span>
+<span id="index-flushleft"></span>
+<span id="index-center"></span>
+</p>
+<p>They all work in the same way; let&rsquo;s take <code>\center</code> as the
+example. To start centering lines, you say <code>\center</code> inside a
+group; to stop, you end the group. Between the two commands, each
+end-of-line in the input file also starts a new line in the output file.
+</p>
+<p>The entire block of text is broken into paragraphs at blank lines,
+so all the TeX paragraph-shaping parameters apply in the usual way.
+This is convenient, but it implies something else that isn&rsquo;t so
+convenient: changes to any linespacing parameters, such as
+<code>\baselineskip</code>, will have <em>no effect</em> on the paragraph in
+which they are changed. TeX does not handle linespacing changes
+within a paragraph (because it doesn&rsquo;t know where the line breaks are
+until the end of the paragraph).
+</p>
+<p>The space between paragraphs is by default one blank line&rsquo;s worth.
+You can adjust this space by assigning to <code>\blanklineskipamount</code>;
+<span id="index-blanklineskipamount-in-justified-text"></span>
+this (vertical) glue is inserted after each blank line.
+</p>
+<p>Here is an example:
+</p>
+<div class="example">
+<pre class="example">{\center First line.
+
+ Second line, with a blank line before.
+}
+</pre></div>
+
+<p>This produces:
+</p>
+<div align="center">First line.
+</div><div align="center"><!-- /@w -->
+</div><div align="center">Second line, with a blank line before.
+</div>
+<p>You may wish to use the justification macros inside of your own
+macros. Just be sure to put them in a group. For example, here is how
+a title macro might be defined:
+</p>
+<div class="example">
+<pre class="example">\def\title{\begingroup\titlefont\center}
+\def\endtitle{\endgroup}
+</pre></div>
+
+<span id="index-raggedleft"></span>
+<span id="index-raggedright"></span>
+<span id="index-leftskip"></span>
+<span id="index-raggedleftskip"></span>
+<span id="index-spaceskip_002c-reset-by-_005cragged_002e_002e_002e"></span>
+<span id="index-xspaceskip_002c-reset-by-_005cragged_002e_002e_002e"></span>
+<span id="index-parfillskip_002c-reset-by-_005cragged_002e_002e_002e"></span>
+<p>In addition, Eplain defines <code>\raggedleft</code>, analogous to plain
+TeX&rsquo;s <code>\raggedright</code>. This macro is also typically used
+inside a group, but unlike the environments above, TeX does normal
+line breaking; that is, ends-of-lines in the input file aren&rsquo;t treated
+specially. Just like plain&rsquo;s <code>\raggedright</code>, it also resets
+<code>\spaceskip</code> and <code>\xspaceskip</code> so that interword spacing is
+uniform. It also sets <code>\parfillskip</code> to zero so that last lines
+of paragraphs are also &ldquo;ragged left&rdquo;. Finally, <code>\leftskip</code>&rsquo;s
+new value is taken from a new glue register, <code>\raggedleft</code>; its
+default value is <code>0pt plus 2em</code>, the same as
+<code>\raggedright</code>&rsquo;s <code>\rightskip</code>.
+</p>
+<p>Here&rsquo;s an example:
+</p>
+<div class="example">
+<pre class="example">{\raggedleft This text will be set ragged left,
+although the left margin won't be too ragged by default.
+You may well want to increase the value of
+{\tt \char`\\raggedleftskip} before calling the macro.
+It's necessary to end the paragraph before ending the group
+or the setting won't have any effect, so: {\tt \char`\\par}
+}
+</pre></div>
+
+<p>Despite <code>\raggedleft</code> resetting <code>\parfillskip</code> to zero,
+TeX&rsquo;s line breaking may still prefer to make the last line of a
+paragraph considerably shorter than the rest, to minimize overall
+badness. Increasing <code>\raggedleftskip</code> may help somewhat, but
+using <code>\emergencystretch</code>, retaining interword stretchability by
+assigning <code>\leftskip</code> directly, or even forcing line breaks may
+be necessary.
+</p>
+
+
+<hr>
+<span id="Tables"></span><div class="header">
+<p>
+Next: <a href="#Margins" accesskey="n" rel="next">Margins</a>, Previous: <a href="#Justification" accesskey="p" rel="prev">Justification</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Tables-1"></span><h3 class="section">4.14 Tables</h3>
+
+<span id="index-tables"></span>
+<span id="index-alignments"></span>
+<p>Eplain provides a single command, <code>\makecolumns</code>,
+<span id="index-makecolumns"></span>
+to make generating one particular kind of table easier. More
+ambitious LaTeX styles and macro packages tackle more difficult
+applications. The <code>autorows</code> feature of the Memoir package
+provides similar functionality to this.
+</p>
+<p>Many tables are homogenous, i.e., all the entries are semantically the
+same. The arrangement into columns is to save space on the page, not
+to encode different meanings. In this kind of the table, it is useful to
+have the column breaks chosen automatically, so that you can add or
+delete entries without worrying about the column breaks.
+</p>
+<p><code>\makecolumns</code> takes two arguments: the number of entries in the
+table, and the number of columns to break them into. As you can see
+from the example below, the first argument is delimited by a slash, and
+the second by a colon and a space (or end-of-line). The entries for the
+table then follow, one per line (not including the line with the
+<code>\makecolumns</code> command itself).
+</p>
+<p><code>\parindent</code> defines the space to the left of the
+table. <code>\hsize</code> defines the width of the table.
+So you can adjust the position of the table on the page by assignments
+to these parameters, probably inside a group.
+</p>
+<p>You can also control the penalty at a page break before the
+<code>\makecolumns</code> by setting the parameter
+<code>\abovecolumnspenalty</code>.
+<span id="index-abovecolumnspenalty"></span>
+Usually, the table is preceded by some explanatory text. You wouldn&rsquo;t
+want a page break to occur after the text and before the table, so
+Eplain sets it to <code>10000</code>. But if the table produced by
+<code>\makecolumns</code> is standing on its own, <code>\abovecolumnspenalty</code>
+should be decreased.
+</p>
+<p>If you happen to give <code>\makecolumns</code> a smaller number of entries
+than you really have, some text beyond the (intended) end of the table
+will be incorporated into the table, probably producing an error
+message, or at least some strange looking entries. And if you give
+<code>\makecolumns</code> a larger number of entries than you really have,
+some of the entries will be typeset as straight text, probably also
+looking somewhat out of place.
+</p>
+<p>Here is an example:
+</p>
+<div class="example">
+<pre class="example">% Arrange 6 entries into 2 columns:
+\makecolumns 6/2: % This line doesn't have an entry.
+one
+two
+three
+four
+five
+six
+Text after the table.
+</pre></div>
+
+<p>This produces &lsquo;one&rsquo;, &lsquo;two&rsquo;, and &lsquo;three&rsquo; in the first column, and
+&lsquo;four&rsquo;, &lsquo;five&rsquo;, and &lsquo;six&rsquo; in the second.
+</p>
+
+<hr>
+<span id="Margins"></span><div class="header">
+<p>
+Next: <a href="#Multiple-columns" accesskey="n" rel="next">Multiple columns</a>, Previous: <a href="#Tables" accesskey="p" rel="prev">Tables</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Margins-1"></span><h3 class="section">4.15 Margins</h3>
+
+<span id="index-margins_002c-changing"></span>
+<p>TeX&rsquo;s primitives describe the type area in terms of an offset from
+the upper left corner, and the width and height of the type. Some
+people prefer to think in terms of the <em>margins</em> at the top, bottom,
+left, and right of the page, and most composition systems other than
+TeX conceive of the page laid out in this way. Therefore, Eplain
+provides commands to directly assign and increment the margins.
+</p>
+<dl compact="compact">
+<dt><code>\topmargin = <var>dimen</var></code></dt>
+<dt><code>\bottommargin = <var>dimen</var></code></dt>
+<dt><code>\leftmargin = <var>dimen</var></code></dt>
+<dt><code>\rightmargin = <var>dimen</var></code></dt>
+<dd><span id="index-topmargin"></span>
+<span id="index-bottommargin"></span>
+<span id="index-leftmargin"></span>
+<span id="index-rightmargin"></span>
+<p>These commands set the specified margin to the <var>dimen</var> given.
+The <code>=</code> and the spaces around it are optional. The control
+sequences here are not TeX registers, despite appearances;
+therefore, commands like <code>\showthe\topmargin</code> will not do what you
+expect.
+</p>
+</dd>
+<dt><code>\advancetopmargin by <var>dimen</var></code></dt>
+<dt><code>\advancebottommargin by <var>dimen</var></code></dt>
+<dt><code>\advanceleftmargin by <var>dimen</var></code></dt>
+<dt><code>\advancerightmargin by <var>dimen</var></code></dt>
+<dd><span id="index-advancetopmargin"></span>
+<span id="index-advancebottommargin"></span>
+<span id="index-advanceleftmargin"></span>
+<span id="index-advancerightmargin"></span>
+<p>These commands change the specified margin by the <var>dimen</var> given.
+</p></dd>
+</dl>
+
+<p>Regardless of whether you use the assignment or the advance commands,
+Eplain always changes the type area in response, not the other margins.
+For example, when TeX starts, the left and right margins are both one
+inch. If you then say <code>\leftmargin = 2in</code>, the right margin will
+remain at one inch, and the width of the lines (i.e., <code>\hsize</code>)
+<span id="index-hsize"></span>
+will decrease by one inch.
+</p>
+<p>When you use any of these commands, Eplain computes the old value of
+the particular margin, by how much you want to change it, and then
+resets the values of TeX&rsquo;s primitive parameters to correspond.
+Unfortunately, Eplain cannot compute the right or bottom margin without
+help: you must tell it the full width and height of the final output
+page. It defines two new parameters for this:
+</p>
+<dl compact="compact">
+<dt><code>\paperheight</code></dt>
+<dd><span id="index-paperheight"></span>
+<p>The height of the output page; default is 11truein.
+</p>
+</dd>
+<dt><code>\paperwidth</code></dt>
+<dd><span id="index-paperwidth"></span>
+<p>The width of the output page; default is 8.5truein.
+</p></dd>
+</dl>
+
+<p>If your output page has different dimensions than this, you must
+reassign to these parameters, as in
+</p>
+<div class="example">
+<pre class="example">\paperheight = 11truein
+\paperwidth = 17truein
+</pre></div>
+
+
+<hr>
+<span id="Multiple-columns"></span><div class="header">
+<p>
+Next: <a href="#Footnotes" accesskey="n" rel="next">Footnotes</a>, Previous: <a href="#Margins" accesskey="p" rel="prev">Margins</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Multiple-columns-1"></span><h3 class="section">4.16 Multiple columns</h3>
+
+<span id="index-double-column-output"></span>
+<span id="index-triple-column-output"></span>
+<span id="index-quadruple-column-output"></span>
+<span id="index-multiple-column-output"></span>
+<p>Eplain provides for double, triple, and quadruple column output: say
+<code>\doublecolumns</code>,
+<span id="index-doublecolumns"></span>
+<code>\triplecolumns</code>,
+<span id="index-triplecolumns"></span>
+or <code>\quadcolumns</code>,
+<span id="index-quadcolumns"></span>
+and from that point on, the manuscript will be
+set in columns. To go back to one column, say
+<code>\singlecolumn</code>.
+<span id="index-singlecolumn"></span>
+</p>
+<span id="index-column-balancing-with-_005csinglecolumn"></span>
+<span id="index-balancing-of-columns-with-_005csinglecolumn"></span>
+<p>You may need to invoke <code>\singlecolumn</code> to balance the columns
+on the last page of output.
+</p>
+<span id="index-columnfill"></span>
+<span id="index-column-eject"></span>
+<span id="index-eject-in-multicolumns"></span>
+<span id="index-pagetotal"></span>
+<p>To do a &ldquo;column eject&rdquo;, i.e., move to the top of the next column, do
+<code>\columnfill</code>. This does not actually force an eject, however: it
+merely inserts an unbreakable space of (essentially) size
+<code>\@normalvsize</code> minus <code>\pagetotal</code> (where
+<code>\@normalvsize</code> is the usual height of the page; to implement
+multicolumns, Eplain multiplies <code>\vsize</code> itself by the number of
+columns). In most circumstances, a column break will be forced after
+this space (during the column splitting operation when the whole page
+is output). Bugs are easily possible, unfortunately.
+</p>
+<span id="index-gutter"></span>
+<p>The columns are separated by the value of the dimen parameter
+<code>\gutter</code>. Default value is two picas.
+<span id="index-gutterbox"></span>
+If you want to add vertical material between the columns, use
+<code>\gutterbox</code>. For example, to put a vertical line between columns,
+define
+<code>\gutterbox</code> as
+</p>
+<div class="example">
+<pre class="example">\def\gutterbox{\vbox to \dimen0{\vfil\hbox{\vrule height\dimen0}\vfil}}%
+</pre></div>
+
+<p>The dimension counter
+<code>\dimen0</code>
+contains the height of the column.
+</p>
+<p>All the <code>\&hellip;columns</code> macros insert the value of the glue parameter
+<code>\abovecolumnskip</code>
+<span id="index-abovecolumnskip"></span>
+before the multicolumn text, and the value of the glue parameter
+<code>\belowcolumnskip</code>
+<span id="index-belowcolumnskip"></span>
+after it. The default value for both of these parameters is
+<code>\bigskipamount</code>, i.e., one linespace in plain TeX.
+</p>
+<p>The macros take into account only the insertion classes
+<span id="index-insertion-classes"></span>
+defined by plain TeX; namely, footnotes and <code>\topinsert</code>s. If
+you have additional insertion classes, you will need to change
+the implementation.
+</p>
+<p>Also, Eplain makes insertions the full page width. There is no
+provision for column-width insertions.
+</p>
+
+<hr>
+<span id="Footnotes"></span><div class="header">
+<p>
+Next: <a href="#Fractions" accesskey="n" rel="next">Fractions</a>, Previous: <a href="#Multiple-columns" accesskey="p" rel="prev">Multiple columns</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Footnotes-1"></span><h3 class="section">4.17 Footnotes</h3>
+
+<span id="index-footnotes_002c-numbered"></span>
+<p>The most common reference mark for footnotes is a raised number,
+incremented on each footnote. The <code>\numberedfootnote</code>
+<span id="index-numberedfootnote"></span>
+macro provides this. It takes one argument, the footnote text.
+</p>
+<p>If your document uses only numbered footnotes, you could make typing
+<code>\numberedfootnote</code> more convenient with a command such as:
+</p>
+<div class="example">
+<pre class="example">\let\footnote = \numberedfootnote
+</pre></div>
+
+<p>After doing this, you can type your footnotes as
+<code>\footnote{<var>footnote text</var>}</code>, instead of as
+<code>\numberedfootnote{<var>footnote text</var>}</code>.
+</p>
+<p>Eplain keeps the current footnote number in the count register
+<code>\footnotenumber</code>. So, to reset the footnote number to zero,
+as you might want to do at, for example, the beginning of a chapter, you
+could say <code>\footnotenumber=0</code>.
+</p>
+<p>Plain TeX separates the footnote marker from the footnote text by
+an en space (it uses the <code>\textindent</code> macro). In Eplain, you can
+change this space by setting the dimension register
+<code>\footnotemarkseparation</code>.
+<span id="index-footnotemarkseparation"></span>
+The default is still an en.
+</p>
+<p>You can produce a space between footenotes by setting the glue
+register <code>\interfootnoteskip</code>.
+<span id="index-interfootnoteskip"></span>
+The default is zero.
+</p>
+<p><code>\parskip</code> is also set to zero by default before the beginning of
+each footnote (but not for the text of the footnote).
+</p>
+<p>You can also control footnote formatting in a more general way:
+Eplain expands the token register <code>\everyfootnote</code>
+<span id="index-everyfootnote"></span>
+before a footnote is typeset, but after the default values for all the
+parameters have been established. For example, if you want your
+footnotes to be printed in seven-point type, indented by one inch, you
+could say:
+</p>
+<div class="example">
+<pre class="example">\everyfootnote = {\sevenrm \leftskip = 1in}
+</pre></div>
+
+<p>By default, an <code>\hrule</code> is typeset above each group of footnotes
+on a page. You can control the dimensions of this rule by setting
+the dimension registers <code>\footnoterulewidth</code>
+<span id="index-footnoterulewidth"></span>
+and <code>\footnoteruleheight</code>.
+<span id="index-footnoteruleheight"></span>
+The space between the rule and the first footnote on the page is
+determined by the dimension register <code>\belowfootnoterulespace</code>.
+<span id="index-belowfootnoterulespace"></span>
+If you don&rsquo;t want any rule at all, set <code>\footenoteruleheight=0pt</code>,
+and, most likely, <code>\belowfootnoterulespace=0pt</code>. The defaults for
+these parameters typeset the rule in the same way as plain TeX: the
+rule is 0.4 points high, 2 true inches wide, with 2.6 points below it.
+</p>
+<p>The space above the rule and below the text on the page is controlled
+by the glue register <code>\skip\footins</code>. The default is a plain TeX
+<code>\bigskip</code>.
+</p>
+<p>Eplain can create hypertext links for the footnote marks (see <a href="#Footnote-hyperlinks">Footnote hyperlinks</a>).
+</p>
+
+
+<hr>
+<span id="Fractions"></span><div class="header">
+<p>
+Next: <a href="#Paths" accesskey="n" rel="next">Paths</a>, Previous: <a href="#Footnotes" accesskey="p" rel="prev">Footnotes</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Fractions-1"></span><h3 class="section">4.18 Fractions</h3>
+
+<span id="index-fractions"></span>
+<p>Exercise 11.6 of <cite>The TeXbook</cite> describes a macro <code>\frac</code>
+<span id="index-frac"></span>
+for setting fractions, but <code>\frac</code> never made it into plain TeX.
+So Eplain includes it.
+</p>
+<p><code>\frac</code> typesets the numerator and denominator in
+<code>\scriptfont0</code>, slightly raised and lowered. The numerator and
+denominator are separated by a slash. The denominator must be enclosed
+in braces if it&rsquo;s more than one token long, but the numerator need not
+be. (This is a consequence of <code>\frac</code> taking delimited arguments;
+see page&nbsp;203 of <cite>The TeXbook</cite> for an explanation of
+delimited macro arguments.)
+</p>
+<p>For example, <code>\frac 23/{64}</code> turns &lsquo;23/64&rsquo; into
+.
+</p>
+
+<hr>
+<span id="Paths"></span><div class="header">
+<p>
+Next: <a href="#Logos" accesskey="n" rel="next">Logos</a>, Previous: <a href="#Fractions" accesskey="p" rel="prev">Fractions</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Paths-1"></span><h3 class="section">4.19 Paths</h3>
+
+<span id="index-pathnames_002c-breaking"></span>
+<span id="index-filenames_002c-breaking"></span>
+<span id="index-electronic-mail-addresses_002c-breaking"></span>
+
+<p>When you typeset long pathnames, electronic mail addresses, or other
+such &ldquo;computer&rdquo; names, you would like TeX to break lines at
+punctuation characters within the name, rather than trying to find
+hyphenation points within the words. For example, it would be better to
+break the email address <code>letters@alpha.gnu.ai.mit.edu</code> at the
+&lsquo;<samp>@</samp>&rsquo; or a &lsquo;<samp>.</samp>&rsquo;, rather than at the hyphenation points in
+&lsquo;<samp>letters</samp>&rsquo; and &lsquo;<samp>alpha</samp>&rsquo;.
+</p>
+<span id="index-path"></span>
+<p>If you use the <code>\path</code> macro to typeset the names, TeX will find
+these good breakpoints. The argument to <code>\path</code> is delimited by
+any character other than &lsquo;<samp>\</samp>&rsquo; which does not appear in the
+name itself.
+&lsquo;<samp>|</samp>&rsquo; is often a good choice, as in:
+</p>
+<div class="example">
+<pre class="example">\path|letters@alpha.gnu.ai.mit.edu|
+</pre></div>
+
+<span id="index-discretionaries"></span>
+<p>You can control the exact set of characters at which breakpoints will be
+allowed by calling <code>\discretionaries</code>. This takes the same sort of
+delimited argument; any character in the argument will henceforth be a valid
+breakpoint within <code>\path</code>. The default set is essentially all the
+punctuation characters:
+</p>
+<div class="example">
+<pre class="example">\discretionaries |~!@$%^&amp;*()_+`-=#{}[]:&quot;;'&lt;&gt;,.?\/|
+</pre></div>
+
+<span id="index-specialpathdelimiters-_0028conditional_0029"></span>
+<p>If for some reason you absolutely must use <code>\</code> as the delimiter
+character for <code>\path</code>, you can set
+<code>\specialpathdelimiterstrue</code>. (Other delimiter characters can
+still be used.) TeX then processes the <code>\path</code> argument
+about four times more slowly.
+</p>
+<span id="index-URL-for-path_002esty"></span>
+<p>The <code>\path</code> macro comes from <samp>path.sty</samp>, written by Nelson
+Beebe and Philip Taylor, and available at
+<a href="https://ctan.org/pkg/path">https://ctan.org/pkg/path</a>.
+</p>
+
+<hr>
+<span id="Logos"></span><div class="header">
+<p>
+Next: <a href="#Boxes" accesskey="n" rel="next">Boxes</a>, Previous: <a href="#Paths" accesskey="p" rel="prev">Paths</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Logos-1"></span><h3 class="section">4.20 Logos</h3>
+
+<span id="index-logos"></span>
+<span id="index-names_002c-of-TeX-variants"></span>
+
+<p>Eplain redefines the <code>\TeX</code>
+<span id="index-TeX"></span>
+macro of plain TeX to end with <code>\null</code>, so that the proper
+spacing is produced when <code>\TeX</code> is used at the end of a sentence.
+The other &hellip;TeX macros listed here do this, also.
+</p>
+<p>Eplain defines
+<code>\AMSLaTeX</code>,
+<span id="index-AMSLaTeX"></span>
+<span id="index-AMSLaTeX-1"></span>
+<code>\AMSTeX</code>,
+<span id="index-AMSTeX"></span>
+<span id="index-AMSTeX-1"></span>
+<code>\BibTeX</code>
+<span id="index-BibTeX-1"></span>
+<span id="index-BibTeX-2"></span>
+<code>\eTeX</code>,
+<span id="index-eTeX"></span>
+<span id="index-eTeX-1"></span>
+<code>\ExTeX</code>,
+<span id="index-ExTeX"></span>
+<span id="index-ExTeX-1"></span>
+<code>\LAMSTeX</code>,
+<span id="index-LAMSTeX"></span>
+<span id="index-LAMSTeX-1"></span>
+<code>\LaTeX</code>,
+<span id="index-LaTeX-2"></span>
+<span id="index-LaTeX-4"></span>
+<code>\MF</code>,
+<span id="index-Metafont"></span>
+<span id="index-MF"></span>
+<code>\SLiTeX</code>,
+<span id="index-SLiTeX"></span>
+<span id="index-SLiTeX-1"></span>
+<code>\XeLaTeX</code>,
+<span id="index-XeLaTeX"></span>
+<span id="index-XeLaTeX-1"></span>
+and <code>\XeTeX</code>
+<span id="index-XeTeX"></span>
+<span id="index-XeTeX-1"></span>
+to produce their respective logos. (Sorry, the logos are not shown
+here.) Some spelling variants of these are also supported.
+</p>
+<span id="index-texnames_002esty"></span>
+<p>Most of these macros come from <samp>texnames.sty</samp>, compiled by Nelson
+Beebe and available at
+<a href="http://mirror.ctan.org/tex-archive/info/biblio/texnames.sty">http://mirror.ctan.org/tex-archive/info/biblio/texnames.sty</a>
+(part of the <code>biblio</code> package, <a href="https://ctan.org/pkg/biblio">https://ctan.org/pkg/biblio</a>).
+</p>
+
+<hr>
+<span id="Boxes"></span><div class="header">
+<p>
+Next: <a href="#Checking-for-PDF-output" accesskey="n" rel="next">Checking for PDF output</a>, Previous: <a href="#Logos" accesskey="p" rel="prev">Logos</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Boxes-1"></span><h3 class="section">4.21 Boxes</h3>
+
+<span id="index-black-boxes"></span>
+<span id="index-rectangles"></span>
+<p>The solid rectangle that Eplain uses as a marker in unordered lists
+(see <a href="#Lists">Lists</a>) is available by itself: just say <code>\blackbox</code>.
+<span id="index-blackbox"></span>
+</p>
+<p>You can create black boxes of arbitrary size with <code>\hrule</code> or
+<code>\vrule</code>.
+</p>
+<span id="index-open-boxes"></span>
+<span id="index-boxes_002c-open"></span>
+<p>You can also get unfilled rectangles with <code>\makeblankbox</code>.
+<span id="index-makeblankbox"></span>
+This takes two explicit arguments: the height and depth of the rules that
+define the top and bottom of the rectangle. (The two arguments are
+added to get the width of the left and right borders, so that the
+thickness of the border is the same on all four sides.) It also uses,
+as implicit arguments, the dimensions of <code>\box0</code> to define the
+dimensions of the rectangle it produces. (The contents of <code>\box0</code>
+are ignored.)
+</p>
+<p>Here is an example. This small raised open box is suitable for
+putting next to numbers in, e.g., a table of contents.
+</p>
+<div class="example">
+<pre class="example">\def\openbox{%
+ \ht0 = 1.75pt \dp0 = 1.75pt \wd0 = 3.5pt
+ \raise 2.75pt \makeblankbox{.2pt}{.2pt}
+}
+</pre></div>
+
+<p>Finally, you can put a box around arbitrary text with <code>\boxit</code>.
+<span id="index-boxit"></span>
+This takes one argument, which must itself be a (TeX) box, and puts a
+printed box around it, separated by <code>\boxitspace</code>
+<span id="index-boxitspace"></span>
+white space (3 points by default) on all four sides. For example:
+</p>
+<div class="example">
+<pre class="example">\boxit{\hbox{This text is boxed.}}
+</pre></div>
+
+<p>The reason that the argument must be a box is that when the text is
+more than one line long, TeX cannot figure out the line length for
+itself. Eplain does set <code>\parindent</code> to zero inside <code>\boxit</code>,
+since it is very unlikely you would want indentation there. (If you do,
+you can always reset it yourself.)
+</p>
+<p><code>\boxit</code> uses <code>\ehrule</code> and <code>\evrule</code> so that you can
+easily adjust the thicknesses of the box rules. See <a href="#Rules">Rules</a>.
+</p>
+
+<hr>
+<span id="Checking-for-PDF-output"></span><div class="header">
+<p>
+Next: <a href="#Loading-LaTeX-packages" accesskey="n" rel="next">Loading LaTeX packages</a>, Previous: <a href="#Boxes" accesskey="p" rel="prev">Boxes</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Checking-for-PDF-output-1"></span><h3 class="section">4.22 Checking for PDF output</h3>
+
+<span id="index-URL-for-pdfTeX"></span>
+<span id="index-PDF-output"></span>
+<span id="index-pdftex-1"></span>
+<span id="index-_002epdf-files"></span>
+<p>pdfTeX is an extended TeX that can output both <samp>.dvi</samp> and
+<samp>.pdf</samp> (Adobe&rsquo;s Portable Document Format) files (see
+<a href="https://ctan.org/pkg/pdftex">https://ctan.org/pkg/pdftex</a>). You might sometimes want to know
+whether the target format is <samp>.pdf</samp> or <samp>.dvi</samp>. The
+<code>\ifpdf</code>
+<span id="index-ifpdf"></span>
+switch can be used to detect pdfTeX in PDF mode:
+</p>
+<div class="example">
+<pre class="example">\ifpdf
+ This text is produced when pdfTeX is in PDF mode.
+\else
+ This text is produced when pdfTeX is in DVI mode,
+ or when some program other than pdfTeX is used.
+\fi
+</pre></div>
+
+<p>Keep in mind that <code>\ifpdf</code> is set based on the value of the
+<code>\pdfoutput</code>
+<span id="index-pdfoutput"></span>
+primitive of pdfTeX at the time Eplain is loaded. If you change
+the value of <code>\pdfoutput</code> after you load Eplain, <code>\ifpdf</code>
+will not reflect the change.
+</p>
+<span id="index-ifpdf_002esty"></span>
+<span id="index-Oberdiek_002c-Heiko"></span>
+<p>Eplain defines <code>\ifpdf</code> by incorporating Heiko Oberdiek&rsquo;s
+<samp>ifpdf.sty</samp>, which is available at
+<a href="https://ctan.org/pkg/ifpdf">https://ctan.org/pkg/ifpdf</a>.
+</p>
+
+<hr>
+<span id="Loading-LaTeX-packages"></span><div class="header">
+<p>
+Previous: <a href="#Checking-for-PDF-output" accesskey="p" rel="prev">Checking for PDF output</a>, Up: <a href="#User-definitions" accesskey="u" rel="up">User definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Loading-LaTeX-packages-1"></span><h3 class="section">4.23 Loading LaTeX packages</h3>
+
+<span id="index-LaTeX-packages"></span>
+<span id="index-packages_002c-LaTeX"></span>
+<span id="index-_002esty-files"></span>
+<span id="index-_002ecls-files"></span>
+
+<p>Eplain provides a limited support for loading LaTeX packages
+(<samp>.sty</samp> files&mdash;not <samp>.cls</samp>). This will mostly work for
+packages which were designed with plain TeX compatibility in mind,
+which means that most LaTeX packages cannot be loaded. The
+packages which are known to work are listed below (see <a href="#Packages-known-to-work">Packages known to work</a>). If you discover a working package which is not in
+the list, please report it to the Eplain mailing list
+(see <a href="#Introduction">Introduction</a>).
+</p>
+<span id="index-graphics-collection_002c-LaTeX"></span>
+<span id="index-LaTeX-graphics-collection"></span>
+<span id="index-miniltx_002etex"></span>
+<span id="index-Carlisle_002c-David"></span>
+<span id="index-Rahtz_002c-Sebastian"></span>
+<p>To set up a pseudo-LaTeX environment for the packages, Eplain uses
+<samp>miniltx.tex</samp> (<a href="https://ctan.org/pkg/miniltx">https://ctan.org/pkg/miniltx</a>) from the
+LaTeX graphics collection, written by David Carlisle and Sebastian
+Rahtz. Eplain extends <samp>miniltx.tex</samp> to provide (primarily)
+support for package options.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#The-_005cusepackage-command" accesskey="1">The \usepackage command</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Command to load packages.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Environment-for-loading-packages" accesskey="2">Environment for loading packages</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Environment for the \usepackage commands.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Packages-known-to-work" accesskey="3">Packages known to work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Packages supported with Eplain.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Packages-known-not-to-work" accesskey="4">Packages known not to work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Packages known not to work with Eplain.
+</td></tr>
+</table>
+
+<hr>
+<span id="The-_005cusepackage-command"></span><div class="header">
+<p>
+Next: <a href="#Environment-for-loading-packages" accesskey="n" rel="next">Environment for loading packages</a>, Up: <a href="#Loading-LaTeX-packages" accesskey="u" rel="up">Loading LaTeX packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="The-_005cusepackage-command-1"></span><h4 class="subsection">4.23.1 The <code>\usepackage</code> command</h4>
+
+<span id="index-usepackage"></span>
+<p><code>\usepackage</code> loads a LaTeX package. Its syntax is similar to
+that of LaTeX&rsquo;s <code>\usepackage</code> command:
+</p>
+<div class="example">
+<pre class="example">\usepackage[<var>options</var>]{<var>packages</var>}[<var>version</var>]
+</pre></div>
+
+<p>where <var>options</var> is a comma-separated list of package
+options, <var>packages</var> is a comma-separated list of packages to load
+(without the <samp>.sty</samp> suffix), and <var>version</var> is a package
+version number given as a date in the format &lsquo;<samp>YYYY/MM/DD</samp>&rsquo;. If an
+older version of the package is found, a warning is issued. If
+several packages are loaded within a single <code>\usepackage</code>
+command, the <var>options</var> will be applied to each of the packages.
+As usual, parameters in square brackets are optional and can be
+omitted (together with the square brackets).
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\usepackage[foo,bar]{pack1,pack2}[2005/08/29]
+</pre></div>
+
+<p>will load packages &lsquo;<samp>pack1</samp>&rsquo; and &lsquo;<samp>pack2</samp>&rsquo;, each with
+the options &lsquo;<samp>foo</samp>&rsquo; and &lsquo;<samp>bar</samp>&rsquo;, and will check that each of the
+packages are dated 2005/08/29 or newer.
+</p>
+
+<hr>
+<span id="Environment-for-loading-packages"></span><div class="header">
+<p>
+Next: <a href="#Packages-known-to-work" accesskey="n" rel="next">Packages known to work</a>, Previous: <a href="#The-_005cusepackage-command" accesskey="p" rel="prev">The \usepackage command</a>, Up: <a href="#Loading-LaTeX-packages" accesskey="u" rel="up">Loading LaTeX packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Environment-for-loading-packages-1"></span><h4 class="subsection">4.23.2 Environment for loading packages</h4>
+
+<span id="index-loading-packages_002c-environment-for"></span>
+
+<span id="index-beginpackages"></span>
+<span id="index-endpackages"></span>
+<p>Some packages request that certain commands are executed after all
+packages have been loaded. In LaTeX, this means that the commands
+are executed at the beginning of the document, after the so-called
+<em>preamble</em>. Neither plain TeX nor Eplain have a concept of
+preamble; therefore, Eplain requires that all packages be loaded inside
+a <code>\beginpackages...\endpackages</code> block. For example:
+</p>
+<div class="example">
+<pre class="example">\beginpackages
+ \usepackage[foo,bar]{pack1}
+ \usepackage{pack2}
+\endpackages
+</pre></div>
+
+<p>This requirement enables Eplain to execute the &ldquo;delayed&rdquo;
+commands at the end of the <code>\beginpackages...\endpackages</code> block.
+</p>
+<p>For the same reason, it is advisable to specify only one such block
+per document, just like there is only one preamble in LaTeX.
+</p>
+<span id="index-input"></span>
+<span id="index-eplaininput"></span>
+<span id="index-LaTeX-packages_002c-restoring-_005cinput"></span>
+<span id="index-restoring-_005cinput_002c-LaTeX-packages"></span>
+<p>Both the <samp>miniltx.tex</samp> file used by Eplain and some LaTeX
+packages redefine TeX&rsquo;s primitive <code>\input</code> to be a macro.
+Under plain&nbsp;TeX, users probably expect the primitive
+<code>\input</code>. Therefore, at the beginning of the
+<code>\beginpackages...\endpackages</code> block Eplain saves the meaning of
+<code>\input</code> as <code>\eplaininput</code> and restores the original
+<code>\input</code> at the end of the block. This usually means that the
+primitive <code>\input</code> is restored, unless you (or some other macro
+package you&rsquo;ve loaded directly) have redefined it before calling
+<code>\beginpackages</code>. In case you need to access the
+package-provided <code>\input</code>, Eplain saves it as
+<code>\packageinput</code>.
+</p>
+<span id="index-resetatcatcode"></span>
+<span id="index-catcode-of-_0040"></span>
+<p>Along the same lines, Eplain restores the catcode of &lsquo;<samp>@</samp>&rsquo; at
+<code>\endpackages</code> to whatever it was before (using
+<code>\resetatcatcode</code>, as defined by <samp>miniltx.tex</samp>). This is
+needed because <samp>miniltx.tex</samp>, read by <code>\beginpackages</code>, does
+not restore the catcode of &lsquo;<samp>@</samp>&rsquo;, but leaves it as 11 (letter).
+</p>
+<span id="index-hanging-on-_005cinput"></span>
+<span id="index-error-on-_005cinput"></span>
+<p>Sometimes you may encounter packages which make conflicting
+redefinitions of <code>\input</code>. Common symptoms are TeX spewing
+incomprehensible error messages or hanging in a loop at a call to
+<code>\input</code>. This sometimes can be cured by restoring <code>\input</code>
+to <code>\eplaininput</code> before loading each package. For example:
+</p>
+<div class="example">
+<pre class="example">\beginpackages
+ \usepackage{pack1}
+ \let\input\eplaininput
+ \usepackage{pack2}
+\endpackages
+</pre></div>
+
+
+<hr>
+<span id="Packages-known-to-work"></span><div class="header">
+<p>
+Next: <a href="#Packages-known-not-to-work" accesskey="n" rel="next">Packages known not to work</a>, Previous: <a href="#Environment-for-loading-packages" accesskey="p" rel="prev">Environment for loading packages</a>, Up: <a href="#Loading-LaTeX-packages" accesskey="u" rel="up">Loading LaTeX packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Packages-known-to-work-1"></span><h4 class="subsection">4.23.3 Packages known to work</h4>
+
+<span id="index-LaTeX-packages-1"></span>
+<span id="index-packages_002c-LaTeX-1"></span>
+<p>The following table lists packages that had been tested and are known
+to work with Eplain, and locations where you can find manuals for
+these packages. Some of the short descriptions of the packages were
+taken from the documentation for those packages.
+</p>
+<dl compact="compact">
+<dt>autopict (&lsquo;<samp>2001/06/04 v1.1j Picture mode autoload file</samp>&rsquo;)</dt>
+<dd><span id="index-autopict_002esty"></span>
+<p><a href="https://tug.org/eplain/misc/ltpictur.pdf">https://tug.org/eplain/misc/ltpictur.pdf</a>
+</p>
+<span id="index-picture-mode"></span>
+<span id="index-begin_007bpicture_007d"></span>
+<span id="index-end_007bpicture_007d"></span>
+<p>This is the LaTeX &ldquo;picture mode&rdquo;, started by
+<code>\begin{picture}</code> and ended by <code>\end{picture}</code> (in
+LaTeX, this package is not explicitly loaded since it is part of
+the LaTeX kernel). It provides commands to draw simple figures
+inside your document without resorting to any external tools.
+</p>
+</dd>
+<dt>color (&lsquo;<samp>1999/02/16 v1.0i Standard LaTeX Color (DPC)</samp>&rsquo;)</dt>
+<dd><span id="index-color_002esty"></span>
+</dd>
+<dt>graphics (&lsquo;<samp>2001/07/07 v1.0n Standard LaTeX Graphics (DPC,SPQR)</samp>&rsquo;)</dt>
+<dd><span id="index-graphics_002esty"></span>
+</dd>
+<dt>graphicx (&lsquo;<samp>1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR)</samp>&rsquo;)</dt>
+<dd><span id="index-graphicx_002esty"></span>
+<p><a href="https://ctan.org/pkg/graphics">https://ctan.org/pkg/graphics</a>
+</p>
+<span id="index-graphics-collection_002c-LaTeX-1"></span>
+<span id="index-LaTeX-graphics-collection-1"></span>
+<span id="index-color"></span>
+<span id="index-rotation"></span>
+<span id="index-scaling"></span>
+<p>These packages are from the LaTeX graphics collection. (The
+independent <samp>xcolor</samp> package does not work with Eplain.) They
+provide commands for changing text/page colors, text rotation and
+scaling, and much more.
+</p>
+<span id="index-color_002c-problems-with-pdfTeX"></span>
+<span id="index-graphics_002c-problems-with-pdfTeX"></span>
+<span id="index-pdfTeX_002c-problems-using-color-and-graphics"></span>
+<span id="index-pdfTeX_002c-problems-with-supp_002dmis_002etex"></span>
+<span id="index-ConTeXt"></span>
+<span id="index-supp_002dmis_002etex_002c-problems-with-pdfTeX"></span>
+<span id="index-supp_002dpdf_002etex"></span>
+<p><strong>Warning&nbsp;1:</strong> If you encounter problems loading one of
+these packages under pdfTeX (when pdfTeX
+reads <samp>supp-mis.tex</samp>), the cause may be an outdated
+<samp>supp-mis.tex</samp> (part of ConTeXt, a typesetting system for
+TeX) installed on your system. The problem was fixed in
+<samp>supp-mis.tex</samp> version&nbsp;2004.10.26. You can obtain
+up-to-date versions of <samp>supp-mis.tex</samp> and the accompanying
+<samp>supp-pdf.tex</samp> from
+<a href="http://mirror.ctan.org/tex-archive/macros/pdftex/graphics">http://mirror.ctan.org/tex-archive/macros/pdftex/graphics</a>.
+To convince TeX to use the new files, you have the following
+options:
+</p>
+<ol>
+<li> put the new files in the same directory with your document;
+
+</li><li> overwrite the outdated files installed by your TeX distribution;
+
+</li><li> install the new <samp>supp-mis.tex</samp> and <samp>supp-pdf.tex</samp> files in
+the relevant subdirectory of your local <samp>texmf</samp> tree (for info on
+TeX directory structure see <a href="https://tug.org/tds/">https://tug.org/tds/</a> and
+<a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds</a>);
+
+</li><li> upgrade your ConTeXt installation.
+</li></ol>
+
+<p>Note that option&nbsp;1 is the safest but provides the fix
+only for your current document. Options&nbsp;2 and&nbsp;3 will
+usually suffice for Eplain but may break ConTeXt. Option&nbsp;4 is
+the most general but is more complicated than the first three. Be
+sure to backup any files you overwrite. Also keep in mind that
+upgrading your TeX distribution may overwrite files you install in
+the system <samp>texmf</samp> tree.<br> <strong>End of warning&nbsp;1.</strong>
+</p>
+<p><strong>Warning&nbsp;2:</strong> If you encounter problems using the
+<code>\pagecolor</code> command from the <samp>color.sty</samp> package under
+pdfTeX, the cause may be an outdated pdfTeX color and graphics
+driver <samp>pdftex.def</samp>. The problem was fixed in <samp>pdftex.def</samp>
+version&nbsp;0.03p. You can obtain an up-to-date version from
+<a href="http://ctan.org/pkg/pdftex-def">http://ctan.org/pkg/pdftex-def</a>.<br>
+<strong>End of warning&nbsp;2.</strong>
+</p>
+<p>The <code>\fcolorbox</code> macro provided by the <code>color</code> package
+requires the macro <code>\fbox</code> to work, but <code>miniltx</code> does not
+provide that. Here is a definition for it that uses Eplain&rsquo;s
+<code>\boxit</code> (see <a href="#Boxes">Boxes</a>), thanks to Dan Luecking and Helmut
+Jarausch:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+\def\fbox#1{{%
+ \hruledefaultheight=\fboxrule
+ \hruledefaultdepth=0pt
+ \vruledefaultwidth=\fboxrule
+ \let\boxitspace\fboxsep % use miniltx register
+ \boxit{\color@begingroup\hbox{#1}\color@endgroup}%
+}}
+\makeatother
+</pre></div>
+
+<span id="index-omitting-typesetting-of-graphics"></span>
+<span id="index-graphics_002c-omitting-typesetting-of"></span>
+<p>The <samp>graphics</samp>/<samp>graphicx</samp> packages have the option
+<span id="index-draft_002c-option-for-graphics_002esty"></span>
+<code>draft</code> which instructs <code>\includegraphics</code> not to include the
+graphics but instead typeset a box with the dimensions of the graphics
+and the name of the graphics file in typewriter type at the center of
+the box. These packages expect the LaTeX-provided command
+<span id="index-ttfamily"></span>
+<code>\ttfamily</code> to switch to typewriter type. This command is not
+defined by <samp>miniltx.tex</samp>, therefore Eplain defines it and makes it
+equivalent to plain&nbsp;TeX&rsquo;s
+<span id="index-tt"></span>
+<code>\tt</code>.
+</p>
+<p>See <a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a>, for the demonstration of text rotation and
+graphics inclusion using the <samp>graphicx</samp> package, and using the
+<samp>color</samp> package to colorize hypertext links.
+</p>
+<span id="index-Hoppner_002c-Klaus"></span>
+<p>Klaus H&ouml;ppner has written a nice introduction to the LaTeX graphics
+packages and different graphics formats. You can download it from
+</p><div class="display">
+<pre class="display"><a href="https://tug.org/pracjourn/2005-3/hoeppner">https://tug.org/pracjourn/2005-3/hoeppner</a>
+</pre></div>
+
+</dd>
+<dt>epstopdf (&lsquo;<samp>2009/07/16 v2.2 Conversion with epstopdf on the fly (HO)</samp>&rsquo;)</dt>
+<dd><span id="index-epstopdf_002esty"></span>
+<p><a href="https://ctan.org/pkg/epstopdf-pkg">https://ctan.org/pkg/epstopdf-pkg</a>
+</p>
+<span id="index-Encapsulated-PostScript"></span>
+<span id="index-EPS"></span>
+<span id="index-_002eeps-files"></span>
+<span id="index-Portable-Document-Format"></span>
+<span id="index-PDF"></span>
+<span id="index-_002epdf-files-1"></span>
+<span id="index-epstopdf"></span>
+<p>This package does on-the-fly conversion of Encapsulated PostScript
+(<acronym>EPS</acronym>) graphics into Portable Document Format (<acronym>PDF</acronym>)
+graphics for inclusion with the <code>\includegraphics</code> command from
+the <samp>graphics</samp>/<samp>graphicx</samp> packages, so that you do not have
+to explicitly call the <samp>epstopdf</samp> script.
+</p>
+</dd>
+<dt>psfrag (&lsquo;<samp>1998/04/11 v3.04 PSfrag (MCG)</samp>&rsquo;)</dt>
+<dd><span id="index-psfrag_002esty"></span>
+<p><a href="https://ctan.org/pkg/psfrag">https://ctan.org/pkg/psfrag</a>
+</p>
+<span id="index-Encapsulated-PostScript-1"></span>
+<span id="index-EPS-1"></span>
+<span id="index-_002eeps-files-1"></span>
+<p>PSfrag allows the user to precisely overlay Encapsulated PostScript
+(<acronym>EPS</acronym>) files with arbitrary (La)TeX constructions. In order to
+accomplish this, the user places a simple text &ldquo;tag&rdquo; in the graphics
+file, as a &ldquo;position marker&rdquo; of sorts. Then, using simple
+(La)TeX commands, the user instructs PSfrag to remove that tag from
+the figure, and replace it with a properly sized, aligned, and rotated
+(La)TeX equation.
+</p>
+</dd>
+<dt>soul (&lsquo;<samp>2003/11/17 v2.4 letterspacing/underlining (mf)</samp>&rsquo;)</dt>
+<dd><span id="index-soul_002esty"></span>
+<p><a href="https://ctan.org/pkg/soul">https://ctan.org/pkg/soul</a>
+</p>
+<span id="index-letterspacing"></span>
+<span id="index-spacing-out"></span>
+<span id="index-underlining"></span>
+<span id="index-striking-out"></span>
+<span id="index-overstriking"></span>
+<span id="index-highlighting"></span>
+<p>This package provides hyphenatable letterspacing (spacing out),
+underlining, and some derivatives. The package is optimized for
+LaTeX, but works with plain TeX&mdash;you don&rsquo;t actually need to
+load it with the <code>\usepackage</code> command, just say <code>\input
+soul.sty</code>. If you intend to use the highlighting macros of
+<samp>soul</samp>, don&rsquo;t forget to load the <samp>color</samp> package.
+</p>
+</dd>
+<dt>url (&lsquo;<samp>2005/06/27 ver 3.2 Verb mode for urls, etc.</samp>&rsquo;)</dt>
+<dd><span id="index-url_002esty"></span>
+<p><a href="https://ctan.org/pkg/url">https://ctan.org/pkg/url</a>
+</p>
+<span id="index-pathnames_002c-breaking-1"></span>
+<span id="index-filenames_002c-breaking-1"></span>
+<span id="index-electronic-mail-addresses_002c-breaking-1"></span>
+<p>This package provides a form of <code>\verbatim</code> that allows
+line breaks at certain characters or combinations of characters,
+accepts reconfiguration, and can usually be used in the argument to
+another command. It is intended for email addresses, hypertext links,
+directories/paths, etc., which normally have no spaces.
+</p>
+<p>Eplain can create hypertext links with the <code>\url</code> command
+(see <a href="#URL-hyperlinks">URL hyperlinks</a>).
+</p>
+<p>Be sure to get a version dated at least 2005/06/27, as older versions
+have problems in plain&nbsp;TeX.
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="Packages-known-not-to-work"></span><div class="header">
+<p>
+Previous: <a href="#Packages-known-to-work" accesskey="p" rel="prev">Packages known to work</a>, Up: <a href="#Loading-LaTeX-packages" accesskey="u" rel="up">Loading LaTeX packages</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Packages-known-not-to-work-1"></span><h4 class="subsection">4.23.4 Packages known not to work</h4>
+
+<span id="index-LaTeX-packages-2"></span>
+<span id="index-packages_002c-LaTeX-2"></span>
+<p>The following packages are known not to work with Eplain:
+</p>
+<dl compact="compact">
+<dt>hyperref</dt>
+<dd><span id="index-hyperref_002esty"></span>
+<p><a href="https://ctan.org/pkg/hyperref">https://ctan.org/pkg/hyperref</a>
+</p>
+<p>This package depends heavily on LaTeX, so that it is essentially
+unusable outside of LaTeX. Eplain provides its own macros for
+creating hyperlinks; see <a href="#Hyperlinks">Hyperlinks</a>.
+</p>
+</dd>
+<dt>microtype (&lsquo;<samp>2013/05/23 v2.51 Micro-typographical refinements (RS)</samp>&rsquo;)</dt>
+<dd><span id="index-microtype_002esty"></span>
+<p><a href="https://ctan.org/pkg/microtype">https://ctan.org/pkg/microtype</a>
+</p>
+</dd>
+<dt>pict2e (&lsquo;<samp>2005/07/15 v0.2r Improved picture commands (HjG,RN)</samp>&rsquo;)</dt>
+<dd><span id="index-pict2e_002esty"></span>
+<p><a href="https://ctan.org/pkg/pict2e">https://ctan.org/pkg/pict2e</a>
+</p>
+</dd>
+<dt>xcolor (&lsquo;<samp>2005/06/06 v2.03 LaTeX color extensions (UK)</samp>&rsquo;)</dt>
+<dd><span id="index-xcolor_002esty"></span>
+<p><a href="https://ctan.org/pkg/xcolor">https://ctan.org/pkg/xcolor</a>
+</p></dd>
+</dl>
+
+<hr>
+<span id="Hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Arrow-theoretic-diagrams" accesskey="n" rel="next">Arrow theoretic diagrams</a>, Previous: <a href="#User-definitions" accesskey="p" rel="prev">User definitions</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlinks-1"></span><h2 class="chapter">5 Hyperlinks</h2>
+
+<span id="index-links_002c-hypertext"></span>
+<span id="index-hypertext-links"></span>
+<p>This chapter describes the support which Eplain provides for hypertext
+links (<em>hyperlinks</em> for short). Hyperlinks can be created
+implicitly by the cross-reference, indexing and other macros in
+Eplain. Macros for constructing explicit hyperlinks are also
+provided.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Introduction-to-hyperlinks" accesskey="1">Introduction to hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Explicit-hyperlinks" accesskey="2">Explicit hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Implicit-hyperlinks" accesskey="3">Implicit hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-drivers" accesskey="4">Hyperlink drivers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Setting-hyperlink-types-and-options" accesskey="5">Setting hyperlink types and options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Turning-hyperlinks-on_002foff" accesskey="6">Turning hyperlinks on/off</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Making-PDF-outlines" accesskey="7">Making PDF outlines</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Also known as bookmarks.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Introduction-to-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Explicit-hyperlinks" accesskey="n" rel="next">Explicit hyperlinks</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Introduction-to-hyperlinks-1"></span><h3 class="section">5.1 Introduction to hyperlinks</h3>
+
+<span id="index-hyperlink-drivers"></span>
+<span id="index-drivers_002c-hyperlink"></span>
+<p>The original TeX engine has no built-in support for hyperlinks
+(a.k.a. hypertext links).
+Many of the present-day file formats with hyperlinking capabilities
+did not even exist at the time TeX was written. However, TeX&rsquo;s
+<span id="index-special"></span>
+<code>\special</code> primitive can be used to instruct TeX to write
+special directives into its <samp>.dvi</samp> output file. These directives
+are not interpreted by TeX in any way; they are intended for programs
+which process the <samp>.dvi</samp> files produced by TeX, be it printing
+or converting to other formats, such as
+<span id="index-_002eps-files"></span>
+<span id="index-_002epdf-files-2"></span>
+<samp>.ps</samp> or <samp>.pdf</samp>.
+</p>
+<p>Another approach is to extend the original TeX engine with the
+ability to generate one of the hyperlinking formats; TeX&rsquo;s set of
+primitives can be extended to include hyperlink commands. This is the
+approach used by the pdfTeX engine, which is capable of producing
+<samp>.pdf</samp> files directly from the TeX source, skipping the
+<samp>.dvi</samp> generation and processing step.
+</p>
+<p>It turns out that the sets of commands for different formats are mostly
+not interchangeable, as each of the file formats has its own quirks and
+capabilities. And this is where Eplain <em>hyperlink drivers</em> come
+into play.
+</p>
+<p>In order for Eplain to generate proper commands, Eplain has to know
+two things: which engine or <samp>.dvi</samp> processor you are using, and
+the set of commands it understands.
+</p>
+<p>The knowledge about the commands that the various processors
+understand is programmed into Eplain&rsquo;s hyperlink drivers. Eplain
+provides three drivers: <code>hypertex</code> (implementation of the
+HyperTeX standard, see <a href="http://arxiv.org/hypertex">http://arxiv.org/hypertex</a>), and
+<code>pdftex</code> and <code>dvipdfm</code> (named after the programs which
+process the hyperlink commands,
+<span id="index-pdftex-2"></span>
+pdfTeX and
+<span id="index-dvipdfm"></span>
+dvipdfm). Therefore, Eplain can only produce HyperTeX commands and
+hyperlink commands for one of these two programs&mdash;except that the
+extended <code>dvipdfmx</code> program can be used as well as the original
+<code>dvipdfm</code>, since they are compatible.
+</p>
+<p>To tell Eplain which <samp>.dvi</samp> processor or extended TeX engine you
+are using, use the command
+<span id="index-enablehyperlinks"></span>
+<code>\enablehyperlinks</code>.
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\enablehyperlinks
+</pre></div>
+
+<p>instructs Eplain to attempt to automatically detect which
+driver to use, as follows: if it detects pdfTeX in <acronym>PDF</acronym>
+mode, it loads the <code>pdftex</code> driver. If it does not detect
+pdfTeX in <acronym>PDF</acronym> mode, the <code>hypertex</code> driver is loaded.
+The detection is based on the
+<span id="index-ifpdf-1"></span>
+<code>\ifpdf</code> switch (see <a href="#Checking-for-PDF-output">Checking for PDF output</a>).
+</p>
+<p>If necessary, you can explicitly specify the driver name:
+</p>
+<div class="example">
+<pre class="example">\enablehyperlinks[dvipdfm]
+</pre></div>
+
+<p>will start producing hyperlinks under the assumption that
+you are using pdfTeX.
+</p>
+<p>Eplain does not produce any hyperlinks until you explicitly enable
+them with <code>\enablehyperlinks</code>. For one thing, this keeps Eplain
+backward-compatible with previous releases without hyperlink support.
+For another, you may be using a program other than pdfTeX or
+<code>dvipdfm</code>, which does not understand their hyperlink commands or
+the HyperTeX commands.
+</p>
+<span id="Concepts-and-Terminology"></span><h4 class="subheading">Concepts and Terminology</h4>
+
+<p>In general, hyperlinks work as follows. You mark some place in your
+document as a hyperlink destination, associating a <em>hyperlink
+label</em> with that destination. Next, somewhere within your document,
+you create a hyperlink, using a label to identify the destination you
+want this link to point to. A hyperlink is a region in the document
+(which can take many forms, for example, text or a picture); when a
+user clicks on that region, they will be taken to a place in the
+document marked by the corresponding destination. The following two
+sections (<a href="#Explicit-hyperlinks">Explicit hyperlinks</a>, and <a href="#Implicit-hyperlinks">Implicit hyperlinks</a>)
+describe the macros you can use to define destinations and create
+links pointing to those destinations.
+</p>
+<p>In the rest of this chapter, we will often need to refer to links and
+destinations jointly, in which case we will use the term
+<em>hyperlinks</em>. We will use the terms <em>links</em> and
+<em>destinations</em> in cases when we need to refer specifically to
+links or destinations.
+</p>
+<span id="index-link-type"></span>
+<span id="index-destination-type"></span>
+<span id="index-type_002c-link-and-destination"></span>
+<p>Hyperlink drivers provide several kinds of links and destinations. We
+will refer to them as <em>link types</em> and <em>destination types</em>.
+</p>
+<p>For example, one of the destination types that the <code>pdftex</code>
+driver provides is the &lsquo;<samp>xyz</samp>&rsquo; type; when the user follows a link
+pointing to an &lsquo;<samp>xyz</samp>&rsquo; destination, the exact location marked by
+that destination is displayed. Another destination type provided by
+the <code>pdftex</code> driver is the &lsquo;<samp>fit</samp>&rsquo; type; when the user follows
+a link pointing to a &lsquo;<samp>fit</samp>&rsquo; destination, the page containing that
+destination is zoomed to fit into the window in which the document is
+displayed.
+</p>
+<p>Similarly, drivers support various link types. For example, with the
+<code>pdftex</code> driver, the usual link type used to refer to
+destinations in the current document is called &lsquo;<samp>name</samp>&rsquo;. You can
+also create a link pointing to another local document (by using the
+&lsquo;<samp>filename</samp>&rsquo; link type) or to a <acronym>URL</acronym> (by using the
+&lsquo;<samp>url</samp>&rsquo; link type).
+</p>
+<span id="index-link-options"></span>
+<span id="index-destination-options"></span>
+<span id="index-options_002c-link-and-destination"></span>
+<p>In addition, each hyperlink driver supports a number of destination and
+link <em>options</em>. By setting these options you can customize
+hyperlink parameters (e.g., the thickness of the border drawn around a
+hyperlink) or pass information to hyperlinks (for example, file name of
+a document, for a link pointing to a destination in another document).
+</p>
+<p>See <a href="#Hyperlink-drivers">Hyperlink drivers</a>, for the description of hyperlink types and
+options supported by the drivers. See <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>, for the information on how to set hyperlink options.
+</p>
+
+<hr>
+<span id="Explicit-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Implicit-hyperlinks" accesskey="n" rel="next">Implicit hyperlinks</a>, Previous: <a href="#Introduction-to-hyperlinks" accesskey="p" rel="prev">Introduction to hyperlinks</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Explicit-hyperlinks-1"></span><h3 class="section">5.2 Explicit hyperlinks</h3>
+
+<span id="index-explicit-hyperlinks"></span>
+<span id="index-hyperlinks_002c-explicit"></span>
+<span id="index-hldest"></span>
+<p>Explicit hyperlinks are created by you, in the source of your
+document. The simplest command is <code>\hldest</code>, which marks the
+current position in your document as a destination:
+</p>
+<div class="example">
+<pre class="example">\hldest{<var>type</var>}{<var>options</var>}{<var>label</var>}
+</pre></div>
+
+<p>Here <var>type</var> is one of the destination types supported by
+the hyperlink driver (see <a href="#Hyperlink-drivers">Hyperlink drivers</a>), <var>options</var> is a
+comma-separated list of option assignments, and <var>label</var> is the
+hyperlink label to associate with this destination. This label will
+identify the destination when creating links pointing to this
+destination. For example, with the <code>pdftex</code> driver, the command
+</p>
+<div class="example">
+<pre class="example">\hldest{xyz}{zoom=2000}{index}
+</pre></div>
+
+<p>creates a destination of type &lsquo;<samp>xyz</samp>&rsquo; (&ldquo;the current
+position&rdquo;), sets the magnification ratio for this destination to be
+200%, and associates the label <code>index</code> with the destination.
+</p>
+<span id="index-hlstart"></span>
+<span id="index-hlend"></span>
+<p>Another command, <code>\hlstart</code>, paired with <code>\hlend</code>, turns all
+intervening material into a link:
+</p>
+<div class="example">
+<pre class="example">\hlstart{<var>type</var>}{<var>options</var>}{<var>label</var>} &hellip; \hlend
+</pre></div>
+
+<p>Here <var>type</var>, <var>options</var> and <var>label</var> have the same
+meaning as for <code>\hldest</code>. Continuing the previous example,
+</p>
+<div class="example">
+<pre class="example">\hlstart{name}{bstyle=U,bwidth=2}{index} Index\hlend
+</pre></div>
+
+<p>typesets the word &lsquo;Index&rsquo; as a link with underline border of
+width&nbsp;2&nbsp;PostScript points, pointing to the named destination
+<code>index</code> defined in the previous example. (The other options, like
+highlight mode and border color, are determined by the defaults,
+see <a href="#Setting-default-types-and-options">Setting default types and options</a>).
+</p>
+<p>The <var>label</var> argument of both <code>\hldest</code> and <code>\hlstart</code>
+can contain special characters (such as &lsquo;<samp>#</samp>&rsquo;, &lsquo;<samp>%</samp>&rsquo;, &lsquo;<samp>&amp;</samp>&rsquo;,
+&lsquo;<samp>~</samp>&rsquo;, etc.) without any escaping. This is especially important
+for <acronym>URL</acronym> links supported by some drivers (see <a href="#Hyperlink-drivers">Hyperlink drivers</a>).
+</p>
+<p>Both <code>\hldest</code> and <code>\hlstart</code> ignore following spaces.
+</p>
+<p>Both <code>\hldest</code> and <code>\hlstart</code> expand the first token of
+<var>options</var> once, so you can save a list of options in a macro and
+pass it for the <var>options</var>. For example:
+</p>
+<div class="example">
+<pre class="example">\def\linkopts{bstyle=U,bwidth=2}
+\hlstart{name}{\linkopts}{index}Index\hlend
+</pre></div>
+
+<p>is functionally equivalent to the previous example.
+</p>
+<p>See <a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a>, for a demonstration of the usage of
+explicit hyperlinks.
+</p>
+
+<hr>
+<span id="Implicit-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Hyperlink-drivers" accesskey="n" rel="next">Hyperlink drivers</a>, Previous: <a href="#Explicit-hyperlinks" accesskey="p" rel="prev">Explicit hyperlinks</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Implicit-hyperlinks-1"></span><h3 class="section">5.3 Implicit hyperlinks</h3>
+
+<span id="index-implicit-hyperlinks"></span>
+<span id="index-hyperlinks_002c-implicit"></span>
+<p><em>Implicit hyperlinks</em> are hyperlinks created implicitly by various
+Eplain macros, such as the macros for citations, cross-references,
+indexing, etc.
+</p>
+<span id="index-link-group"></span>
+<span id="index-linkgroup"></span>
+<span id="index-group_002c-link"></span>
+<span id="index-destination-group"></span>
+<span id="index-destgroup"></span>
+<span id="index-group_002c-destination"></span>
+<p>All such macros are divided into <em>link groups</em> and
+<em>destination groups</em> (or <em>linkgroups</em> and <em>destgroups</em> for
+short) so that parameters can be set individually for each group. For
+example, all equation macros which define a destination are assigned
+to the &lsquo;eq&rsquo; destgroup; equation macros which create a link are
+assigned to the &lsquo;eq&rsquo; linkgroup. By setting parameters for the &lsquo;eq&rsquo;
+linkgroup (destgroup), you can uniformly customize all links
+(destinations) related to equation references, without interfering
+with settings for the other groups.
+</p>
+<p>See <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>, for information on how to
+set parameters for a group.
+</p>
+<p>Here is the list of the linkgroups:
+</p>
+<div class="display">
+<pre class="display">hrefint, hrefext, url, cite, ref, xref, eq, idx, foot, footback.
+</pre></div>
+
+<p>And here are the destgroups:
+</p>
+<div class="display">
+<pre class="display">bib, li, definexref, xrdef, eq, idx, foot, footback.
+</pre></div>
+
+<p>See <a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a>, for a demonstration of the usage of
+implicit hyperlinks.
+</p>
+<p>The following subsections describe each of the linkgroups and destgroups
+and the hyperlink support provided.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#General-hyperlinks" accesskey="1">General hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">hrefint, hrefext
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#URL-hyperlinks" accesskey="2">URL hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">url
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Citation-hyperlinks" accesskey="3">Citation hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">cite, bib
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#List-hyperlinks" accesskey="4">List hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">li
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Cross_002dreference-hyperlinks" accesskey="5">Cross-reference hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">definexref, ref
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-reference-hyperlinks" accesskey="6">Page reference hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">xrdef, xref
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Equation-reference-hyperlinks" accesskey="7">Equation reference hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">eq
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index-hyperlinks" accesskey="8">Index hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">idx
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Footnote-hyperlinks" accesskey="9">Footnote hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">foot, footback
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Contents-hyperlinks">Contents hyperlinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="General-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#URL-hyperlinks" accesskey="n" rel="next">URL hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="General-hyperlinks_003a-hrefint_002c-hrefext"></span><h4 class="subsection">5.3.1 General hyperlinks: hrefint, hrefext</h4>
+
+<span id="index-href"></span>
+<p><code>\href{<var>url</var>}{<var>text</var>}</code> typesets <var>text</var> as a link
+to <var>url</var>. It basically does what the explicit hyperlink macros do
+(see <a href="#Explicit-hyperlinks">Explicit hyperlinks</a>), but is more convenient (at the expense
+of flexibility).
+</p>
+<p>If <var>url</var> starts with &lsquo;<samp>#</samp>&rsquo;, the rest of <var>url</var> is assumed to
+be a local hyperlink destination name (destination within the same
+document). Parameters for these links can be set by customizing the
+<span id="index-group-_0060hrefint_0027"></span>
+<span id="index-linkgroup-_0060hrefint_0027"></span>
+&lsquo;hrefint&rsquo; linkgroup. For example:
+</p>
+<div class="example">
+<pre class="example">See \href{#intro}{Introduction}
+</pre></div>
+
+<p>will make &lsquo;Introduction&rsquo; into an internal link, which might
+have been created, e.g., with <code>\xrdef{intro}</code>.
+</p>
+<span id="index-URL-hyperlink"></span>
+<span id="index-hyperlinks_002c-URL"></span>
+<p>If <var>url</var> does not start with &lsquo;<samp>#</samp>&rsquo;, it is assumed to be a
+<acronym>URL</acronym> link. Parameters for these links can be set by
+customizing the
+<span id="index-group-_0060hrefext_0027"></span>
+<span id="index-linkgroup-_0060hrefext_0027"></span>
+&lsquo;hrefext&rsquo; linkgroup. The special characters (such as &lsquo;<samp>#</samp>&rsquo; and
+&lsquo;<samp>~</samp>&rsquo;) in the <acronym>URL</acronym> don&rsquo;t need to be escaped. For example:
+</p>
+<div class="example">
+<pre class="example">\href{https://tug.org/eplain/doc/eplain.html#Hyperlinks}{Hyperlinks
+ in Eplain}
+\href{mailto:tex-eplain@tug.org}{Eplain mailing list}
+</pre></div>
+
+<p>See <a href="#URL-hyperlinks">URL hyperlinks</a>, for another way to create
+<acronym>URL</acronym> hyperlinks.
+</p>
+<p>The <var>text</var> argument of <code>\href</code> can contain verbatim text
+(see <a href="#Verbatim-listing">Verbatim listing</a>) or other macros which manipulate character
+catcodes. For example:
+</p>
+<div class="example">
+<pre class="example">\href{#WeirdChars}{The weird chars \verbatim #&amp;%$~|endverbatim}
+</pre></div>
+
+<p><code>\href</code> does not currently handle other link types, such as
+<span id="index-file_003a-links"></span>
+&lsquo;<samp>file:</samp>&rsquo; and
+<span id="index-run_003a-links"></span>
+&lsquo;<samp>run:</samp>&rsquo; links.
+</p>
+
+<hr>
+<span id="URL-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Citation-hyperlinks" accesskey="n" rel="next">Citation hyperlinks</a>, Previous: <a href="#General-hyperlinks" accesskey="p" rel="prev">General hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="URL-hyperlinks_003a-url"></span><h4 class="subsection">5.3.2 URL hyperlinks: url</h4>
+
+<span id="index-URL-hyperlink-1"></span>
+<span id="index-hyperlinks_002c-URL-1"></span>
+<span id="index-group-_0060url_0027"></span>
+<span id="index-linkgroup-_0060url_0027"></span>
+<p>The &lsquo;url&rsquo; linkgroup covers the
+<span id="index-url-_0028hyperlinks_0029"></span>
+<code>\url</code> command from the LaTeX package
+<span id="index-url_002esty-1"></span>
+<samp>url</samp> (see <a href="#Packages-known-to-work">Packages known to work</a>), as well as any new
+<code>\url</code>-like commands you define. The type for this linkgroup is
+set to &lsquo;<samp>url</samp>&rsquo; by the drivers which support this link type.
+&lsquo;<samp>url</samp>&rsquo; links use the parameter to the <code>\url</code> command as the
+<acronym>URL</acronym> to point to.
+</p>
+<p>You may be using the <code>\url</code> command to typeset something other than
+a <acronym>URL</acronym>, e.g., a path, for which you do not want a link to be
+created; in that case, you can disable the &lsquo;url&rsquo; linkgroup with the
+command <code>\hloff[url]</code> (see <a href="#Turning-hyperlinks-on_002foff-for-a-group">Turning hyperlinks on/off for a group</a>).
+</p>
+<span id="index-boxed-links_002c-avoiding"></span>
+<span id="index-avoiding-boxed-links"></span>
+<span id="index-color_002c-hyperlinks"></span>
+<span id="index-colored-links"></span>
+<span id="index-hyperlink-color"></span>
+<p>By default, <acronym>URL</acronym> (and other types of) links are boxed, so
+that they are visually marked even if you do not load the LaTeX
+<span id="index-color_002esty-1"></span>
+&lsquo;color&rsquo; package (see <a href="#Loading-LaTeX-packages">Loading LaTeX packages</a>) and therefore link text
+is not colored. You can see the effect by compiling the following code
+snippet (be sure to get a modern <samp>url.sty</samp>, older versions do not
+work in plain&nbsp;TeX; see <a href="#Packages-known-to-work">Packages known to work</a>):
+</p>
+<div class="example">
+<pre class="example">\input eplain
+\beginpackages
+ \usepackage{url}
+\endpackages
+
+\enablehyperlinks
+
+\url{http://foo/bar}
+
+\url{mailto:foobar@example.org}
+
+\bye
+</pre></div>
+
+<p>If the hyperlink driver you use supports the link option <code>bwidth</code>
+(see <a href="#Hyperlink-drivers">Hyperlink drivers</a>), you can produce colored links with no
+border around them. Try this:
+</p>
+<div class="example">
+<pre class="example">\input eplain
+\beginpackages
+ \usepackage{url}
+ \usepackage{color}
+\endpackages
+
+\enablehyperlinks
+\hlopts{bwidth=0}
+
+\url{http://foo/bar}
+
+\url{mailto:foobar@example.org}
+
+\bye
+</pre></div>
+
+<p>The command <code>\hlopts{bwidth=0}</code> sets border width to
+zero as the default for all links, and loading the <samp>color</samp> package
+automatically colors links using the default color (see <a href="#Options-supported-by-all-drivers">Options supported by all drivers</a>). If you want the border width setting to
+apply to <acronym>URL</acronym> links only, say <code>\hlopts[url]{bwidth=0}</code>
+(see <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>).
+</p>
+
+<hr>
+<span id="Citation-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#List-hyperlinks" accesskey="n" rel="next">List hyperlinks</a>, Previous: <a href="#URL-hyperlinks" accesskey="p" rel="prev">URL hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Citation-hyperlinks_003a-cite_002c-bib"></span><h4 class="subsection">5.3.3 Citation hyperlinks: cite, bib</h4>
+
+<span id="index-citations_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-citations"></span>
+<span id="index-group-_0060cite_0027"></span>
+<span id="index-linkgroup-_0060cite_0027"></span>
+<span id="index-cite-_0028hyperlinks_0029"></span>
+<p>The &lsquo;cite&rsquo; linkgroup includes only the <code>\cite</code> command
+(see <a href="#Citations">Citations</a>). <code>\cite</code> turns each of the references in the
+list into a link pointing to the respective bibliography entry
+produced by the <code>\bibliography</code> command.
+</p>
+<span id="index-bibliography_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-bibliography"></span>
+<span id="index-group-_0060bib_0027"></span>
+<span id="index-destgroup-_0060bib_0027"></span>
+<span id="index-bibliography-_0028hyperlinks_0029"></span>
+<p>The &lsquo;bib&rsquo; destgroup includes the macros related to the
+<code>\bibliography</code> command (see <a href="#Citations">Citations</a>). <code>\bibliography</code>
+inputs a <samp>.bbl</samp> file, which contains a list of bibliography
+entries. For each of the entries, a destination is defined.
+</p>
+<p>Both commands use the citation label as the hyperlink label.
+</p>
+
+<hr>
+<span id="List-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Cross_002dreference-hyperlinks" accesskey="n" rel="next">Cross-reference hyperlinks</a>, Previous: <a href="#Citation-hyperlinks" accesskey="p" rel="prev">Citation hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="List-hyperlinks_003a-li"></span><h4 class="subsection">5.3.4 List hyperlinks: li</h4>
+
+<span id="index-lists_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-lists"></span>
+<span id="index-li-_0028hyperlinks_0029"></span>
+<span id="index-group-_0060li_0027"></span>
+<span id="index-destgroup-_0060li_0027"></span>
+<p>The &lsquo;li&rsquo; destgroup consists of the <code>\li</code> command (see <a href="#Lists">Lists</a>),
+which defines a destination if you supply the optional argument
+(cross-reference label). This label is also used as the hyperlink
+label.
+</p>
+
+<hr>
+<span id="Cross_002dreference-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Page-reference-hyperlinks" accesskey="n" rel="next">Page reference hyperlinks</a>, Previous: <a href="#List-hyperlinks" accesskey="p" rel="prev">List hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Cross_002dreference-hyperlinks_003a-definexref_002c-ref"></span><h4 class="subsection">5.3.5 Cross-reference hyperlinks: definexref, ref</h4>
+
+<span id="index-definexref-_0028hyperlinks_0029"></span>
+<span id="index-cross_002dreferences_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-cross_002dreferences"></span>
+<span id="index-group-_0060definexref_0027"></span>
+<span id="index-destgroup-_0060definexref_0027"></span>
+<p>The &lsquo;definexref&rsquo; destgroup is for the <code>\definexref</code> command
+(see <a href="#Defining-generic-references">Defining generic references</a>). <code>\definexref</code> defines a
+destination using the cross-reference label (the first argument) as the
+hyperlink label.
+</p>
+<span id="index-group-_0060ref_0027"></span>
+<span id="index-linkgroup-_0060ref_0027"></span>
+<p>The &lsquo;ref&rsquo; linkgroup includes <code>\refn</code> and <code>\xrefn</code> (they are
+synonyms), <code>\ref</code>, and <code>\refs</code> (see <a href="#Using-generic-references">Using generic references</a>).
+</p>
+<span id="index-refn-_0028hyperlinks_0029"></span>
+<span id="index-xrefn-_0028hyperlinks_0029"></span>
+<p><code>\refn</code> turns the cross-reference it produces into a link, using
+the cross-reference label as the hyperlink label. If an optional
+argument is present, it is tied by
+<span id="index-reftie"></span>
+<code>\reftie</code> to the reference and become part of the link.
+</p>
+<span id="index-ref-_0028hyperlinks_0029"></span>
+<p><code>\ref</code> works similarly to <code>\refn</code>. It takes an optional
+argument, which is treated the same way as the optional argument to
+<code>\refn</code>. In addition, <code>\ref</code> can produce a &ldquo;class word&rdquo;.
+Both the optional argument and the class word become part of the link,
+when present. The cross-reference is tied by
+<span id="index-reftie-1"></span>
+<code>\reftie</code> to the preceding word. The optional argument is
+separated from the class word by
+<span id="index-refspace"></span>
+<code>\refspace</code>.
+</p>
+<span id="index-refs-_0028hyperlinks_0029"></span>
+<p>Unlike <code>\ref</code>, <code>\refs</code> does not take an optional argument and
+does not make the class word part of the link, which is appropriate for
+its intended use.
+</p>
+
+<hr>
+<span id="Page-reference-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Equation-reference-hyperlinks" accesskey="n" rel="next">Equation reference hyperlinks</a>, Previous: <a href="#Cross_002dreference-hyperlinks" accesskey="p" rel="prev">Cross-reference hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Page-reference-hyperlinks_003a-xrdef_002c-xref"></span><h4 class="subsection">5.3.6 Page reference hyperlinks: xrdef, xref</h4>
+
+<span id="index-xrdef-_0028hyperlinks_0029"></span>
+<span id="index-page-reference-hyperlink"></span>
+<span id="index-hyperlinks_002c-page-references"></span>
+<span id="index-group-_0060xrdef_0027"></span>
+<span id="index-destgroup-_0060xrdef_0027"></span>
+<p>The &lsquo;xrdef&rsquo; destgroup is for <code>\xrdef</code> (see <a href="#Page-references">Page references</a>).
+<code>\xrdef</code> defines a destination using cross-reference label as the
+hyperlink label.
+</p>
+<span id="index-xref-_0028hyperlinks_0029"></span>
+<span id="index-refspace-1"></span>
+<span id="index-xrefpageword-1"></span>
+<span id="index-group-_0060xref_0027"></span>
+<span id="index-linkgroup-_0060xref_0027"></span>
+<p>The &lsquo;xref&rsquo; linkgroup includes the <code>\xref</code> command (see <a href="#Page-references">Page references</a>). <code>\xref</code> turns its optional argument (followed by
+<code>\refspace</code>), <code>\xrefpageword</code> and the cross-reference (page
+number) into a link, using the cross-reference label as the hyperlink
+label.
+</p>
+
+<hr>
+<span id="Equation-reference-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Index-hyperlinks" accesskey="n" rel="next">Index hyperlinks</a>, Previous: <a href="#Page-reference-hyperlinks" accesskey="p" rel="prev">Page reference hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Equation-reference-hyperlinks_003a-eq"></span><h4 class="subsection">5.3.7 Equation reference hyperlinks: eq</h4>
+
+<span id="index-eqdef-_0028hyperlinks_0029"></span>
+<span id="index-eqdefn-_0028hyperlinks_0029"></span>
+<span id="index-eqsubdef-_0028hyperlinks_0029"></span>
+<span id="index-eqsubdefn-_0028hyperlinks_0029"></span>
+<span id="index-equations_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-equations"></span>
+<span id="index-group-_0060eq_0027"></span>
+<span id="index-destgroup-_0060eq_0027"></span>
+<p>All commands that define equation labels are part of the &lsquo;eq&rsquo; destgroup.
+These are <code>\eqdef</code>, <code>\eqdefn</code>, <code>\eqsubdef</code> and
+<code>\eqsubdefn</code> (see <a href="#Equation-references">Equation references</a>). All these commands use
+the equation label as the hyperlink label. However, if the equation
+label is empty, they make up a (hopefully) unique hyperlink label for
+the destination. This label will be used for the link when you refer to
+this empty-labeled equation with one of the equation reference macros.
+</p>
+<span id="index-phantomeqlabel"></span>
+<span id="index-phantomeqnumber"></span>
+<p>The command <code>\phantomeqlabel</code> is called to generate hyperlink
+labels for the empty-labeled equations. By default, it produces the
+labels in the format &lsquo;<samp>PHEQ<var>number</var></samp>&rsquo;, where <var>number</var> comes
+from the count register <code>\phantomeqnumber</code>; this count register is
+incremented at every empty-labeled equation definition.
+</p>
+<span id="index-eqref-1"></span>
+<span id="index-eqrefn-1"></span>
+<span id="index-reftie-2"></span>
+<span id="index-group-_0060eq_0027-1"></span>
+<span id="index-linkgroup-_0060eq_0027"></span>
+<p>The commands <code>\eqref</code> and <code>\eqrefn</code> (see <a href="#Equation-references">Equation references</a>) form the &lsquo;eq&rsquo; linkgroup. These commands take an optional
+argument, which, when present, is tied with <code>\reftie</code> to the
+equation reference and becomes part of the link. The equation label is
+used for the hyperlink label; if the label is empty, the link is for the
+label generated for the last empty-labeled equation.
+</p>
+
+<hr>
+<span id="Index-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Footnote-hyperlinks" accesskey="n" rel="next">Footnote hyperlinks</a>, Previous: <a href="#Equation-reference-hyperlinks" accesskey="p" rel="prev">Equation reference hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Index-hyperlinks_003a-idx"></span><h4 class="subsection">5.3.8 Index hyperlinks: idx</h4>
+
+<span id="index-idx-_0028hyperlinks_0029"></span>
+<span id="index-idxname-_0028hyperlinks_0029"></span>
+<span id="index-idxmarked-_0028hyperlinks_0029"></span>
+<span id="index-idxsubmarked-_0028hyperlinks_0029"></span>
+<span id="index-index-hyperlink"></span>
+<span id="index-hyperlinks_002c-index"></span>
+<span id="index-group-_0060idx_0027"></span>
+<span id="index-linkgroup-_0060idx_0027"></span>
+<span id="index-destgroup-_0060idx_0027"></span>
+<p>All indexing commands (<code>\idx</code>, <code>\idxname</code>, <code>\idxmarked</code>,
+<code>\idxsubmarked</code> and their silent equivalents, see <a href="#Indexing-commands">Indexing commands</a>) form the &lsquo;idx&rsquo; destgroup. The &lsquo;idx&rsquo; linkgroup consists of
+the macros which are used to typeset the index when you say
+<span id="index-readindexfile-_0028hyperlinks_0029"></span>
+<code>\readindexfile{<var>index-letter</var>}</code> (see <a href="#Typesetting-an-index">Typesetting an index</a>).
+</p>
+<span id="index-makeindex-2"></span>
+<p>To create the links in index entries, Eplain uses MakeIndex&rsquo;s
+&ldquo;encapsulation&rdquo; feature. When you use an indexing macro to mark an
+index term, Eplain writes out a line to the
+<span id="index-_002eidx-files-1"></span>
+<samp>.idx</samp> file of the following general form:
+</p>
+<div class="example">
+<pre class="example">\indexentry{<var>entry</var>|<var>pagemarkup</var>}{<var>pageno</var>}
+</pre></div>
+
+<p>where <var>entry</var> is the index entry (converted into the
+internal format that MakeIndex understands), <var>cs</var> is the markup
+command you specified with the <code>pagemarkup=<var>cs</var></code> optional
+argument to the indexing commands (see <a href="#Modifying-index-entries">Modifying index entries</a>),
+and <var>pageno</var> is the page number on which the term appeared. When
+processing the <samp>.idx</samp> file, MakeIndex makes the page number an
+argument to the page markup command (&ldquo;encapsulates&rdquo; the page
+number), so the page number in the
+<span id="index-_002eind-files-1"></span>
+<samp>.ind</samp> file appears as <code>\<var>cs</var>{<var>pageno</var>}</code>. Eplain
+internally replaces the <var>cs</var> command name with its own command,
+which, in addition to calling the original <code>\<var>cs</var></code>
+encapsulator, turns the page number into a link.
+</p>
+<p>Eplain provides two approaches to linking page numbers in the index to
+locations of index terms in the text.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Exact-destinations-for-index-terms" accesskey="1">Exact destinations for index terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-destinations-for-index-terms" accesskey="2">Page destinations for index terms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Choosing-destination-placement" accesskey="3">Choosing destination placement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index-page-list-and-page-range-parsers" accesskey="4">Index page list and page range parsers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlinks-in-see-and-see-also-entries" accesskey="5">Hyperlinks in see and see also entries</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Exact-destinations-for-index-terms"></span><div class="header">
+<p>
+Next: <a href="#Page-destinations-for-index-terms" accesskey="n" rel="next">Page destinations for index terms</a>, Up: <a href="#Index-hyperlinks" accesskey="u" rel="up">Index hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Exact-destinations-for-index-terms-1"></span><h4 class="subsubsection">5.3.8.1 Exact destinations for index terms</h4>
+
+<p>In this approach, each command that marks an index term defines a unique
+destination and passes its label on to the <samp>.idx</samp> file as part of
+the <code>\indexentry</code> command. The <code>\indexentry</code> line that Eplain
+writes to the <samp>.idx</samp> file becomes
+</p>
+<div class="example">
+<pre class="example">\indexentry{<var>entry</var>|hlidx{<var>label</var>}{<var>cs</var>}}{<var>pageno}</var>
+</pre></div>
+
+<span id="index-hlidx"></span>
+<p>where <code>\hlidx</code> is the command that is defined by Eplain
+to take three arguments: a hyperlink label (<var>label</var>), a name of
+page number encapsulator (<var>cs</var>) and a page number (<var>pageno</var>).
+In the <samp>.ind</samp> file that MakeIndex will generate, the page number
+will now appear as
+</p>
+<div class="example">
+<pre class="example">\hlidx{<var>label</var>}{<var>cs</var>}{<var>pageno</var>}
+</pre></div>
+
+<p>The result of this command is
+<code>\<var>cs</var>{<var>pageno</var>}</code>, wrapped up into a link pointing to
+<var>label</var> destination.
+</p>
+<p>The hyperlink labels for the index terms are generated by the
+<span id="index-hlidxlabel"></span>
+<code>\hlidxlabel</code> command, by default in the format
+&lsquo;<samp>IDX<var>number</var></samp>&rsquo;, where <var>number</var> is the value of the count
+register
+<span id="index-hlidxlabelnumber"></span>
+<code>\hlidxlabelnumber</code>. This count register is incremented at each
+index term.
+</p>
+<span id="index-exact-index-hyperlinks"></span>
+<span id="index-index_002c-exact-hyperlinks"></span>
+<span id="index-hyperlinks_002c-index_002c-exact"></span>
+<p>The advantage of this approach, as compared to the second approach
+described below, is that links in the index point to exact locations of
+the indexed terms on the page. The disadvantage of this approach is
+that MakeIndex will regard <em>all</em> index entries as distinct, because
+each one contains a (unique) hyperlink label. This disadvantage can be
+partially overcome by the script
+<span id="index-idxuniq"></span>
+<span id="index-filtering-index-entries-with-hyperlinks"></span>
+<span id="index-hyperlinks_002c-filtering-index-entries"></span>
+<samp>idxuniq</samp> distributed with Eplain in the <samp>util</samp> directory.
+This script filters out <code>\indexentry</code> lines differing only in the
+hyperlink label but identical otherwise. You should process the
+<samp>.idx</samp> with this script before passing it on to MakeIndex. For
+example:
+</p>
+<div class="example">
+<pre class="example">prompt$ ./idxuniq file.idx | makeindex &gt; file.ind
+</pre></div>
+
+<p>Still, this solution is not ideal, as the page-range formation
+ability of MakeIndex will not work, and there will be problems of
+apparently identical index entries clashing (e.g., when a range-end
+entry appears on the same page as another entry with the same
+definition; <samp>idxuniq</samp> will not filter out the second entry).
+</p>
+
+<hr>
+<span id="Page-destinations-for-index-terms"></span><div class="header">
+<p>
+Next: <a href="#Choosing-destination-placement" accesskey="n" rel="next">Choosing destination placement</a>, Previous: <a href="#Exact-destinations-for-index-terms" accesskey="p" rel="prev">Exact destinations for index terms</a>, Up: <a href="#Index-hyperlinks" accesskey="u" rel="up">Index hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Page-destinations-for-index-terms-1"></span><h4 class="subsubsection">5.3.8.2 Page destinations for index terms</h4>
+
+<p>In the second approach, Eplain does not write out any destination labels
+for the index terms. Instead, Eplain writes out a wrapper for page
+number encapsulator which can parse the page number and generate a link
+pointing to the <em>page</em> on which the term appeared. On top of each
+page containing an index term, Eplain defines a destination with label
+produced by
+<span id="index-hlidxpagelabel"></span>
+<code>\hlidxpagelabel</code>. The <code>\hlidxpagelabel</code> command takes a
+single argument (page number <var>number</var>) and by default produces the
+label in the format &lsquo;<samp>IDXPG<var>number</var></samp>&rsquo;.
+</p>
+<p>With this approach, the <code>\indexentry</code> line which Eplain writes to
+the <code>.idx</code> file looks like this:
+</p>
+<div class="example">
+<pre class="example">\indexentry{<var>entry</var>|hlidxpage{<var>cs</var>}}{<var>pageno}</var>
+</pre></div>
+
+<span id="index-hlidxpage"></span>
+<p>where <code>\hlidxpage</code> is the command that is defined by Eplain
+to take two arguments: a name of page number encapsulator (<var>cs</var>)
+and a page number (<var>pageno</var>). In the <samp>.ind</samp> file that
+MakeIndex will generate, the page number will appear as
+</p>
+<div class="example">
+<pre class="example">\hlidxpage{<var>cs</var>}{<var>pageno</var>}
+</pre></div>
+
+<p>The advantage of this approach is that all features of MakeIndex are
+intact. The drawback is that links in the index do not point to exact
+locations of indexed terms on a page, but to the top of a page on
+which the term appears.
+</p>
+<span id="index-index_002c-parsing-page-numbers"></span>
+<span id="index-page-range_002c-parsing"></span>
+<span id="index-page-list_002c-parsing"></span>
+<span id="index-parsing-page-numbers"></span>
+<p>Another disadvantage is that this approach depends on the page range and
+page list separators which MakeIndex was configured to output.
+<code>\hlidxpage</code> must be able to parse the first page number in a page
+range like &lsquo;<samp>1--4</samp>&rsquo;. In addition, page list parsing is needed
+because MakeIndex combines two consecutive page numbers in one call to
+the page number encapsulator, so <code>\hlidxpage</code> can be passed, e.g.,
+&lsquo;<samp>1, 2</samp>&rsquo; for the <var>pageno</var>. In this last case, <code>\hlidxpage</code>
+splits the two page numbers, applies <code>\<var>cs</var></code> to each of them,
+and makes each of the page numbers a link to the appropriate page. Note
+that this will alter typesetting slightly, because now the page list
+separator (a comma followed by a space, by default) is not typeset using
+the page number encapsulator (<code>\<var>cs</var></code>).
+</p>
+<p>Eplain&rsquo;s defaults for the page list and page number delimiters are the
+same as those in MakeIndex, a comma followed by a space (&lsquo;<samp>, </samp>&rsquo;) and
+two dashes (&lsquo;<samp>--</samp>&rsquo;), respectively. If you customize MakeIndex to use
+different delimiters, you must not forget to let Eplain know about them
+with the commands
+</p>
+<div class="example">
+<pre class="example">\setidxpagelistdelimiter{<var>list-delim</var>}
+\setidxpagerangedelimiter{<var>page-delim</var>}
+</pre></div>
+
+<p>(see <a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a>).
+</p>
+
+<hr>
+<span id="Choosing-destination-placement"></span><div class="header">
+<p>
+Next: <a href="#Index-page-list-and-page-range-parsers" accesskey="n" rel="next">Index page list and page range parsers</a>, Previous: <a href="#Page-destinations-for-index-terms" accesskey="p" rel="prev">Page destinations for index terms</a>, Up: <a href="#Index-hyperlinks" accesskey="u" rel="up">Index hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Choosing-destination-placement-1"></span><h4 class="subsubsection">5.3.8.3 Choosing destination placement</h4>
+
+<span id="index-index_002c-placement-of-destinations"></span>
+<span id="index-index_002c-destination-placement"></span>
+<span id="index-index_002c-selecting-destination-placement"></span>
+<span id="index-index_002c-choosing-destination-placement"></span>
+<span id="index-hyperlinks_002c-index-destination-placement"></span>
+<p>The approach that Eplain should use for the index terms can be
+selected in the
+<span id="index-enablehyperlinks-1"></span>
+<code>\enablehyperlinks</code> command. The optional argument it accepts is
+a comma-separated list of options. The
+<span id="index-idxexact"></span>
+<code>idxexact</code> option selects the first approach,
+<span id="index-idxpage"></span>
+<code>idxpage</code> the second, and
+<span id="index-idxnone"></span>
+<code>idxnone</code> disables hyperlink support for the index terms
+altogether, in case you want to stop Eplain from writing its link
+wrappers into the <samp>.idx</samp> file. The default is <code>idxpage</code>.
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\enablehyperlinks[idxexact]
+</pre></div>
+
+<p>selects the first approach (&ldquo;exact index links&rdquo;).
+</p>
+
+<hr>
+<span id="Index-page-list-and-page-range-parsers"></span><div class="header">
+<p>
+Next: <a href="#Hyperlinks-in-see-and-see-also-entries" accesskey="n" rel="next">Hyperlinks in see and see also entries</a>, Previous: <a href="#Choosing-destination-placement" accesskey="p" rel="prev">Choosing destination placement</a>, Up: <a href="#Index-hyperlinks" accesskey="u" rel="up">Index hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Index-page-list-and-page-range-parsers-1"></span><h4 class="subsubsection">5.3.8.4 Index page list and page range parsers</h4>
+
+<p>The macros that Eplain uses to parse page lists and page ranges,
+<code>\idxparselist</code> and <code>\idxparserange</code>, can sometimes be useful
+when defining page number encapsulators. See <a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a>, for the description of these commands and an example of their
+usage.
+</p>
+
+<hr>
+<span id="Hyperlinks-in-see-and-see-also-entries"></span><div class="header">
+<p>
+Previous: <a href="#Index-page-list-and-page-range-parsers" accesskey="p" rel="prev">Index page list and page range parsers</a>, Up: <a href="#Index-hyperlinks" accesskey="u" rel="up">Index hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlinks-in-see-and-see-also-entries-1"></span><h4 class="subsubsection">5.3.8.5 Hyperlinks in see and see also entries</h4>
+
+<span id="index-hyperlinks_002c-see-and-see-also-index-entries"></span>
+<span id="index-index_002c-hyperlinks-in-see-and-see-also-entries"></span>
+<span id="index-see-also-index-entries-and-hyperlinks"></span>
+<span id="index-see_002c-and-index-entries_002c-hyperlinks"></span>
+<p>There is no automatic support for hyperlinks with &ldquo;see&rdquo; and &ldquo;see
+also&rdquo; index entries, as there is not enough information to trace the
+parameters of
+<span id="index-indexsee-1"></span>
+<code>\indexsee</code> and
+<span id="index-indexseealso-1"></span>
+<code>\indexseealso</code> to corresponding index entries. But if desired,
+this can be implemented with <code>\hldest</code> and <code>\hlstart</code>
+(see <a href="#Explicit-hyperlinks">Explicit hyperlinks</a>); for example:
+</p>
+<div class="example">
+<pre class="example">\sidx{semantic theory of truth@%
+ \leavevmode\hldest{}{}{idx:theo truth}semantic theory of truth}
+&hellip;
+\sidx[seealso]{truth}[definition of]%
+ {\hlstart{}{}{idx:theo truth}semantic theory of truth\hlend}
+</pre></div>
+
+
+<hr>
+<span id="Footnote-hyperlinks"></span><div class="header">
+<p>
+Next: <a href="#Contents-hyperlinks" accesskey="n" rel="next">Contents hyperlinks</a>, Previous: <a href="#Index-hyperlinks" accesskey="p" rel="prev">Index hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Footnote-hyperlinks_003a-foot_002c-footback"></span><h4 class="subsection">5.3.9 Footnote hyperlinks: foot, footback</h4>
+
+<span id="index-footnotes_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-footnotes"></span>
+<span id="index-group-_0060foot_0027"></span>
+<span id="index-group-_0060footback_0027"></span>
+<span id="index-linkgroup-_0060foot_0027"></span>
+<span id="index-linkgroup-_0060footback_0027"></span>
+<span id="index-destgroup-_0060foot_0027"></span>
+<span id="index-destgroup-_0060footback_0027"></span>
+<p>The &lsquo;foot&rsquo; link and destination groups include the
+<span id="index-numberedfootnote-_0028hyperlinks_0029"></span>
+<code>\numberedfootnote</code> and
+<span id="index-footnote-_0028hyperlinks_0029"></span>
+<code>\footnote</code> macros (see <a href="#Footnotes">Footnotes</a>). The &lsquo;footback&rsquo; groups
+include the same macros, but control parameters for links and
+destinations created inside the footnote to point back to the footnote
+mark within the text body.
+</p>
+<p>The macros use hyperlink labels generated by
+<span id="index-hlfootlabel"></span>
+<code>\hlfootlabel</code> and
+<span id="index-hlfootbacklabel"></span>
+<code>\hlfootbacklabel</code>. The default formats for the labels are
+&lsquo;<samp>FOOT<var>number</var></samp>&rsquo; and &lsquo;<samp>FOOTB<var>number</var></samp>&rsquo;, respectively,
+where <var>number</var> is the value of the count register
+<span id="index-hlfootlabelnumber"></span>
+<code>\hlfootlabelnumber</code>. This register is incremented at every
+footnote.
+</p>
+<p>Generally, footnote hyperlinks are not of much use, because the
+footnotes are usually placed on the same page as the footnote mark.
+Therefore, footnote hyperlinks are disabled by default. Here is how you
+can turn them on selectively, without affecting the other kinds of
+hyperlinks (see <a href="#Turning-hyperlinks-on_002foff-for-a-group">Turning hyperlinks on/off for a group</a>):
+</p>
+<div class="example">
+<pre class="example">\hldeston[foot,footback]
+\hlon[foot,footback]
+</pre></div>
+
+
+<hr>
+<span id="Contents-hyperlinks"></span><div class="header">
+<p>
+Previous: <a href="#Footnote-hyperlinks" accesskey="p" rel="prev">Footnote hyperlinks</a>, Up: <a href="#Implicit-hyperlinks" accesskey="u" rel="up">Implicit hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Contents-hyperlinks-1"></span><h4 class="subsection">5.3.10 Contents hyperlinks</h4>
+
+<span id="index-table-of-contents_002c-hyperlinks"></span>
+<span id="index-contents_002c-hyperlinks"></span>
+<span id="index-hyperlinks_002c-table-of-contents"></span>
+<p>There is currently no special support for hyperlinks in the table of
+contents (see <a href="#Contents">Contents</a>), but implementing them with the
+<code>\hldest</code> and <code>\hlstart &hellip; \hlend</code> commands
+(see <a href="#Explicit-hyperlinks">Explicit hyperlinks</a>) should be possible.
+</p>
+
+<hr>
+<span id="Hyperlink-drivers"></span><div class="header">
+<p>
+Next: <a href="#Setting-hyperlink-types-and-options" accesskey="n" rel="next">Setting hyperlink types and options</a>, Previous: <a href="#Implicit-hyperlinks" accesskey="p" rel="prev">Implicit hyperlinks</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlink-drivers-1"></span><h3 class="section">5.4 Hyperlink drivers</h3>
+
+<p>This section describes the hyperlink drivers: the types of hyperlinks
+they support, and the options they accept. During the first reading,
+you may only want to skim through this section.
+</p>
+<p>Some of the descriptions below come from <cite>Portable Document Format
+Reference Manual Version&nbsp;1.3</cite>, March&nbsp;11, 1999.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Options-supported-by-all-drivers" accesskey="1">Options supported by all drivers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-driver-hypertex" accesskey="2">Hyperlink driver hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="3">Hyperlink drivers pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlink-driver-nolinks" accesskey="4">Hyperlink driver nolinks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Options-supported-by-all-drivers"></span><div class="header">
+<p>
+Next: <a href="#Hyperlink-driver-hypertex" accesskey="n" rel="next">Hyperlink driver hypertex</a>, Up: <a href="#Hyperlink-drivers" accesskey="u" rel="up">Hyperlink drivers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Options-supported-by-all-drivers-1"></span><h4 class="subsection">5.4.1 Options supported by all drivers</h4>
+
+<span id="index-hyperlink-options_002c-common"></span>
+<p>This subsection describes the destination and link options which are
+supported by all hyperlink drivers.
+</p>
+
+<span id="Destination-options-supported-by-all-drivers"></span><h4 class="subsubheading">Destination options supported by all drivers</h4>
+
+<span id="index-destination-options_002c-common"></span>
+<span id="index-options_002c-destination_002c-common"></span>
+<dl compact="compact">
+<dt><code>raise</code></dt>
+<dd><span id="index-raise-_0028hyperlink-option_0029"></span>
+<span id="index-raising-hyperlink-destinations"></span>
+<span id="index-hyperlink-destination_002c-raising"></span>
+<span id="index-destinations_002c-raising"></span>
+<p>Specifies how much to raise destinations above the baseline. When set
+to zero or empty, destinations are placed at the baseline.
+</p>
+<p>It is usually convenient to set this option to some variable parameter,
+so that the height to which destinations are raised is automatically
+adjusted according to the current context. For example, setting it to
+<span id="index-normalbaselineskip"></span>
+<code>\normalbaselineskip</code> (or some fraction of it, like
+<code>1.7\normalbaselineskip</code>) makes the setting appropriate for
+different point sizes, in case your document uses more than one.
+</p>
+<p>The default setting is <code>\normalbaselineskip</code>. Initially, the
+destgroups do not define this option, so they fall back on the default,
+except for the &lsquo;eq&rsquo; destgroup, for which this option is set to
+<code>1.7\normalbaselineskip</code>,
+<span id="index-mathematics-displays_002c-hyperlinks"></span>
+<span id="index-displayed-math-and-hyperlinks"></span>
+<span id="index-large-operators-and-hyperlinks"></span>
+<span id="index-hyperlinks_002c-large-operators"></span>
+<span id="index-destinations_002c-large-operators"></span>
+to accommodate the usual cases of large operators in displayed math.
+</p>
+<p>Example: <code>\hldestopts[eq]{raise=2.5\normalbaselineskip}</code>
+</p></dd>
+</dl>
+
+
+<span id="Link-options-supported-by-all-drivers"></span><h4 class="subsubheading">Link options supported by all drivers</h4>
+<span id="index-link-options_002c-common"></span>
+<span id="index-options_002c-link_002c-common"></span>
+
+<dl compact="compact">
+<dt><code>colormodel</code></dt>
+<dt><code>color</code></dt>
+<dd><span id="index-colormodel-_0028hyperlink-option_0029"></span>
+<span id="index-color-_0028hyperlink-option_0029"></span>
+<span id="index-color_002c-hyperlinks-1"></span>
+<span id="index-colored-links-1"></span>
+<span id="index-hyperlink-color-1"></span>
+<p>These two options define the color to be used for rendering the link
+text. The colors are used only when a <code>\color</code> command is defined,
+e.g., by loading the LaTeX &lsquo;color&rsquo; package (see <a href="#Packages-known-to-work">Packages known to work</a>). The <code>\color</code> command is called as
+<code>\color[<var>colormodel</var>]{<var>color</var>}</code>, where <var>colormodel</var>
+and <var>color</var> are the definitions of the <code>colormodel</code> and
+<code>color</code> options, respectively. However, if <var>colormodel</var> is
+empty, the optional argument to <code>\color</code> is omitted; and if
+<var>color</var> is empty, the <code>\color</code> command is omitted altogether.
+The default setting is <code><var>colormodel</var>=cmyk</code> and
+<code><var>color</var>=0.28,1,1,0.35</code>.
+</p>
+<p>When specifying colors with several components delimited by commas
+(e.g., RGB and CMYK colors in the LaTeX &lsquo;color&rsquo; package), it is not
+possible to specify the components directly in the option list of
+<code>\hlopts</code>, because comma is the option list delimiter. With the
+&lsquo;color&rsquo; package, it is possible to specify such colors by defining a
+custom color with <code>\definecolor</code> and using the new color name with
+an empty <var>colormodel</var> (see examples below).
+</p>
+<p>Examples:
+</p>
+<div class="example">
+<pre class="example">\hlopts{colormodel=,color=blue}% predefined color
+\definecolor{mycolor}{rgb}{.3,.8,.95}
+\hlopts{colormodel=,color=mycolor}% custom color
+\hlopts{colormodel=gray,color=.4}
+</pre></div>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Hyperlink-driver-hypertex"></span><div class="header">
+<p>
+Next: <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="n" rel="next">Hyperlink drivers pdftex and dvipdfm</a>, Previous: <a href="#Options-supported-by-all-drivers" accesskey="p" rel="prev">Options supported by all drivers</a>, Up: <a href="#Hyperlink-drivers" accesskey="u" rel="up">Hyperlink drivers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlink-driver-hypertex-1"></span><h4 class="subsection">5.4.2 Hyperlink driver <code>hypertex</code></h4>
+
+<span id="index-hypertex-_0028hyperlink-driver_0029"></span>
+<span id="index-hypertex_002c-hyperlink-driver"></span>
+<span id="index-driver-hypertex"></span>
+<span id="index-hyperlink-driver-hypertex"></span>
+<p>HyperTeX is a standard for inclusion of hyperlink information in
+TeX (and LaTeX) documents (see <a href="http://arxiv.org/hypertex">http://arxiv.org/hypertex</a>).
+This standard defines a set of hyperlink tags implemented as
+<code>\special</code> commands written into the <acronym>DVI</acronym> file. The
+major advantage of such standard is that a single <samp>.dvi</samp> file
+containing HyperTeX commands can be viewed by any
+HyperTeX-enabled viewer (e.g., any more or less modern version of
+<span id="index-xdvi"></span>
+<code>xdvi</code>) or converted to other file formats (e.g., <acronym>PDF</acronym>)
+by any HyperTeX-enabled <acronym>DVI</acronym> converter (e.g.,
+<span id="index-dvipdfm-1"></span>
+<code>dvipdfmx</code> or
+<span id="index-dvips"></span>
+<code>dvips</code> with
+<span id="index-Ghostscript"></span>
+Ghostscript&rsquo;s
+<span id="index-ps2pdf"></span>
+<code>ps2pdf</code> script).
+</p>
+<p>The downside to the standard is that it is by design &ldquo;the common
+factor&rdquo; of other formats supporting hyperlinks, so many features of a
+particular file format cannot be supported by HyperTeX. Therefore,
+if you need to use special features of a particular format, HyperTeX
+is not a good choice. For the <acronym>PDF</acronym> file format, Eplain
+provides the <code>pdftex</code> and <code>dvipdfm</code> drivers which provide
+fine control over the <acronym>PDF</acronym> options (see <a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a>).
+</p>
+<p>For more information on programs which support the HyperTeX standard,
+please see
+</p>
+<div class="display">
+<pre class="display"><a href="http://arxiv.org/hypertex">http://arxiv.org/hypertex</a>
+<a href="http://mirror.ctan.org/tex-archive/support/hypertex/hypertex">http://mirror.ctan.org/tex-archive/support/hypertex/hypertex</a>
+</pre></div>
+
+<p>For convenience, we list a few HyperTeX-enabled converters:
+</p>
+<dl compact="compact">
+<dd><span id="index-dvips-1"></span>
+</dd>
+<dt><code>dvips</code></dt>
+<dd><p>Note that you need to pass the <samp>-z</samp> option to <code>dvips</code> to
+tell it to preserve the information about the hyperlinks. To generate a
+<samp>.pdf</samp> file with hyperlinks, you can use the
+<span id="index-ps2pdf-1"></span>
+<samp>ps2pdf</samp> script of
+<span id="index-Ghostscript-1"></span>
+Ghostscript. For example, if <samp>foo.tex</samp> is a TeX file using
+HyperTeX commands, then
+</p>
+<div class="example">
+<pre class="example">prompt$ tex foo.tex
+prompt$ dvips -z foo.dvi -o
+prompt$ ps2pdf foo.ps
+</pre></div>
+
+<p>will produce <samp>foo.pdf</samp> with hyperlinks.
+</p>
+</dd>
+<dt><code>dvipdfm</code></dt>
+<dt><code>dvipdfmx</code></dt>
+<dd><span id="index-dvipdfm-2"></span>
+<p>No special command line arguments are required, these programs
+automatically detect the HyperTeX commands.
+</p>
+</dd>
+</dl>
+
+<p>One more note is in place: support for the HyperTeX commands varies
+from one previewer/converter to another, so you might need to experiment
+to see if what you need is supported by the program(s) you intend to
+use. For example, dvips(k) as of version&nbsp;5.92b converts all
+internal hyperlinks into page links pointing to a page containing the
+destination, so that &ldquo;exact&rdquo; linking to destinations is not possible
+(this was confirmed to be a bug and most probably has already been fixed
+in later versions of dvips(k)); dvipdfm as of version&nbsp;0.13.2c and
+dvipdfmx as of version&nbsp;20040411 do not correctly parse links to
+external local files, and produce a <acronym>URL</acronym> link instead of a
+file link.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Destination-types-for-hypertex" accesskey="1">Destination types for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Destination-options-for-hypertex" accesskey="2">Destination options for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-types-for-hypertex" accesskey="3">Link types for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-options-for-hypertex" accesskey="4">Link options for hypertex</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Destination-types-for-hypertex"></span><div class="header">
+<p>
+Next: <a href="#Destination-options-for-hypertex" accesskey="n" rel="next">Destination options for hypertex</a>, Up: <a href="#Hyperlink-driver-hypertex" accesskey="u" rel="up">Hyperlink driver hypertex</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Destination-types-for-hypertex-1"></span><h4 class="subsubsection">5.4.2.1 Destination types for <code>hypertex</code></h4>
+
+<span id="index-destination-types_002c-hypertex"></span>
+<span id="index-types_002c-destination_002c-hypertex"></span>
+<span id="index-hypertex_002c-destination-types"></span>
+<dl compact="compact">
+<dt><code>xyz</code></dt>
+<dd><span id="index-xyz-_0028destination-type_0029"></span>
+<p>&ldquo;Current position&rdquo;. This is the default type.
+</p>
+<p>Example: <code>\hldest{xyz}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>raw</code></dt>
+<dd><span id="index-raw-_0028destination-type_0029"></span>
+<p>The destination specification (in the form of a HyperTeX
+<code>\special</code>) is taken from the command sequence <code>\<var>cs</var></code>,
+where <var>cs</var> is the value of the
+<span id="index-cmd-_0028destination-option_0029"></span>
+<code>cmd</code> option. In the definition of <code>\<var>cs</var></code>, use
+<span id="index-_0040hllabel"></span>
+<code>\@hllabel</code> to refer to the hyperlink label. This option is
+intended to be used with destgroups (see <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>), as it does not make sense in a direct call to
+<span id="index-hldest-1"></span>
+<code>\hldest</code>&mdash;you can just call the raw command.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+\def\mydest{\special{html:&lt;a name=&quot;\@hllabel&quot;&gt;}%
+ \special{html:&lt;/a&gt;}}
+\resetatcatcode
+\indent\hldest{raw}{cmd=mydest}{SpecialDest}
+ Special destination.
+</pre></div>
+
+</dd>
+</dl>
+
+
+<hr>
+<span id="Destination-options-for-hypertex"></span><div class="header">
+<p>
+Next: <a href="#Link-types-for-hypertex" accesskey="n" rel="next">Link types for hypertex</a>, Previous: <a href="#Destination-types-for-hypertex" accesskey="p" rel="prev">Destination types for hypertex</a>, Up: <a href="#Hyperlink-driver-hypertex" accesskey="u" rel="up">Hyperlink driver hypertex</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Destination-options-for-hypertex-1"></span><h4 class="subsubsection">5.4.2.2 Destination options for <code>hypertex</code></h4>
+
+<span id="index-destination-options_002c-hypertex"></span>
+<span id="index-options_002c-destination_002c-hypertex"></span>
+<span id="index-hypertex_002c-destination-options"></span>
+<dl compact="compact">
+<dt><code>cmd</code></dt>
+<dd><span id="index-cmd-_0028destination-option_0029-1"></span>
+<p>Name of the macro (without the leading &lsquo;<samp>\</samp>&rsquo;) containing a
+HyperTeX <code>\special</code> for the <code>raw</code> destination.
+</p>
+<p>See <a href="#Destination-types-for-hypertex">Destination types for hypertex</a>, the description of the <code>raw</code>
+destination, for an example.
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="Link-types-for-hypertex"></span><div class="header">
+<p>
+Next: <a href="#Link-options-for-hypertex" accesskey="n" rel="next">Link options for hypertex</a>, Previous: <a href="#Destination-options-for-hypertex" accesskey="p" rel="prev">Destination options for hypertex</a>, Up: <a href="#Hyperlink-driver-hypertex" accesskey="u" rel="up">Hyperlink driver hypertex</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Link-types-for-hypertex-1"></span><h4 class="subsubsection">5.4.2.3 Link types for <code>hypertex</code></h4>
+
+<span id="index-link-types_002c-hypertex"></span>
+<span id="index-types_002c-link_002c-hypertex"></span>
+<span id="index-hypertex_002c-link-types"></span>
+<dl compact="compact">
+<dt><code>name</code></dt>
+<dd><span id="index-name-_0028hyperlink-type_0029"></span>
+<span id="index-named-destination"></span>
+<span id="index-destinations_002c-named"></span>
+<span id="index-hyperlink-destination_002c-named"></span>
+<p>Go to a &ldquo;named destination&rdquo;. The label is the destination name. All
+destinations in HyperTeX are named destinations. This is the default
+type.
+</p>
+<p>Example: <code>\hlstart{name}{}{dest123}Link to dest123\hlend</code>
+</p>
+</dd>
+<dt><code>url</code></dt>
+<dd><span id="index-url-_0028hyperlink-type_0029"></span>
+<span id="index-URL-hyperlink-2"></span>
+<span id="index-destinations_002c-URL"></span>
+<span id="index-hyperlinks_002c-URL-2"></span>
+<p>Go to a <acronym>URL</acronym>. The label is the <acronym>URL</acronym>.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example"><code>\hlstart{url}{}{https://tug.org/eplain/}Eplain home\hlend</code>
+</pre></div>
+
+</dd>
+<dt><code>filename</code></dt>
+<dd><span id="index-filename-_0028hyperlink-type_0029"></span>
+<span id="index-file_002c-hyperlink-to"></span>
+<span id="index-destinations_002c-in-another-file"></span>
+<span id="index-hyperlinks_002c-to-another-file"></span>
+<p>Go to a named destination in another file. The label is the
+destination name. The file name is specified by the
+<span id="index-file-_0028hyperlink-option_0029"></span>
+<code>file</code> option. The file name extension can be specified separately
+by the
+<span id="index-ext-_0028hyperlink-option_0029"></span>
+<code>ext</code> option. The idea is to set the <code>ext</code> option globally at
+the beginning of the document to avoid hard-coding the extension
+together with the file name within each link&mdash;HyperTeX is not
+restricted to any single output format, it can be <acronym>DVI</acronym>,
+<acronym>PDF</acronym>, possibly other formats.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hlopts{ext=.pdf}
+\hlstart{filename}{file=book}{dest123}
+ Link to dest123 in file `book.pdf'\hlend
+</pre></div>
+
+</dd>
+<dt><code>raw</code></dt>
+<dd><span id="index-raw-_0028hyperlink-type_0029"></span>
+<p>The link specification (in the form of a HyperTeX <code>\special</code>) is
+taken from the command sequence <code>\<var>cs</var></code>, where <var>cs</var> is the
+value of the
+<span id="index-cmd-_0028hyperlink-option_0029"></span>
+<code>cmd</code> option. In the definition of <code>\<var>cs</var></code>, use
+<span id="index-_0040hllabel-1"></span>
+<code>\@hllabel</code> to refer to the hyperlink label. Use the predefined
+command
+<span id="index-hlhash"></span>
+<code>\hlhash</code> to insert the <code>#</code> characters. This option is
+intended to be used with linkgroups (see <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>), as it does not make sense in a direct call to
+<span id="index-hlstart-1"></span>
+<code>\hlstart</code>&mdash;you can just call the raw command.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+\def\mylink{\special{html:&lt;a href=&quot;\hlhash\@hllabel&quot;&gt;}}
+\resetatcatcode
+\hlstart{raw}{cmd=mylink}{SpecialDest}
+ Link to the special destination.\hlend
+</pre></div>
+
+</dd>
+</dl>
+
+
+<hr>
+<span id="Link-options-for-hypertex"></span><div class="header">
+<p>
+Previous: <a href="#Link-types-for-hypertex" accesskey="p" rel="prev">Link types for hypertex</a>, Up: <a href="#Hyperlink-driver-hypertex" accesskey="u" rel="up">Hyperlink driver hypertex</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Link-options-for-hypertex-1"></span><h4 class="subsubsection">5.4.2.4 Link options for <code>hypertex</code></h4>
+
+<span id="index-link-options_002c-hypertex"></span>
+<span id="index-options_002c-link_002c-hypertex"></span>
+<span id="index-hypertex_002c-link-options"></span>
+<dl compact="compact">
+<dt><code>cmd</code></dt>
+<dd><span id="index-cmd-_0028hyperlink-option_0029-1"></span>
+<p>Name of the macro (without the leading &lsquo;<samp>\</samp>&rsquo;) containing a
+HyperTeX <code>\special</code> for the <code>raw</code> link.
+</p>
+<p>See <a href="#Link-types-for-hypertex">Link types for hypertex</a>, the description of the <code>raw</code> link,
+for an example.
+</p>
+</dd>
+<dt><code>file</code></dt>
+<dd><span id="index-file-_0028hyperlink-option_0029-1"></span>
+<p>File name for the <code>filename</code> link type. See also the <code>ext</code>
+option.
+</p>
+<p>See <a href="#Link-types-for-hypertex">Link types for hypertex</a>, the description of the <code>filename</code>
+link, for an example.
+</p>
+</dd>
+<dt><code>ext</code></dt>
+<dd><span id="index-ext-_0028hyperlink-option_0029-1"></span>
+<p>File name extension for the <code>filename</code> link type. The idea is to
+set the <code>ext</code> option globally at the beginning of the document to
+avoid hard-coding the extension together with the file name within each
+link&mdash;HyperTeX is not restricted to any single output format, it can
+be <acronym>DVI</acronym>, <acronym>PDF</acronym>, possibly other formats.
+</p>
+<p>See <a href="#Link-types-for-hypertex">Link types for hypertex</a>, the description of the <code>filename</code>
+link, for an example.
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="Hyperlink-drivers-pdftex-and-dvipdfm"></span><div class="header">
+<p>
+Next: <a href="#Hyperlink-driver-nolinks" accesskey="n" rel="next">Hyperlink driver nolinks</a>, Previous: <a href="#Hyperlink-driver-hypertex" accesskey="p" rel="prev">Hyperlink driver hypertex</a>, Up: <a href="#Hyperlink-drivers" accesskey="u" rel="up">Hyperlink drivers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlink-drivers-pdftex-and-dvipdfm-1"></span><h4 class="subsection">5.4.3 Hyperlink drivers <code>pdftex</code> and <code>dvipdfm</code></h4>
+
+<span id="index-pdftex-_0028hyperlink-driver_0029"></span>
+<span id="index-dvipdfm-_0028hyperlink-driver_0029"></span>
+<span id="index-pdftex_002c-hyperlink-driver"></span>
+<span id="index-dvipdfm_002c-hyperlink-driver"></span>
+<span id="index-driver-pdftex"></span>
+<span id="index-driver-dvipdfm"></span>
+<span id="index-hyperlink-driver-pdftex"></span>
+<span id="index-hyperlink-driver-dvipdfm"></span>
+<p>This subsection describes link and destination types and options
+supported by the <code>pdftex</code> and <code>dvipdfm</code> drivers. Many of the
+hyperlink types and options are common to both drivers, so we describe
+them together.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Destination-types-for-pdftex-and-dvipdfm" accesskey="1">Destination types for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Destination-options-for-pdftex-and-dvipdfm" accesskey="2">Destination options for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-types-for-pdftex-and-dvipdfm" accesskey="3">Link types for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Link-options-for-pdftex-and-dvipdfm" accesskey="4">Link options for pdftex and dvipdfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Destination-types-for-pdftex-and-dvipdfm"></span><div class="header">
+<p>
+Next: <a href="#Destination-options-for-pdftex-and-dvipdfm" accesskey="n" rel="next">Destination options for pdftex and dvipdfm</a>, Up: <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="u" rel="up">Hyperlink drivers pdftex and dvipdfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Destination-types-for-pdftex-and-dvipdfm-1"></span><h4 class="subsubsection">5.4.3.1 Destination types for <code>pdftex</code> and <code>dvipdfm</code></h4>
+
+<span id="index-destination-types_002c-pdftex"></span>
+<span id="index-destination-types_002c-dvipdfm"></span>
+<span id="index-types_002c-destination_002c-pdftex"></span>
+<span id="index-types_002c-destination_002c-dvipdfm"></span>
+<span id="index-pdftex_002c-destination-types"></span>
+<span id="index-dvipdfm_002c-destination-types"></span>
+<dl compact="compact">
+<dt><code>xyz</code></dt>
+<dd><span id="index-xyz-_0028destination-type_0029-1"></span>
+<p>&ldquo;Current position&rdquo;. The option
+<span id="index-zoom-_0028destination-option_0029"></span>
+<code>zoom</code> specifies magnification to use (zero or empty means leave
+magnification unchanged, which is the default). This is the default
+type.
+</p>
+<p>For <code>dvipdfm</code>: the options
+<span id="index-left-_0028destination-option_0029"></span>
+<code>left</code> and
+<span id="index-top-_0028destination-option_0029"></span>
+<code>top</code> specify position coordinates to use (empty options mean
+current position coordinate, which is the default).
+</p>
+<p>Example: <code>\hldest{xyz}{zoom=2000}{dest123}</code>
+</p>
+</dd>
+<dt><code>fit</code></dt>
+<dd><span id="index-fit-_0028destination-type_0029"></span>
+<p>Fit the page to the window.
+</p>
+<p>Example: <code>\hldest{fit}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>fith</code></dt>
+<dd><span id="index-fith-_0028destination-type_0029"></span>
+<p>Fit the width of the page to the window.
+</p>
+<p>For <code>dvipdfm</code>: the
+<span id="index-top-_0028destination-option_0029-1"></span>
+<code>top</code> option specifies vertical position (default is empty, meaning
+current position).
+</p>
+<p>Example: <code>\hldest{fith}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>fitv</code></dt>
+<dd><span id="index-fitv-_0028destination-type_0029"></span>
+<p>Fit the height of the page to the window.
+</p>
+<p>For <code>dvipdfm</code>: The option
+<span id="index-left-_0028destination-option_0029-1"></span>
+<code>left</code> specifies horizontal position (default is empty, meaning
+current position).
+</p>
+<p>Example: <code>\hldest{fitv}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>fitb</code></dt>
+<dd><span id="index-fitb-_0028destination-type_0029"></span>
+<p>Fit the page&rsquo;s bounding box to the window.
+</p>
+<p>Example: <code>\hldest{fitb}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>fitbh</code></dt>
+<dd><span id="index-fitbh-_0028destination-type_0029"></span>
+<p>Fit the width of the page&rsquo;s bounding box to the window.
+</p>
+<p>For <code>dvipdfm</code>: the option
+<span id="index-top-_0028destination-option_0029-2"></span>
+<code>top</code> specifies vertical position (default is empty, meaning
+current position).
+</p>
+<p>Example: <code>\hldest{fitbh}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>fitbv</code></dt>
+<dd><span id="index-fitbv-_0028destination-type_0029"></span>
+<p>Fit the height of the page&rsquo;s bounding box to the window.
+</p>
+<p>For <code>dvipdfm</code>: the option
+<span id="index-left-_0028destination-option_0029-2"></span>
+<code>left</code> specifies horizontal position (default is empty, meaning
+current position).
+</p>
+<p>Example: <code>\hldest{fitbv}{}{dest123}</code>
+</p>
+</dd>
+<dt><code>fitr</code></dt>
+<dd><span id="index-fitr-_0028destination-type_0029"></span>
+<p>For <code>pdftex</code>: fit the rectangle specified by the options
+<span id="index-width-_0028destination-option_0029"></span>
+<code>width</code>,
+<span id="index-height-_0028destination-option_0029"></span>
+<code>height</code> and
+<span id="index-depth-_0028destination-option_0029"></span>
+<code>depth</code> (as a TeX rule specification) in the window. For
+dimensions set to empty, the corresponding value of the parent box is
+used (these are the defaults).
+</p>
+<p>For <code>dvipdfm</code>: fit the rectangle specified by the options
+<span id="index-left-_0028destination-option_0029-3"></span>
+<code>left</code>,
+<span id="index-bottom-_0028destination-option_0029"></span>
+<code>bottom</code>,
+<span id="index-right-_0028destination-option_0029"></span>
+<code>right</code> and
+<span id="index-top-_0028destination-option_0029-3"></span>
+<code>top</code> (in
+<span id="index-PostScript-point"></span>
+PostScript points, 72&nbsp;points per inch) in the window. For
+dimensions set to empty, current position coordinate is substituted
+(these are the defaults).
+</p>
+<p>Example for <code>pdftex</code>:
+</p>
+<div class="example">
+<pre class="example">\hldest{fitr}{width=\hsize,
+ height=.5\vsize,depth=0pt}{dest123}
+</pre></div>
+
+<p>Example for <code>dvipdfm</code>:
+</p>
+<div class="example">
+<pre class="example">\hldest{fitr}{left=72,bottom=72,
+ right=720,top=360}{dest123}
+</pre></div>
+
+</dd>
+<dt><code>raw</code></dt>
+<dd><span id="index-raw-_0028destination-type_0029-1"></span>
+<p>The destination specification (in the form of a pdfTeX command or a
+dvipdfm <code>\special</code>) is taken from the command sequence
+<code>\<var>cs</var></code>, where <var>cs</var> is the value of the
+<span id="index-cmd-_0028destination-option_0029-2"></span>
+<code>cmd</code> option. In the definition of <code>\<var>cs</var></code>, use
+<span id="index-_0040hllabel-2"></span>
+<code>\@hllabel</code> to refer to the hyperlink label. This option is
+intended to be used with destgroups (see <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>), as it does not make sense in a direct call to
+<span id="index-hldest-2"></span>
+<code>\hldest</code>&mdash;you can just call the raw command.
+</p>
+<p>Example for <code>pdftex</code>:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+\def\mydest{\pdfdest name{\@hllabel} xyz}
+\resetatcatcode
+\hldesttype{raw}
+\hldestopts{cmd=mydest}
+</pre></div>
+
+<p>Example for <code>dvipdfm</code>:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+\def\mydest{\special{pdf: dest (\@hllabel)
+ [@thispage /XYZ @xpos @ypos 0]}}
+\resetatcatcode
+\hldesttype{raw}
+\hldestopts{cmd=mydest}
+</pre></div>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Destination-options-for-pdftex-and-dvipdfm"></span><div class="header">
+<p>
+Next: <a href="#Link-types-for-pdftex-and-dvipdfm" accesskey="n" rel="next">Link types for pdftex and dvipdfm</a>, Previous: <a href="#Destination-types-for-pdftex-and-dvipdfm" accesskey="p" rel="prev">Destination types for pdftex and dvipdfm</a>, Up: <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="u" rel="up">Hyperlink drivers pdftex and dvipdfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Destination-options-for-pdftex-and-dvipdfm-1"></span><h4 class="subsubsection">5.4.3.2 Destination options for <code>pdftex</code> and <code>dvipdfm</code></h4>
+
+<span id="index-destination-options_002c-pdftex"></span>
+<span id="index-destination-options_002c-dvipdfm"></span>
+<span id="index-options_002c-destination_002c-pdftex"></span>
+<span id="index-options_002c-destination_002c-dvipdfm"></span>
+<span id="index-pdftex_002c-destination-options"></span>
+<span id="index-dvipdfm_002c-destination-options"></span>
+<p>With respect to the destination options, the <code>pdftex</code> and
+<code>dvipdfm</code> differ in the way the fit rectangle is specified
+(relative coordinates for <code>pdftex</code>, absolute coordinates for
+<code>dvipdfm</code>).
+</p>
+
+<span id="Common-destination-options"></span><h4 class="subsubheading">Common destination options</h4>
+
+<dl compact="compact">
+<dt><code>cmd</code></dt>
+<dd><span id="index-cmd-_0028destination-option_0029-3"></span>
+<p>Name of the macro (without the leading &lsquo;<samp>\</samp>&rsquo;) containing a
+pdfTeX command or a dvipdfm <code>\special</code> for the <code>raw</code>
+destination.
+</p>
+<p>See <a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a>, the description of the
+<code>raw</code> destination, for an example.
+</p>
+</dd>
+<dt><code>zoom</code></dt>
+<dd><span id="index-zoom-_0028destination-option_0029-1"></span>
+<span id="index-destinations_002c-magnification"></span>
+<span id="index-hyperlink-destination_002c-magnification"></span>
+<span id="index-magnification_002c-hyperlink-destination"></span>
+<span id="index-zooming_002c-hyperlink-destination"></span>
+<p>Magnification ratio times 1000 (like TeX&rsquo;s scale factor).
+Zero or empty means leave magnification unchanged, which is the
+default.
+</p>
+<p>Example: <code>\hldest{xyz}{zoom=2000}{dest123}</code>
+</p></dd>
+</dl>
+
+
+<span id="pdftex_002dspecific-destination-options"></span><h4 class="subsubheading"><code>pdftex</code>-specific destination options</h4>
+
+<p>The dimension options below must be specified as a TeX rule
+specification. When set to empty, the corresponding value
+of the parent box is used (this is the default for all dimension
+options).
+</p>
+<dl compact="compact">
+<dt><code>depth</code></dt>
+<dd><span id="index-depth-_0028destination-option_0029-1"></span>
+<span id="index-destinations_002c-dimensions"></span>
+<span id="index-hyperlink-destination_002c-dimensions"></span>
+<span id="index-dimensions_002c-hyperlink-destination"></span>
+<p>Depth of the fit rectangle for the <code>fitr</code> destination.
+</p>
+</dd>
+<dt><code>height</code></dt>
+<dd><span id="index-height-_0028destination-option_0029-1"></span>
+<span id="index-destinations_002c-dimensions-1"></span>
+<span id="index-hyperlink-destination_002c-dimensions-1"></span>
+<span id="index-dimensions_002c-hyperlink-destination-1"></span>
+<p>Height of the fit rectangle for the <code>fitr</code> destination.
+</p>
+</dd>
+<dt><code>width</code></dt>
+<dd><span id="index-width-_0028destination-option_0029-1"></span>
+<span id="index-destinations_002c-dimensions-2"></span>
+<span id="index-hyperlink-destination_002c-dimensions-2"></span>
+<span id="index-dimensions_002c-hyperlink-destination-2"></span>
+<p>Width of the fit rectangle for the <code>fitr</code> destination.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hldest{fitr}{width=\hsize,
+ height=.5\vsize,depth=0pt}{dest123}
+</pre></div>
+</dd>
+</dl>
+
+
+<span id="dvipdfm_002dspecific-destination-options"></span><h4 class="subsubheading"><code>dvipdfm</code>-specific destination options</h4>
+
+<p>The dimension options below must be specified in
+<span id="index-PostScript-point-1"></span>
+PostScript points (72&nbsp;points per inch), as a number without the
+&lsquo;<samp>bp</samp>&rsquo; unit name. When set to empty, the current position
+coordinate is used (this is the default for all dimension options).
+</p>
+<dl compact="compact">
+<dt><code>bottom</code></dt>
+<dd><span id="index-bottom-_0028destination-option_0029-1"></span>
+<span id="index-destinations_002c-dimensions-3"></span>
+<span id="index-hyperlink-destination_002c-dimensions-3"></span>
+<span id="index-dimensions_002c-hyperlink-destination-3"></span>
+<p>Bottom position coordinate of a box specification for the various
+destination types.
+</p>
+</dd>
+<dt><code>left</code></dt>
+<dd><span id="index-left-_0028destination-option_0029-4"></span>
+<span id="index-destinations_002c-dimensions-4"></span>
+<span id="index-hyperlink-destination_002c-dimensions-4"></span>
+<span id="index-dimensions_002c-hyperlink-destination-4"></span>
+<p>Left position coordinate of a box specification for the various
+destination types.
+</p>
+</dd>
+<dt><code>right</code></dt>
+<dd><span id="index-right-_0028destination-option_0029-1"></span>
+<span id="index-destinations_002c-dimensions-5"></span>
+<span id="index-hyperlink-destination_002c-dimensions-5"></span>
+<span id="index-dimensions_002c-hyperlink-destination-5"></span>
+<p>Right position coordinate of a box specification for the various
+destination types.
+</p>
+</dd>
+<dt><code>top</code></dt>
+<dd><span id="index-top-_0028destination-option_0029-4"></span>
+<span id="index-destinations_002c-dimensions-6"></span>
+<span id="index-hyperlink-destination_002c-dimensions-6"></span>
+<span id="index-dimensions_002c-hyperlink-destination-6"></span>
+<p>Top position coordinate of a box specification for the various
+destination types.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hldest{fitr}{left=72,bottom=72,
+ right=720,top=360}{dest123}
+</pre></div>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Link-types-for-pdftex-and-dvipdfm"></span><div class="header">
+<p>
+Next: <a href="#Link-options-for-pdftex-and-dvipdfm" accesskey="n" rel="next">Link options for pdftex and dvipdfm</a>, Previous: <a href="#Destination-options-for-pdftex-and-dvipdfm" accesskey="p" rel="prev">Destination options for pdftex and dvipdfm</a>, Up: <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="u" rel="up">Hyperlink drivers pdftex and dvipdfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Link-types-for-pdftex-and-dvipdfm-1"></span><h4 class="subsubsection">5.4.3.3 Link types for <code>pdftex</code> and <code>dvipdfm</code></h4>
+
+<span id="index-link-types_002c-pdftex"></span>
+<span id="index-link-types_002c-dvipdfm"></span>
+<span id="index-types_002c-link_002c-pdftex"></span>
+<span id="index-types_002c-link_002c-dvipdfm"></span>
+<span id="index-pdftex_002c-link-types"></span>
+<span id="index-dvipdfm_002c-link-types"></span>
+<p>Link types are the same for the <code>pdftex</code> and <code>dvipdfm</code>
+drivers, except that the <code>pdftex</code> driver provides one additional
+link type <code>num</code> (link to a numbered destination). dvipdfm does not
+support numbered destinations, therefore it does not have this link
+type. Note that all destinations created by Eplain hyperlink macros are
+named destinations; to define a numbered destination, you have to use
+low-level pdfTeX commands.
+</p>
+
+<span id="Common-link-types"></span><h4 class="subsubheading">Common link types</h4>
+
+<dl compact="compact">
+<dt><code>name</code></dt>
+<dd><span id="index-name-_0028hyperlink-type_0029-1"></span>
+<span id="index-named-destination-1"></span>
+<span id="index-destinations_002c-named-1"></span>
+<span id="index-hyperlink-destination_002c-named-1"></span>
+<p>Go to a &ldquo;named destination&rdquo;. The label is the destination name.
+All destinations created with <code>\hldest</code> are named destinations
+(see <a href="#Explicit-hyperlinks">Explicit hyperlinks</a>). This is the default type.
+</p>
+<p>Example: <code>\hlstart{name}{}{dest123}Link to dest123\hlend</code>
+</p>
+</dd>
+<dt><code>url</code></dt>
+<dd><span id="index-url-_0028hyperlink-type_0029-1"></span>
+<span id="index-URL-hyperlink-3"></span>
+<span id="index-destinations_002c-URL-1"></span>
+<span id="index-hyperlinks_002c-URL-3"></span>
+<p>Go to a <acronym>URL</acronym>. The label is the <acronym>URL</acronym>.
+</p>
+<p>Example: <code>\hlstart{url}{}{https://tug.org/eplain/}Eplain home\hlend</code>
+</p>
+</dd>
+<dt><code>page</code></dt>
+<dd><span id="index-page-_0028hyperlink-type_0029"></span>
+<span id="index-page-destination"></span>
+<span id="index-destinations_002c-page"></span>
+<span id="index-hyperlink-destination_002c-page"></span>
+<p>Go to a page. The label is the page number (counting from&nbsp;1).
+Page fitting is specified by the
+<span id="index-pagefit-_0028hyperlink-option_0029"></span>
+<code>pagefit</code> option.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hlstart{page}{pagefit=/FitH 600}{123}
+ Link to page~123\hlend
+</pre></div>
+
+</dd>
+<dt><code>filename</code></dt>
+<dd><span id="index-filename-_0028hyperlink-type_0029-1"></span>
+<span id="index-file_002c-hyperlink-to-1"></span>
+<span id="index-destinations_002c-in-another-file-1"></span>
+<span id="index-hyperlinks_002c-to-another-file-1"></span>
+<p>Go to a named destination in another file. The label is the
+destination name. The file name is specified by the
+<span id="index-file-_0028hyperlink-option_0029-2"></span>
+<code>file</code> option. Page fitting is specified by the
+<span id="index-pagefit-_0028hyperlink-option_0029-1"></span>
+<code>pagefit</code> option. The
+<span id="index-newwin-_0028hyperlink-option_0029"></span>
+<code>newwin</code> option specifies whether the destination document is
+opened in the same window or in a new window.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hlstart{filename}{file=book.pdf,newwin=1}{dest123}
+ Link to dest123 in file `book.pdf'\hlend
+</pre></div>
+
+</dd>
+<dt><code>filepage</code></dt>
+<dd><span id="index-filepage-_0028hyperlink-type_0029"></span>
+<span id="index-file_002c-hyperlink-to-2"></span>
+<span id="index-destinations_002c-in-another-file-2"></span>
+<span id="index-hyperlinks_002c-to-another-file-2"></span>
+<p>Go to a page in another file. The label is the page number (counting
+from&nbsp;1). The file name is specified by the
+<span id="index-file-_0028hyperlink-option_0029-3"></span>
+<code>file</code> option. Page fitting is specified by the
+<span id="index-pagefit-_0028hyperlink-option_0029-2"></span>
+<code>pagefit</code> option. The
+<span id="index-newwin-_0028hyperlink-option_0029-1"></span>
+<code>newwin</code> option specifies whether the destination document is
+opened in the same window or in a new window.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hlstart{filepage}{file=book.pdf,newwin=,
+ pagefit=/FitR 50 100 300 500}{1}
+ Link to page~1 in file `book.pdf'\hlend
+</pre></div>
+
+</dd>
+<dt><code>raw</code></dt>
+<dd><span id="index-raw-_0028hyperlink-type_0029-1"></span>
+<p>The link specification (in the form of a pdfTeX command or a dvipdfm
+<code>\special</code> primitive) is taken from the command sequence
+<code>\<var>cs</var></code>, where <var>cs</var> is the value of the
+<span id="index-cmd-_0028hyperlink-option_0029-2"></span>
+<code>cmd</code> option. In the definition of <code>\<var>cs</var></code>, use
+<span id="index-_0040hllabel-3"></span>
+<code>\@hllabel</code> to refer to the hyperlink label. This option is
+intended to be used with linkgroups (see <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a>), as it does not make sense in a direct call to
+<span id="index-hlstart-2"></span>
+<code>\hlstart</code>&mdash;you can just call the raw command.
+</p>
+<p>Example for <code>pdftex</code>:
+</p>
+<div class="example">
+<pre class="example">% Redirect all \url links to the first page
+\def\mycmd{\pdfstartlink goto page 1 {/Fit}}
+\hltype[url]{raw}
+\hlopts[url]{cmd=mycmd}
+</pre></div>
+
+<p>Example for <code>dvipdfm</code>:
+</p>
+<div class="example">
+<pre class="example">% Redirect all \url links to the first page
+\def\mycmd{\special{pdf: beginann &lt;&lt;/Type/Annot /Subtype/Link
+ /Dest[0 /Fit]&gt;&gt;}}
+\hltype[url]{raw}
+\hlopts[url]{cmd=mycmd}
+</pre></div>
+</dd>
+</dl>
+
+<span id="pdftex_002dspecific-link-types"></span><h4 class="subsubheading"><code>pdftex</code>-specific link types</h4>
+
+<dl compact="compact">
+<dt><code>num</code></dt>
+<dd><span id="index-num-_0028hyperlink-type_0029"></span>
+<span id="index-numbered-destination"></span>
+<span id="index-destinations_002c-numbered"></span>
+<span id="index-hyperlink-destination_002c-numbered"></span>
+<p>Go to a &ldquo;numbered destination&rdquo;. The label is the destination
+number.
+</p>
+<p>Example: <code>\hlstart{num}{}{123}Link to 123\hlend</code>
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="Link-options-for-pdftex-and-dvipdfm"></span><div class="header">
+<p>
+Previous: <a href="#Link-types-for-pdftex-and-dvipdfm" accesskey="p" rel="prev">Link types for pdftex and dvipdfm</a>, Up: <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="u" rel="up">Hyperlink drivers pdftex and dvipdfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Link-options-for-pdftex-and-dvipdfm-1"></span><h4 class="subsubsection">5.4.3.4 Link options for <code>pdftex</code> and <code>dvipdfm</code></h4>
+
+<span id="index-link-options_002c-pdftex"></span>
+<span id="index-link-options_002c-dvipdfm"></span>
+<span id="index-options_002c-link_002c-pdftex"></span>
+<span id="index-options_002c-link_002c-dvipdfm"></span>
+<span id="index-pdftex_002c-link-options"></span>
+<span id="index-dvipdfm_002c-link-options"></span>
+<p>Link options are mostly the same for the <code>pdftex</code> and
+<code>dvipdfm</code> drivers. The <code>pdftex</code> driver has additional
+options to specify link dimensions.
+</p>
+
+<span id="Common-link-options"></span><h4 class="subsubheading">Common link options</h4>
+
+<dl compact="compact">
+<dt><code>bcolor</code></dt>
+<dd><span id="index-bcolor-_0028hyperlink-option_0029"></span>
+<span id="index-hyperlink-border-color"></span>
+<span id="index-border-color_002c-hyperlink"></span>
+<span id="index-color_002c-hyperlink-border"></span>
+<p>Border color. An array of three numbers in the range 0 to 1,
+representing a color in DeviceRGB.
+</p>
+<p>Example: <code>\hlstart{name}{bcolor=.1 .5 1}{dest123}Link\hlend</code>
+</p>
+</dd>
+<dt><code>bdash</code></dt>
+<dd><span id="index-bdash-_0028hyperlink-option_0029"></span>
+<span id="index-dashed-hyperlink-border"></span>
+<span id="index-hyperlinks_002c-border-style"></span>
+<span id="index-border-style_002c-hyperlink"></span>
+<p>Array of numbers representing on and off stroke lengths for drawing
+dashes.
+</p>
+<p>Example: <code>\hlstart{name}{bstyle=D,bdash=2 4}{dest123}Link\hlend</code>
+</p>
+</dd>
+<dt><code>bstyle</code></dt>
+<dd><span id="index-bstyle-_0028hyperlink-option_0029"></span>
+<span id="index-solid-hyperlink-border"></span>
+<span id="index-dashed-hyperlink-border-1"></span>
+<span id="index-beveled-hyperlink-border"></span>
+<span id="index-inset-hyperlink-border"></span>
+<span id="index-underline-hyperlink-border"></span>
+<span id="index-hyperlinks_002c-border-style-1"></span>
+<span id="index-style_002c-hyperlink-border"></span>
+<span id="index-border-style_002c-hyperlink-1"></span>
+<p>Link border style:
+</p>
+<dl compact="compact">
+<dt><code>S</code></dt>
+<dd><p>The border is drawn as a solid line.
+</p>
+</dd>
+<dt><code>D</code></dt>
+<dd><p>The border is drawn with a dashed line (the dash pattern is specified
+by the
+<span id="index-bdash-_0028hyperlink-option_0029-1"></span>
+<code>bdash</code> option).
+</p>
+</dd>
+<dt><code>B</code></dt>
+<dd><p>The border is drawn in a beveled style.
+</p>
+</dd>
+<dt><code>I</code></dt>
+<dd><p>The border is drawn in an inset style.
+</p>
+</dd>
+<dt><code>U</code></dt>
+<dd><p>The border is drawn as a line on the bottom of the link rectangle.
+</p></dd>
+</dl>
+
+<p>The default is &lsquo;<samp>S</samp>&rsquo;.
+</p>
+<p>Example: <code>\hlstart{name}{bstyle=D,bdash=2 4}{dest123}Link\hlend</code>
+</p>
+</dd>
+<dt><code>bwidth</code></dt>
+<dd><span id="index-bwidth-_0028hyperlink-option_0029"></span>
+<span id="index-width_002c-hyperlink-border"></span>
+<span id="index-hyperlinks_002c-border-width"></span>
+<span id="index-border-width_002c-hyperlink"></span>
+<p>Border width in
+<span id="index-PostScript-point-2"></span>
+PostScript points (72&nbsp;points per inch). The default is&nbsp;1.
+</p>
+<p>Example: <code>\hlstart{name}{bwidth=2}{dest123}Link\hlend</code>
+</p>
+</dd>
+<dt><code>cmd</code></dt>
+<dd><span id="index-cmd-_0028hyperlink-option_0029-3"></span>
+<p>Name of the macro (without the leading &lsquo;<samp>\</samp>&rsquo;) containing a
+pdfTeX command or a dvipdfm <code>\special</code> for the <code>raw</code> link.
+</p>
+<p>See <a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a>, the description of the
+<code>raw</code> link, for an example.
+</p>
+</dd>
+<dt><code>file</code></dt>
+<dd><span id="index-file-_0028hyperlink-option_0029-4"></span>
+<p>File name for the <code>filename</code> and <code>filepage</code> link types.
+</p>
+<p>See <a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a>, the descriptions of the
+<code>filename</code> and <code>filepage</code> links, for an example.
+</p>
+</dd>
+<dt><code>hlight</code></dt>
+<dd><span id="index-hlight-_0028hyperlink-option_0029"></span>
+<span id="index-hyperlinks_002c-highlight-mode"></span>
+<span id="index-highlight-modes_002c-hyperlink"></span>
+<p>Link border highlight modes:
+</p>
+<dl compact="compact">
+<dt><code>I</code></dt>
+<dd><p>The rectangle specified by the bounding box of the link is inverted.
+</p>
+</dd>
+<dt><code>N</code></dt>
+<dd><p>No highlighting is done.
+</p>
+</dd>
+<dt><code>O</code></dt>
+<dd><p>The border of the link is inverted.
+</p>
+</dd>
+<dt><code>P</code></dt>
+<dd><p>The region underneath the bounding box of the link is drawn inset into
+the page.
+</p></dd>
+</dl>
+
+<p>The default is &lsquo;<samp>I</samp>&rsquo;.
+</p>
+<p>Example: <code>\hlstart{name}{bstyle=S,hlight=O}{dest123}Link\hlend</code>
+</p>
+</dd>
+<dt><code>newwin</code></dt>
+<dd><span id="index-newwin-_0028hyperlink-option_0029-2"></span>
+<span id="index-hyperlinks_002c-opening-in-a-new-window"></span>
+<span id="index-new-window_002c-opening-hyperlink-in"></span>
+<p>For the <code>filename</code> and <code>filepage</code> links, specifies whether the destination document is
+opened in the same window or in a new window. The settings are:
+</p>
+<dl compact="compact">
+<dt><code>0</code></dt>
+<dd><p>Open in the same window.
+</p></dd>
+<dt><code><span class="roman">non-</span>0</code></dt>
+<dd><p>Open in a new window.
+</p></dd>
+<dt><code><span class="roman">empty</span></code></dt>
+<dd><p>Behavior according to the viewer settings.
+</p></dd>
+</dl>
+
+<p>The default is empty.
+</p>
+<p>See <a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a>, the descriptions of the
+<code>filename</code> and <code>filepage</code> links, for an example.
+</p>
+</dd>
+<dt><code>pagefit</code></dt>
+<dd><span id="index-pagefit-_0028hyperlink-option_0029-3"></span>
+<p>For the <code>page</code> and <code>filepage links</code>, specifies how the page
+must be fitted to the window. <code>pagefit</code> specification is written
+to the <acronym>PDF</acronym> file as is, so it must conform to the
+<acronym>PDF</acronym> standard.
+</p>
+<p>See <a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a>, the descriptions of the
+<code>page</code> and <code>filepage</code> links, for an example.
+</p></dd>
+</dl>
+
+
+<span id="pdftex_002dspecific-link-options"></span><h4 class="subsubheading"><code>pdftex</code>-specific link options</h4>
+
+<p>The dimension options below must be specified as a TeX rule
+specification. When set to empty, the corresponding value
+of the parent box is used (this is the default for all dimension
+options).
+</p>
+<dl compact="compact">
+<dt><code>depth</code></dt>
+<dd><span id="index-depth-_0028hyperlink-option_0029"></span>
+<span id="index-hyperlink-dimensions"></span>
+<span id="index-dimensions_002c-hyperlink"></span>
+<p>Depth of the link.
+</p>
+</dd>
+<dt><code>height</code></dt>
+<dd><span id="index-height-_0028hyperlink-option_0029"></span>
+<span id="index-hyperlink-dimensions-1"></span>
+<span id="index-dimensions_002c-hyperlink-1"></span>
+<p>Height of the link.
+</p>
+</dd>
+<dt><code>width</code></dt>
+<dd><span id="index-width-_0028hyperlink-option_0029"></span>
+<span id="index-hyperlink-dimensions-2"></span>
+<span id="index-dimensions_002c-hyperlink-2"></span>
+<p>Width of the link.
+</p>
+<p>Example:
+</p>
+<div class="example">
+<pre class="example">\hlstart{name}{width=5in,height=20pc,depth=0pt}{dest123}
+ Link\hlend
+</pre></div>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Hyperlink-driver-nolinks"></span><div class="header">
+<p>
+Previous: <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="p" rel="prev">Hyperlink drivers pdftex and dvipdfm</a>, Up: <a href="#Hyperlink-drivers" accesskey="u" rel="up">Hyperlink drivers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlink-driver-nolinks-1"></span><h4 class="subsection">5.4.4 Hyperlink driver <code>nolinks</code></h4>
+
+<span id="index-nolinks-_0028hyperlink-driver_0029"></span>
+<span id="index-nolinks_002c-hyperlink-driver"></span>
+<span id="index-driver-nolinks"></span>
+<span id="index-hyperlink-driver-nolinks"></span>
+<span id="index-omitting-hyperlinks"></span>
+<span id="index-disabling-hyperlinks"></span>
+<span id="index-hyperlinks_002c-disabling"></span>
+<span id="index-destinations_002c-disabling"></span>
+<span id="index-spacing_002c-preserving-with-hyperlinks"></span>
+<span id="index-hyperlinks_002c-preserving-spacing"></span>
+<span id="index-page_002dbreaking_002c-preserving-with-hyperlinks"></span>
+<span id="index-hyperlinks_002c-preserving-page_002dbreaking"></span>
+<p>Select this driver to suppress all hyperlinks in your document.
+</p>
+<p>Selecting this driver is quite different from not selecting any driver
+at all, or from selecting some driver and then turning hyperlinks off
+for the entire document with
+<span id="index-hloff"></span>
+<code>\hloff</code> and
+<span id="index-hldestoff"></span>
+<code>\hldestoff</code> (see <a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a>).
+</p>
+<p>The purpose of <code>\hldestoff</code> and <code>\hloff</code> is to mark (parts) of
+your document where hyperlinks should never appear. (Imagine you want
+to prevent a cross-referencing macro from generating a link at a certain
+spot in your document.)
+</p>
+<p>If instead you have prepared a document with hyperlinks and just want to
+compile a version without them, it is better to select the driver
+<code>nolinks</code>. This ensures that spacing and page-breaking are the
+same as what you were getting with hyperlinks enabled.
+</p>
+<p>The reason for this is that hyperlinks are produced by the
+<code>\special</code> primitives or low-level hyperlink commands. Each such
+command is placed inside a
+<span id="index-whatsits-made-by-hyperlinks"></span>
+<em>whatsit</em> (an internal TeX object), which may introduce
+legitimate breakpoints at places where none would exist without the
+whatsits. The macros <code>\hldestoff</code> and <code>\hloff</code> disable the
+hyperlink macros completely, so that no whatsits are produced.
+</p>
+<p>In contrast, the <code>nolinks</code> driver does not completely disable
+hyperlink macros. Instead, it defines them to merely write to the log
+file (what gets written is unimportant). This also produces
+whatsits, thus imitating the whatsits from the hyperlink commands.
+(This trick was borrowed from the
+<span id="index-color_002esty-2"></span>
+<span id="index-graphics-collection_002c-LaTeX-2"></span>
+<span id="index-LaTeX-graphics-collection-2"></span>
+LaTeX &lsquo;color&rsquo; package.)
+</p>
+<p>Another reason for using <code>nolinks</code> is that in horizontal mode
+<code>\hldest</code> places destinations inside boxes of zero width, height,
+and depth. When you say <code>\hldestoff</code>, <code>\hldest</code> will omit
+both destination definitions and these boxes. The missing boxes can
+again cause the typesetting to be inconsistent with that with
+destinations enabled. Here again, the <code>nolinks</code> driver helps by
+defining <code>\hldest</code> to produce the empty boxes.
+</p>
+<p>So, if you are planning to produce versions of your <acronym>PDF</acronym>
+document both with and without hyperlinks, here is the recommended way
+to enable the hyperlinks under pdfTeX:
+</p>
+<span id="index-enablehyperlinks-2"></span>
+<div class="example">
+<pre class="example">\ifpdf
+ \enablehyperlinks
+\else
+ \enablehyperlinks[nolinks]%
+\fi
+</pre></div>
+
+
+<hr>
+<span id="Setting-hyperlink-types-and-options"></span><div class="header">
+<p>
+Next: <a href="#Turning-hyperlinks-on_002foff" accesskey="n" rel="next">Turning hyperlinks on/off</a>, Previous: <a href="#Hyperlink-drivers" accesskey="p" rel="prev">Hyperlink drivers</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Setting-hyperlink-types-and-options-1"></span><h3 class="section">5.5 Setting hyperlink types and options</h3>
+
+<span id="index-default-hyperlink-type"></span>
+<span id="index-default-hyperlink-options"></span>
+<span id="index-hyperlinks_002c-default-type"></span>
+<span id="index-hyperlinks_002c-default-options"></span>
+<span id="index-destinations_002c-default-type"></span>
+<span id="index-destinations_002c-default-options"></span>
+<p>You can define default types for links and destinations, which will be
+used when you do not specify a type in
+<span id="index-hlstart-3"></span>
+<code>\hlstart</code> or
+<span id="index-hldest-3"></span>
+<code>\hldest</code>. Similarly, you can define default values for the
+options; the default value for an option is used when you do not set the
+option in the argument to <code>\hlstart</code> or <code>\hldest</code>.
+</p>
+<span id="index-group-type_002c-hyperlink"></span>
+<span id="index-group-options_002c-hyperlink"></span>
+<span id="index-hyperlinks_002c-group-type"></span>
+<span id="index-hyperlinks_002c-group-options"></span>
+<span id="index-link_002c-group-type"></span>
+<span id="index-link_002c-group-options"></span>
+<span id="index-linkgroup-type"></span>
+<span id="index-linkgroup-options"></span>
+<span id="index-destinations_002c-group-type"></span>
+<span id="index-destinations_002c-group-options"></span>
+<span id="index-destgroup-type"></span>
+<span id="index-destgroup-options"></span>
+<p>The parameters for implicit links and destinations can be customized by
+setting the &ldquo;group&rdquo; types and options. When not set, the defaults are
+used.
+</p>
+<p>All these settings are local to the current (TeX) group, so if
+you want to set an option temporarily, you can do so inside a
+<code>\begingroup&hellip;\endgroup</code> block; when the group ends, the
+previous settings are restored.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Setting-default-types-and-options" accesskey="1">Setting default types and options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Setting-group-types" accesskey="2">Setting group types</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Setting-group-options" accesskey="3">Setting group options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Setting-default-types-and-options"></span><div class="header">
+<p>
+Next: <a href="#Setting-group-types" accesskey="n" rel="next">Setting group types</a>, Up: <a href="#Setting-hyperlink-types-and-options" accesskey="u" rel="up">Setting hyperlink types and options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Setting-default-types-and-options-1"></span><h4 class="subsection">5.5.1 Setting default types and options</h4>
+
+<span id="index-hltype"></span>
+<span id="index-hldesttype"></span>
+<p>The default types for links and destinations can be set with the
+following commands:
+</p>
+<div class="example">
+<pre class="example">\hltype{<var>type</var>}
+\hldesttype{<var>type</var>}
+</pre></div>
+
+<p>where <var>type</var> is one of the
+link/destination types supported by the selected hyperlink driver
+(see <a href="#Hyperlink-drivers">Hyperlink drivers</a>).
+</p>
+<span id="index-hlopts"></span>
+<span id="index-hldestopts"></span>
+<p>Default values for the options can be set with the following commands:
+</p>
+<div class="example">
+<pre class="example">\hlopts{<var>options</var>}
+\hldestopts{<var>options</var>}
+</pre></div>
+
+<p>where <var>options</var> is a comma-separated list of option
+assignments in the format &lsquo;<samp><var>option</var>=<var>value</var></samp>&rsquo;. Again, what options
+are allowed depends on the selected hyperlink driver.
+</p>
+<span id="index-boxed-links_002c-avoiding-1"></span>
+<span id="index-avoiding-boxed-links-1"></span>
+<span id="index-color_002c-hyperlinks-2"></span>
+<span id="index-colored-links-2"></span>
+<span id="index-hyperlink-color-2"></span>
+<p>Many people regard the default boxed links as not aesthetic and
+intruding on page layout. The reason why boxed links are the default is
+that the links are not colored until you load the LaTeX
+<span id="index-color_002esty-3"></span>
+&lsquo;color&rsquo; package (see <a href="#Loading-LaTeX-packages">Loading LaTeX packages</a>) or use other means to
+define the <code>\color</code> command; therefore, not producing any kind of
+link border may result in the links not being marked in any way.
+However, when the links are actually colored, there is no need to
+produce the link boxes anymore; to avoid the boxes, you can set the
+default border width to zero (if the driver you use supports the link
+option <code>bwidth</code>; see <a href="#Hyperlink-drivers">Hyperlink drivers</a>):
+</p>
+<div class="example">
+<pre class="example">\hlopts{bwidth=0}
+</pre></div>
+
+
+<hr>
+<span id="Setting-group-types"></span><div class="header">
+<p>
+Next: <a href="#Setting-group-options" accesskey="n" rel="next">Setting group options</a>, Previous: <a href="#Setting-default-types-and-options" accesskey="p" rel="prev">Setting default types and options</a>, Up: <a href="#Setting-hyperlink-types-and-options" accesskey="u" rel="up">Setting hyperlink types and options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Setting-group-types-1"></span><h4 class="subsection">5.5.2 Setting group types</h4>
+
+<span id="index-hltype-1"></span>
+<span id="index-hldesttype-1"></span>
+<span id="index-group-type_002c-hyperlink-1"></span>
+<span id="index-hyperlinks_002c-group-type-1"></span>
+<span id="index-link_002c-group-type-1"></span>
+<span id="index-linkgroup-type-1"></span>
+<span id="index-destinations_002c-group-type-1"></span>
+<span id="index-destgroup-type-1"></span>
+<p>When called with an optional argument, as in
+</p>
+<div class="example">
+<pre class="example">\hltype[<var>groups</var>]{<var>type</var>}
+\hldesttype[<var>groups</var>]{<var>type</var>}
+</pre></div>
+
+<p>where <var>groups</var> is a comma-separated list of groups,
+<code>\hltype</code> and <code>\hldesttype</code> set the type for each group from
+<var>groups</var> to <var>type</var>. The default type is used for all groups
+with an empty type (this is the initial setting for all groups, except
+that the type for the &lsquo;url&rsquo; linkgroup is set to &lsquo;<samp>url</samp>&rsquo; by the
+drivers which support this link type).
+</p>
+<span id="index-group-_0060_0027-_0028empty_0029"></span>
+<span id="index-default-hyperlink-type-1"></span>
+<span id="index-default-hyperlink-options-1"></span>
+<span id="index-hyperlinks_002c-default-type-1"></span>
+<span id="index-hyperlinks_002c-default-options-1"></span>
+<span id="index-destinations_002c-default-type-1"></span>
+<span id="index-destinations_002c-default-options-1"></span>
+<p>There are two special &ldquo;groups&rdquo; which can be used inside the
+<var>groups</var> list. An empty group sets the default type. This allows
+to set the default type and group types in one command, for example:
+</p>
+<div class="example">
+<pre class="example">\hltype[eq,]{<var>type</var>}
+</pre></div>
+
+<p>sets the link type for the &lsquo;eq&rsquo; linkgroup and the
+default link type to <var>type</var>.
+</p>
+<span id="index-group-_0060_002a_0027"></span>
+<span id="index-groups_002c-specifying-all"></span>
+<span id="index-all-groups_002c-specifying"></span>
+<p>Another special group is a star (&lsquo;<samp>*</samp>&rsquo;) group, which signifies all
+defined groups. For example, the command
+</p>
+<div class="example">
+<pre class="example">\hldesttype[*,]{<var>type</var>}
+</pre></div>
+
+<p>sets the destination type to <var>type</var> for each group,
+as well as the default destination type.
+</p>
+
+<hr>
+<span id="Setting-group-options"></span><div class="header">
+<p>
+Previous: <a href="#Setting-group-types" accesskey="p" rel="prev">Setting group types</a>, Up: <a href="#Setting-hyperlink-types-and-options" accesskey="u" rel="up">Setting hyperlink types and options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Setting-group-options-1"></span><h4 class="subsection">5.5.3 Setting group options</h4>
+
+<span id="index-group-options_002c-hyperlink-1"></span>
+<span id="index-hyperlinks_002c-group-options-1"></span>
+<span id="index-link_002c-group-options-1"></span>
+<span id="index-linkgroup-options-1"></span>
+<span id="index-destinations_002c-group-options-1"></span>
+<span id="index-destgroup-options-1"></span>
+<p>Option values for each group are stored as a list of option
+assignments. This list does not have to contain every supported
+option. Values for options missing from this list are taken from the
+default option values.
+</p>
+<span id="index-hlopts-1"></span>
+<span id="index-hldestopts-1"></span>
+<p>To manipulate the list of option values for the groups, you use the
+<code>\hlopts</code> and <code>\hldestopts</code> commands with an optional
+argument:
+</p>
+<div class="example">
+<pre class="example">\hlopts[<var>groups</var>]{<var>options</var>}
+\hldestopts[<var>groups</var>]{<var>options</var>}
+\hlopts![<var>groups</var>]{<var>options</var>}
+\hldestopts![<var>groups</var>]{<var>options</var>}
+</pre></div>
+
+<p>where <var>groups</var> is a comma-separated list of groups and
+<var>options</var> is a comma-separated list of option assignments. The
+two special &ldquo;groups&rdquo;, the empty group and the star (&lsquo;<samp>*</samp>&rsquo;)
+group, have the same meaning as for <code>\hltype</code> and
+<code>\hldesttype</code>.
+<span id="index-group_002c-preserving-option-list"></span>
+<span id="index-hyperlink-group_002c-preserving-option-list"></span>
+<span id="index-option-list_002c-preserving-for-group"></span>
+When used without the exclamation mark, <code>\hlopts</code> and
+<code>\hldestopts</code> preserve the current list of options for the groups,
+and only update the options listed in <var>options</var>. If you add the
+exclamation mark, the current list of options for each group in
+<var>groups</var> is discarded and the new list is set to <var>options</var>.
+</p>
+<p>The &ldquo;overriding&rdquo; nature of the &lsquo;<samp>!</samp>&rsquo; is appropriate when you give
+a complete specification of the options for a group, e.g., at the
+beginning of your document. On the other hand, when you want to
+adjust some option(s) and leave others intact, you should use the
+macros without the &lsquo;<samp>!</samp>&rsquo;.
+</p>
+<span id="index-raise-_0028hyperlink-option_0029-1"></span>
+<span id="index-mathematics-displays_002c-hyperlinks-1"></span>
+<span id="index-displayed-math-and-hyperlinks-1"></span>
+<span id="index-large-operators-and-hyperlinks-1"></span>
+<span id="index-hyperlinks_002c-large-operators-1"></span>
+<span id="index-destinations_002c-large-operators-1"></span>
+<span id="index-raising-hyperlink-destinations-1"></span>
+<p>For example, with displayed mathematical formulas, you often need to
+adjust the &lsquo;<samp>raise</samp>&rsquo; option for the
+<span id="index-group-_0060eq_0027-2"></span>
+<span id="index-linkgroup-_0060eq_0027-1"></span>
+&lsquo;eq&rsquo; destgroup, because the formulas often contain large parentheses and
+brackets. But when doing so, you want to leave the other settings
+unchanged. To achieve this, call <code>\hldestopts</code> without the
+&lsquo;<samp>!</samp>&rsquo;, for example:
+</p>
+<div class="example">
+<pre class="example">$$\hldestopts[eq]{raise=2.5\normalbaselineskip}
+&hellip;
+$$
+</pre></div>
+
+<p>The display commands (&lsquo;<samp>$$</samp>&rsquo;) implicitly put the entire
+formula inside a (TeX) group (<code>\begingroup&hellip;\endgroup</code>), so
+you do not need to isolate the setting of the &lsquo;<samp>raise</samp>&rsquo; option&mdash;it
+will be restored after the closing &lsquo;<samp>$$</samp>&rsquo;.
+</p>
+<span id="index-option-list_002c-group"></span>
+<span id="index-group-option-list"></span>
+<span id="index-hyperlinks_002c-group-option-list"></span>
+<p>Initially, Eplain sets the option lists for almost all groups to empty,
+so that the groups fall back on the default values for all options. The
+one exception to this rule is the &lsquo;eq&rsquo; destgroup, whose initial option
+list contains one setting:
+</p>
+<div class="example">
+<pre class="example">raise=1.7\normalbaselineskip
+</pre></div>
+
+<p>This setting usually accommodates the large operators, which often
+appear in displayed math.
+</p>
+
+<hr>
+<span id="Turning-hyperlinks-on_002foff"></span><div class="header">
+<p>
+Next: <a href="#Making-PDF-outlines" accesskey="n" rel="next">Making PDF outlines</a>, Previous: <a href="#Setting-hyperlink-types-and-options" accesskey="p" rel="prev">Setting hyperlink types and options</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Turning-hyperlinks-on_002foff-1"></span><h3 class="section">5.6 Turning hyperlinks on/off</h3>
+
+<span id="index-omitting-hyperlinks-1"></span>
+<span id="index-disabling-hyperlinks-1"></span>
+<span id="index-hyperlinks_002c-disabling-1"></span>
+<span id="index-destinations_002c-disabling-1"></span>
+<p>Links and/or destinations can be turned on or off globally by disabling
+the low-level commands, or for each group individually.
+</p>
+<p>All these settings are local to the current (TeX) group, so if you
+want to enable or disable links/destinations temporarily, you can do so
+inside a <code>\begingroup&hellip;\endgroup</code> block; when the group ends, the
+previous settings are restored.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Turning-low_002dlevel-commands-on_002foff" accesskey="1">Turning low-level commands on/off</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Turning-hyperlinks-on_002foff-for-a-group" accesskey="2">Turning hyperlinks on/off for a group</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Turning-low_002dlevel-commands-on_002foff"></span><div class="header">
+<p>
+Next: <a href="#Turning-hyperlinks-on_002foff-for-a-group" accesskey="n" rel="next">Turning hyperlinks on/off for a group</a>, Up: <a href="#Turning-hyperlinks-on_002foff" accesskey="u" rel="up">Turning hyperlinks on/off</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Turning-low_002dlevel-commands-on_002foff-1"></span><h4 class="subsection">5.6.1 Turning low-level commands on/off</h4>
+
+<span id="index-hldeston"></span>
+<span id="index-hldestoff-1"></span>
+<span id="index-hlon"></span>
+<span id="index-hloff-1"></span>
+<p>The low-level commands <code>\hlstart</code>, <code>\hlend</code> and
+<code>\hldest</code> can be turned on/off with the following commands:
+</p>
+<div class="example">
+<pre class="example">\hldeston
+\hldestoff
+\hlon
+\hloff
+</pre></div>
+
+<p>See <a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a>, for the implications of using
+these commands to disable hyperlinks for the entire document.
+</p>
+
+<hr>
+<span id="Turning-hyperlinks-on_002foff-for-a-group"></span><div class="header">
+<p>
+Previous: <a href="#Turning-low_002dlevel-commands-on_002foff" accesskey="p" rel="prev">Turning low-level commands on/off</a>, Up: <a href="#Turning-hyperlinks-on_002foff" accesskey="u" rel="up">Turning hyperlinks on/off</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Turning-hyperlinks-on_002foff-for-a-group-1"></span><h4 class="subsection">5.6.2 Turning hyperlinks on/off for a group</h4>
+
+<span id="index-group_002c-disabling-hyperlinks"></span>
+<span id="index-hyperlink-group_002c-disabling-hyperlinks"></span>
+<p>If you want to disable links/destinations produced by certain groups,
+you can give a list of the groups as an optional argument to these
+commands:
+</p>
+<div class="example">
+<pre class="example">\hldeston[<var>groups</var>]
+\hldestoff[<var>groups</var>]
+\hlon[<var>groups</var>]
+\hloff[<var>groups</var>]
+</pre></div>
+
+<p>where <var>groups</var> is the list of linkgroups/destgroups. This
+list can contain two special groups. The empty group switches the
+low-level commands (see <a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a>), and the
+star (&lsquo;<samp>*</samp>&rsquo;) group operates on all defined groups.
+</p>
+<p>Note that turning off the low-level commands disables all hyperlinks
+globally, including groups which have them enabled. Turning off certain
+linkgroups/destgroups records the fact that the macros in the group
+should not produce links/destinations. To illustrate the distinction,
+assume that all links are on; after the following sequence of commands:
+</p>
+<div class="example">
+<pre class="example">\hloff
+\hloff[eq]
+\hlon
+</pre></div>
+
+<p>all links are on except for the &lsquo;eq&rsquo; linkgroup.
+</p>
+<hr>
+<span id="Making-PDF-outlines"></span><div class="header">
+<p>
+Previous: <a href="#Turning-hyperlinks-on_002foff" accesskey="p" rel="prev">Turning hyperlinks on/off</a>, Up: <a href="#Hyperlinks" accesskey="u" rel="up">Hyperlinks</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Making-PDF-outlines-1"></span><h3 class="section">5.7 Making PDF outlines</h3>
+
+<span id="index-outlines_002c-making-PDF"></span>
+<span id="index-bookmarks_002c-making-PDF"></span>
+<span id="index-PDF-outlines-_0028a_002ek_002ea_002e-bookmarks_0029"></span>
+
+<p>PDF outlines (a.k.a. bookmarks) are more or less a table of contents
+that PDF viewers can display alongside the main document. Eplain&rsquo;s
+hyperlink features can be used to create them; there isn&rsquo;t any special
+support for them. A continuing example interspersed with commentary
+follows.
+</p>
+<p>First we must enable hyperlinks.
+</p><div class="example">
+<pre class="example">\input eplain
+\enablehyperlinks %[dvipdfm] doesn't work
+</pre></div>
+
+<span id="index-ifpdf-2"></span>
+<span id="index-pdftex_002c-making-PDF-outlines-for"></span>
+<span id="index-dvips_002c-making-PDF-outlines-for"></span>
+<p>We will separate the code to support <code>pdftex</code> from <code>dvips</code>
+with the <code>\ifpdf</code> conditional (provided by Eplain).
+</p>
+<span id="index-pdfoutline-_0028pdftex-primitive_0029"></span>
+<p>For <code>pdftex</code>, we can use the <code>\pdfoutline</code> primitive. The
+keyword &quot;count&quot; is followed by the number of subentries in this entry.
+If negative, the bookmark is closed (that is, subentries are hidden).
+</p>
+<div class="example">
+<pre class="example">\ifpdf
+ \pdfoutline goto name {sec1} count -1 {Mysec-pdf}%
+ \pdfoutline goto name {sec1.1} {Mysubsec-pdf}%
+</pre></div>
+
+<span id="index-special-ps_003a-for-dvips"></span>
+<p>For <code>dvips</code>, we use TeX&rsquo;s <code>\special</code> command to emit a
+<code>ps:</code> special using the PDF <code>pdfmark</code> operator. The
+<code>ps:</code> prefix tells <code>dvips</code> that the following is literal
+PostScript.
+</p>
+<span id="index-pdfmark-_0028PDF-language-primitive_0029"></span>
+<p><code>[ ... pdfmark</code> (there is no closing &lsquo;<samp>]</samp>&rsquo;) is a extension to
+the PostScript language for specifying various PDF-related things. It
+is recognized by Ghostscript, Distiller, et al. Adobe publishes a
+reference manual for it:
+<a href="https://adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdfmark_reference.pdf">https://adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdfmark_reference.pdf</a>.
+</p>
+<span id="index-DOCVIEW-pdfmark"></span>
+<p>The <code>/DOCVIEW</code> pdfmark used here says the outline panel should be used.
+</p>
+<div class="example">
+<pre class="example">\else % not pdf output
+ \special{ps:[/PageMode /UseOutlines /DOCVIEW pdfmark}
+ %
+ % The individual outline entries, using a different syntax
+ % than pdftex, but the same information.
+ \special{ps:[/Count -1 /Dest (sec1) cvn /Title (Mysec-dvi)
+ /OUT pdfmark}
+ \special{ps:[/Count -0 /Dest (sec1.1) cvn /Title (Mysubsec-dvi)
+ /OUT pdfmark}
+\fi
+</pre></div>
+
+<p>The &lsquo;<samp>-pdf</samp>&rsquo; and &lsquo;<samp>-dvi</samp>&rsquo; suffixes in the strings above in the
+outline entries are just to make it clear which branch is being
+executed, for purposes of this example. Ordinarily the entries would
+be the same in both branches.
+</p>
+<p>Also, the strings above are literal PostScript constants, again for
+this example. Usually they would come from control sequences, e.g.,
+as the table of contents is read.
+</p>
+<span id="index-pdfescapestring-pdfTeX-primitive"></span>
+<p>It is necessary to &quot;pdf-escape&quot; such arbitrary strings, else
+backslashes, parentheses, etc., would not come out right. pdfTeX&rsquo;s
+<code>\pdfescapestring</code> primitive is an easy way to do this, e.g.,
+<code>\xdef#1{\pdfescapestring{#1}}</code>.
+</p>
+<p>Here is the document text, constructing three pages with the section
+and subsection given above in the outlines.
+</p>
+<div class="example">
+<pre class="example">First page.\vfil\eject
+
+\hldest{}{}{sec1}%
+1. Mysec on second page.\vfil\eject
+
+\hldest{}{}{sec1.1}%
+1.1. Mysubsec on third page.
+
+\end
+</pre></div>
+
+
+
+
+
+<hr>
+<span id="Arrow-theoretic-diagrams"></span><div class="header">
+<p>
+Next: <a href="#Programming-definitions" accesskey="n" rel="next">Programming definitions</a>, Previous: <a href="#Hyperlinks" accesskey="p" rel="prev">Hyperlinks</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Arrow-theoretic-diagrams-1"></span><h2 class="chapter">6 Arrow theoretic diagrams</h2>
+
+<p>This chapter describes definitions for producing commutative diagrams.
+</p>
+<p>Steven Smith wrote this documentation (and the macros).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Slanted-lines-and-vectors" accesskey="1">Slanted lines and vectors</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Commutative-diagrams" accesskey="2">Commutative diagrams</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr>
+<span id="Slanted-lines-and-vectors"></span><div class="header">
+<p>
+Next: <a href="#Commutative-diagrams" accesskey="n" rel="next">Commutative diagrams</a>, Up: <a href="#Arrow-theoretic-diagrams" accesskey="u" rel="up">Arrow theoretic diagrams</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Slanted-lines-and-vectors-1"></span><h3 class="section">6.1 Slanted lines and vectors</h3>
+
+<p>The macros <code>\drawline</code>
+<span id="index-drawline"></span>
+and <code>\drawvector</code>
+<span id="index-drawvector"></span>
+provide the capability found in LaTeX&rsquo;s
+<span id="index-LaTeX-3"></span>
+<span id="index-picture-mode-1"></span>
+picture mode to draw slanted lines and vectors of certain directions.
+Both of these macros take three arguments: two integer arguments to
+specify the direction of the line or vector, and one argument to specify
+its length. For example, &lsquo;<samp>\drawvector(-4,1){60pt}</samp>&rsquo; produces the
+vector
+<span id="index-lines"></span>
+<span id="index-vectors"></span>
+which lies in the 2d quadrant, has a slope of minus 1/4, and a width of
+60 pt.
+</p>
+<p>Note that if an <code>\hbox</code> is placed around <code>\drawline</code> or
+<code>\drawvector</code>, then the width of the <code>\hbox</code> will be the
+positive dimension specified in the third argument, except when a
+vertical line or vector is specified, e.g.,
+<code>\drawline(0,1){1in}</code>, which has zero width. If the specified
+direction lies in the 1st or 2d quadrant (e.g., <code>(1,1)</code> or
+<code>(-2,3)</code>), then the <code>\hbox</code> will have positive height and zero
+depth. Conversely, if the specified direction lies in the 3d or 4th
+quadrant (e.g., <code>(-1,-1)</code> or <code>(2,-3)</code>), then the <code>\hbox</code>
+will have positive depth and zero height.
+</p>
+<p>There are a finite number of directions that can be specified. For
+<code>\drawline</code>, the absolute value of each integer defining the
+direction must be less than or equal to six, i.e., <code>(7,-1)</code> is
+incorrect, but <code>(6,-1)</code> is acceptable. For <code>\drawvector</code>, the
+absolute value of each integer must be less than or equal to four.
+Furthermore, the two integers cannot have common divisors; therefore, if
+a line with slope 2 is desired, say <code>(2,1)</code> instead of
+<code>(4,2)</code>. Also, specify <code>(1,0)</code> instead of, say, <code>(3,0)</code>
+for horizontal lines and likewise for vertical lines.
+</p>
+<p>Finally, these macros depend upon the LaTeX font <code>line10</code>. If
+your site doesn&rsquo;t have this font, ask your system administrator to get
+it. Future enhancements will include macros to draw dotted lines and
+dotted vectors of various directions.
+</p>
+
+<hr>
+<span id="Commutative-diagrams"></span><div class="header">
+<p>
+Previous: <a href="#Slanted-lines-and-vectors" accesskey="p" rel="prev">Slanted lines and vectors</a>, Up: <a href="#Arrow-theoretic-diagrams" accesskey="u" rel="up">Arrow theoretic diagrams</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Commutative-diagrams-1"></span><h3 class="section">6.2 Commutative diagrams</h3>
+
+<span id="index-commutative-diagrams"></span>
+
+<p>The primitive commands <code>\drawline</code> and <code>\drawvector</code> can be
+used to typeset arrow theoretic diagrams. This section describes (1)
+macros to facilitate typesetting arrows and morphisms, and (2) macros to
+facilitate the construction of commutative diagrams. All macros
+described in this section must be used in math mode.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Arrows-and-morphisms" accesskey="1">Arrows and morphisms</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Construction-of-commutative-diagrams" accesskey="2">Construction of commutative diagrams</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Commutative-diagram-parameters" accesskey="3">Commutative diagram parameters</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr>
+<span id="Arrows-and-morphisms"></span><div class="header">
+<p>
+Next: <a href="#Construction-of-commutative-diagrams" accesskey="n" rel="next">Construction of commutative diagrams</a>, Up: <a href="#Commutative-diagrams" accesskey="u" rel="up">Commutative diagrams</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Arrows-and-morphisms-1"></span><h4 class="subsection">6.2.1 Arrows and morphisms</h4>
+<span id="index-arrows"></span>
+<span id="index-morphisms"></span>
+
+<p>The macros <code>\mapright</code> and <code>\mapleft</code> produce right and left
+<span id="index-mapright"></span>
+<span id="index-mapleft"></span>
+pointing arrows, respectively. Use superscript (<code>^</code>) to place a
+morphism above the arrow, e.g., &lsquo;<samp>\mapright^\alpha</samp>&rsquo;; use subscript
+(<code>_</code>) to place a morphism below the arrow, e.g.,
+&lsquo;<samp>\mapright_{\tilde l}</samp>&rsquo;. Superscripts and subscripts may be used
+simultaneously, e.g., &lsquo;<samp>\mapright^\pi_{\rm epimor.}</samp>&rsquo;.
+</p>
+<p>Similarly, the macros <code>\mapup</code> and <code>\mapdown</code> produce up and
+<span id="index-mapup"></span>
+<span id="index-mapdown"></span>
+down pointing arrows, respectively. Use <code>\rt</code>
+<span id="index-rt"></span>
+to place a morphism to the right of the arrow, e.g., &lsquo;<samp>\mapup\rt{\rm
+id}</samp>&rsquo;; use <code>\lft</code>
+<span id="index-lft"></span>
+to place a morphism to the left of the arrow, e.g., &lsquo;<samp>\mapup\lft\omega</samp>&rsquo;.
+<code>\lft</code> and <code>\rt</code> may be used simultaneously, e.g.,
+&lsquo;<samp>\mapdown\lft\pi\rt{\rm monomor.}</samp>&rsquo;.
+</p>
+<p>Slanted arrows are produced by the macro <code>\arrow</code>, which takes
+<span id="index-arrow"></span>
+a direction argument (e.g., &lsquo;<samp>\arrow(3,-4)</samp>&rsquo;). Use <code>\rt</code> and
+<code>\lft</code> to place morphisms to the right and left, respectively, of
+the arrow. A slanted line (no arrowhead) is produced with the macro
+<code>\sline</code>,
+<span id="index-sline"></span>
+whose syntax is identical to that of <code>\arrow</code>.
+</p>
+<p>The length of these macros is predefined by the default TeX
+dimensions <code>\harrowlength</code>,
+<span id="index-harrowlength"></span>
+for horizontal arrows (or lines),
+<code>\varrowlength</code>,
+<span id="index-varrowlength"></span>
+for vertical arrows (or lines), and
+<code>\sarrowlength</code>,
+<span id="index-sarrowlength"></span>
+for slanted arrows (or lines). To change any of these dimensions, say,
+e.g., &lsquo;<samp>\harrowlength=40pt</samp>&rsquo;. As with all other TeX dimensions,
+the change may be as global or as local as you like. Furthermore, the
+placement of morphisms on the arrows is controlled by the dimensions
+<code>\hmorphposn</code>,
+<span id="index-hmorphposn"></span>
+<code>\vmorphposn</code>,
+<span id="index-vmorphposn"></span>
+and <code>\morphdist</code>.
+<span id="index-morphdist"></span>
+The first two dimensions control the horizontal and vertical position of
+the morphism from its default position; the latter dimension controls
+the distance of the morphism from the arrow. If you have more than one
+morphism per arrow (i.e., a <code>^</code>/<code>_</code> or <code>\lft</code>/<code>\rt</code>
+construction), use the parameters
+<code>\hmorphposnup</code>,
+<span id="index-hmorphposnup"></span>
+<code>\hmorphposndn</code>,
+<span id="index-hmorphposndn"></span>
+<code>\vmorphposnup</code>,
+<span id="index-vmorphposnup"></span>
+<code>\vmorphposndn</code>,
+<span id="index-vmorphposndn"></span>
+<code>\hmorphposnrt</code>,
+<span id="index-hmorphposnrt"></span>
+<code>\hmorphposnlft</code>,
+<span id="index-hmorphposnlft"></span>
+<code>\vmorphposnrt</code>,
+<span id="index-vmorphposnrt"></span>
+and <code>\vmorphposnlft</code>.
+<span id="index-vmorphposnlft"></span>
+The default values of all these dimensions are provided in the section
+on parameters that follows below.
+</p>
+<p>There is a family of macros to produce horizontal lines, arrows, and
+adjoint arrows. The following macros produce horizontal maps and have
+the same syntax as <code>\mapright</code>:
+</p>
+<dl compact="compact">
+<dt><code>\mapright</code></dt>
+<dd><span id="index-mapright-1"></span>
+<p><code>$X\mapright Y$</code>
+= (a right arrow).
+</p>
+</dd>
+<dt><code>\mapleft</code></dt>
+<dd><span id="index-mapleft-1"></span>
+<p><code>$X\mapleft Y$</code>
+</p>
+</dd>
+<dt><code>\hline</code></dt>
+<dd><span id="index-hline"></span>
+<p><code>$X\hline Y$</code>
+</p>
+
+</dd>
+<dt><code>\bimapright</code></dt>
+<dd><span id="index-bimapright"></span>
+<p><code>$X\bimapright Y$</code>
+</p>
+</dd>
+<dt><code>\bimapleft</code></dt>
+<dd><span id="index-bimapleft"></span>
+<p><code>$X\bimapleft Y$</code>
+</p>
+</dd>
+<dt><code>\adjmapright</code></dt>
+<dd><span id="index-adjmapright"></span>
+<p><code>$X\adjmapright Y$</code>
+</p>
+</dd>
+<dt><code>\adjmapleft</code></dt>
+<dd><span id="index-adjmapleft"></span>
+<p><code>$X\adjmapleft Y$</code>
+</p>
+</dd>
+<dt><code>\bihline</code></dt>
+<dd><span id="index-bihline"></span>
+<p><code>$X\bihline Y$</code>
+</p></dd>
+</dl>
+
+<p>There is also a family of macros to produce vertical lines, arrows, and
+adjoint arrows. The following macros produce vertical maps and have
+the same syntax as <code>\mapdown</code>:
+</p>
+<dl compact="compact">
+<dt><code>\mapdown</code></dt>
+<dd><span id="index-mapdown-1"></span>
+<p>(a down arrow)
+</p>
+</dd>
+<dt><code>\mapup</code></dt>
+<dd><span id="index-mapup-1"></span>
+<p>(an up arrow)
+</p>
+</dd>
+<dt><code>\vline</code></dt>
+<dd><span id="index-vline"></span>
+<p>(vertical line)
+</p>
+
+</dd>
+<dt><code>\bimapdown</code></dt>
+<dd><span id="index-bimapdown"></span>
+<p>(two down arrows)
+</p>
+</dd>
+<dt><code>\bimapup</code></dt>
+<dd><span id="index-bimapup"></span>
+<p>(two up arrows)
+</p>
+</dd>
+<dt><code>\adjmapdown</code></dt>
+<dd><span id="index-adjmapdown"></span>
+<p>(two adjoint arrows; down then up)
+</p>
+</dd>
+<dt><code>\adjmapup</code></dt>
+<dd><span id="index-adjmapup"></span>
+<p>(two adjoint arrows; up then down)
+</p>
+</dd>
+<dt><code>\bivline</code></dt>
+<dd><span id="index-bivline"></span>
+<p>(two vertical lines)
+</p></dd>
+</dl>
+
+<p>Finally, there is a family of macros to produce slanted lines, arrows,
+and adjoint arrows. The following macros produce slanted maps and have
+the same syntax as <code>\arrow</code>:
+</p>
+<dl compact="compact">
+<dt><code>\arrow</code></dt>
+<dd><span id="index-arrow-1"></span>
+<p>(a slanted arrow)
+</p>
+</dd>
+<dt><code>\sline</code></dt>
+<dd><span id="index-sline-1"></span>
+<p>(a slanted line)
+</p>
+</dd>
+<dt><code>\biarrow</code></dt>
+<dd><span id="index-biarrow"></span>
+<p>(two straight arrows)
+</p>
+</dd>
+<dt><code>\adjarrow</code></dt>
+<dd><span id="index-adjarrow"></span>
+<p>(two adjoint arrows)
+</p>
+</dd>
+<dt><code>\bisline</code></dt>
+<dd><span id="index-bisline"></span>
+<p>(two straight lines)
+</p>
+</dd>
+</dl>
+
+<p>The width between double arrows is controlled by the parameter
+<code>\channelwidth</code>.
+<span id="index-channelwidth"></span>
+The parameters <code>\hchannel</code> and <code>\vchannel</code>, if nonzero,
+override <code>\channelwidth</code> by controlling the horizontal and vertical
+shifting from the first arrow to the second.
+</p>
+<p>There are no adornments on these arrows to distinguish inclusions from
+epimorphisms from monomorphisms. Many texts, such as Lang&rsquo;s book
+<cite>Algebra</cite>, use as a tasteful alternative the symbol &lsquo;inc&rsquo; (in roman) next
+to an arrow to denote inclusion.
+<span id="index-Lang_002c-Serge"></span>
+</p>
+<p>Future enhancements will include a mechanism to draw curved arrows
+found in, e.g., the Snake Lemma, by employing a version of the
+<code>\path</code> macros of Appendix D of <cite>The TeXbook</cite>.
+<span id="index-Snake-Lemma"></span>
+</p>
+
+<hr>
+<span id="Construction-of-commutative-diagrams"></span><div class="header">
+<p>
+Next: <a href="#Commutative-diagram-parameters" accesskey="n" rel="next">Commutative diagram parameters</a>, Previous: <a href="#Arrows-and-morphisms" accesskey="p" rel="prev">Arrows and morphisms</a>, Up: <a href="#Commutative-diagrams" accesskey="u" rel="up">Commutative diagrams</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Construction-of-commutative-diagrams-1"></span><h4 class="subsection">6.2.2 Construction of commutative diagrams</h4>
+
+<p>There are two approaches to the construction of commutative diagrams
+described here. The first approach, and the simplest, treats
+commutative diagrams like fancy matrices, as Knuth does in Exercise
+18.46 of <cite>The TeXbook</cite>. This case is covered by the macro
+<code>\commdiag</code>,
+<span id="index-commdiag"></span>
+which is an altered version of the Plain TeX macro <code>\matrix</code>.
+<span id="index-matrix"></span>
+An example suffices to demonstrate this macro. The following
+commutative diagram (illustrating the covering homotopy property; Bott
+and Tu, <cite>Differential Forms in Algebraic Topology</cite>)
+<span id="index-Bott_002c-Raoul"></span>
+<span id="index-Tu_002c-Loring-W_002e"></span>
+<span id="index-covering-homotopy-property"></span>
+is produced with the code
+</p>
+<div class="example">
+<pre class="example">$$\commdiag{Y&amp;\mapright^f&amp;E\cr \mapdown&amp;\arrow(3,2)\lft{f_t}&amp;\mapdown\cr
+Y\times I&amp;\mapright^{\bar f_t}&amp;X}$$
+</pre></div>
+
+<p>Of course, the parameters may be changed to produce a different effect.
+The following commutative diagram (illustrating the universal mapping
+property; Warner, <cite>Foundations of Differentiable Manifolds and Lie
+Groups</cite>)
+<span id="index-Warner_002c-Frank-W_002e"></span>
+<span id="index-universal-mapping-property"></span>
+is produced with the code
+</p>
+<div class="example">
+<pre class="example">$$\varrowlength=20pt
+\commdiag{V\otimes W\cr \mapup\lft\phi&amp;\arrow(3,-1)\rt{\tilde l}\cr
+V\times W&amp;\mapright^l&amp;U\cr}$$
+</pre></div>
+
+<p>A diagram containing isosceles triangles is achieved by placing the apex
+of the triangle in the center column, as shown in the example
+(illustrating all constant minimal realizations of a linear system;
+Brockett, <cite>Finite Dimensional Linear Systems</cite>)
+<span id="index-Brockett_002c-Roger-W_002e"></span>
+<span id="index-minimal-realizations"></span>
+<span id="index-linear-systems-theory"></span>
+which is produced with the code
+</p>
+<div class="example">
+<pre class="example">$$\sarrowlength=.42\harrowlength
+\commdiag{&amp;R^m\cr &amp;\arrow(-1,-1)\lft{\bf B}\quad \arrow(1,-1)\rt{\bf G}\cr
+R^n&amp;\mapright^{\bf P}&amp;R^n\cr
+\mapdown\lft{e^{{\bf A}t}}&amp;&amp;\mapdown\rt{e^{{\bf F}t}}\cr
+R^n&amp;\mapright^{\bf P}&amp;R^n\cr
+&amp;\arrow(1,-1)\lft{\bf C}\quad \arrow(-1,-1)\rt{\bf H}\cr
+&amp;R^q\cr}$$
+</pre></div>
+
+<p>Other commutative diagram examples appear in the file
+<code>commdiags.tex</code>, which is distributed with this package.
+</p>
+<p>In these examples the arrow lengths and line slopes were carefully
+chosen to blend with each other. In the first example, the default
+settings for the arrow lengths are used, but a direction for the arrow
+must be chosen. The ratio of the default horizontal and vertical arrow
+lengths is approximately the golden mean
+<span id="index-golden-mean"></span>
+<span id="index-golden-mean-1"></span>
+the arrow direction closest to this mean is <code>(3,2)</code>. In the second
+example, a slope of
+is desired and the default horizontal arrow length is 60 pt; therefore,
+choose a vertical arrow length of 20 pt. You may affect the interline
+glue settings of <code>\commdiag</code> by redefining the macro
+<code>\commdiagbaselines</code>.
+<span id="index-commdiagbaselines"></span>
+(cf. Exercise 18.46 of <cite>The TeXbook</cite> and the section on
+parameters below.)
+</p>
+<p>The width, height, and depth of all morphisms are hidden so that the
+morphisms&rsquo; size do not affect arrow positions. This can cause a large
+morphism at the top or bottom of a diagram to impinge upon the text
+surrounding the diagram. To overcome this problem, use TeX&rsquo;s
+<code>\noalign</code> primitive to insert a <code>\vskip</code> immediately above or
+below the offending line, e.g.,
+&lsquo;<samp>$$\commdiag{\noalign{\vskip6pt}X&amp;\mapright^\int&amp;Y\cr ...}</samp>&rsquo;.
+</p>
+<p>The macro <code>\commdiag</code> is too simple to be used for more complicated
+diagrams, which may have intersecting or overlapping arrows. A second
+approach, borrowed from Francis Borceux&rsquo;s <cite>Diagram</cite> macros for
+LaTeX, treats the commutative diagram like a grid of identically
+shaped boxes. To compose the commutative diagram, first draw an equally
+spaced grid, e.g.,
+<span id="index-grid"></span>
+<span id="index-Borceux_002c-Francis"></span>
+<span id="index-Diagram_002c-macros-for-LaTeX"></span>
+on a piece of scratch paper. Then draw each element (vertices and
+arrows) of the commutative diagram on this grid, centered at each
+grid point. Finally, use the macro <code>\gridcommdiag</code>
+<span id="index-gridcommdiag"></span>
+to implement your design as a TeX alignment. For example, the cubic
+diagram
+<span id="index-cube"></span>
+that appears in Francis Borceux&rsquo;s documentation can be implemented on
+a 7 by 7 grid, and is achieved with the code
+</p>
+<div class="example">
+<pre class="example">$$\harrowlength=48pt \varrowlength=48pt \sarrowlength=20pt
+\def\cross#1#2{\setbox0=\hbox{$#1$}%
+ \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+\gridcommdiag{&amp;&amp;B&amp;&amp;\mapright^b&amp;&amp;D\cr
+&amp;\arrow(1,1)\lft a&amp;&amp;&amp;&amp;\arrow(1,1)\lft d\cr
+A&amp;&amp;\cross{\hmorphposn=12pt\mapright^c}{\vmorphposn=-12pt\mapdown\lft f}
+&amp;&amp;C&amp;&amp;\mapdown\rt h\cr\cr
+\mapdown\lft e&amp;&amp;F&amp;&amp;\cross{\hmorphposn=-12pt\mapright_j}
+{\vmorphposn=12pt\mapdown\rt g}&amp;&amp;H\cr
+&amp;\arrow(1,1)\lft i&amp;&amp;&amp;&amp;\arrow(1,1)\rt l\cr
+E&amp;&amp;\mapright_k&amp;&amp;G\cr}$$
+</pre></div>
+
+<p>The dimensions <code>\hgrid</code> and <code>\vgrid</code>
+<span id="index-hgrid"></span>
+<span id="index-vgrid"></span>
+control the horizontal and vertical spacing of the grid used by
+<code>\gridcommdiag</code>. The default setting for both of these dimensions
+is 15 pt. Note that in the example of the cube the arrow lengths must
+be adjusted so that the arrows overlap into neighboring boxes by the
+desired amount. Hence, the <code>\gridcommdiag</code> method, albeit more
+powerful, is less automatic than the simpler <code>\commdiag</code> method.
+Furthermore, the ad hoc macro <code>\cross</code> is introduced to allow the
+effect of overlapping arrows. Finally, note that the positions of four
+of the morphisms are adjusted by setting <code>\hmorphposn</code> and
+<code>\vmorphposn</code>.
+</p>
+<p>One is not restricted to a square grid. For example, the proof of
+Zassenhaus&rsquo;s Butterfly Lemma can be illustrated by the diagram (appearing
+in Lang&rsquo;s book <cite>Algebra</cite>)
+<span id="index-Zassenhaus_002c-Hans"></span>
+<span id="index-Lang_002c-Serge-1"></span>
+<span id="index-Butterfly-Lemma"></span>
+This diagram may be implemented on a 9 by 12 grid with an aspect ratio
+of 1/2, and is set with the code
+</p>
+<div class="example">
+<pre class="example">$$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt
+\def\cross#1#2{\setbox0=\hbox{$#1$}%
+ \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+\def\l#1{\llap{$#1$\hskip.5em}}
+\def\r#1{\rlap{\hskip.5em$#1$}}
+\gridcommdiag{&amp;&amp;U&amp;&amp;&amp;&amp;V\cr &amp;&amp;\bullet&amp;&amp;&amp;&amp;\bullet\cr
+&amp;&amp;\sarrowlength=16pt\sline(0,1)&amp;&amp;&amp;&amp;\sarrowlength=16pt\sline(0,1)\cr
+&amp;&amp;\l{u(U\cap V)}\bullet&amp;&amp;&amp;&amp;\bullet\r{(U\cap V)v}\cr
+&amp;&amp;&amp;\sline(2,-1)&amp;&amp;\sline(2,1)\cr
+&amp;&amp;\cross{=}{\sline(0,1)}&amp;&amp;\bullet&amp;&amp;\cross{=}{\sline(0,1)}\cr\cr
+&amp;&amp;\l{^{\textstyle u(U\cap v)}}\bullet&amp;&amp;\cross{=}{\sline(0,1)}&amp;&amp;
+ \bullet\r{^{\textstyle(u\cap V)v}}\cr
+&amp;\sline(2,1)&amp;&amp;\sline(2,-1)&amp;&amp;\sline(2,1)&amp;&amp;\sline(2,-1)\cr
+\l{u}\bullet&amp;&amp;&amp;&amp;\bullet&amp;&amp;&amp;&amp;\bullet\r{v}\cr
+&amp;\sline(2,-1)&amp;&amp;\sline(2,1)&amp;&amp;\sline(2,-1)&amp;&amp;\sline(2,1)\cr
+&amp;&amp;\bullet&amp;&amp;&amp;&amp;\bullet\cr &amp;&amp;u\cap V&amp;&amp;&amp;&amp;U\cap v\cr}$$
+</pre></div>
+
+<p>Again, the construction of this diagram requires careful choices for the
+arrow lengths and is facilitated by the introduction of the ad hoc
+macros <code>\cross</code>, <code>\r</code>, and <code>\l</code>. Note also that
+superscripts were used to adjust the position of the vertices
+Many diagrams may be typeset with the predefined macros that appear
+here; however, ingenuity is often required to handle special cases.
+</p>
+<hr>
+<span id="Commutative-diagram-parameters"></span><div class="header">
+<p>
+Previous: <a href="#Construction-of-commutative-diagrams" accesskey="p" rel="prev">Construction of commutative diagrams</a>, Up: <a href="#Commutative-diagrams" accesskey="u" rel="up">Commutative diagrams</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Commutative-diagram-parameters-1"></span><h4 class="subsection">6.2.3 Commutative diagram parameters</h4>
+
+<p>The following is a list describing the parameters used in the
+commutative diagram macros. These dimensions may be changed globally or
+locally.
+</p>
+<dl compact="compact">
+<dt><code>\harrowlength</code></dt>
+<dd><span id="index-harrowlength-1"></span>
+<p>(Default: 60 pt) The length of right or left arrows.
+</p>
+</dd>
+<dt><code>\varrowlength</code></dt>
+<dd><span id="index-varrowlength-1"></span>
+<p>(Default: 0.618<code>\harrowlength</code>) The length of up or down
+arrows.
+</p>
+</dd>
+<dt><code>\sarrowlength</code></dt>
+<dd><span id="index-sarrowlength-1"></span>
+<p>(Default: 60 pt) The horizontal length of slanted arrows.
+</p>
+</dd>
+<dt><code>\hmorphposn</code></dt>
+<dd><span id="index-hmorphposn-1"></span>
+<p>(Default: 0 pt) The horizontal position of the morphism with
+respect to its default position. There are also the dimensions
+<code>\hmorphposnup</code>,
+<span id="index-hmorphposnup-1"></span>
+<code>\hmorphposndn</code>,
+<span id="index-hmorphposndn-1"></span>
+<code>\hmorphposnrt</code>,
+<span id="index-hmorphposnrt-1"></span>
+and <code>\hmorphposnlft</code>
+<span id="index-hmorphposnlft-1"></span>
+for <code>^</code>/<code>_</code> or <code>\lft</code>/<code>\rt</code> constructions.
+</p>
+</dd>
+<dt><code>\vmorphposn</code></dt>
+<dd><span id="index-vmorphposn-1"></span>
+<p>(Default: 0 pt) The vertical position of the morphism with
+respect to its default position. There are also the dimensions
+<code>\vmorphposnup</code>,
+<span id="index-vmorphposnup-1"></span>
+<code>\vmorphposndn</code>,
+<span id="index-vmorphposndn-1"></span>
+<code>\vmorphposnrt</code>,
+<span id="index-vmorphposnrt-1"></span>
+and <code>\vmorphposnlft</code>
+<span id="index-vmorphposnlft-1"></span>
+for <code>^</code>/<code>_</code> or <code>\lft</code>/<code>\rt</code> constructions.
+</p>
+</dd>
+<dt><code>\morphdist</code></dt>
+<dd><span id="index-morphdist-1"></span>
+<p>(Default: 4 pt) The distance of morphisms from slanted lines
+or arrows.
+</p>
+</dd>
+<dt><code>\channelwidth</code></dt>
+<dd><span id="index-channelwidth-1"></span>
+<p>(Default: 3 pt) The distance between double lines or arrows.
+</p>
+</dd>
+<dt><code>\hchannel, \vchannel</code></dt>
+<dd><span id="index-hchannel"></span>
+<span id="index-vchannel"></span>
+<p>(Defaults: 0 pt) Overrides <code>\channelwidth</code>. The
+horizontal and vertical shifts between double lines or arrows.
+</p>
+</dd>
+<dt><code>\commdiagbaselines</code></dt>
+<dd><span id="index-commdiagbaselines-1"></span>
+<p>(Default: <code>\baselineskip=15pt
+\lineskip=3pt
+\lineskiplimit=3pt </code>)
+The parameters used by <code>\commdiag</code> for setting interline glue.
+</p>
+</dd>
+<dt><code>\hgrid</code></dt>
+<dd><span id="index-hgrid-1"></span>
+<p>(Default: 15 pt) The horizontal spacing of the grid used by
+<code>\gridcommdiag</code>.
+</p>
+</dd>
+<dt><code>\vgrid</code></dt>
+<dd><span id="index-vgrid-1"></span>
+<p>(Default: 15 pt) The vertical spacing of the grid used by
+<code>\gridcommdiag</code>.
+</p>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Programming-definitions"></span><div class="header">
+<p>
+Next: <a href="#Demo-files" accesskey="n" rel="next">Demo files</a>, Previous: <a href="#Arrow-theoretic-diagrams" accesskey="p" rel="prev">Arrow theoretic diagrams</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Programming-definitions-1"></span><h2 class="chapter">7 Programming definitions</h2>
+
+<p>The definitions in this section are only likely to be useful when you
+are writing nontrivial macros, not when writing a document.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Category-codes" accesskey="1">Category codes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing category codes.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Allocation-macros" accesskey="2">Allocation macros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Non-outer versions of \newcount et al.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Iteration" accesskey="3">Iteration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Doing &lsquo;for&rsquo; and &lsquo;while&rsquo; loops in TeX.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Macro-arguments" accesskey="4">Macro arguments</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Reading and ignoring them.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Converting-to-characters" accesskey="5">Converting to characters</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Normalizing control sequences and spaces.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Expansion" accesskey="6">Expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Controlling expansion.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Obeying-spaces" accesskey="7">Obeying spaces</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making whitespace count anywhere.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Writing-out-numbers" accesskey="8">Writing out numbers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Making &lsquo;1&rsquo; into &lsquo;one&rsquo;.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Mode_002dspecific-penalties" accesskey="9">Mode-specific penalties</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Auxiliary-files">Auxiliary files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Testing for their existence.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#User_002ddefined-environments">User-defined environments</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">User-defined environments.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Category-codes"></span><div class="header">
+<p>
+Next: <a href="#Allocation-macros" accesskey="n" rel="next">Allocation macros</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Category-codes-1"></span><h3 class="section">7.1 Category codes</h3>
+
+<span id="index-category-codes"></span>
+
+<p>Plain TeX defines <code>\active</code> (as the number 13) for use in
+changing category codes. Although the author of <cite>The TeXbook</cite>
+<span id="index-Knuth_002c-Donald-Ervin-1"></span>
+has &ldquo;intentionally kept the category codes numeric&rdquo;, two other
+categories are commonly used: letters (category code 11) and others
+(12). Therefore, Eplain defines <code>\letter</code> and
+<code>\other</code>.
+<span id="index-letter"></span>
+<span id="index-other"></span>
+</p>
+<p>Sometimes it is cleaner to make a character active without actually
+<span id="index-active-characters"></span>
+writing a <code>\catcode</code> command. The <code>\makeactive</code> command takes
+<span id="index-catcode"></span>
+<span id="index-makeactive"></span>
+a character as an argument to make active (and ignores following
+spaces). For example, here are two commands which both make <kbd>\</kbd>
+active:
+<span id="index-backslash-character"></span>
+</p>
+<div class="example">
+<pre class="example">\makeactive\\ \makeactive92
+</pre></div>
+
+<span id="index-user_002dinaccessible-macros"></span>
+<span id="index-inaccessible-macros"></span>
+<p>Sometimes you might want to temporarily change the category code of
+the &lsquo;@&rsquo; character to <code>\letter</code>, so that you can use or define
+macros which are normally inaccessible to the user. For such
+situations, Eplain provides the <code>\makeatletter</code>
+<span id="index-makeatletter"></span>
+command. It sets the category code of &lsquo;@&rsquo; to <code>\letter</code> (11) and
+defines
+<code>\resetatcatcode</code>
+<span id="index-resetatcatcode-1"></span>
+to restore the category code to whatever it was before the call to
+<code>\makeatletter</code>. For example:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+\def\@hidden@macro{This macro cannot normally be
+ called / redefined by the user}
+\resetatcatcode
+</pre></div>
+
+<p>There is also <code>\makeatother</code>
+<span id="index-makeatother"></span>
+which works similarly but sets the category code of &lsquo;@&rsquo; to
+<code>\other</code> (12).
+</p>
+<p>Usually, when you give a definition to an active character, you have
+to do so inside a group where you temporarily make the character active,
+and then give it a global definition (cf. the definition of
+<code>\obeyspaces</code> in <cite>The TeXbook</cite>).
+<span id="index-definitions_002c-global"></span>
+This is inconvenient if you are writing a long macro, or if the
+character already has a global definition you do not wish to transcend.
+Eplain provides <code>\letreturn</code>, which defines the usual end-of-line
+<span id="index-letreturn"></span>
+<span id="index-return-character"></span>
+character to be the argument. For example:
+</p>
+<div class="example">
+<pre class="example">\def\mymacro{&hellip; \letreturn\myreturn &hellip; }
+\mymacro hello
+there
+</pre></div>
+
+<p>The end-of-line between &lsquo;<samp>hello</samp>&rsquo; and &lsquo;<samp>there</samp>&rsquo; causes
+<code>\myreturn</code> to be expanded.
+</p>
+<p><cite>The TeXbook</cite> describes <code>\uncatcodespecials</code>,
+<span id="index-uncatcodespecials-1"></span>
+which makes all characters which are normally &ldquo;special&rdquo; into &ldquo;other&rdquo;
+characters, but the definition never made it into plain TeX.
+Eplain therefore defines it. For notes on the usage, see <a href="#Verbatim-listing">Verbatim listing</a>.
+</p>
+<p>Finally, <code>\percentchar</code>
+<span id="index-percentchar"></span>
+expands into a literal &lsquo;%&rsquo; character. This is useful when you
+<code>\write</code> TeX output to a file, and want to avoid spurious
+spaces. For example, Eplain writes a <code>\percentchar</code> after the
+definition of cross-references. The macros <code>\lbracechar</code>
+<span id="index-lbracechar"></span>
+and <code>\rbracechar</code>
+<span id="index-rbracechar"></span>
+expand similarly.
+</p>
+
+<hr>
+<span id="Allocation-macros"></span><div class="header">
+<p>
+Next: <a href="#Iteration" accesskey="n" rel="next">Iteration</a>, Previous: <a href="#Category-codes" accesskey="p" rel="prev">Category codes</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Allocation-macros-1"></span><h3 class="section">7.2 Allocation macros</h3>
+
+<span id="index-allocation-macros"></span>
+<span id="index-register-allocation"></span>
+
+<p>Plain TeX provides macros that allocate registers of each primitive
+type in TeX, to prevent different sets of macros from using the same
+register for two different things. The macros are all named starting
+with &lsquo;<samp>new</samp>&rsquo;,
+<span id="index-new_2026"></span>
+e.g., <code>\newcount</code> allocates a new &ldquo;count&rdquo;
+(integer) register. Such allocations are usually needed only at the top
+level of some macro definition file; therefore, plain TeX makes the
+allocation registers <code>\outer</code>,
+<span id="index-outer"></span>
+to help find errors. (The error this helps to find is a missing right
+brace in some macro definition.)
+</p>
+<p>Sometimes, however, it is useful to allocate a register as part of
+some macro. An outer control sequence cannot be used as part of a macro
+definition (or in a few other contexts: the parameter text of a
+definition, an argument to a definition, the preamble of an alignment,
+or in conditional text that is being skipped). Therefore, Eplain
+defines &ldquo;inner&rdquo; versions of all the allocation macros, named with the
+prefix &lsquo;<samp>inner</samp>&rsquo;:
+<code>\innernewbox</code>,
+<span id="index-innernewbox"></span>
+<code>\innernewcount</code>,
+<span id="index-innernewcount"></span>
+<code>\innernewdimen</code>,
+<span id="index-innernewdimen"></span>
+<code>\innernewfam</code>,
+<span id="index-innernewfam"></span>
+<code>\innernewhelp</code>,
+<span id="index-innernewhelp"></span>
+<code>\innernewif</code>,
+<span id="index-innernewif"></span>
+<code>\innernewinsert</code>,
+<span id="index-innernewinsert"></span>
+<code>\innernewlanguage</code>,
+<span id="index-innernewlanguage"></span>
+<code>\innernewread</code>,<br>
+<span id="index-innernewread"></span>
+<code>\innernewskip</code>,
+<span id="index-innernewskip"></span>
+<code>\innernewtoks</code>,
+<span id="index-innernewtoks"></span>
+<code>\innernewwrite</code>.
+<span id="index-innernewwrite"></span>
+</p>
+<p>You can also define non-outer versions of other macros in the same way
+that Eplain defines the above. The basic macro is called
+<code>\innerdef</code>:
+<span id="index-innerdef"></span>
+</p>
+<div class="example">
+<pre class="example">\innerdef <var>\innername</var> {<var>outername</var>}
+</pre></div>
+
+<p>The first argument (<var>\innername</var>) to <code>\innerdef</code> is the
+control sequence that you want to define. Any previous definition of
+<var>\innername</var> is replaced. The second argument
+(<var>outername</var>) is the <em>characters</em> in the name of the outer
+control sequence. (You can&rsquo;t use the actual control sequence name,
+since it&rsquo;s outer!)
+</p>
+<p>If the outer control sequence is named <var>\cs</var>, and you want to
+define <code>inner<var>cs</var></code> as the inner one, you can use
+<code>\innerinnerdef</code>,
+<span id="index-innerinnerdef"></span>
+which is just an abbreviation for a call to <code>\innerdef</code>. For
+example, these two calls are equivalent:
+</p>
+<div class="example">
+<pre class="example">\innerdef\innerproclaim{proclaim}
+\innerinnerdef{proclaim}
+</pre></div>
+
+
+<hr>
+<span id="Iteration"></span><div class="header">
+<p>
+Next: <a href="#Macro-arguments" accesskey="n" rel="next">Macro arguments</a>, Previous: <a href="#Allocation-macros" accesskey="p" rel="prev">Allocation macros</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Iteration-1"></span><h3 class="section">7.3 Iteration</h3>
+
+<span id="index-iteration"></span>
+<span id="index-loops"></span>
+<span id="index-for-loops"></span>
+<span id="index-while-loops"></span>
+<span id="index-do_2026while-loops"></span>
+
+<p>You can iterate through a comma-separated list of items with
+<code>\for</code>.
+<span id="index-for"></span>
+Here is an example:
+</p>
+<div class="example">
+<pre class="example">\for\name:=karl,kathy\do{%
+ \message{\name}%
+}%
+</pre></div>
+
+<p>This writes &lsquo;<samp>karl</samp>&rsquo; and &lsquo;<samp>kathy</samp>&rsquo; to the terminal. Spaces
+before or after the commas in the list, or after the <code>:=</code>, are
+<em>not</em> ignored. To strip leading spaces off the items, use
+<code>\For</code>:
+<span id="index-For"></span>
+</p>
+<div class="example">
+<pre class="example">\For\name:=
+ karl,
+ kathy\do{%
+ \message{\name}%
+ }%
+</pre></div>
+
+<p>Note that trailing spaces are still <em>not</em> ignored.
+</p>
+<p>Both <code>\for</code> and <code>\For</code> expand the first token of the item
+list fully, so this is equivalent to the above:
+</p>
+<div class="example">
+<pre class="example">\def\namelist{karl,kathy}%
+\for\name:=\namelist\do &hellip;
+</pre></div>
+
+<p>However, this won&rsquo;t work, either with <code>\for</code> or with
+<code>\For</code>:
+</p>
+<div class="example">
+<pre class="example">\def\namelist{karl,kathy}%
+\For\name:= \namelist\do &hellip;
+</pre></div>
+
+<p>because <code>\for</code> and <code>\For</code> expand the first
+token after <code>:=</code> which is space, not <code>\namelist</code>.
+</p>
+<p>Eplain provides another kind of loops, which is an extension of plain
+TeX&rsquo;s
+<span id="index-loop"></span>
+<code>\loop</code>. If you say:
+</p>
+<span id="index-repeat"></span>
+<div class="example">
+<pre class="example">\loop
+ <var>loop-text</var>
+\if <var>condition</var>
+ <var>if-text</var>
+\repeat
+</pre></div>
+
+<p>then <var>loop-text</var> will be repeated as long as <var>condition</var>
+is satisfied (<code>\if</code> can be any of the TeX&rsquo;s conditional
+commands, without the matching <code>\fi</code>). Eplain extends this with
+the optional else clause:
+</p>
+<div class="example">
+<pre class="example">\loop
+ <var>loop-text</var>
+\if <var>condition</var>
+ <var>if-text</var>
+\else
+ <var>else-text</var>
+\repeat
+</pre></div>
+
+<p>Here, <var>loop-text</var> will be repeated as long as
+<var>condition</var> is <em>not</em> satisfied. This extension is from
+<span id="index-Eijkhout_002c-Victor"></span>
+Victor Eijkhout&rsquo;s
+<span id="index-TeX-by-Topic"></span>
+<i>TeX by Topic</i> (page&nbsp;104).
+</p>
+
+<hr>
+<span id="Macro-arguments"></span><div class="header">
+<p>
+Next: <a href="#Converting-to-characters" accesskey="n" rel="next">Converting to characters</a>, Previous: <a href="#Iteration" accesskey="p" rel="prev">Iteration</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Macro-arguments-1"></span><h3 class="section">7.4 Macro arguments</h3>
+
+<span id="index-arguments_002c-ignoring"></span>
+<span id="index-ignoring-arguments"></span>
+<span id="index-gobbling-arguments"></span>
+<p>It is occasionally useful to redefine a macro that takes arguments to
+do nothing. Eplain defines <code>\gobble</code>,
+<span id="index-gobble"></span>
+<code>\gobbletwo</code>,
+<span id="index-gobbletwo"></span>
+and <code>\gobblethree</code> to swallow one, two, and three arguments,
+respectively.
+</p>
+<p>For example, if you want to produce a &ldquo;short&rdquo; table of
+<span id="index-table-of-contents_002c-short-1"></span>
+contents&mdash;one that includes only chapters, say&mdash;the easiest thing to
+do is read the entire <code>.toc</code> file (see <a href="#Contents">Contents</a>), and just
+ignore the commands that produce section or subsection entries. To be
+specific:
+</p>
+<div class="example">
+<pre class="example">\let\tocchapterentry = \shorttocchapter
+\let\tocsectionentry = \gobbletwo
+\let\tocsubsectionentry = \gobbletwo
+\readtocfile
+</pre></div>
+
+<p>(Of course, this assumes you only have chapters, sections, and
+subsections in your document.)
+</p>
+<p>In addition, Eplain defines <code>\eattoken</code>
+<span id="index-eattoken"></span>
+to swallow the single following token, using <code>\let</code>. Thus,
+<code>\gobble</code> followed by &lsquo;<samp>{&hellip;}</samp>&rsquo; ignores the entire
+brace-enclosed text. <code>\eattoken</code> followed by the same ignores only
+the opening left brace.
+</p>
+<p>Eplain defines a macro <code>\identity</code>
+<span id="index-identity"></span>
+which takes one argument and expands to that argument. This may be
+useful if you want to provide a function for the user to redefine, but
+don&rsquo;t need to do anything by default. (For example, the default
+definition of <code>\eqconstruct</code> (see <a href="#Formatting-equation-references">Formatting equation references</a>) is <code>\identity</code>.)
+</p>
+<p>You may also want to read an optional argument. The established
+convention is that optional arguments are put in square brackets, so
+that is the syntax Eplain recognizes. Eplain ignores space tokens
+before and after optional arguments, via <code>\futurenonspacelet</code>.
+</p>
+<p>You test for an optional argument by using <code>\@getoptionalarg</code>.
+<span id="index-_0040getoptionalarg"></span>
+It takes one argument, a control sequence to expand after reading the
+argument, if present. If an optional argument is present, the control
+sequence <code>\@optionalarg</code> expands to it; otherwise,
+<code>\@optionalarg</code> is <code>\empty</code>. You must therefore have the
+category code of <kbd>@</kbd> set to 11 (letter). Here is an example:
+</p>
+<div class="example">
+<pre class="example">\catcode`@=\letter
+\def\cmd{\@getoptionalarg\finishcmd}
+\def\finishcmd{%
+ \ifx\@optionalarg\empty
+ % <span class="roman">No optional argument present.</span>
+ \else
+ % <span class="roman">One was present.</span>
+ \fi
+}
+</pre></div>
+
+<p>It&rsquo;s possible to define macros that appear to accept optional
+arguments intermixed with mandatory arguments in any imaginable way.
+For example:
+</p>
+<div class="example">
+<pre class="example">\makeatletter
+% \mo{m}[o]
+\def\mo#1{\def\mo@arg{#1}\@getoptionalarg\fin@mo}
+\def\fin@mo{\vskip1pc
+ ARG: \mo@arg \par
+ OPTARG: \@optionalarg \par
+}
+% \mom{m}[o]{m}
+\def\mom#1{\def\mom@arg{#1}\@getoptionalarg\fin@mom}
+\def\fin@mom#1{\vskip1pc
+ ARG1: \mom@arg \par
+ OPTARG: \@optionalarg \par
+ ARG2: #1\par
+}
+% \omo[o]{m}[o]
+\def\omo{\@getoptionalarg\fin@omo}
+\def\fin@omo#1{\let\omo@optarg\@optionalarg
+ \def\omo@arg{#1}\@getoptionalarg\@fin@omo}
+\def\@fin@omo{\vskip1pc
+ OPTARG1: \omo@optarg \par
+ ARG: \omo@arg \par
+ OPTARG2: \@optionalarg \par
+}
+\makeatother
+</pre></div>
+
+<p>If an optional argument contains another optional argument, the inner
+one will need to be enclosed in braces, so TeX does not mistake the
+end of the first for the end of the second.
+</p>
+
+<hr>
+<span id="Converting-to-characters"></span><div class="header">
+<p>
+Next: <a href="#Expansion" accesskey="n" rel="next">Expansion</a>, Previous: <a href="#Macro-arguments" accesskey="p" rel="prev">Macro arguments</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Converting-to-characters-1"></span><h3 class="section">7.5 Converting to characters</h3>
+
+<span id="index-characters_002c-converting-to"></span>
+<p>Eplain defines <code>\xrlabel</code>
+<span id="index-xrlabel"></span>
+to produce control sequence names for cross-reference labels, et al.
+This macro expands to its argument with an &lsquo;<samp>_</samp>&rsquo; appended. (It does
+this because the usual use of <code>\xrlabel</code> is to generate a control
+sequence name, and we naturally want to avoid conflicts between control
+sequence names.)
+</p>
+<p>Because <code>\xrlabel</code> is fully expandable, to make a control
+sequence name out of the result you need only do
+</p>
+<div class="example">
+<pre class="example"><code>\csname \xrlabel{<var>label</var>}\endcsname</code>
+</pre></div>
+
+<p>The <code>\csname</code> primitive makes a control sequence name out
+of any sequence of character tokens, regardless of category code.
+Labels can therefore include any characters except for &lsquo;<samp>\</samp>&rsquo;,
+&lsquo;<samp>{</samp>&rsquo;, &lsquo;<samp>}</samp>&rsquo;, and &lsquo;<samp>#</samp>&rsquo;, all of which are used in macro
+definitions themselves.
+</p>
+<span id="index-sanitize"></span>
+<p><code>\sanitize</code> takes a control sequence as an argument and converts
+the expansion of the control sequence into a list of character tokens.
+This is the behavior you want when writing information like chapter
+titles to an output file. For example, here is part of the definition
+of <code>\writenumberedtocentry</code>; <code>#2</code> is the title that the user
+has given.
+</p>
+<div class="example">
+<pre class="example">&hellip;
+\def\temp{#2}%
+&hellip;
+ \write\tocfile{%
+ &hellip;
+ \sanitize\temp
+ &hellip;
+ }%
+</pre></div>
+
+
+<hr>
+<span id="Expansion"></span><div class="header">
+<p>
+Next: <a href="#Obeying-spaces" accesskey="n" rel="next">Obeying spaces</a>, Previous: <a href="#Converting-to-characters" accesskey="p" rel="prev">Converting to characters</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Expansion-1"></span><h3 class="section">7.6 Expansion</h3>
+
+<p>This section describes some miscellanous macros for expansion, etc.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005ccsn-and-_005cece" accesskey="1">\csn and \ece</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Abbreviations for \csname expansions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cedefappend" accesskey="2">\edefappend</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hooks" accesskey="3">Hooks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Manipulating and executing named actions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Properties" accesskey="4">Properties</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Associating information with a csname.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cexpandonce" accesskey="5">\expandonce</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cifundefined" accesskey="6">\ifundefined</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cifempty" accesskey="7">\ifempty</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cifinteger-and-_005cisinteger" accesskey="8">\ifinteger and \isinteger</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cfuturenonspacelet" accesskey="9">\futurenonspacelet</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="g_t_005ccsn-and-_005cece"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cedefappend" accesskey="n" rel="next">\edefappend</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005ccsn-and-_005cece-1"></span><h4 class="subsection">7.6.1 <code>\csn</code> and <code>\ece</code></h4>
+
+<span id="index-csn"></span>
+<p><code>\csn</code>{<var>name</var>} simply abbreviates <code>\csname</code> <var>name</var>
+<code>\endcsname</code>, thus saving some typing. The extra level of expansion
+does take some time, though, so I don&rsquo;t recommend it for an inner loop.
+</p>
+<span id="index-ece"></span>
+<p><code>\ece</code>{<var>token</var>}{<var>name</var>} abbreviates
+</p>
+<div class="example">
+<pre class="example">\expandafter <var>token</var> \csname <var>name</var> \endcsname
+</pre></div>
+
+<p>For example,
+</p>
+<div class="example">
+<pre class="example">\def\fontabbrevdef#1#2{\ece\def{@#1font}{#2}}
+\fontabbrevdef{normal}{ptmr}
+</pre></div>
+
+<p>defines a control sequence <code>\@normalfont</code> to expand to
+<code>ptmr</code>.
+</p>
+
+<hr>
+<span id="g_t_005cedefappend"></span><div class="header">
+<p>
+Next: <a href="#Hooks" accesskey="n" rel="next">Hooks</a>, Previous: <a href="#g_t_005ccsn-and-_005cece" accesskey="p" rel="prev">\csn and \ece</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005cedefappend-1"></span><h4 class="subsection">7.6.2 <code>\edefappend</code></h4>
+
+<span id="index-edefappend"></span>
+<p><code>\edefappend</code> is a way of adding on to an existing definition. It
+takes two arguments: the first is the control sequence name, the second
+the new tokens to append to the definition. The second argument is
+fully expanded (in the <code>\edef</code> that redefines the control sequence).
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\def\foo{abc}
+\def\bar{xyz}
+\edefappend\foo{\bar karl}
+</pre></div>
+
+<p>results in <code>\foo</code> being defined as &lsquo;<samp>abcxyzkarl</samp>&rsquo;.
+</p>
+
+<hr>
+<span id="Hooks"></span><div class="header">
+<p>
+Next: <a href="#Properties" accesskey="n" rel="next">Properties</a>, Previous: <a href="#g_t_005cedefappend" accesskey="p" rel="prev">\edefappend</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hooks-1"></span><h4 class="subsection">7.6.3 Hooks</h4>
+
+<span id="index-hooks"></span>
+<p>A <em>hook</em> is simply a name for a group of actions which is executed
+in certain places&mdash;presumably when it is most useful to allow
+customization or modification. TeX already provides many builtin
+hooks; for example, the <code>\every &hellip;</code> token lists are all
+examples of hooks.
+</p>
+<p>Eplain provides several macros for adding actions to hooks. They all
+take two arguments: the name of the hook and the new actions.
+</p>
+<dl compact="compact">
+<dd>
+<span id="index-hookaction"></span>
+</dd>
+<dt><code>hookaction <var>name</var> <var>actions</var></code></dt>
+<dd><span id="index-hookappend"></span>
+</dd>
+<dt><code>hookappend <var>name</var> <var>actions</var></code></dt>
+<dd><span id="index-hookprepend"></span>
+</dd>
+<dt><code>hookprepend <var>name</var> <var>actions</var></code></dt>
+<dd><p>Each of these adds <var>actions</var> to the hook <var>name</var>. (Any
+previously-defined actions are retained.) <var>name</var> is not a control
+sequence, but rather the characters of the name.
+</p>
+<span id="index-hookactiononce"></span>
+</dd>
+<dt><code>hookactiononce <var>name</var> <code>\<var>cs</var></code></code></dt>
+<dd><p><code>\hookactiononce</code> adds <var>cs</var> to <var>name</var>, like the macros
+above, but first it adds
+</p>
+<div class="example">
+<pre class="example">\global\let <var>\cs</var> \relax
+</pre></div>
+
+<p>to the definition of <var>\cs</var>. (This implies <var>\cs</var> must
+be a true expandable macro, not a control sequence <code>\let</code> to a
+primitive or some other such thing.) Thus, <var>\cs</var> is expanded the
+next time the hook <var>name</var> is run, but it will disappear after that.
+</p>
+<p>The <code>\global</code> is useful because <code>\hookactiononce</code> is most
+useful when the grouping structure of the TeX code could be anything.
+Neither this nor the other hook macros do global assignments to the hook
+variable itself, so TeX&rsquo;s usual grouping rules apply.
+</p></dd>
+</dl>
+
+<span id="index-hookrun"></span>
+<p>The companion macro to defining hook actions is <code>\hookrun</code>, for
+running them. This takes a single argument, the name of the hook. If
+no actions for the hook are defined, no error ensues.
+</p>
+<p>Here is a skeleton of general <code>\begin</code> and <code>\end</code> macros that
+run hooks, and a couple of calls to define actions. The use of
+<code>\hookprepend</code> for the begin action and <code>\hookappend</code> for the
+end action ensures that the actions are executed in proper sequence with
+other actions (as long as the other actions use <code>\hookprepend</code> and
+<code>\hookappend</code> also).
+</p>
+<div class="example">
+<pre class="example">\def\begin#1{ &hellip; \hookrun{begin} &hellip; }
+\def\end#1{ &hellip; \hookrun{end} &hellip; }
+\hookprepend{begin}\start_underline
+\hookappend{end}\finish_underline
+</pre></div>
+
+
+<hr>
+<span id="Properties"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cexpandonce" accesskey="n" rel="next">\expandonce</a>, Previous: <a href="#Hooks" accesskey="p" rel="prev">Hooks</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Properties-1"></span><h4 class="subsection">7.6.4 Properties</h4>
+
+<span id="index-properties"></span>
+<span id="index-atom"></span>
+<p>A <em>property</em> is a name/value pair associated with another symbol,
+traditionally called an <em>atom</em>. Both atom and property names are
+control sequence names.
+</p>
+<p>Eplain provides two macros for dealing with property lists:
+<code>\setproperty</code> and <code>\getproperty</code>.
+</p>
+<dl compact="compact">
+<dd>
+<span id="index-setproperty"></span>
+</dd>
+<dt><code>\setproperty <var>atom</var> <var>propname</var> <var>value</var></code></dt>
+<dd><p><code>\setproperty</code> defines the property <var>property</var> on the atom
+<var>atom</var> to be <var>value</var>. <var>atom</var> and <var>propname</var> can be
+anything acceptable to <code>\csname</code>. <var>value</var> can be anything.
+</p>
+<span id="index-getproperty"></span>
+</dd>
+<dt><code>\getproperty <var>atom</var> <var>propname</var></code></dt>
+<dd><p><code>\getproperty</code> expands to the value stored for <var>propname</var> on
+<var>atom</var>. If <var>propname</var> is undefined, it expands to nothing
+(i.e., <code>\empty</code>).
+</p>
+</dd>
+</dl>
+
+<p>The idea of properties originated in Lisp (I believe). There, the
+implementation truly does associate properties with atoms. In TeX,
+where we have no builtin support for properties, the association is only
+conceptual.
+</p>
+<p>The following example typesets &lsquo;<samp>xyz</samp>&rsquo;.
+</p>
+<div class="example">
+<pre class="example">\setproperty{a}{pr}{xyz}
+\getproperty{a}{pr}
+</pre></div>
+
+
+<hr>
+<span id="g_t_005cexpandonce"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cifundefined" accesskey="n" rel="next">\ifundefined</a>, Previous: <a href="#Properties" accesskey="p" rel="prev">Properties</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005cexpandonce-1"></span><h4 class="subsection">7.6.5 <code>\expandonce</code></h4>
+
+<span id="index-expansion_002c-one_002dlevel"></span>
+<span id="index-expandonce"></span>
+<p><code>\expandonce</code> is defined as <code>\expandafter\noexpand</code>. Thus,
+<code>\expandonce <var>token</var></code> expands <var>token</var> once, instead of to
+TeX primitives. This is most useful in an <code>\edef</code>.
+</p>
+<p>For example, the following defines <code>\temp</code> to be <code>\foo</code>, not
+&lsquo;<samp>abc</samp>&rsquo;.
+</p>
+<div class="example">
+<pre class="example">\def\foo{abc}
+\def\bar{\foo}
+\edef\temp{\expandonce\bar}
+</pre></div>
+
+
+<hr>
+<span id="g_t_005cifundefined"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cifempty" accesskey="n" rel="next">\ifempty</a>, Previous: <a href="#g_t_005cexpandonce" accesskey="p" rel="prev">\expandonce</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005cifundefined-1"></span><h4 class="subsection">7.6.6 <code>\ifundefined</code></h4>
+
+<span id="index-ifundefined"></span>
+<p><code>\ifundefined{<var>cs</var>} <var>t</var> \else <var>f</var> \fi</code> expands the
+<var>t</var> text if the control sequence <code>\<var>cs</var></code> is undefined or
+has been <code>\let</code> to <code>\relax</code>, and the <var>f</var> text otherwise.
+</p>
+<span id="index-skipping-tokens"></span>
+<span id="index-undefined-control-sequence_002c-checking-for"></span>
+<p>Since <code>\ifundefined</code> is not a primitive conditional, it cannot be
+used in places where TeX might skip tokens &ldquo;at high speed&rdquo;, e.g.,
+within another conditional&mdash;TeX can&rsquo;t match up the <code>\if</code>&rsquo;s and
+<code>\fi</code>&rsquo;s.
+</p>
+<p>This macro was taken directly from <cite>The TeXbook</cite>, page 308.
+</p>
+
+<hr>
+<span id="g_t_005cifempty"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cifinteger-and-_005cisinteger" accesskey="n" rel="next">\ifinteger and \isinteger</a>, Previous: <a href="#g_t_005cifundefined" accesskey="p" rel="prev">\ifundefined</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005cifempty-1"></span><h4 class="subsection">7.6.7 <code>\ifempty</code></h4>
+
+<span id="index-ifempty"></span>
+<span id="index-empty-string_002c-checking-for"></span>
+<span id="index-empty-argument_002c-checking-for"></span>
+<p><code>\ifempty{<var>arg</var>} <var>t</var> \else <var>f</var> \fi</code> expands the
+<var>t</var> text if <var>arg</var> is the empty string, and the <var>f</var> text
+otherwise. This macro is useful when you need to test for empty
+arguments to your macros, for example:
+</p>
+<div class="example">
+<pre class="example">\def\foo#1{\ifempty{#1} <var>t</var> \else <var>f</var> \fi}
+</pre></div>
+
+<span id="index-skipping-tokens-1"></span>
+<p>Since <code>\ifempty</code> is not a primitive conditional, it cannot be
+used in places where TeX might skip tokens &ldquo;at high speed&rdquo;, e.g.,
+within another conditional&mdash;TeX can&rsquo;t match up the <code>\if</code>&rsquo;s and
+<code>\fi</code>&rsquo;s.
+</p>
+<p>Note that the following code
+</p>
+<div class="example">
+<pre class="example">\def\empty{}
+\ifempty\empty\message{empty}\else\message{not empty}\fi
+</pre></div>
+
+<p>will produce the message &lsquo;<samp>not empty</samp>&rsquo;.
+</p>
+
+<hr>
+<span id="g_t_005cifinteger-and-_005cisinteger"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cfuturenonspacelet" accesskey="n" rel="next">\futurenonspacelet</a>, Previous: <a href="#g_t_005cifempty" accesskey="p" rel="prev">\ifempty</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005cifinteger-and-_005cisinteger-1"></span><h4 class="subsection">7.6.8 <code>\ifinteger</code> and <code>\isinteger</code></h4>
+
+<span id="index-ifinteger"></span>
+<span id="index-integers_002c-detecting"></span>
+<span id="index-numbers_002c-detecting"></span>
+<span id="index-detecting-numbers"></span>
+<span id="index-identifying-numbers"></span>
+<span id="index-recognizing-numbers"></span>
+<p><code>\ifinteger{<var>arg</var>} <var>t</var> \else <var>f</var> \fi</code> expands the
+<var>t</var> text if <var>arg</var> is an integer, and the <var>f</var> text
+otherwise. This macro can detect positive and negative integers.
+</p>
+<p>Since <code>\ifinteger</code> is not a primitive conditional, it cannot be
+used in places where TeX might skip tokens &ldquo;at high speed&rdquo;, e.g.,
+within another conditional&mdash;TeX can&rsquo;t match up the <code>\if</code>&rsquo;s
+and <code>\fi</code>&rsquo;s. For such situations Eplain provides
+<span id="index-isinteger"></span>
+<code>\isinteger</code>, which can be used as follows:
+</p>
+<div class="example">
+<pre class="example">\if\isinteger{<var>arg</var>} <var>t</var> \else <var>f</var> \fi
+</pre></div>
+
+<p>Although <code>\ifinteger</code> and <code>\isinteger</code> work well
+with regular input, they are not bullet-proof. For example, the
+following code
+</p>
+<div class="example">
+<pre class="example">\ifinteger{12_ab}integer\else not integer\fi
+</pre></div>
+
+<p>will expand to &lsquo;<samp>ab_integer</samp>&rsquo; (and thus would not
+even compile outside math mode).
+</p>
+<span id="index-TeX-Frequently-Asked-Questions"></span>
+<p>These macros come from the TeX Frequently Asked Questions
+(<a href="http://www.tex.ac.uk/cgi-bin/texfaq2html">http://www.tex.ac.uk/cgi-bin/texfaq2html</a>).
+</p>
+
+<hr>
+<span id="g_t_005cfuturenonspacelet"></span><div class="header">
+<p>
+Previous: <a href="#g_t_005cifinteger-and-_005cisinteger" accesskey="p" rel="prev">\ifinteger and \isinteger</a>, Up: <a href="#Expansion" accesskey="u" rel="up">Expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_005cfuturenonspacelet-1"></span><h4 class="subsection">7.6.9 <code>\futurenonspacelet</code></h4>
+
+<span id="index-lookahead-without-spaces"></span>
+<span id="index-spaces_002c-ignoring"></span>
+<span id="index-futurenonspacelet"></span>
+<p>The <code>\futurelet</code> primitive allows you to look at the next token
+from the input. Sometimes, though, you want to look ahead while
+ignoring any spaces. This is what <code>\futurenonspacelet</code> does. It
+is otherwise the same as <code>\futurelet</code>: you give it two control
+sequences as arguments, and it assigns the next nonspace token to the
+first, and then expands the second. For example:
+</p>
+<div class="example">
+<pre class="example">\futurenonspacelet\temp\finishup
+\def\finishup{\ifx\temp &hellip;}
+</pre></div>
+
+
+<hr>
+<span id="Obeying-spaces"></span><div class="header">
+<p>
+Next: <a href="#Writing-out-numbers" accesskey="n" rel="next">Writing out numbers</a>, Previous: <a href="#Expansion" accesskey="p" rel="prev">Expansion</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Obeying-spaces-1"></span><h3 class="section">7.7 Obeying spaces</h3>
+
+<span id="index-whitespace"></span>
+<span id="index-spaces_002c-obeying"></span>
+<span id="index-newlines_002c-obeying"></span>
+<span id="index-obeywhitespace"></span>
+
+<p><code>\obeywhitespace</code> makes both end-of-lines and space characters in
+the input be respected in the output. Unlike plain TeX&rsquo;s
+<code>\obeyspaces</code>, even spaces at the beginnings of lines turn into
+blank space.
+</p>
+<p>By default, the size of the space that is produced by a space
+character is the natural space of the current font, i.e.,
+what <code>\ </code> produces.
+</p>
+<p>Ordinarily, a blank line in the input produces as much blank vertical
+space as a line of text would occupy. You can adjust this by assigning
+to the parameter <code>\blanklineskipamount</code>:
+<span id="index-blanklineskipamount-in-obeyed-text"></span>
+if you set this negative, the space produced by a blank line will be
+smaller; if positive, larger.
+</p>
+<p>Tabs are not affected by this routine. In particular, if tabs occur
+at the beginning of a line, they will disappear. (If you are trying to
+make TeX do the &ldquo;right thing&rdquo; with tabs, don&rsquo;t. Use a utility
+program like <i>expand</i> instead.)
+<span id="index-tabs"></span>
+</p>
+
+<hr>
+<span id="Writing-out-numbers"></span><div class="header">
+<p>
+Next: <a href="#Mode_002dspecific-penalties" accesskey="n" rel="next">Mode-specific penalties</a>, Previous: <a href="#Obeying-spaces" accesskey="p" rel="prev">Obeying spaces</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Writing-out-numbers-1"></span><h3 class="section">7.8 Writing out numbers</h3>
+
+<span id="index-numbers_002c-written-form-of"></span>
+<p><code>\numbername</code>
+<span id="index-numbername"></span>
+produces the written-out form of its argument, i.e., &lsquo;zero&rsquo; through
+&lsquo;ten&rsquo; for the numbers 0&ndash;10, and numerals for all others.
+</p>
+
+<hr>
+<span id="Mode_002dspecific-penalties"></span><div class="header">
+<p>
+Next: <a href="#Auxiliary-files" accesskey="n" rel="next">Auxiliary files</a>, Previous: <a href="#Writing-out-numbers" accesskey="p" rel="prev">Writing out numbers</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Mode_002dspecific-penalties-1"></span><h3 class="section">7.9 Mode-specific penalties</h3>
+
+<p>TeX&rsquo;s built-in <code>\penalty</code> command simply appends to the
+current list, no matter what kind of list it is. You might intend a
+particular penalty to always be a &ldquo;vertical&rdquo; penalty, however, i.e.,
+appended to a vertical list. Therefore, Eplain provides
+<code>\vpenalty</code>
+<span id="index-vpenalty"></span>
+and <code>\hpenalty</code>
+which first leave the other mode and then do <code>\penalty</code>.
+</p>
+<p>More precisely, <code>\vpenalty</code> inserts <code>\par</code> if the current
+mode is horizontal, and <code>\hpenalty</code> inserts <code>\leavevmode</code> if
+the current mode is vertical. (Thus, <code>\vpenalty</code> cannot be used in
+math mode.)
+</p>
+
+<hr>
+<span id="Auxiliary-files"></span><div class="header">
+<p>
+Next: <a href="#User_002ddefined-environments" accesskey="n" rel="next">User-defined environments</a>, Previous: <a href="#Mode_002dspecific-penalties" accesskey="p" rel="prev">Mode-specific penalties</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Auxiliary-files-1"></span><h3 class="section">7.10 Auxiliary files</h3>
+
+<span id="index-auxiliary-files_002c-existence-of"></span>
+<p>It is common to write some information out to a file to be used on a
+subsequent run. But when it is time to read the file again, you only
+want to do so if the file actually exists. <code>\testfileexistence</code>
+<span id="index-testfileexistence"></span>
+is given an argument which is appended to <code>\jobname</code>,
+<span id="index-jobname-2"></span>
+and sets the conditional <code>\iffileexists</code>
+<span id="index-iffileexists"></span>
+<span id="index-fileexists-_0028conditional_0029"></span>
+appropriately. For example:
+</p>
+<div class="example">
+<pre class="example">\testfileexistence{toc}%
+\iffileexists
+ \input \jobname.toc
+\fi
+</pre></div>
+
+<p><code>\testfileexistence</code> takes an optional parameter; when
+given, it will override <code>\jobname</code> for the root part of the file
+name. For example, if you want to test for the file
+<samp>answers.aux</samp>, you can do this with the following:
+</p>
+<div class="example">
+<pre class="example">\testfileexistence[answers]{aux}%
+\iffileexists
+ \input answers.aux
+\fi
+</pre></div>
+
+
+<hr>
+<span id="User_002ddefined-environments"></span><div class="header">
+<p>
+Next: <a href="#Page-list-and-page-range-parsers" accesskey="n" rel="next">Page list and page range parsers</a>, Previous: <a href="#Auxiliary-files" accesskey="p" rel="prev">Auxiliary files</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="User_002ddefined-environments-1"></span><h3 class="section">7.11 User-defined environments</h3>
+
+<span id="index-environments_002c-user_002ddefined"></span>
+<p>Plain TeX does not provide &ldquo;named&rdquo; block structures, only the anonymous
+<code>\begingroup</code> and <code>\endgroup</code> pair. The disadvantage of this
+is that when there are several such groups and one is mismatched, it can
+be difficult to find the error. Eplain provides a named block structure
+so that if you forget an <code>\environment</code> or an
+<code>\endenvironment</code>, you will (probably) get an error message about
+it.
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\def\itpar{
+ \environment{@italicpar}
+ \it\par
+}
+\def\enditpar{
+ \par
+ \endenvironment{@italicpar}%
+}
+</pre></div>
+
+<p>which could then be used to set italicized paragraphs:
+</p>
+<div class="example">
+<pre class="example">\itpar
+If I reprehend anything in this world, it is the use of my oracular
+tongue, and a nice derangement of epitaphs!
+\enditpar
+</pre></div>
+
+<p>The above sort of environment allows nesting. But environments
+shouldn&rsquo;t always be allowed to nest. Put the control sequence
+<code>\checkenv</code> at the beginning of a macro that is going to define an
+environment that should not be nested.
+</p>
+
+<hr>
+<span id="Page-list-and-page-range-parsers"></span><div class="header">
+<p>
+Previous: <a href="#User_002ddefined-environments" accesskey="p" rel="prev">User-defined environments</a>, Up: <a href="#Programming-definitions" accesskey="u" rel="up">Programming definitions</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Page-list-and-page-range-parsers-1"></span><h3 class="section">7.12 Page list and page range parsers</h3>
+
+<span id="index-idxparselist"></span>
+<span id="index-idxparserange"></span>
+<span id="index-idxpagei"></span>
+<span id="index-idxpageii"></span>
+<p>The macros which Eplain uses to parse the page lists and ranges in the
+index, <code>\idxparselist</code> and <code>\idxparserange</code> (see <a href="#Page-destinations-for-index-terms">Page destinations for index terms</a>), are sometimes useful when defining page
+number encapsulators. They take one argument, text to parse. When a
+page list (range) is not present, they set <code>\idxpagei</code> to be
+<code>\empty</code>; when a list (range) is detected, they set
+<code>\idxpagei</code> and <code>\idxpageii</code> to the first and the second page
+numbers, respectively.
+</p>
+<span id="index-setidxpagelistdelimiter"></span>
+<span id="index-setidxpagerangedelimiter"></span>
+<p>Eplain&rsquo;s defaults for the page list and page range delimiters are the
+same as those in MakeIndex, a comma followed by a space (&lsquo;<samp>, </samp>&rsquo;) and
+two dashes (&lsquo;<samp>--</samp>&rsquo;), respectively. If you customize MakeIndex to use
+different delimiters, you must not forget to let Eplain know about them
+with the commands
+</p>
+<div class="example">
+<pre class="example">\setidxpagelistdelimiter{<var>list-delim</var>}
+\setidxpagerangedelimiter{<var>page-delim</var>}
+</pre></div>
+
+<p>These commands save the <var>list-delim</var> and
+<var>page-delim</var> delimiters in
+<span id="index-idxpagelistdelimiter"></span>
+<span id="index-idxpagerangedelimiter"></span>
+<code>\idxpagelistdelimiter</code> and <code>\idxpagerangedelimiter</code>,
+respectively.
+</p>
+<span id="index-underlining-page-numbers-in-index"></span>
+<span id="index-index_002c-underlining-page-numbers"></span>
+<span id="index-ituline"></span>
+<p>For example, you may want to define a page number markup command which
+italicizes and properly underlines page ranges by underlining only the
+page numbers and not the delimiter:
+</p>
+<span id="index-idxpagerangedelimiter-1"></span>
+<div class="example">
+<pre class="example">\def\ituline#1{%
+ {\it
+ \idxparserange{#1}%
+ \ifx\idxpagei\empty
+ % The argument is a single page number.
+ \underbar{#1}%
+ \else
+ % The argument is a page range.
+ \underbar{\idxpagei}\idxpagerangedelimiter\underbar{\idxpageii}%
+ \fi}%
+}
+</pre></div>
+
+<p>Note that the <code>\ituline</code> macro is not aware of page
+lists. This is not needed if you use hyperlinks in the index, because
+<code>\hlidx</code> and <code>\hlidxpage</code> will break up the page lists before
+calling the user&rsquo;s page encapsulator (see <a href="#Page-destinations-for-index-terms">Page destinations for index terms</a>), so <code>\ituline</code> will never see the lists. If, however, you
+need to design a macro which also takes care of the lists, you can
+extend <code>\ituline</code> with an additional call to <code>\idxparselist</code>.
+</p>
+<hr>
+<span id="Demo-files"></span><div class="header">
+<p>
+Next: <a href="#Macro-index" accesskey="n" rel="next">Macro index</a>, Previous: <a href="#Programming-definitions" accesskey="p" rel="prev">Programming definitions</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Demo-files-1"></span><h2 class="chapter">8 Demo files</h2>
+
+<span id="index-demo-files"></span>
+<p>This chapter contains listings of source files, along with the output
+they produce (where appropriate), which illustrate various aspects of
+Eplain. The files can be found in the <code>demo</code> subdirectory of
+Eplain distribution. These demos, both the sources and the compiled PDF
+and PS files, are also available from <a href="https://tug.org/eplain/demo">https://tug.org/eplain/demo</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Hyperlinks-_0028xhyper_002etex_0029" accesskey="1">Hyperlinks (xhyper.tex)</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029" accesskey="2">Highlighting TeX comments in listings (lscommnt.tex)</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Hyperlinks-_0028xhyper_002etex_0029"></span><div class="header">
+<p>
+Next: <a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029" accesskey="n" rel="next">Highlighting TeX comments in listings (lscommnt.tex)</a>, Up: <a href="#Demo-files" accesskey="u" rel="up">Demo files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hyperlinks-_0028xhyper_002etex_0029-1"></span><h3 class="section">8.1 Hyperlinks (<code>xhyper.tex</code>)</h3>
+
+<img src="xhyper.jpg" alt="xhyper">
+
+<span id="index-xhyper_002etex"></span>
+
+<span id="index-hyperlinks_002c-demo"></span>
+<span id="index-explicit-hyperlinks_002c-demo"></span>
+<span id="index-hyperlinks_002c-explicit_002c-demo"></span>
+<span id="index-implicit-hyperlinks_002c-demo"></span>
+<span id="index-hyperlinks_002c-implicit_002c-demo"></span>
+
+<span id="index-hlstart-4"></span>
+<span id="index-hlend-1"></span>
+
+<span id="index-group-options_002c-hyperlink_002c-demo"></span>
+<span id="index-hyperlinks_002c-group-options_002c-demo"></span>
+<span id="index-link_002c-group-options_002c-demo"></span>
+<span id="index-linkgroup-options_002c-demo"></span>
+<span id="index-destinations_002c-group-options_002c-demo"></span>
+<span id="index-destgroup-options_002c-demo"></span>
+
+<span id="index-group-type_002c-hyperlink_002c-demo"></span>
+<span id="index-destinations_002c-group-type_002c-demo"></span>
+<span id="index-destgroup-type_002c-demo"></span>
+
+<span id="index-hlopts-2"></span>
+<span id="index-hldesttype-2"></span>
+<span id="index-hldestopts-2"></span>
+
+<span id="index-cross_002dreferences_002c-demo"></span>
+<span id="index-definexref-1"></span>
+<span id="index-ref-1"></span>
+
+<span id="index-graphics-collection_002c-LaTeX_002c-demo"></span>
+<span id="index-LaTeX-graphics-collection_002c-demo"></span>
+<span id="index-color_002c-demo"></span>
+<span id="index-rotation_002c-demo"></span>
+<span id="index-scaling_002c-demo"></span>
+<span id="index-color_002esty-4"></span>
+<span id="index-graphicx_002esty-1"></span>
+<span id="index-url_002esty-2"></span>
+
+<span id="index-includegraphics"></span>
+<span id="index-rotatebox"></span>
+<span id="index-definecolor"></span>
+<span id="index-url"></span>
+<pre class="verbatim">% (This file is public domain.)
+%
+% This file demonstrates the following features of Eplain:
+%
+% - explicit and implicit hyperlinks;
+% - symbolic cross-references;
+% - inserting external graphics using |\includegraphics| from
+% the \LaTeX\ package |graphicx.sty|.
+% - rotating text using |\rotatebox| from |graphicx.sty|.
+%
+% The compiled demo can be downloaded from
+%
+% http://tug.org/eplain/demo
+%
+% In order to compile this file yourself, you will need the CTAN lion
+% drawing by Duane Bibby from
+%
+% ftp://tug.ctan.org/ftpmaint/CTAN_lion/ctan_lion_350x350.png
+%
+% (thanks, |www.ctan.org|). Place the image file in the same
+% directory with this file, and change to that directory. Now, to
+% produce a PDF, run twice the command
+%
+% pdftex xhyper.tex
+%
+% During the first run, Eplain will write the information about the
+% cross-references into |xhyper.aux|, and during the second run this
+% information will be read by Eplain to typeset the references.
+%
+% Demo case:
+%
+% Suppose you are using pdf\TeX, have a figure you want to insert
+% scaled to $200\,pt$ horizontally, and you want this figure to
+% completely fill the PDF viewer's window whenever the reader
+% selects a link pointing to this figure. Additionally, you want to
+% typeset some text as live hyperlinks, clicking on which will start
+% a Web browser and open a URL.
+
+\input eplain
+
+% Load \LaTeX\ packages.
+\beginpackages
+ % |url.sty| provides the |\url| command which we will use to typeset
+ % a URL. We request that |url.sty| be the version from June~27,
+ % 2005, or later, because earlier versions had problems interacting
+ % with plain \TeX.
+ \usepackage{url}[2005/06/27]
+ % |color.sty| provides support for colored text; all hyperlinks are
+ % automatically colored by Eplain when this package is loaded. We give
+ % the |dvipsnames| option because we want to use named colors from the
+ % |dvips| graphics driver.
+ \usepackage[dvipsnames]{color}
+ % Finally, we load |graphicx.sty|, for the macros |\includegraphics|
+ % and |\rotatebox|.
+ \usepackage{graphicx}
+\endpackages
+
+% Remember that hyperlinks are off by default. Therefore, we need to
+% enable them.
+\enablehyperlinks
+
+% Customize some hyperlink options. First, we set border width to~$0$
+% for all links to get rid of the default boxes around links (we
+% prefer colored links over the boxed links). Next, we say that all
+% links created by the |url| hyperlink group (which means the |\url|
+% command from |url.sty|) must be colored using the named color
+% |BlueViolet|.
+\hlopts{bwidth=0}
+\hlopts[url]{colormodel=named,color=BlueViolet}
+
+% Inhibit page numbering (we have only one page).
+\nopagenumbers
+
+% Define a class word for the cross-reference class |figure|. This
+% word, when defined, will be automatically prepended by Eplain to the
+% reference created by |\ref| (read on to see its use).
+\def\figureword{fig.}
+
+% Allocate a count register for the figure's number, and a box
+% register which we'll use to measure dimensions of the image.
+\newcount\fignumber
+\newbox\imgbox
+
+% Now comes the fun part--constructing the figure for the image of the
+% \CTAN\ lion. We define a macro
+%
+% \fig{LABEL}{FILENAME}{CAPTION}{WIDTH}
+%
+% which creates a figure using LABEL for the cross-reference and
+% hyperlink label, reading the image from file FILENAME, using CAPTION
+% to name the figure, and WIDTH to scale the image horizontally.
+\def\fig#1#2#3#4{%
+ % Leave some space above the figure. This will also ensure that we
+ % are in the vertical mode before we produce a |\vbox|.
+ \medskip
+ % Advance the figure number. |\global| ensures that the change to
+ % the count register is global, even when |\fig| is buried inside a
+ % group.
+ \global\advance\fignumber by 1
+ % We use |\includegraphics| (from |graphicx.sty|) to load the image,
+ % scaled to the specified width, into our ``measuring'' box
+ % |\imgbox|.
+ \setbox\imgbox = \hbox{\includegraphics[width=#4]{#2}}%
+ % To make the demo even more exciting, let's put the figure's
+ % caption to the left of the image into the |\indent| space of the
+ % new paragraph, and rotate the caption~$90^\circ$.
+ \textindent{%
+ \rotatebox{90}{F{\sc IGURE}~\the\fignumber. #3}%
+ }%
+ % Continue the paragraph by constructing a |\vbox| with the image of
+ % the lion. We use |\definexref| to define the cross-reference
+ % label.
+ \vbox{%
+ % In addition to the cross-reference label, |\definexref| will
+ % create a hyperlink destination with the same label. Therefore,
+ % we customize this destination to do what we need. We say that
+ % destination type for the hyperlink group |definexref| (to which
+ % |\definexref| belongs) should be |fitr|. This destination type
+ % will magnify the rectangle specified by the options |width|,
+ % |height| and |depth| to the PDF viewer's window. Therefore, we
+ % set those options accordingly with |\hldestopts| (notice the use
+ % of |depth| instead of |height|---we will want the rectangle to
+ % extend {\it downward}, to cover the image which will come
+ % next). Notice that these settings will be isolated within the
+ % current group (i.e., the |\vbox| we're constructing).
+ \hldesttype[definexref]{fitr}%
+ \hldestopts[definexref]{width=\wd\imgbox,height=0pt,depth=\ht\imgbox}%
+ % We define a symbolic label so that we can later refer
+ % to the figure with |\ref|. The command |\definexref| does
+ % exactly that. The last argument to |\definexref| specifies
+ % class of the label, which determines the word used by |\ref| in
+ % front of the reference text (remember that we've defined
+ % |\figureword| above).
+ \definexref{#1}{\the\fignumber}{figure}%
+ % Finally, produce the image which we've been stashing in the box
+ % register |\imgbox|.
+ \box\imgbox
+ }%
+ \medskip
+}
+
+% Create the figure.
+\fig{CTANlion}{ctan_lion_350x350}{Lion in the archives}{200pt}
+
+% Finished with the fun part, we can relax and typeset some
+% hyperlinks. The easiest way to do that is to use the |\ref|
+% cross-reference command. We can even pass an optional argument
+% (|the lion in|), which will be placed before the class word (|fig.|)
+% and become part of the link (to make sure the reader does not have
+% to aim too hard).
+Show me \ref[the lion in]{CTANlion}.
+
+% If you are the restless kind, here's another way to create a
+% hyperlink to the image: we create a link explicitly by using
+% |\hlstart ... \hlend|. We don't specify the link type, therefore
+% the default type |name| will be used (these are ``named links'',
+% i.e., links pointing to destinations identified by labels). In the
+% options argument, we specify that the border of the link should be
+% inverted when the user clicks the link (|hlight=O|), and also set
+% special color for this link, overriding the default dark-red. The
+% label for the destination is the same as the cross-reference label,
+% |CTANlion|.
+Show me
+\hlstart{}{hlight=O,colormodel=named,color=OliveGreen}{CTANlion}
+ the CTAN lion\hlend.
+
+% Let's now point somewhere outside our document. Eplain homepage is
+% a good target. In the similar spirit, let's consider two
+% approaches. The easy one is to use the |\url| command from
+% |url.sty|. Remember that we have customized the color of |url|
+% hyperlinks, so this one will show up with a different color than the
+% default dark-red.
+Take me to \url{http://tug.org/eplain}.
+
+% The second approach is to create an explicit URL link. We specify
+% yet another border highlighting mode, |P|, which means that the
+% region underneath the bounding box of the link will be drawn inset
+% into the page. Also, let's set the color of the hyperlink to an RGB
+% color |0.4,0.1,0.4|. Since we cannot use commas to separate the
+% color elements inside the options parameter to |\hlstart| (commas
+% there separate options), we have to first create a user-defined
+% color with |\definecolor| from |color.sty|, and use that in
+% |\hlstart|.
+\definecolor{mycolor}{rgb}{0.4,0.1,0.4}
+
+Take me to
+\hlstart{url}{hlight=P,colormodel=,color=mycolor}{http://tug.org/eplain}
+ Eplain homepage\hlend.
+
+\bye
+</pre>
+
+<hr>
+<span id="Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029"></span><div class="header">
+<p>
+Previous: <a href="#Hyperlinks-_0028xhyper_002etex_0029" accesskey="p" rel="prev">Hyperlinks (xhyper.tex)</a>, Up: <a href="#Demo-files" accesskey="u" rel="up">Demo files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029-1"></span><h3 class="section">8.2 Highlighting TeX comments in listings (<code>lscommnt.tex</code>)</h3>
+
+<img src="lscommnt.jpg" alt="lscommnt">
+
+
+<span id="index-lscommnt_002etex"></span>
+
+<span id="index-verbatim-listing_002c-demo"></span>
+<span id="index-listing-files_002c-demo"></span>
+<span id="index-files_002c-verbatim-listing-of_002c-demo"></span>
+<span id="index-comments_002c-highlighting-in-listings"></span>
+<span id="index-highlighting_002c-in-listings"></span>
+
+<span id="index-listing-1"></span>
+<span id="index-setuplistinghook-1"></span>
+<span id="index-linenumberedlisting-1"></span>
+<span id="index-nolastlinelisting-1"></span>
+<span id="index-hlightcommentslisting"></span>
+<pre class="verbatim">% (This file is public domain.)
+% Demonstrate how Eplain can be used to include a TeX source file
+% verbatim, typesetting comments in colored italic typewriter type.
+
+% Load Eplain and LaTeX's color.sty package.
+\input eplain
+\beginpackages \usepackage{color} \endpackages
+\nopagenumbers % Disable page numbers.
+\font\commentfont = cmitt10 % Font for the comments (italic \tt).
+% We'll define some `protected' macros with `@' in their names.
+\makeatletter
+% Define an equivalent of Eplain's \letreturn, to be able to assign
+% various actions to the (active) percent character.
+\begingroup \makeactive\%
+ \gdef\letpercent{\let%}
+\endgroup
+% The listing hook to be called in \setuplistinghook, see below. It
+% makes `%' active and assigns it a `start comment' action.
+\def\hlightcommentslisting{\makeactive\% \letpercent\start@comment}%
+% This is what `%' is aliased to before a comment is started.
+\def\start@comment{%
+ \leavevmode % Needed in the very first line of the input to process
+ % the new par (possibly inserting line number) before we
+ % kick in with the color and stuff.
+ \begingroup % Isolate color and font changes and the redefinitions.
+ \commentfont
+ \color[cmyk]{0.28,1,1,0.35}%
+ \percentchar % Produce the actual `%' and
+ \letpercent\percentchar % make all following `%'s do the same.
+ \letreturn\end@comment % Call \end@comment at end-of-line.
+}
+% \end@comment (alias for ^^M inside a comment) will end the comment
+% started by \start@comment. We make ^^M active temporarily so that
+% the active version of ^^M gets &quot;frozen&quot; into \end@comment.
+\begingroup \makeactive\^^M % Avoid ^^M's from here on.
+ \gdef\end@comment{\endgroup ^^M}%
+\endgroup
+\resetatcatcode % Make `@' again inaccessible for use in macro names.
+
+% Define \setuplistinghook to setup comments highlighting, line
+% numbering and omitting the last (empty) line of input.
+\def\setuplistinghook{\hlightcommentslisting \linenumberedlisting
+ \nolastlinelisting}
+% Isn't this fun? This file typesets itself, with the extra bonus of
+% the pretty-printed comments and numbered source lines!
+\listing{lscommnt}
+\bye
+</pre>
+<hr>
+<span id="Macro-index"></span><div class="header">
+<p>
+Next: <a href="#Concept-index" accesskey="n" rel="next">Concept index</a>, Previous: <a href="#Demo-files" accesskey="p" rel="prev">Demo files</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Macro-index-1"></span><h2 class="unnumbered">Macro index</h2>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Macro-index_fn_symbol-1"><b>@</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Macro-index_fn_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-fn" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_symbol-1">@</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040getoptionalarg"><code>@getoptionalarg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040hllabel"><code>@hllabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040hllabel-1"><code>@hllabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040hllabel-2"><code>@hllabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040hllabel-3"><code>@hllabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040indexproof-insertion-class"><code>@indexproof <span class="roman">insertion class</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-abovecolumnskip"><code>abovecolumnskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-abovecolumnspenalty"><code>abovecolumnspenalty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tables">Tables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-abovelistpenalty"><code>abovelistpenalty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-abovelistskip"><code>abovelistskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-abovelistskipamount"><code>abovelistskipamount</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-adjarrow"><code>adjarrow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-adjmapdown"><code>adjmapdown</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-adjmapleft"><code>adjmapleft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-adjmapright"><code>adjmapright</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-adjmapup"><code>adjmapup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-advancebottommargin"><code>advancebottommargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-advanceleftmargin"><code>advanceleftmargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-advancerightmargin"><code>advancerightmargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-advancetopmargin"><code>advancetopmargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-afterindexterm"><code>afterindexterm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-afterindexterm-hook"><code>afterindexterm <span class="roman">hook</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-AMSLaTeX-1"><code>AMSLaTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-AMSTeX-1"><code>AMSTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-arrow"><code>arrow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-arrow-1"><code>arrow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblem"><code>bblem</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblemph"><code>bblemph</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblfilebasename"><code>bblfilebasename</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblhook"><code>bblhook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblnewblock"><code>bblnewblock</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblrm"><code>bblrm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bblsc"><code>bblsc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bcolor-_0028hyperlink-option_0029"><code>bcolor <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bdash-_0028hyperlink-option_0029"><code>bdash <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bdash-_0028hyperlink-option_0029-1"><code>bdash <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-begin-for-index-entries"><code>begin <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-beginindex-hook"><code>beginindex <span class="roman">hook</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-beginlist"><code>beginlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-beginpackages"><code>beginpackages</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-begin_007bpicture_007d"><code>begin{picture}</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-begin_007btheindex_007d"><code>begin{theindex}</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-belowcolumnskip"><code>belowcolumnskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-belowfootnoterulespace"><code>belowfootnoterulespace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-belowlistskip"><code>belowlistskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-belowlistskipamount"><code>belowlistskipamount</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biarrow"><code>biarrow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biblabelcontents"><code>biblabelcontents</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biblabelextraspace"><code>biblabelextraspace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biblabelpostcontents"><code>biblabelpostcontents</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biblabelprecontents"><code>biblabelprecontents</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biblabelprint"><code>biblabelprint</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-biblabelwidth"><code>biblabelwidth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography"><code>bibliography</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography-_0028hyperlinks_0029"><code>bibliography <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliographystyle"><code>bibliographystyle</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BibTeX-2"><code>BibTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bihline"><code>bihline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bimapdown"><code>bimapdown</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bimapleft"><code>bimapleft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bimapright"><code>bimapright</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bimapup"><code>bimapup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bisline"><code>bisline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bivline"><code>bivline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-blackbox"><code>blackbox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-blanklineskipamount-in-justified-text"><code>blanklineskipamount <span class="roman">in justified text</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-blanklineskipamount-in-obeyed-text"><code>blanklineskipamount <span class="roman">in obeyed text</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Obeying-spaces">Obeying spaces</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bottom-_0028destination-option_0029"><code>bottom <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bottom-_0028destination-option_0029-1"><code>bottom <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bottommargin"><code>bottommargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-boxit"><code>boxit</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-boxitspace"><code>boxitspace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bstyle-_0028hyperlink-option_0029"><code>bstyle <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bwidth-_0028hyperlink-option_0029"><code>bwidth <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-catcode"><code>catcode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-center"><code>center</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-centereddisplays"><code>centereddisplays</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-channelwidth"><code>channelwidth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-channelwidth-1"><code>channelwidth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cite"><code>cite</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cite-_0028hyperlinks_0029"><code>cite <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028destination-option_0029"><code>cmd <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028destination-option_0029-1"><code>cmd <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-hypertex">Destination options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028destination-option_0029-2"><code>cmd <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028destination-option_0029-3"><code>cmd <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028hyperlink-option_0029"><code>cmd <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028hyperlink-option_0029-1"><code>cmd <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-hypertex">Link options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028hyperlink-option_0029-2"><code>cmd <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmd-_0028hyperlink-option_0029-3"><code>cmd <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-_0028hyperlink-option_0029"><code>color <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colormodel-_0028hyperlink-option_0029"><code>colormodel <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-columnfill"><code>columnfill</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-commdiag"><code>commdiag</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-commdiagbaselines"><code>commdiagbaselines</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-commdiagbaselines-1"><code>commdiagbaselines</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-csn"><code>csn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005ccsn-and-_005cece">\csn and \ece</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-definecolor"><code>definecolor</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-definecontentsfile"><code>definecontentsfile</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternative-contents-files">Alternative contents files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-defineindex"><code>defineindex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-definexref"><code>definexref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Defining-generic-references">Defining generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-definexref-1"><code>definexref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-definexref-_0028hyperlinks_0029"><code>definexref <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-depth-_0028destination-option_0029"><code>depth <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-depth-_0028destination-option_0029-1"><code>depth <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-depth-_0028hyperlink-option_0029"><code>depth <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-discretionaries"><code>discretionaries</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-displaylines"><code>displaylines</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DOCVIEW-pdfmark"><code>DOCVIEW <span class="roman">pdfmark</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dospecials"><code>dospecials</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-doublecolumns"><code>doublecolumns</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-drawline"><code>drawline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-drawvector"><code>drawvector</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm-_0028hyperlink-driver_0029"><code>dvipdfm <span class="roman">(hyperlink driver)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eattoken"><code>eattoken</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ece"><code>ece</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005ccsn-and-_005cece">\csn and \ece</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-edefappend"><code>edefappend</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cedefappend">\edefappend</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ehrule"><code>ehrule</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Rules">Rules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-em"><code>em</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-emph"><code>emph</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enablehyperlinks"><code>enablehyperlinks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enablehyperlinks-1"><code>enablehyperlinks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enablehyperlinks-2"><code>enablehyperlinks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end-for-index-entries"><code>end <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-endlist"><code>endlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-endnumberedlist"><code>endnumberedlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-endorderedlist"><code>endorderedlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-endpackages"><code>endpackages</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-endunorderedlist"><code>endunorderedlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_007bpicture_007d"><code>end{picture}</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_007btheindex_007d"><code>end{theindex}</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eplain"><code>eplain</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eplaininput"><code>eplaininput</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqalignno"><code>eqalignno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqalignno-1"><code>eqalignno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqalignnum"><code>eqalignnum</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqconstruct"><code>eqconstruct</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-equation-references">Formatting equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqdef"><code>eqdef</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqdef-_0028hyperlinks_0029"><code>eqdef <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqdefn"><code>eqdefn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqdefn-_0028hyperlinks_0029"><code>eqdefn <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqno"><code>eqno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqnum"><code>eqnum</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqnum-1"><code>eqnum</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqnum-2"><code>eqnum</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqnumber"><code>eqnumber</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqprint"><code>eqprint</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-equation-references">Formatting equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqref"><code>eqref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqref-1"><code>eqref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqrefn"><code>eqrefn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqrefn-1"><code>eqrefn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqsubdef"><code>eqsubdef</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subequation-references">Subequation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqsubdef-_0028hyperlinks_0029"><code>eqsubdef <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqsubdefn"><code>eqsubdefn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subequation-references">Subequation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqsubdefn-_0028hyperlinks_0029"><code>eqsubdefn <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eqsubreftext"><code>eqsubreftext</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subequation-references">Subequation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eTeX-1"><code>eTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-everyfootnote"><code>everyfootnote</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-evrule"><code>evrule</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Rules">Rules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expandonce"><code>expandonce</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cexpandonce">\expandonce</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ext-_0028hyperlink-option_0029"><code>ext <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ext-_0028hyperlink-option_0029-1"><code>ext <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-hypertex">Link options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ExTeX-1"><code>ExTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-_0028hyperlink-option_0029"><code>file <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-_0028hyperlink-option_0029-1"><code>file <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-hypertex">Link options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-_0028hyperlink-option_0029-2"><code>file <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-_0028hyperlink-option_0029-3"><code>file <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-_0028hyperlink-option_0029-4"><code>file <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fileexists-_0028conditional_0029"><code>fileexists <span class="roman">(conditional)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-files">Auxiliary files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filename-_0028hyperlink-type_0029"><code>filename <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filename-_0028hyperlink-type_0029-1"><code>filename <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filepage-_0028hyperlink-type_0029"><code>filepage <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fit-_0028destination-type_0029"><code>fit <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fitb-_0028destination-type_0029"><code>fitb <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fitbh-_0028destination-type_0029"><code>fitbh <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fitbv-_0028destination-type_0029"><code>fitbv <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fith-_0028destination-type_0029"><code>fith <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fitr-_0028destination-type_0029"><code>fitr <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fitv-_0028destination-type_0029"><code>fitv <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-flushleft"><code>flushleft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-flushright"><code>flushright</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fmtversion"><code>fmtversion</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-footnote-_0028hyperlinks_0029"><code>footnote <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-footnotemarkseparation"><code>footnotemarkseparation</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-footnoteruleheight"><code>footnoteruleheight</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-footnoterulewidth"><code>footnoterulewidth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-for"><code>for</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-For"><code>For</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-frac"><code>frac</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fractions">Fractions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fullmonthname"><code>fullmonthname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-futurenonspacelet"><code>futurenonspacelet</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cfuturenonspacelet">\futurenonspacelet</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-getproperty"><code>getproperty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Properties">Properties</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gloggingall"><code>gloggingall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gobble"><code>gobble</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gobbletwo"><code>gobbletwo</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gridcommdiag"><code>gridcommdiag</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gtracingall"><code>gtracingall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gutter"><code>gutter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gutterbox"><code>gutterbox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hangindent-for-index-entries"><code>hangindent <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-harrowlength"><code>harrowlength</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-harrowlength-1"><code>harrowlength</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hchannel"><code>hchannel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-height-_0028destination-option_0029"><code>height <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-height-_0028destination-option_0029-1"><code>height <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-height-_0028hyperlink-option_0029"><code>height <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hgrid"><code>hgrid</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hgrid-1"><code>hgrid</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldest"><code>hldest</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldest-1"><code>hldest</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldest-2"><code>hldest</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldest-3"><code>hldest</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldestoff"><code>hldestoff</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldestoff-1"><code>hldestoff</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldeston"><code>hldeston</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldestopts"><code>hldestopts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldestopts-1"><code>hldestopts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldestopts-2"><code>hldestopts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldesttype"><code>hldesttype</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldesttype-1"><code>hldesttype</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hldesttype-2"><code>hldesttype</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlend"><code>hlend</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlend-1"><code>hlend</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlfootbacklabel"><code>hlfootbacklabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlfootlabel"><code>hlfootlabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlfootlabelnumber"><code>hlfootlabelnumber</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlhash"><code>hlhash</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlidx"><code>hlidx</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlidxlabel"><code>hlidxlabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlidxlabelnumber"><code>hlidxlabelnumber</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlidxpage"><code>hlidxpage</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlidxpagelabel"><code>hlidxpagelabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlight-_0028hyperlink-option_0029"><code>hlight <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlightcommentslisting"><code>hlightcommentslisting</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hline"><code>hline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hloff"><code>hloff</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hloff-1"><code>hloff</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlon"><code>hlon</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlopts"><code>hlopts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlopts-1"><code>hlopts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlopts-2"><code>hlopts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlstart"><code>hlstart</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlstart-1"><code>hlstart</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlstart-2"><code>hlstart</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlstart-3"><code>hlstart</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hlstart-4"><code>hlstart</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hltype"><code>hltype</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hltype-1"><code>hltype</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposn"><code>hmorphposn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposn-1"><code>hmorphposn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposndn"><code>hmorphposndn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposndn-1"><code>hmorphposndn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposnlft"><code>hmorphposnlft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposnlft-1"><code>hmorphposnlft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposnrt"><code>hmorphposnrt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposnrt-1"><code>hmorphposnrt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposnup"><code>hmorphposnup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hmorphposnup-1"><code>hmorphposnup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hoffset"><code>hoffset</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hookaction"><code>hookaction</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hooks">Hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hookactiononce"><code>hookactiononce</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hooks">Hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hookappend"><code>hookappend</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hooks">Hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hookprepend"><code>hookprepend</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hooks">Hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hookrun"><code>hookrun</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hooks">Hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-href"><code>href</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hruledefaultdepth"><code>hruledefaultdepth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Rules">Rules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hruledefaultheight"><code>hruledefaultheight</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Rules">Rules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hsize"><code>hsize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertex-_0028hyperlink-driver_0029"><code>hypertex <span class="roman">(hyperlink driver)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyphenpenalty-for-index-entries"><code>hyphenpenalty <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-identity"><code>identity</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idx"><code>idx</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idx-_0028hyperlinks_0029"><code>idx <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxargclose"><code>idxargclose</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxargopen"><code>idxargopen</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxbeginrangemark"><code>idxbeginrangemark</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxencapoperator"><code>idxencapoperator</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxendrangemark"><code>idxendrangemark</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxexact"><code>idxexact</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxmarked"><code>idxmarked</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxmarked-_0028hyperlinks_0029"><code>idxmarked <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxname"><code>idxname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxname-_0028hyperlinks_0029"><code>idxname <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxnameseparator"><code>idxnameseparator</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxnone"><code>idxnone</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpage"><code>idxpage</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpagei"><code>idxpagei</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpageii"><code>idxpageii</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpagelistdelimiter"><code>idxpagelistdelimiter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpagenum"><code>idxpagenum</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpagerangedelimiter"><code>idxpagerangedelimiter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxpagerangedelimiter-1"><code>idxpagerangedelimiter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxparselist"><code>idxparselist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxparserange"><code>idxparserange</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxrangebeginword"><code>idxrangebeginword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxrangeendword"><code>idxrangeendword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxseealsocmdword"><code>idxseealsocmdword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxseecmdword"><code>idxseecmdword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxsubentryseparator"><code>idxsubentryseparator</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxsubmarked"><code>idxsubmarked</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxsubmarked-_0028hyperlinks_0029"><code>idxsubmarked <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifempty"><code>ifempty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifempty">\ifempty</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-iffileexists"><code>iffileexists</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-files">Auxiliary files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifidx"><code>ifidx</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifindexproofing"><code>ifindexproofing</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifinteger"><code>ifinteger</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifpdf"><code>ifpdf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifpdf-1"><code>ifpdf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifpdf-2"><code>ifpdf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifrewritetocfile"><code>ifrewritetocfile</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reading-the-_002etoc-file">Reading the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifundefined"><code>ifundefined</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifundefined">\ifundefined</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-includegraphics"><code>includegraphics</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexfilebasename"><code>indexfilebasename</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexfonts"><code>indexfonts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexitem-hook"><code>indexitem <span class="roman">hook</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexprooffont"><code>indexprooffont</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexproofingfalse"><code>indexproofingfalse</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexproofingtrue"><code>indexproofingtrue</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexproofterm"><code>indexproofterm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexproofunbox"><code>indexproofunbox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexsee"><code>indexsee</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexsee-1"><code>indexsee</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexseealso"><code>indexseealso</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexseealso-1"><code>indexseealso</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexseealsowords"><code>indexseealsowords</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexseeword"><code>indexseeword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexsetmargins"><code>indexsetmargins</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexspace"><code>indexspace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innerdef"><code>innerdef</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innerinnerdef"><code>innerinnerdef</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewbox"><code>innernewbox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewcount"><code>innernewcount</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewdimen"><code>innernewdimen</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewfam"><code>innernewfam</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewhelp"><code>innernewhelp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewif"><code>innernewif</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewinsert"><code>innernewinsert</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewlanguage"><code>innernewlanguage</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewread"><code>innernewread</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewskip"><code>innernewskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewtoks"><code>innernewtoks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-innernewwrite"><code>innernewwrite</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-input"><code>input</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-insidemargin"><code>insidemargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interfootnoteskip"><code>interfootnoteskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interitemskip"><code>interitemskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interitemskipamount"><code>interitemskipamount</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-isinteger"><code>isinteger</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-item-in-indexes"><code>item <span class="roman">in indexes</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-itemletter"><code>itemletter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-itemnumber"><code>itemnumber</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ituline"><code>ituline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-jobname"><code>jobname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-jobname-1"><code>jobname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-jobname-2"><code>jobname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-files">Auxiliary files</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LAMSTeX-1"><code>LAMSTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-4"><code>LaTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lbracechar"><code>lbracechar</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left-_0028destination-option_0029"><code>left <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left-_0028destination-option_0029-1"><code>left <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left-_0028destination-option_0029-2"><code>left <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left-_0028destination-option_0029-3"><code>left <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left-_0028destination-option_0029-4"><code>left <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leftdisplayindent"><code>leftdisplayindent</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leftdisplays"><code>leftdisplays</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leftdisplaysetup"><code>leftdisplaysetup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-displays">Formatting displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lefteqnumbers"><code>lefteqnumbers</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leftmargin"><code>leftmargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leftskip"><code>leftskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leqalignno"><code>leqalignno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leqalignno-1"><code>leqalignno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leqno"><code>leqno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letreturn"><code>letreturn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letter"><code>letter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lft"><code>lft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-li"><code>li</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-li-_0028hyperlinks_0029"><code>li <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#List-hyperlinks">List hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linenumberedlisting"><code>linenumberedlisting</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linenumberedlisting-1"><code>linenumberedlisting</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listcompact"><code>listcompact</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listing"><code>listing</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listing-1"><code>listing</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listingfont"><code>listingfont</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listleftindent"><code>listleftindent</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listmarkerspace"><code>listmarkerspace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listrightindent"><code>listrightindent</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-loggingall"><code>loggingall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-loop"><code>loop</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeactive"><code>makeactive</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeatletter"><code>makeatletter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeatother"><code>makeatother</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeblankbox"><code>makeblankbox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makecolumns"><code>makecolumns</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tables">Tables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeheadline"><code>makeheadline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapdown"><code>mapdown</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapdown-1"><code>mapdown</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapleft"><code>mapleft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapleft-1"><code>mapleft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapright"><code>mapright</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapright-1"><code>mapright</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapup"><code>mapup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mapup-1"><code>mapup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-matrix"><code>matrix</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mbox"><code>mbox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MF"><code>MF</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-monthname"><code>monthname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-morphdist"><code>morphdist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-morphdist-1"><code>morphdist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-name-_0028hyperlink-type_0029"><code>name <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-name-_0028hyperlink-type_0029-1"><code>name <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-new_2026"><code>new&hellip;</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newblock"><code>newblock</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newcommand"><code>newcommand</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newwin-_0028hyperlink-option_0029"><code>newwin <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newwin-_0028hyperlink-option_0029-1"><code>newwin <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newwin-_0028hyperlink-option_0029-2"><code>newwin <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-noarrow"><code>noarrow</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-noauxfile"><code>noauxfile</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nobibtex"><code>nobibtex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nocite"><code>nocite</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nolastlinelisting"><code>nolastlinelisting</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nolastlinelisting-1"><code>nolastlinelisting</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nolinks-_0028hyperlink-driver_0029"><code>nolinks <span class="roman">(hyperlink driver)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-normalbaselineskip"><code>normalbaselineskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-num-_0028hyperlink-type_0029"><code>num <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numberedfootnote"><code>numberedfootnote</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numberedfootnote-_0028hyperlinks_0029"><code>numberedfootnote <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numberedlist"><code>numberedlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numberedlistdepth"><code>numberedlistdepth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numberedmarker"><code>numberedmarker</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numbername"><code>numbername</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-out-numbers">Writing out numbers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-obeywhitespace"><code>obeywhitespace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Obeying-spaces">Obeying spaces</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-orderedlist"><code>orderedlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-other"><code>other</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-outer"><code>outer</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-outsidemargin"><code>outsidemargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-_0028hyperlink-type_0029"><code>page <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pagefit-_0028hyperlink-option_0029"><code>pagefit <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pagefit-_0028hyperlink-option_0029-1"><code>pagefit <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pagefit-_0028hyperlink-option_0029-2"><code>pagefit <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pagefit-_0028hyperlink-option_0029-3"><code>pagefit <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pageno"><code>pageno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pagetotal"><code>pagetotal</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paperheight"><code>paperheight</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paperwidth"><code>paperwidth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-parfillskip_002c-reset-by-_005cragged_002e_002e_002e"><code>parfillskip<span class="roman">, reset by <code>\ragged...</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-parindent-in-indexes"><code>parindent <span class="roman">in indexes</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path"><code>path</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfescapestring-pdfTeX-primitive"><code>pdfescapestring <span class="roman">pdfTeX primitive</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfmark-_0028PDF-language-primitive_0029"><code>pdfmark <span class="roman">(PDF language primitive)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfoutline-_0028pdftex-primitive_0029"><code>pdfoutline <span class="roman">(<code>pdftex</code> primitive)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfoutput"><code>pdfoutput</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex-_0028hyperlink-driver_0029"><code>pdftex <span class="roman">(hyperlink driver)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-percentchar"><code>percentchar</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-phantomeqlabel"><code>phantomeqlabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-phantomeqnumber"><code>phantomeqnumber</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-previouseverydisplay"><code>previouseverydisplay</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-displays">Formatting displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printbetweencitations"><code>printbetweencitations</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-citations">Formatting citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printcitefinish"><code>printcitefinish</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-citations">Formatting citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printcitenote"><code>printcitenote</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-citations">Formatting citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printcitestart"><code>printcitestart</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-citations">Formatting citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printitem"><code>printitem</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printlistinglineno"><code>printlistinglineno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printlistinglineno-1"><code>printlistinglineno</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-providecommand"><code>providecommand</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quadcolumns"><code>quadcolumns</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raggedleft"><code>raggedleft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raggedleftskip"><code>raggedleftskip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raggedright"><code>raggedright</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raggedright-for-index-entries"><code>raggedright <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raise-_0028hyperlink-option_0029"><code>raise <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raise-_0028hyperlink-option_0029-1"><code>raise <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raw-_0028destination-type_0029"><code>raw <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raw-_0028destination-type_0029-1"><code>raw <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raw-_0028hyperlink-type_0029"><code>raw <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raw-_0028hyperlink-type_0029-1"><code>raw <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rbracechar"><code>rbracechar</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-readindexfile"><code>readindexfile</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-readindexfile-_0028hyperlinks_0029"><code>readindexfile <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-readtocfile"><code>readtocfile</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reading-the-_002etoc-file">Reading the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ref"><code>ref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ref-1"><code>ref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ref-_0028hyperlinks_0029"><code>ref <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-refn"><code>refn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-refn-_0028hyperlinks_0029"><code>refn <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-refs"><code>refs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-refs-_0028hyperlinks_0029"><code>refs <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-refspace"><code>refspace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-refspace-1"><code>refspace</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reftie"><code>reftie</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reftie-1"><code>reftie</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reftie-2"><code>reftie</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-renewcommand"><code>renewcommand</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-repeat"><code>repeat</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resetatcatcode"><code>resetatcatcode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resetatcatcode-1"><code>resetatcatcode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rewritetocfile-_0028conditional_0029"><code>rewritetocfile <span class="roman">(conditional)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reading-the-_002etoc-file">Reading the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-right-_0028destination-option_0029"><code>right <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-right-_0028destination-option_0029-1"><code>right <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-righteqnumbers"><code>righteqnumbers</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rightmargin"><code>rightmargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rotatebox"><code>rotatebox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rt"><code>rt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sanitize"><code>sanitize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Converting-to-characters">Converting to characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sarrowlength"><code>sarrowlength</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sarrowlength-1"><code>sarrowlength</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sc"><code>sc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see-for-index-entries"><code>see <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see-for-index-entries-1"><code>see <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-seealso-for-index-entries"><code>seealso <span class="roman">for index entries</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-seevariant"><code>seevariant</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setidxpagelistdelimiter"><code>setidxpagelistdelimiter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setidxpagerangedelimiter"><code>setidxpagerangedelimiter</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setproperty"><code>setproperty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Properties">Properties</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setuplistinghook"><code>setuplistinghook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setuplistinghook-1"><code>setuplistinghook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sidx"><code>sidx</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sidxmarked"><code>sidxmarked</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sidxname"><code>sidxname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sidxsubmarked"><code>sidxsubmarked</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-singlecolumn"><code>singlecolumn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sline"><code>sline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sline-1"><code>sline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SLiTeX-1"><code>SLiTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spaceskip_002c-reset-by-_005cragged_002e_002e_002e"><code>spaceskip<span class="roman">, reset by <code>\ragged...</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-special"><code>special</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-special-ps_003a-for-dvips"><code>special ps: <span class="roman">for <code>dvips</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-specialpathdelimiters-_0028conditional_0029"><code>specialpathdelimiters <span class="roman">(conditional)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-subeqnumber"><code>subeqnumber</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subequation-references">Subequation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-subitem-in-indexes"><code>subitem <span class="roman">in indexes</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-subsubitem-in-indexes"><code>subsubitem <span class="roman">in indexes</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-testfileexistence"><code>testfileexistence</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-files">Auxiliary files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX"><code>TeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-textbf"><code>textbf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-timestamp"><code>timestamp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-timestring"><code>timestring</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-toc_2026entry"><code>toc&hellip;entry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-toc_2026entry-1"><code>toc&hellip;entry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tocfilebasename"><code>tocfilebasename</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-the-_002etoc-file_0027s-root-name">Changing the .toc file's root name</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-today"><code>today</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-top-_0028destination-option_0029"><code>top <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-top-_0028destination-option_0029-1"><code>top <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-top-_0028destination-option_0029-2"><code>top <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-top-_0028destination-option_0029-3"><code>top <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-top-_0028destination-option_0029-4"><code>top <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-topmargin"><code>topmargin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tracingall"><code>tracingall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tracingboxes"><code>tracingboxes</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tracingoff"><code>tracingoff</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-triplecolumns"><code>triplecolumns</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tt"><code>tt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ttfamily"><code>ttfamily</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-uncatcodespecials"><code>uncatcodespecials</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-uncatcodespecials-1"><code>uncatcodespecials</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unorderedlist"><code>unorderedlist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unorderedlistdepth"><code>unorderedlistdepth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unorderedmarker"><code>unorderedmarker</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url"><code>url</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url-_0028hyperlink-type_0029"><code>url <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url-_0028hyperlink-type_0029-1"><code>url <span class="roman">(hyperlink type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url-_0028hyperlinks_0029"><code>url <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-usepackage"><code>usepackage</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#The-_005cusepackage-command">The \usepackage command</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-varrowlength"><code>varrowlength</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-varrowlength-1"><code>varrowlength</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vchannel"><code>vchannel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbatim"><code>verbatim</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbatimescapechar"><code>verbatimescapechar</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vgrid"><code>vgrid</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vgrid-1"><code>vgrid</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vline"><code>vline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposn"><code>vmorphposn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposn-1"><code>vmorphposn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposndn"><code>vmorphposndn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposndn-1"><code>vmorphposndn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposnlft"><code>vmorphposnlft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposnlft-1"><code>vmorphposnlft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposnrt"><code>vmorphposnrt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposnrt-1"><code>vmorphposnrt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposnup"><code>vmorphposnup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vmorphposnup-1"><code>vmorphposnup</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vpenalty"><code>vpenalty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Mode_002dspecific-penalties">Mode-specific penalties</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vruledefaultwidth"><code>vruledefaultwidth</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Rules">Rules</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-width-_0028destination-option_0029"><code>width <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-width-_0028destination-option_0029-1"><code>width <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-width-_0028hyperlink-option_0029"><code>width <span class="roman">(hyperlink option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-writenumberedtocentry"><code>writenumberedtocentry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-writenumberedtocline"><code>writenumberedtocline</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-writetocentry"><code>writetocentry</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-X">X</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XeLaTeX-1"><code>XeLaTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XeTeX-1"><code>XeTeX</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrdef"><code>xrdef</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-references">Page references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrdef-_0028hyperlinks_0029"><code>xrdef <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xref"><code>xref</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-references">Page references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xref-_0028hyperlinks_0029"><code>xref <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrefn"><code>xrefn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrefn-_0028hyperlinks_0029"><code>xrefn <span class="roman">(hyperlinks)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrefpageword"><code>xrefpageword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-references">Page references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrefpageword-1"><code>xrefpageword</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrefwarning-conditional"><code>xrefwarning <span class="roman">conditional</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrefwarningfalse"><code>xrefwarningfalse</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xrlabel"><code>xrlabel</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Converting-to-characters">Converting to characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xspaceskip_002c-reset-by-_005cragged_002e_002e_002e"><code>xspaceskip<span class="roman">, reset by <code>\ragged...</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xyz-_0028destination-type_0029"><code>xyz <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xyz-_0028destination-type_0029-1"><code>xyz <span class="roman">(destination type)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Macro-index_fn_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-zoom-_0028destination-option_0029"><code>zoom <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-zoom-_0028destination-option_0029-1"><code>zoom <span class="roman">(destination option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Macro-index_fn_symbol-1"><b>@</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Macro-index_fn_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Macro-index_fn_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+
+<hr>
+<span id="Concept-index"></span><div class="header">
+<p>
+Previous: <a href="#Macro-index" accesskey="p" rel="prev">Macro index</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Macro-index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Concept-index-1"></span><h2 class="unnumbered">Concept index</h2>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Concept-index_cp_symbol-1"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_symbol-2"><b>.</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Concept-index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_symbol-1">*</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002a_002dform-of-LaTeX-commands">*-form of LaTeX commands</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_symbol-2">.</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eaux-file"><code>.aux <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eaux-file-1"><code>.aux <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreferences">Cross-references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebbl-file"><code>.bbl <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebib-file"><code>.bib <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebst-files"><code>.bst <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ecls-files"><code>.cls <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eeps-files"><code>.eps <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eeps-files-1"><code>.eps <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002efmt-file"><code>.fmt <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002efmt-file-1"><code>.fmt <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eidx-files"><code>.idx <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eidx-files-1"><code>.idx <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eind-files"><code>.ind <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eind-files-1"><code>.ind <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epdf-files"><code>.pdf <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epdf-files-1"><code>.pdf <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epdf-files-2"><code>.pdf <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eps-files"><code>.ps <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002esty-files"><code>.sty <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002etoc-file"><code>.toc <span class="roman">file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Contents">Contents</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-active-characters">active characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-after-index-terms">after index terms</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-alignments">alignments</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tables">Tables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-all-groups_002c-specifying">all groups, specifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-allocation-macros">allocation macros</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-alphanumeric-references">alphanumeric references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-AMSLaTeX">AMSLaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-amsppt_002esty"><code>amsppt.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-AMSTeX">AMSTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-AMSTeX-conflicts">AMSTeX conflicts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-arguments_002c-ignoring">arguments, ignoring</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-arrows">arrows</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-atom">atom</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Properties">Properties</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-autopict_002esty"><code>autopict.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-auxiliary-files_002c-existence-of">auxiliary files, existence of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-files">Auxiliary files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-avoiding-boxed-links">avoiding boxed links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-avoiding-boxed-links-1">avoiding boxed links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backslash-character">backslash character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-balancing-of-columns-with-_005csinglecolumn">balancing of columns with <code>\singlecolumn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Berry_002c-Karl">Berry, Karl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-beveled-hyperlink-border">beveled hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliographies">bibliographies</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography-fonts">bibliography fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography-items_002c-extra-space-between">bibliography items, extra space between</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography_002c-formatting-the">bibliography, formatting the</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibliography_002c-hyperlinks">bibliography, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bibtex"><code>bibtex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BibTeX">BibTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BibTeX-1">BibTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-black-boxes">black boxes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bookmarks_002c-making-PDF">bookmarks, making PDF</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Borceux_002c-Francis">Borceux, Francis</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-border-color_002c-hyperlink">border color, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-border-style_002c-hyperlink">border style, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-border-style_002c-hyperlink-1">border style, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-border-width_002c-hyperlink">border width, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Bott_002c-Raoul">Bott, Raoul</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-boxed-links_002c-avoiding">boxed links, avoiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-boxed-links_002c-avoiding-1">boxed links, avoiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-boxes_002c-open">boxes, open</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-braces_002c-inside-index-entries">braces, inside index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-brackets_002c-inside-index-entries">brackets, inside index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Brockett_002c-Roger-W_002e">Brockett, Roger W.</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Butterfly-Lemma">Butterfly Lemma</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Carlisle_002c-David">Carlisle, David</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-catcode-of-_0040">catcode of &lsquo;<samp>@</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-category-codes">category codes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-centering">centering</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-characters_002c-converting-to">characters, converting to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Converting-to-characters">Converting to characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-characters_002c-special">characters, special</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-citations">citations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-citations_002c-formatting">citations, formatting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-citations">Formatting citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-citations_002c-hyperlinks">citations, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-citations_002c-undefined">citations, undefined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmtt8"><code>cmtt8</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color">color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002c-demo">color, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002c-hyperlink-border">color, hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002c-hyperlinks">color, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002c-hyperlinks-1">color, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002c-hyperlinks-2">color, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002c-problems-with-pdfTeX">color, problems with pdfTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002esty"><code>color.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002esty-1"><code>color.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002esty-2"><code>color.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002esty-3"><code>color.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color_002esty-4"><code>color.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colored-links">colored links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colored-links-1">colored links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colored-links-2">colored links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-column-balancing-with-_005csinglecolumn">column balancing with <code>\singlecolumn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-column-eject">column eject</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-commas-after-index-terms">commas after index terms</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-commas-in-cross_002dreferencing-index-entries">commas in cross-referencing index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-highlighting-in-listings">comments, highlighting in listings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-commutative-diagrams">commutative diagrams</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commutative-diagrams">Commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-contents">contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Contents">Contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-contents_002c-and-verbatim-text">contents, and verbatim text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-contents_002c-hyperlinks">contents, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Contents-hyperlinks">Contents hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ConTeXt">ConTeXt</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-continued-index-entries">continued index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-covering-homotopy-property">covering homotopy property</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferences">cross-references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreferences">Cross-references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferences_002c-defining-general">cross-references, defining general</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Defining-generic-references">Defining generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferences_002c-defining-general-1">cross-references, defining general</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferences_002c-demo">cross-references, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferences_002c-hyperlinks">cross-references, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferencing-index-entries">cross-referencing index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cross_002dreferencing-index-entries-1">cross-referencing index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-CTRL_002dL_002c-and-verbatim-listing"><kbd>CTRL-L</kbd>, and verbatim listing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cube">cube</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-customizing-indexing">customizing indexing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dashed-hyperlink-border">dashed hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dashed-hyperlink-border-1">dashed hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-date">date</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default-hyperlink-options">default hyperlink options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default-hyperlink-options-1">default hyperlink options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default-hyperlink-type">default hyperlink type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default-hyperlink-type-1">default hyperlink type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-defining-general-references">defining general references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Defining-generic-references">Defining generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-defining-general-references-1">defining general references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-definitions_002c-global">definitions, global</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-demo-files">demo files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Demo-files">Demo files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup">destgroup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-options">destgroup options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-options-1">destgroup options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-options_002c-demo">destgroup options, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-type">destgroup type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-type-1">destgroup type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-type_002c-demo">destgroup type, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060bib_0027">destgroup &lsquo;bib&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060definexref_0027">destgroup &lsquo;definexref&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060eq_0027">destgroup &lsquo;eq&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060foot_0027">destgroup &lsquo;foot&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060footback_0027">destgroup &lsquo;footback&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060idx_0027">destgroup &lsquo;idx&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060li_0027">destgroup &lsquo;li&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#List-hyperlinks">List hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destgroup-_0060xrdef_0027">destgroup &lsquo;xrdef&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-group">destination group</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-options">destination options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-options_002c-common">destination options, common</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-options_002c-dvipdfm">destination options, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-options_002c-hypertex">destination options, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-hypertex">Destination options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-options_002c-pdftex">destination options, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-type">destination type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-types_002c-dvipdfm">destination types, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-types_002c-hypertex">destination types, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destination-types_002c-pdftex">destination types, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-default-options">destinations, default options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-default-options-1">destinations, default options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-default-type">destinations, default type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-default-type-1">destinations, default type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions-1">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions-2">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions-3">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions-4">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions-5">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-dimensions-6">destinations, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-disabling">destinations, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-disabling-1">destinations, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-group-options">destinations, group options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-group-options-1">destinations, group options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-group-options_002c-demo">destinations, group options, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-group-type">destinations, group type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-group-type-1">destinations, group type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-group-type_002c-demo">destinations, group type, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-in-another-file">destinations, in another file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-in-another-file-1">destinations, in another file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-in-another-file-2">destinations, in another file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-large-operators">destinations, large operators</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-large-operators-1">destinations, large operators</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-magnification">destinations, magnification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-named">destinations, named</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-named-1">destinations, named</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-numbered">destinations, numbered</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-page">destinations, page</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-raising">destinations, raising</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-URL">destinations, <acronym>URL</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-destinations_002c-URL-1">destinations, <acronym>URL</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-detecting-numbers">detecting numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-diagnostics">diagnostics</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Diagram_002c-macros-for-LaTeX">Diagram, macros for LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink">dimensions, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-1">dimensions, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-2">dimensions, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination-1">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination-2">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination-3">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination-4">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination-5">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dimensions_002c-hyperlink-destination-6">dimensions, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disabling-hyperlinks">disabling hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disabling-hyperlinks-1">disabling hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disabling-indexes">disabling indexes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-displayed-math-and-hyperlinks">displayed math and hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-displayed-math-and-hyperlinks-1">displayed math and hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-displays_002c-left_002djustifying">displays, left-justifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-do_2026while-loops">do&hellip;while loops</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-double-column-output">double column output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-double-columns-in-indexes">double columns in indexes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-draft_002c-option-for-graphics_002esty"><code>draft</code>, option for <samp>graphics.sty</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-driver-dvipdfm">driver <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-driver-hypertex">driver <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-driver-nolinks">driver <code>nolinks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-driver-pdftex">driver <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-drivers_002c-hyperlink">drivers, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm"><code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm-1"><code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm-2"><code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm_002c-destination-options"><code>dvipdfm</code>, destination options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm_002c-destination-types"><code>dvipdfm</code>, destination types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm_002c-hyperlink-driver"><code>dvipdfm</code>, hyperlink driver</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm_002c-link-options"><code>dvipdfm</code>, link options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfm_002c-link-types"><code>dvipdfm</code>, link types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvips"><code>dvips</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvips-1"><code>dvips</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvips_002c-making-PDF-outlines-for"><code>dvips</code>, making PDF outlines for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Eijkhout_002c-Victor">Eijkhout, Victor</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eject-in-multicolumns">eject in multicolumns</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-electronic-mail-addresses_002c-breaking">electronic mail addresses, breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-electronic-mail-addresses_002c-breaking-1">electronic mail addresses, breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-empty-argument_002c-checking-for">empty argument, checking for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifempty">\ifempty</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-empty-equation-labels">empty equation labels</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-empty-equation-labels_002c-referring-to">empty equation labels, referring to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-empty-string_002c-checking-for">empty string, checking for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifempty">\ifempty</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Encapsulated-PostScript">Encapsulated PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Encapsulated-PostScript-1">Encapsulated PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-environments_002c-user_002ddefined">environments, user-defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#User_002ddefined-environments">User-defined environments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Eplain_002c-installing">Eplain, installing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Eplain_002c-invoking">Eplain, invoking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Eplain_002c-purpose-of">Eplain, purpose of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Eplain_002c-upgrading">Eplain, upgrading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eplain_002eaux"><code>eplain.aux</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eplain_002efmt"><code>eplain.fmt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EPS"><acronym>EPS</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EPS-1"><acronym>EPS</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-epstopdf"><code>epstopdf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-epstopdf_002esty"><code>epstopdf.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equation-labels_002c-characters-valid-in">equation labels, characters valid in</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equation-numbers_002c-formatting-of">equation numbers, formatting of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-equation-references">Formatting equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equation-numbers_002c-left_002dalignment">equation numbers, left-alignment</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equations_002c-giving-numbers-to-all">equations, giving numbers to all</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equations_002c-groups-of">equations, groups of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subequation-references">Subequation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equations_002c-hyperlinks">equations, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equations_002c-numbering">equations, numbering</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-equations_002c-references-to">equations, references to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-error-messages">error messages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-error-on-_005cinput">error on <code>\input</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-escape-character_002c-changing-verbatim">escape character, changing verbatim</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eTeX">eTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-exact-index-hyperlinks">exact index hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-one_002dlevel">expansion, one-level</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cexpandonce">\expandonce</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-explicit-hyperlinks">explicit hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-explicit-hyperlinks_002c-demo">explicit hyperlinks, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ExTeX">ExTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-hyperlink-to">file, hyperlink to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-hyperlink-to-1">file, hyperlink to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_002c-hyperlink-to-2">file, hyperlink to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file_003a-links">&lsquo;<samp>file:</samp>&rsquo; links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filenames_002c-breaking">filenames, breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filenames_002c-breaking-1">filenames, breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-files_002c-verbatim-listing-of">files, verbatim listing of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-files_002c-verbatim-listing-of_002c-demo">files, verbatim listing of, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filtering-index-entries-with-hyperlinks">filtering index entries with hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-footnotes_002c-hyperlinks">footnotes, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-footnotes_002c-numbered">footnotes, numbered</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnotes">Footnotes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-for-loops">for loops</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-form-feed-character_002c-and-verbatim-listing">form feed character, and verbatim listing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-format-file">format file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-formatting-index-entries">formatting index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fractions">fractions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fractions">Fractions</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Ghostscript"><code><span class="roman">Ghostscript</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Ghostscript-1"><code><span class="roman">Ghostscript</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gobbling-arguments">gobbling arguments</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-golden-mean">golden mean</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-golden-mean-1">golden mean</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Graham_002c-Ronald-L_002e">Graham, Ronald L.</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics-collection_002c-LaTeX">graphics collection, LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics-collection_002c-LaTeX-1">graphics collection, LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics-collection_002c-LaTeX-2">graphics collection, LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics-collection_002c-LaTeX_002c-demo">graphics collection, LaTeX, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics_002c-omitting-typesetting-of">graphics, omitting typesetting of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics_002c-problems-with-pdfTeX">graphics, problems with pdfTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics_002esty"><code>graphics.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphicx_002esty"><code>graphicx.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphicx_002esty-1"><code>graphicx.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-grid">grid</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-option-list">group option list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-options_002c-hyperlink">group options, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-options_002c-hyperlink-1">group options, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-options_002c-hyperlink_002c-demo">group options, hyperlink, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-type_002c-hyperlink">group type, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-type_002c-hyperlink-1">group type, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-type_002c-hyperlink_002c-demo">group type, hyperlink, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060_0027-_0028empty_0029">group &lsquo;&rsquo; (empty)</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060_002a_0027">group &lsquo;*&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060bib_0027">group &lsquo;bib&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060cite_0027">group &lsquo;cite&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060definexref_0027">group &lsquo;definexref&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060eq_0027">group &lsquo;eq&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060eq_0027-1">group &lsquo;eq&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060eq_0027-2">group &lsquo;eq&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060foot_0027">group &lsquo;foot&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060footback_0027">group &lsquo;footback&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060hrefext_0027">group &lsquo;hrefext&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060hrefint_0027">group &lsquo;hrefint&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060idx_0027">group &lsquo;idx&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060li_0027">group &lsquo;li&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#List-hyperlinks">List hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060ref_0027">group &lsquo;ref&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060url_0027">group &lsquo;url&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060xrdef_0027">group &lsquo;xrdef&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group-_0060xref_0027">group &lsquo;xref&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group_002c-destination">group, destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group_002c-disabling-hyperlinks">group, disabling hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-hyperlinks-on_002foff-for-a-group">Turning hyperlinks on/off for a group</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group_002c-link">group, link</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group_002c-preserving-option-list">group, preserving option list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-groups_002c-specifying-all">groups, specifying all</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hanging-on-_005cinput">hanging on <code>\input</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-help-messages">help messages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-highlight-modes_002c-hyperlink">highlight modes, hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-highlighting">highlighting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-highlighting_002c-in-listings">highlighting, in listings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Hoppner_002c-Klaus">H&ouml;ppner, Klaus</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hooks">hooks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hooks">Hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-border-color">hyperlink border color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-color">hyperlink color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-color-1">hyperlink color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-color-2">hyperlink color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-default-types-and-options">Setting default types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions-1">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions-2">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions-3">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions-4">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions-5">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-dimensions-6">hyperlink destination, dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-magnification">hyperlink destination, magnification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-named">hyperlink destination, named</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-named-1">hyperlink destination, named</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-numbered">hyperlink destination, numbered</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-page">hyperlink destination, page</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-destination_002c-raising">hyperlink destination, raising</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-dimensions">hyperlink dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-dimensions-1">hyperlink dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-dimensions-2">hyperlink dimensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-driver-dvipdfm">hyperlink driver <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-driver-hypertex">hyperlink driver <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-driver-nolinks">hyperlink driver <code>nolinks</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-driver-pdftex">hyperlink driver <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-drivers">hyperlink drivers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-group_002c-disabling-hyperlinks">hyperlink group, disabling hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-hyperlinks-on_002foff-for-a-group">Turning hyperlinks on/off for a group</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-group_002c-preserving-option-list">hyperlink group, preserving option list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlink-options_002c-common">hyperlink options, common</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-bibliography">hyperlinks, bibliography</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-border-style">hyperlinks, border style</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-border-style-1">hyperlinks, border style</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-border-width">hyperlinks, border width</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-citations">hyperlinks, citations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-cross_002dreferences">hyperlinks, cross-references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-default-options">hyperlinks, default options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-default-options-1">hyperlinks, default options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-default-type">hyperlinks, default type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-default-type-1">hyperlinks, default type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-demo">hyperlinks, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-disabling">hyperlinks, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-disabling-1">hyperlinks, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-equations">hyperlinks, equations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-explicit">hyperlinks, explicit</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-explicit_002c-demo">hyperlinks, explicit, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-filtering-index-entries">hyperlinks, filtering index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-footnotes">hyperlinks, footnotes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-group-option-list">hyperlinks, group option list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-group-options">hyperlinks, group options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-group-options-1">hyperlinks, group options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-group-options_002c-demo">hyperlinks, group options, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-group-type">hyperlinks, group type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-group-type-1">hyperlinks, group type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-highlight-mode">hyperlinks, highlight mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-implicit">hyperlinks, implicit</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-implicit_002c-demo">hyperlinks, implicit, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-index">hyperlinks, index</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-index-destination-placement">hyperlinks, index destination placement</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-index_002c-exact">hyperlinks, index, exact</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-large-operators">hyperlinks, large operators</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-large-operators-1">hyperlinks, large operators</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-lists">hyperlinks, lists</a>:</td><td>&nbsp;</td><td valign="top"><a href="#List-hyperlinks">List hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-opening-in-a-new-window">hyperlinks, opening in a new window</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-page-references">hyperlinks, page references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-preserving-page_002dbreaking">hyperlinks, preserving page-breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-preserving-spacing">hyperlinks, preserving spacing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-see-and-see-also-index-entries">hyperlinks, see and see also index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-table-of-contents">hyperlinks, table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Contents-hyperlinks">Contents hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-to-another-file">hyperlinks, to another file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-to-another-file-1">hyperlinks, to another file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-to-another-file-2">hyperlinks, to another file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-URL">hyperlinks, <acronym>URL</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-URL-1">hyperlinks, <acronym>URL</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-URL-2">hyperlinks, <acronym>URL</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperlinks_002c-URL-3">hyperlinks, <acronym>URL</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperref_002esty"><code>hyperref.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-not-to-work">Packages known not to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertex_002c-destination-options"><code>hypertex</code>, destination options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-hypertex">Destination options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertex_002c-destination-types"><code>hypertex</code>, destination types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertex_002c-hyperlink-driver"><code>hypertex</code>, hyperlink driver</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertex_002c-link-options"><code>hypertex</code>, link options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-hypertex">Link options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertex_002c-link-types"><code>hypertex</code>, link types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertext-links">hypertext links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks">Hyperlinks</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-identifying-numbers">identifying numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idxuniq"><code>idxuniq</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ifpdf_002esty"><code>ifpdf.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ignoring-arguments">ignoring arguments</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-implicit-hyperlinks">implicit hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-implicit-hyperlinks_002c-demo">implicit hyperlinks, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-inaccessible-macros">inaccessible macros</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries-and-ranges">index entries and ranges</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries-containing-braces">index entries containing braces</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries-containing-brackets">index entries containing brackets</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries-with-special-characters">index entries with special characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries_0027-page-numbers_002c-modifying">index entries&rsquo; page numbers, modifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries_002c-and-cross_002dreferencing">index entries, and cross-referencing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries_002c-and-cross_002dreferencing-1">index entries, and cross-referencing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries_002c-proofing">index entries, proofing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entries_002c-with-verbatim-text">index entries, with verbatim text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entry-continuations">index entry continuations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entry-formatting">index entry formatting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-entry-general-sorting">index entry general sorting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-fonts">index fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-groupings">index groupings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-hyperlink">index hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index-typesetting">index typesetting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-and-verbatim-text">index, and verbatim text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-choosing-destination-placement">index, choosing destination placement</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-destination-placement">index, destination placement</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-exact-hyperlinks">index, exact hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-hyperlinks-in-see-and-see-also-entries">index, hyperlinks in see and see also entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-parsing-page-numbers">index, parsing page numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-placement-of-destinations">index, placement of destinations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-selecting-destination-placement">index, selecting destination placement</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Choosing-destination-placement">Choosing destination placement</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-index_002c-underlining-page-numbers">index, underlining page numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexes_002c-disabling">indexes, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexes_002c-multiple">indexes, multiple</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexing">indexing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexing-and-trailing-spaces">indexing and trailing spaces</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-terms">Indexing terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexing-commands">indexing commands</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-indexing-terms">indexing terms</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-terms">Indexing terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-insertion-classes">insertion classes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-inset-hyperlink-border">inset hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-installation">installation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-integers_002c-detecting">integers, detecting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-italic-correction">italic correction</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-bibliographies">Formatting bibliographies</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-item-labels_002c-changing">item labels, changing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-iteration">iteration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-justification">justification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Knuth_002c-Donald-Ervin">Knuth, Donald Ervin</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Knuth_002c-Donald-Ervin-1">Knuth, Donald Ervin</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-labels-on-items_002c-changing">labels on items, changing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-labels_002c-characters-valid-in">labels, characters valid in</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreferences">Cross-references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-labels_002c-empty-equation">labels, empty equation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-labels_002c-empty-equation_002c-referring-to">labels, empty equation, referring to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-references">Equation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Lamport_002c-Leslie">Lamport, Leslie</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LAMSTeX">LAMSTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Lang_002c-Serge">Lang, Serge</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Lang_002c-Serge-1">Lang, Serge</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-large-operators-and-hyperlinks">large operators and hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-large-operators-and-hyperlinks-1">large operators and hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX">LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-1">LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-2">LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-3">LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-commands_002c-in-btxmac_002etex">LaTeX commands, in <samp>btxmac.tex</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Commands-from-LaTeX">Commands from LaTeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-graphics-collection">LaTeX graphics collection</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-graphics-collection-1">LaTeX graphics collection</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-graphics-collection-2">LaTeX graphics collection</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-graphics-collection_002c-demo">LaTeX graphics collection, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-packages">LaTeX packages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-packages-1">LaTeX packages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-packages-2">LaTeX packages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-not-to-work">Packages known not to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LaTeX-packages_002c-restoring-_005cinput">LaTeX packages, restoring <code>\input</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left_002dalignment-of-equation-numbers">left-alignment of equation numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left_002djustification">left-justification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-left_002djustification-of-displays">left-justification of displays</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letterspacing">letterspacing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linear-systems-theory">linear systems theory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lines">lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-group">link group</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-options">link options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-options_002c-common">link options, common</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-options_002c-dvipdfm">link options, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-options_002c-hypertex">link options, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-hypertex">Link options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-options_002c-pdftex">link options, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-type">link type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-types_002c-dvipdfm">link types, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-types_002c-hypertex">link types, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link-types_002c-pdftex">link types, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-group-options">link, group options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-group-options-1">link, group options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-group-options_002c-demo">link, group options, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-group-type">link, group type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-link_002c-group-type-1">link, group type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup">linkgroup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-options">linkgroup options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-options-1">linkgroup options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-options_002c-demo">linkgroup options, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-type">linkgroup type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-type-1">linkgroup type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-types">Setting group types</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060cite_0027">linkgroup &lsquo;cite&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citation-hyperlinks">Citation hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060eq_0027">linkgroup &lsquo;eq&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060eq_0027-1">linkgroup &lsquo;eq&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060foot_0027">linkgroup &lsquo;foot&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060footback_0027">linkgroup &lsquo;footback&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060hrefext_0027">linkgroup &lsquo;hrefext&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060hrefint_0027">linkgroup &lsquo;hrefint&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060idx_0027">linkgroup &lsquo;idx&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060ref_0027">linkgroup &lsquo;ref&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060url_0027">linkgroup &lsquo;url&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-linkgroup-_0060xref_0027">linkgroup &lsquo;xref&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-links_002c-hypertext">links, hypertext</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks">Hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-list-of-figures">list of figures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternative-contents-files">Alternative contents files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-list-of-tables">list of tables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alternative-contents-files">Alternative contents files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listing-files">listing files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-listing-files_002c-demo">listing files, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lists">lists</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lists_002c-formatting">lists, formatting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Formatting-lists">Formatting lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lists_002c-hyperlinks">lists, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#List-hyperlinks">List hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-loading-packages_002c-environment-for">loading packages, environment for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-logos">logos</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lookahead-without-spaces">lookahead without spaces</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cfuturenonspacelet">\futurenonspacelet</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-loops">loops</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lscommnt_002etex"><code>lscommnt.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-magnification_002c-hyperlink-destination">magnification, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeindex"><code>makeindex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeindex-1"><code>makeindex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-makeindex-2"><code>makeindex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-hyperlinks">Index hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-margins_002c-changing">margins, changing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Margins">Margins</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-margins_002c-index-terms-in">margins, index terms in</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mathematics-displays_002c-formatting">mathematics displays, formatting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Displays">Displays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mathematics-displays_002c-hyperlinks">mathematics displays, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mathematics-displays_002c-hyperlinks-1">mathematics displays, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont">Metafont</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-microtype_002esty"><code>microtype.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-not-to-work">Packages known not to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-miniltx_002etex"><code>miniltx.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-minimal-realizations">minimal realizations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-modifying-index-entries_0027-page-numbers">modifying index entries&rsquo; page numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-morphisms">morphisms</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-multiple-column-output">multiple column output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-multiple-indexes">multiple indexes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-named-destination">named destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-named-destination-1">named destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-names_002c-of-TeX-variants">names, of TeX variants</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-new-window_002c-opening-hyperlink-in">new window, opening hyperlink in</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newlinechar">newlinechar</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-newlines_002c-obeying">newlines, obeying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Obeying-spaces">Obeying spaces</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nolinks_002c-hyperlink-driver"><code>nolinks</code>, hyperlink driver</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numbered-destination">numbered destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numbered-lists">numbered lists</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numbered-references">numbered references</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numbers_002c-detecting">numbers, detecting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numbers_002c-written-form-of">numbers, written form of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-out-numbers">Writing out numbers</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Oberdiek_002c-Heiko">Oberdiek, Heiko</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-omitting-hyperlinks">omitting hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-omitting-hyperlinks-1">omitting hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-omitting-typesetting-of-graphics">omitting typesetting of graphics</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-open-boxes">open boxes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-option-list_002c-group">option list, group</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-option-list_002c-preserving-for-group">option list, preserving for group</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-destination_002c-common">options, destination, common</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-destination_002c-dvipdfm">options, destination, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-destination_002c-hypertex">options, destination, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-hypertex">Destination options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-destination_002c-pdftex">options, destination, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-link-and-destination">options, link and destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-link_002c-common">options, link, common</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-link_002c-dvipdfm">options, link, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-link_002c-hypertex">options, link, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-hypertex">Link options for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-link_002c-pdftex">options, link, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ordered-list">ordered list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-outlines_002c-making-PDF">outlines, making PDF</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output-routine-and-index-proofing">output routine and index proofing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-overstriking">overstriking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-packages_002c-LaTeX">packages, LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-packages_002c-LaTeX-1">packages, LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-packages_002c-LaTeX-2">packages, LaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-not-to-work">Packages known not to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-destination">page destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-list_002c-parsing">page list, parsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-range_002c-parsing">page range, parsing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-reference-hyperlink">page reference hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page_002dbreaking_002c-preserving-with-hyperlinks">page-breaking, preserving with hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-parsing-page-numbers">parsing page numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Patashnik_002c-Oren">Patashnik, Oren</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pathnames_002c-breaking">pathnames, breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pathnames_002c-breaking-1">pathnames, breaking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF"><acronym>PDF</acronym></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF-outlines-_0028a_002ek_002ea_002e-bookmarks_0029">PDF outlines (a.k.a. bookmarks)</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF-output"><acronym>PDF</acronym> output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex"><code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex-1"><code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex-2"><code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002c-destination-options"><code>pdftex</code>, destination options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002c-destination-types"><code>pdftex</code>, destination types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002c-hyperlink-driver"><code>pdftex</code>, hyperlink driver</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002c-link-options"><code>pdftex</code>, link options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002c-link-types"><code>pdftex</code>, link types</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002c-making-PDF-outlines-for"><code>pdftex</code>, making PDF outlines for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-PDF-outlines">Making PDF outlines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfTeX_002c-problems-using-color-and-graphics">pdfTeX, problems using color and graphics</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfTeX_002c-problems-with-supp_002dmis_002etex">pdfTeX, problems with <samp>supp-mis.tex</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pict2e_002esty"><code>pict2e.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-not-to-work">Packages known not to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-picture-mode">picture mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-picture-mode-1">picture mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Portable-Document-Format">Portable Document Format</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-point">PostScript point</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-point-1">PostScript point</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-point-2">PostScript point</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-proofing-index-terms">proofing index terms</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Proofing-index-terms">Proofing index terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-properties">properties</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Properties">Properties</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ps2pdf"><code>ps2pdf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ps2pdf-1"><code>ps2pdf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psfrag_002esty"><code>psfrag.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quadruple-column-output">quadruple column output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Rahtz_002c-Sebastian">Rahtz, Sebastian</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raising-hyperlink-destinations">raising hyperlink destinations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raising-hyperlink-destinations-1">raising hyperlink destinations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Setting-group-options">Setting group options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ranges-and-index-entry">ranges and index entry</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-recognizing-numbers">recognizing numbers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rectangles">rectangles</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Boxes">Boxes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-references_002c-alphanumeric">references, alphanumeric</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-references_002c-defining-general">references, defining general</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Defining-generic-references">Defining generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-references_002c-defining-general-1">references, defining general</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Using-generic-references">Using generic references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-references_002c-numbered">references, numbered</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-register-allocation">register allocation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Allocation-macros">Allocation macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-restoring-_005cinput_002c-LaTeX-packages">restoring <code>\input</code>, LaTeX packages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-for-loading-packages">Environment for loading packages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-return-character">return character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-right_002djustification">right-justification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Justification">Justification</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rms">rms</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rotation">rotation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rotation_002c-demo">rotation, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rule-thickness">rule thickness</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Rules">Rules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-run_003a-links">&lsquo;<samp>run:</samp>&rsquo; links</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-scaling">scaling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-scaling_002c-demo">scaling, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sed"><code>sed</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see-also-index-entries-and-hyperlinks">see also index entries and hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see-also-index-entries-and-sorting">see also index entries and sorting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see_002c-and-index-entries">see, and index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Modifying-index-entries">Modifying index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see_002c-and-index-entries-1">see, and index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-see_002c-and-index-entries_002c-hyperlinks">see, and index entries, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-silent-indexing">silent indexing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-terms">Indexing terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-skipping-tokens">skipping tokens</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifundefined">\ifundefined</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-skipping-tokens-1">skipping tokens</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifempty">\ifempty</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SLiTeX">SLiTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Snake-Lemma">Snake Lemma</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Arrows-and-morphisms">Arrows and morphisms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-solid-hyperlink-border">solid hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sorting-an-index">sorting an index</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sorting-of-index-entries">sorting of index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-soul_002esty"><code>soul.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-space-above-index-entries">space above index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spaces_002c-ignoring">spaces, ignoring</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cfuturenonspacelet">\futurenonspacelet</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spaces_002c-obeying">spaces, obeying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Obeying-spaces">Obeying spaces</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spaces_002c-trailing-and-indexing-commands">spaces, trailing and indexing commands</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-terms">Indexing terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spacing-out">spacing out</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spacing_002c-preserving-with-hyperlinks">spacing, preserving with hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-special-characters">special characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-special-characters_002c-in-index-entries">special characters, in index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-special-characters_002c-in-table-of-contents">special characters, in table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Stallman_002c-Richard">Stallman, Richard</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-striking-out">striking out</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-style_002c-hyperlink-border">style, hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-subequations_002c-referring-to">subequations, referring to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subequation-references">Subequation references</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-subterm-in-indexing">subterm in indexing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-terms">Indexing terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-supp_002dmis_002etex_002c-problems-with-pdfTeX"><code>supp-mis.tex<span class="roman">, problems with pdfTeX</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-supp_002dpdf_002etex"><code>supp-pdf.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents">table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Contents">Contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents_002c-and-verbatim-text">table of contents, and verbatim text</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents_002c-hyperlinks">table of contents, hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Contents-hyperlinks">Contents hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents_002c-short">table of contents, short</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reading-the-_002etoc-file">Reading the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-table-of-contents_002c-short-1">table of contents, short</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Macro-arguments">Macro arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tables">tables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tables">Tables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tabs">tabs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Obeying-spaces">Obeying spaces</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-by-Topic"><i>TeX by Topic</i></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-Frequently-Asked-Questions">TeX Frequently Asked Questions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFORMATS"><code>TEXFORMATS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texi2dvi"><code>texi2dvi</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Eplain">Invoking Eplain</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texi2dvi-1"><code>texi2dvi</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Citations">Citations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texi2dvi-2"><code>texi2dvi</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing">Indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Texinfo">Texinfo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXINPUTS"><code>TEXINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texnames_002esty"><code>texnames.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-time-of-day">time of day</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Time-of-day">Time of day</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-toc-files_002c-writing-several"><code>toc</code> files, writing several</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-the-_002etoc-file_0027s-root-name">Changing the .toc file's root name</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tracing">tracing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnostics">Diagnostics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trailing-spaces-and-indexing-commands">trailing spaces and indexing commands</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-terms">Indexing terms</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trimsee"><code>trimsee</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Customizing-indexing">Customizing indexing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-triple-column-output">triple column output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Multiple-columns">Multiple columns</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Tu_002c-Loring-W_002e">Tu, Loring W.</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TUGboat"><i>TUGboat</i></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-type_002c-link-and-destination">type, link and destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-types_002c-destination_002c-dvipdfm">types, destination, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-types_002c-destination_002c-hypertex">types, destination, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-types_002c-destination_002c-pdftex">types, destination, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-types_002c-link_002c-dvipdfm">types, link, <code>dvipdfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-types_002c-link_002c-hypertex">types, link, <code>hypertex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-types_002c-link_002c-pdftex">types, link, <code>pdftex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-typesetting-an-index">typesetting an index</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Typesetting-an-index">Typesetting an index</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-undefined-control-sequence_002c-checking-for">undefined control sequence, checking for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cifundefined">\ifundefined</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-undefined-labels_002c-warnings-about">undefined labels, warnings about</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-underline-hyperlink-border">underline hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-underlining">underlining</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-underlining-page-numbers-in-index">underlining page numbers in index</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-universal-mapping-property">universal mapping property</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unordered-lists">unordered lists</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Lists">Lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-upgrading">upgrading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL-for-path_002esty"><acronym>URL</acronym> for <samp>path.sty</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paths">Paths</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL-for-pdfTeX"><acronym>URL</acronym> for pdfTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Checking-for-PDF-output">Checking for PDF output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL-hyperlink"><acronym>URL</acronym> hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#General-hyperlinks">General hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL-hyperlink-1"><acronym>URL</acronym> hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL-hyperlink-2"><acronym>URL</acronym> hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-hypertex">Link types for hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL-hyperlink-3"><acronym>URL</acronym> hyperlink</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url_002esty"><code>url.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-to-work">Packages known to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url_002esty-1"><code>url.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#URL-hyperlinks">URL hyperlinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-url_002esty-2"><code>url.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-user_002dinaccessible-macros">user-inaccessible macros</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Category-codes">Category codes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vectors">vectors</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbatim-listing">verbatim listing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Verbatim-listing">Verbatim listing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbatim-listing_002c-demo">verbatim listing, demo</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbatim-text_002c-in-index">verbatim text, in index</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Index-entries-with-special-characters">Index entries with special characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbatim-text_002c-in-table-of-contents">verbatim text, in table of contents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-version-number">version number</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Walden_002c-David">Walden, David</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Warner_002c-Frank-W_002e">Warner, Frank W.</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-whatsits-made-by-hyperlinks">whatsits made by hyperlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-whatsits-made-by-index-entries">whatsits made by index entries</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Indexing-commands">Indexing commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-while-loops">while loops</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Iteration">Iteration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-whitespace">whitespace</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Obeying-spaces">Obeying spaces</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-width_002c-hyperlink-border">width, hyperlink border</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-writing-several-toc-files">writing several <code>toc</code> files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-the-_002etoc-file_0027s-root-name">Changing the .toc file's root name</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-X">X</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xcolor_002esty"><code>xcolor.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Packages-known-not-to-work">Packages known not to work</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xdvi"><code>xdvi</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XeLaTeX">XeLaTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xeplain_002etex"><code>xeplain.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XeTeX">XeTeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logos">Logos</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-xhyper_002etex"><code>xhyper.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Concept-index_cp_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Zassenhaus_002c-Hans">Zassenhaus, Hans</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-zooming_002c-hyperlink-destination">zooming, hyperlink destination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Concept-index_cp_symbol-1"><b>*</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_symbol-2"><b>.</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Concept-index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Concept-index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+
+
+<hr>
+
+
+
+</body>
+</html>
diff --git a/macros/eplain/doc/eplain.info b/macros/eplain/doc/eplain.info
new file mode 100644
index 0000000000..3f85c1675d
--- /dev/null
+++ b/macros/eplain/doc/eplain.info
@@ -0,0 +1,8325 @@
+This is eplain.info, produced by makeinfo version 6.6 from eplain.texi.
+
+This manual documents the Eplain macros, version 3.9, May 2019. Eplain
+provides functionality for plain TeX that is intended to be useful
+regardless of how your document is actually formatted.
+
+ Most of this manual is in the public domain, like most of the Eplain
+code. It was originally written by Karl Berry, starting in 1989. Steven
+Smith wrote the documentation for the commutative diagram macros; this
+chapter is under the GNU General Public License. Adam Lewenberg has made
+additions and corrections. Oleg Katsitadze wrote the section on LaTeX
+packages and the chapter on hyperlinks, and updates throughout.
+INFO-DIR-SECTION TeX
+START-INFO-DIR-ENTRY
+* Eplain: (eplain). Expanding on plain Tex.
+END-INFO-DIR-ENTRY
+
+
+File: eplain.info, Node: Top, Next: Introduction, Up: (dir)
+
+Eplain
+******
+
+This manual documents the Eplain macros, version 3.9, May 2019. Eplain
+provides functionality for plain TeX that is intended to be useful
+regardless of how your document is actually formatted.
+
+ Most of this manual is in the public domain, like most of the Eplain
+code. It was originally written by Karl Berry, starting in 1989.
+Steven Smith wrote the documentation for the commutative diagram macros;
+this chapter is under the GNU General Public License. Adam Lewenberg
+has made additions and corrections. Oleg Katsitadze wrote the section
+on LaTeX packages and the chapter on hyperlinks, and updates throughout.
+
+ The Eplain home page is <https://tug.org/eplain>.
+
+* Menu:
+
+* Introduction:: Eplain's purpose and philosophy.
+* Installation:: Installing Eplain.
+* Invoking Eplain:: Using Eplain from a TeX file.
+* User definitions:: Macros to be used in a document.
+* Hyperlinks:: Producing documents with hyperlinks.
+* Arrow theoretic diagrams:: Macros for commutative diagrams.
+* Programming definitions:: Macros to be used in writing other macros.
+* Demo files:: Sample documents demonstrating Eplain.
+* Macro index:: Entries for TeX and Eplain control sequences.
+* Concept index:: General index.
+
+ -- The Detailed Node Listing --
+
+User definitions
+
+* Diagnostics:: Tracing information.
+* Rules:: Changing the default rule dimensions.
+* Citations:: Using BibTeX and Eplain to make bibliographies.
+* Displays:: Changing the formatting of math displays.
+* Time of day:: Producing the time of day.
+* Lists:: Producing numbered and unordered lists.
+* Verbatim listing:: Producing text just as it appears.
+* Contents:: Making a table of contents.
+* Cross-references:: Symbolically referring to pages or equations.
+* Page references:: Symbolic references to page numbers.
+* Equation references:: Symbolic references to equation numbers.
+* Indexing:: Creating and typesetting indexes.
+* Justification:: Left- or right-justification, or centering.
+* Tables:: Producing ordered tables.
+* Margins:: Changing the margins directly.
+* Multiple columns:: Getting output in two columns.
+* Footnotes:: Autonumbered footnotes; changing formatting.
+* Fractions:: A better way to produce fractions in text.
+* Paths:: Allowing line breaks in pathnames.
+* Logos:: Various logos.
+* Boxes:: Producing filled or open rectangles.
+* Checking for PDF output:: Checking for pdfTeX in PDF mode.
+* Loading LaTeX packages:: Support for LaTeX packages under plain TeX.
+
+Citations
+
+* Formatting citations:: Changing the way citations are printed.
+* Formatting bibliographies:: Changing the way bibliographies are printed.
+
+Displays
+
+* Formatting displays:: General formatting of displays.
+
+Lists
+
+* Formatting lists:: Changing how the lists look.
+
+Contents
+
+* Writing the .toc file::
+* Reading the .toc file::
+* Changing the .toc file's root name::
+* Alternative contents files::
+
+Cross-references
+
+* Defining generic references::
+* Using generic references::
+
+Equation references
+
+* Formatting equation references::
+* Subequation references::
+
+Indexing
+
+* Indexing terms:: Specifying what to index.
+* Typesetting an index:: Printing the sorted output.
+* Customizing indexing:: Creating commands and specifying extra actions.
+
+Indexing terms
+
+* Indexing commands:: Making index entries.
+* Modifying index entries:: Ranges, see/see also, page number typesetting.
+* Index entries with special characters::
+* Proofing index terms:: Noting index entries in the margins.
+
+Loading LaTeX packages
+
+* The \usepackage command:: Command to load packages.
+* Environment for loading packages:: Environment for the \usepackage commands.
+* Packages known to work:: Supported packages.
+* Packages known not to work:: Packages known not to work with Eplain.
+
+Hyperlinks
+
+* Introduction to hyperlinks::
+* Explicit hyperlinks::
+* Implicit hyperlinks::
+* Hyperlink drivers::
+* Setting hyperlink types and options::
+* Turning hyperlinks on/off::
+
+Implicit hyperlinks
+
+* General hyperlinks:: hrefint, hrefext
+* URL hyperlinks:: url
+* Citation hyperlinks:: cite, bib
+* List hyperlinks:: li
+* Cross-reference hyperlinks:: definexref, ref
+* Page reference hyperlinks:: xrdef, xref
+* Equation reference hyperlinks:: eq
+* Index hyperlinks:: idx
+* Footnote hyperlinks:: foot, footback
+* Contents hyperlinks::
+
+Index hyperlinks
+
+* Exact destinations for index terms::
+* Page destinations for index terms::
+* Choosing destination placement::
+* Index page list and page range parsers::
+* Hyperlinks in see and see also entries::
+
+Hyperlink drivers
+
+* Options supported by all drivers::
+* Hyperlink driver hypertex::
+* Hyperlink drivers pdftex and dvipdfm::
+* Hyperlink driver nolinks::
+
+Hyperlink driver hypertex::
+
+* Destination types for hypertex::
+* Destination options for hypertex::
+* Link types for hypertex::
+* Link options for hypertex::
+
+Hyperlink drivers pdftex and dvipdfm::
+
+* Destination types for pdftex and dvipdfm::
+* Destination options for pdftex and dvipdfm::
+* Link types for pdftex and dvipdfm::
+* Link options for pdftex and dvipdfm::
+
+Setting hyperlink types and options
+
+* Setting default types and options::
+* Setting group types::
+* Setting group options::
+
+Turning hyperlinks on/off
+
+* Turning low-level commands on/off::
+* Turning hyperlinks on/off for a group::
+
+Arrow theoretic diagrams
+
+* Slanted lines and vectors::
+* Commutative diagrams::
+
+Commutative diagrams
+
+* Arrows and morphisms::
+* Construction of commutative diagrams::
+* Commutative diagram parameters::
+
+Programming definitions
+
+* Category codes:: Changing category codes.
+* Allocation macros:: Non-outer versions of \newcount et al.
+* Iteration:: Doing 'for' and 'while' loops in TeX.
+* Macro arguments:: Reading and ignoring them.
+* Converting to characters:: Normalizing control sequences and spaces.
+* Expansion:: Controlling expansion.
+* Obeying spaces:: Making whitespace count anywhere.
+* Writing out numbers:: Making '1' into 'one'.
+* Mode-specific penalties::
+* Auxiliary files:: Testing for their existence.
+* User-defined environments:: User-defined environments.
+* Page list and page range parsers::
+
+Expansion
+
+* \csn and \ece::
+* \edefappend::
+* Hooks:: Manipulating and executing named actions.
+* Properties:: Associating information with a csname.
+* \expandonce::
+* \ifundefined::
+* \ifempty::
+* \ifinteger and \isinteger::
+* \futurenonspacelet::
+
+Demo files
+
+* Hyperlinks (xhyper.tex)::
+* Highlighting TeX comments in listings (lscommnt.tex)::
+
+
+File: eplain.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+The "Eplain" macro package expands on and extends the definitions in
+plain TeX. Its home on the web is <https://tug.org/eplain>.
+
+ This manual describes the definitions that you, as either an author
+or a macro writer, might like to use. It doesn't discuss the
+implementation; see comments in the source code ('xeplain.tex') for
+that.
+
+ Eplain is not intended to provide typesetting capabilities, as does
+LaTeX (originally written by Leslie Lamport) and Texinfo (Originally
+written by Richard Stallman). Instead, it provides definitions that are
+intended to be useful regardless of the high-level commands that you use
+when you actually prepare your manuscript.
+
+ For example, Eplain does not have a command '\section' to format
+section headings in an "appropriate" way, such as LaTeX's '\section'.
+The philosophy of Eplain is that some people will always need or want to
+go beyond the macro designer's idea of "appropriate". Such canned
+macros are fine--as long as you are willing to accept the resulting
+output. If you don't like the results, or if you are trying to match a
+different format, you have to put in extra work to override the
+defaults.
+
+ On the other hand, almost everyone would like capabilities such as
+cross-referencing by labels, so that you don't have to put actual page
+numbers in the manuscript. The author of Eplain is not aware of any
+generally available macro packages that (1) do not force their
+typographic style on an author, and yet (2) provide such capabilities.
+
+ Besides such generic macros as cross-referencing, Eplain contains
+another set of definitions: ones that change the conventions of plain
+TeX's output. For example, math displays in TeX are, by default,
+centered. If you want your displays to come out left-justified, you
+have to plow through 'The TeXbook' to find some way to do it, and then
+adapt the code to your own needs. Eplain tries to take care of the
+messy details of such things, while still leaving the detailed
+appearance of the output up to you.
+
+ Finally, numerous definitions turned out to be useful as Eplain was
+developed. They are also documented in this manual, on the chance that
+people writing other macros will be able to use them.
+
+ You can send bug reports or suggestions to <tex-eplain@tug.org>. The
+current version number of Eplain is defined as the macro '\fmtversion'
+at the end of the source file 'eplain.tex'. When corresponding, please
+refer to it.
+
+ To get on this mailing list yourself, email
+<tex-eplain-request@tug.org> with a message whose body contains a line
+
+ subscribe YOU@YOUR.PREFERRED.ADDRESS
+
+or visit <http://lists.tug.org/tex-eplain>.
+
+ David Walden had reported his experience with Eplain as a new user.
+The article is available online at
+<https://tug.org/pracjourn/2005-4/walden>. An introductory article
+(written for TUGboat) is also available online at
+<https://tug.org/eplain/misc/tb84katsi.pdf>.
+
+
+File: eplain.info, Node: Installation, Next: Invoking Eplain, Prev: Introduction, Up: Top
+
+2 Installation
+**************
+
+Your TeX installation should already contain a version of Eplain
+('eplain.tex') in its main 'texmf' tree (usually under
+'/usr/share/texmf/tex/eplain/' on Unix systems). To install a newer
+version of Eplain, put the new 'eplain.tex' (included in Eplain
+distributions) in the 'tex/eplain/' subdirectory of your local 'texmf'
+tree. The newer version you install in the local tree should override
+the older one in the main tree.
+
+ The location of the local 'texmf' tree obviously depends on your
+operating system and TeX installation. On Unix systems the usual
+location is '/usr/local/share/texmf/'. If you don't have write
+permissions for '/usr/local/share/texmf/', many installations read the
+'texmf' tree in the user's home directory; 'eplain.tex' then should go
+under '~/texmf/tex/eplain/'. For more information about TeX directory
+structure, please see
+<http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds>.
+
+ If you prefer to install 'eplain.tex' in a non-standard place, set an
+environment variable ('TEXINPUTS' for the Web2C port of TeX to Unix) to
+tell TeX how to find it.
+
+ If you want, you can also create a format ('.fmt') file for Eplain,
+which will eliminate the time spent reading the macro source file with
+'\input'. You do this by issuing a sequence of Unix commands something
+like this:
+
+ prompt$ touch eplain.aux
+ prompt$ initex
+ This is TeX, ...
+ **&plain eplain
+ (eplain.tex)
+ *\dump
+ ... MESSAGES ...
+
+You must make sure that 'eplain.aux' exists _before_ you run 'initex';
+otherwise, warning messages about undefined labels will never be issued.
+
+ You then have to install the resulting 'eplain.fmt' in your local
+'texmf' tree or set an environment variable to tell TeX how to find it.
+For the Web2C port of TeX to Unix, format files are usually installed
+under '/usr/local/share/texmf/web2c/' or '/var/lib/texmf/web2c/'; the
+environment variable is 'TEXFORMATS'.
+
+
+File: eplain.info, Node: Invoking Eplain, Next: User definitions, Prev: Installation, Up: Top
+
+3 Invoking Eplain
+*****************
+
+The simplest way to use Eplain is simply to put:
+
+ \input eplain
+
+at the beginning of your input file. The macro file is small enough
+that reading it does not take an unbearably long time--at least on
+contemporary machines.
+
+ In addition, if a format ('.fmt') file has been created for Eplain
+(see the previous section), you can eliminate the time spent reading the
+macro source file. You do this by responding '&eplain' to TeX's '**'
+prompt. For example:
+
+ initex
+ This is TeX, ...
+ **&eplain myfile
+
+ Depending on the implementation of TeX which you are using, you might
+also be able to invoke TeX as 'eplain' and have the format file
+automatically read.
+
+ If you write something which you will be distributing to others, you
+won't know if the Eplain format will be loaded already. If it is, then
+doing '\input eplain' will waste time; if it isn't, then you must load
+it. To solve this, Eplain defines the control sequence '\eplain' to be
+the letter 't' (a convention borrowed from Lisp; it doesn't actually
+matter what the definition is, only that the definition exists).
+Therefore, you can do the following:
+
+ \ifx\eplain\undefined \input eplain \fi
+
+where '\undefined' must never acquire a definition.
+
+ Eplain consists of several source files:
+'xeplain.tex'
+ most of the macros;
+
+'arrow.tex'
+ commutative diagram macros (*note Arrow theoretic diagrams::),
+ written by Steven Smith;
+
+'btxmac.tex'
+ bibliography-related macros (*note Citations::);
+
+'ifpdf.sty'
+ sets the switch '\ifpdf', which can be used to detect pdfTeX in PDF
+ mode (*note Checking for PDF output::), written by Heiko Oberdiek;
+
+'path.sty'
+ macro for allowing line breaks at punctuation characters within
+ long pathnames, electronic mail addresses, etc., (*note Paths::),
+ written by Philip Taylor;
+
+'texnames.sty'
+ abbreviations for various TeX-related names (*note Logos::), edited
+ by Nelson Beebe.
+
+The file 'eplain.tex' is all of these files merged together, with
+comments removed. The original sources can be found in Eplain source
+zip archive in your TeX distribution, on CTAN or on Eplain's home page
+at <https://tug.org/eplain>.
+
+ All of these files except 'xeplain.tex' can be input individually, if
+all you want are the definitions in that file.
+
+ Also, since the bibliography macros are fairly extensive, you might
+not want to load them, to conserve TeX's memory. Therefore, if the
+control sequence '\nobibtex' is defined, then the bibliography
+definitions are skipped. You must set '\nobibtex' before 'eplain.tex'
+is read, naturally. For example, you could start your input file like
+this:
+
+ \let\nobibtex = t
+ \input eplain
+
+By default, '\nobibtex' is undefined, and so the bibliography
+definitions _are_ made.
+
+ Likewise, define '\noarrow' if you don't want to include the
+commutative diagram macros from 'arrow.tex', perhaps because you already
+have conflicting ones.
+
+ If you don't want to read or write an 'aux' file at all, for any kind
+of cross-referencing, define '\noauxfile' before reading 'eplain.tex'.
+This also turns off all warnings about undefined labels.
+
+ Eplain conflicts with AMSTeX (to be precise, with 'amsppt.sty'): the
+macros '\cite' and '\ref' are defined by both.
+
+ If you want to use AMSTeX's '\cite', the solution is to define
+'\nobibtex' before reading Eplain, as described above.
+
+ If you have 'amsppt.sty' loaded and use '\ref', Eplain writes a
+warning on your terminal. If you want to use the AMSTeX '\ref', do
+'\let\ref = \amsref' after reading Eplain. To avoid the warning, do
+'\let\ref = \eplainref' after reading Eplain and before using '\ref'.
+
+ Sometimes you may need to run TeX more then once on your '.tex' file
+in order to produce and typeset indexes, resolve undefined
+cross-references and/or citations. The shell script 'texi2dvi' from the
+Texinfo documentation system (see <http://www.gnu.org/software/texinfo>)
+can automate this process: it runs BibTeX, MakeIndex and TeX as many
+times as needed to complete the compilation process. You will need to
+set the 'LATEX' environment variable to 'tex'. For example, in a
+Bourne-compatible shell, the following command will do all the work:
+
+ prompt$ LATEX=tex texi2dvi file.tex
+
+(Despite the name, 'texi2dvi' can also produce '.pdf' files; just set
+'LATEX=pdftex'.) See the output from the command 'texi2dvi --help' for
+invoking information and a full list of options.
+
+
+File: eplain.info, Node: User definitions, Next: Hyperlinks, Prev: Invoking Eplain, Up: Top
+
+4 User definitions
+******************
+
+This chapter describes definitions that are meant to be used directly in
+a document. When appropriate, ways to change the default formatting are
+described in subsections.
+
+* Menu:
+
+* Diagnostics:: Tracing information.
+* Rules:: Changing the default rule dimensions.
+* Citations:: Using BibTeX and Eplain to make bibliographies.
+* Displays:: Changing the formatting of math displays.
+* Time of day:: Producing the time of day.
+* Lists:: Producing numbered and unordered lists.
+* Verbatim listing:: Producing text just as it appears.
+* Contents:: Making a table of contents.
+* Cross-references:: Symbolic references to equations, figures, etc.
+* Page references:: Symbolic references to page numbers.
+* Equation references:: Symbolic references to equation numbers.
+* Indexing:: Creating and typesetting indexes.
+* Justification:: Ragged left, ragged right, centered.
+* Tables:: Producing ordered tables.
+* Margins:: Changing the margins directly.
+* Multiple columns:: Getting output in two columns.
+* Footnotes:: Autonumbered footnotes; changing formatting.
+* Fractions:: A better way to produce fractions in text.
+* Paths:: Allowing line breaks in pathnames.
+* Logos:: Various logos.
+* Boxes:: Producing filled or open rectangles.
+* Checking for PDF output:: Checking for pdfTeX in PDF mode.
+* Loading LaTeX packages:: Support for LaTeX packages under plain TeX.
+
+
+File: eplain.info, Node: Diagnostics, Next: Rules, Up: User definitions
+
+4.1 Diagnostics
+===============
+
+Plain TeX provides the '\tracingall' command, to turn on the maximum
+amount of tracing possible in TeX. The (usually voluminous) output from
+'\tracingall' goes both on the terminal and into the transcript file.
+It is sometimes easier to have the output go only to the transcript
+file, so you can peruse it at your leisure and not obscure other output
+to the terminal. So, Eplain provides the command '\loggingall'. (For
+some reason, this command is available in Metafont, but not in TeX.)
+
+ It is also sometimes useful to see the complete contents of boxes.
+'\tracingboxes' does this. (It doesn't affect whether or not the
+contents are shown on the terminal.)
+
+ You can turn off all tracing with '\tracingoff'.
+
+ You can also turn logging on and off globally, so you don't have to
+worry about whether or not you're inside a group at the time of command.
+These variants are named '\gloggingall' and '\gtracingall'.
+
+ Finally, if you write your own help messages (see '\newhelp' in 'The
+TeXbook'), you want a convenient way to break lines in them. This is
+what TeX's '\newlinechar' parameter is for; however, plain TeX doesn't
+set '\newlinechar'. Therefore, Eplain defines it to be the character
+'^^J'.
+
+ For example, one of Eplain's own error messages is defined as
+follows:
+
+ \newhelp\envhelp{Perhaps you forgot to end the previous^^J%
+ environment? I'm finishing off the current group,^^J%
+ hoping that will fix it.}%
+
+
+File: eplain.info, Node: Rules, Next: Citations, Prev: Diagnostics, Up: User definitions
+
+4.2 Rules
+=========
+
+The default dimensions of rules are defined in chapter 21 of the 'The
+TeXbook'. To sum up what is given there, the "thickness" of rules is
+0.4pt by default. Eplain defines three parameters that let you change
+this dimension: '\hruledefaultheight', '\hruledefaultdepth', and
+'\vruledefaultwidth'. By default, they are defined as 'The TeXbook'
+describes.
+
+ But it would be wrong to redefine '\hrule' and '\vrule'. For one
+thing, some macros in plain TeX depend on the default dimensions being
+used; for another, rules are used quite heavily, and the performance
+impact of making it a macro can be noticeable. Therefore, to take
+advantage of the default rule parameters, you must use '\ehrule' and
+'\evrule'.
+
+
+File: eplain.info, Node: Citations, Next: Displays, Prev: Rules, Up: User definitions
+
+4.3 Citations
+=============
+
+Bibliographies are part of almost every technical document. To handle
+them conveniently, you need two things: a program to do the tedious
+formatting, and a way to cite references by labels, rather than by
+numbers. The BibTeX program, written by Oren Patashnik, takes care of
+the first item; the citation commands in LaTeX, written to be used with
+BibTeX, take care of the second. Therefore, Eplain adopts the use of
+BibTeX, and virtually the same interface as LaTeX.
+
+ The general idea is that you put citation commands in the text of
+your document, and commands saying where the bibliography data is. When
+you run TeX, these commands produce output on the file with the same
+root name as your document (by default) and the extension '.aux'.
+BibTeX reads this file. You should put the bibliography data in a file
+or files with the extension '.bib'. BibTeX writes out a file with the
+same root name as your document and extension '.bbl'. Eplain reads this
+file the next time you run your document through TeX. (It takes
+multiple passes to get everything straight, because usually after seeing
+your bibliography typeset, you want to make changes in the '.bib' file,
+which means you have to run BibTeX again, which means you have to run
+TeX again...) An annotated example of the whole process is given below.
+
+ If your document has more than one bibliography--for example, if it
+is a collection of papers--you can tell Eplain to use a different root
+name for the '.bbl' file by defining the control sequence
+'\bblfilebasename'. The default definition is simply '\jobname'.
+
+ On the other hand, if your document's bibliography is very simple,
+you may prefer to create the '.bbl' file yourself, by hand, instead of
+using BibTeX. An annotated example of this approach is also given
+below.
+
+ See the document 'BibTeXing' (whose text is in the file 'btxdoc.tex',
+which should be in the Eplain distribution you got) for information on
+how to write your .bib files. Both the BibTeX and the Eplain
+distributions contain several examples, also.
+
+ The '\cite' command produces a citation in the text of your document.
+The exact printed form the citation will take is under your control
+(*note Formatting citations::). '\cite' takes one required argument, a
+comma-separated list of cross-reference labels (*note
+Cross-references::, for exactly what characters are allowed in such
+labels). Warning: spaces in this list are taken as part of the
+following label name, which is probably not what you expect. The
+'\cite' command also produces a command in the .aux file that tells
+BibTeX to retrieve the given reference(s) from the .bib file. '\cite'
+also takes one optional argument, which you specify within square
+brackets, as in LaTeX. This text is simply typeset after the citations.
+(See the example below.)
+
+ Eplain can create hypertext links for citations pointing to the
+relevant bibliography entries (*note Citation hyperlinks::).
+
+ Another command, '\nocite', puts the given reference(s) into the
+bibliography, but produces nothing in the text.
+
+ The '\bibliography' command is next. It serves two purposes:
+producing the typeset bibliography, and telling BibTeX the root names of
+the .bib files. Therefore, the argument to '\bibliography' is a comma
+separated list of the .bib files (without the '.bib'). Again, spaces in
+this list are significant.
+
+ You tell BibTeX the particular style in which you want your
+bibliography typeset with one more command: '\bibliographystyle'. The
+argument to this is a single filename STYLE, which tells BibTeX to look
+for a file STYLE.bst. See the document 'Designing BibTeX styles' (whose
+text is in the 'btxhak.tex') for information on how to write your own
+styles.
+
+ Eplain automatically reads the citations from the .aux file when your
+job starts.
+
+ If you don't want to see the messages about undefined citations, you
+can say '\xrefwarningfalse' before making any citations. Eplain
+automatically does this if the .aux file does not exist. You can
+restore the default by saying '\xrefwarningtrue'.
+
+ Here is a TeX input file that illustrates the various commands.
+
+ \input eplain % Reads the .aux file.
+ Two citations to Knuthian works:
+ \cite[note]{surreal,concrete-math}.
+ \beginsection{References.}\par % Title for the bibliography.
+ \bibliography{knuth} % Use knuth.bib for the labels.
+ \bibliographystyle{plain} % Number the references.
+ \end % End of the document.
+
+ If we suppose that this file was named 'citex.tex' and that the
+bibliography data is in 'knuth.bib' (as the above '\bibliography'
+command says), the following commands do what's required. ('$ '
+represents the shell prompt.)
+
+ $ tex citex (produces undefined citation messages)
+ $ bibtex citex (read knuth.bib and citex.aux, write citex.bbl)
+ $ tex citex (read citex.bbl, still have undefined citations)
+ $ tex citex (one more time, to resolve the references)
+
+The 'texi2dvi' program can help you automate this process (*note
+Invoking Eplain::).
+
+ For simple documents you might choose to write the '.bbl' file
+yourself, instead of running BibTeX. For this scenario, the following
+commands should suffice:
+
+ $ tex citex (read citex.bbl, produces undefined citation messages)
+ $ tex citex (one more time, to resolve the references)
+
+ The output looks something like (because we used the plain
+bibliography style):
+
+ Two citations to Knuthian works: [2,1 note].
+
+ References
+
+ [1] Ronald L. Graham, Donald E. Knuth, and Oren Patashnik. Concrete
+ Mathematics. Addison-Wesley, Reading, Massachusetts, 1989.
+
+ [2] Donald E. Knuth. Surreal Numbers. Addison-Wesley, Reading,
+ Massachusetts, 1974.
+
+ See the BibTeX documentation for information on how to write the
+bibliography databases, and the bibliography styles that are available.
+(If you want your references printed with names, as in [Knu74], instead
+of numbered, the bibliography style is 'alpha'.)
+
+* Menu:
+
+* Formatting citations:: Changing the way citations are printed.
+* Formatting bibliographies:: Changing the way bibliographies are printed.
+* Commands from LaTeX:: LaTeX commands defined by 'btxmac'.
+
+
+File: eplain.info, Node: Formatting citations, Next: Formatting bibliographies, Up: Citations
+
+4.3.1 Formatting citations
+--------------------------
+
+You may wish to change Eplain's formatting of citations; i.e., the
+result of your '\cite' commands. By default, the citation labels are
+printed one after another, separated by commas and enclosed in brackets,
+using the main text font. Some formats require other styles, such as
+superscripted labels. You can accommodate such formats by redefining the
+following macros.
+
+'\printcitestart'
+'\printcitefinish'
+ Eplain expands these macros at the beginning and end of the list of
+ citations for each '\cite' command. By default, they produce a '['
+ and ']', respectively.
+
+'\printbetweencitations'
+ If a '\cite' command has multiple citations, as in
+ '\cite{acp,texbook}', Eplain expands this macro in between each
+ pair of citations. By default, it produces a comma followed by a
+ space.
+
+'\printcitenote'
+ This macro takes one argument, which is the optional note to the
+ '\cite' command. If the '\cite' command had no note, this macro
+ isn't used. Otherwise, it should print the note. By default, the
+ note is preceded with a comma and a space.
+
+ Here is an example, showing you could produce citations as
+superscripted labels, with the optional notes in parentheses.
+
+ \def\printcitestart{\unskip $^\bgroup}
+ \def\printbetweencitations{,}
+ \def\printcitefinish{\egroup$}
+ \def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
+
+
+File: eplain.info, Node: Formatting bibliographies, Next: Commands from LaTeX, Prev: Formatting citations, Up: Citations
+
+4.3.2 Formatting bibliographies
+-------------------------------
+
+You may wish to change Eplain's formatting of the bibliography,
+especially with respect to the fonts that are used. Therefore, Eplain
+provides the following control sequences:
+
+'\biblabelwidth'
+ This control sequence represents a '\dimen' register, and its value
+ is the width of the widest label in the bibliography. Although it
+ is unlikely you will ever want to redefine it, you might want to
+ use it if you redefine '\biblabelprint', below.
+
+'\biblabelprint'
+ This macro takes one argument, the label to print. By default, the
+ label is put in a box of width '\biblabelwidth', and is followed by
+ an enspace. When you want to change the spacing around the labels,
+ this is the right macro to redefine.
+
+'\biblabelcontents'
+ This macro also takes one argument, the label to print. By default,
+ the label is printed using the font '\bblrm' (below), and enclosed
+ in brackets. When you want to change the appearance of the label,
+ but not the spacing around it, this is the right macro to redefine.
+
+'\biblabelprecontents'
+'\biblabelpostcontents'
+ Macros expanded before and after '\biblabelcontents', respectively.
+ For example, to get left-justified numeric labels (they are
+ right-justified by default):
+
+ \def\biblabelprecontents{\relax}
+ \def\biblabelpostcontents{\hss}
+
+'\bblrm'
+ The default font used for printing the bibliography.
+
+'\bblem'
+ The font used for printing the titles and other "emphasized"
+ material.
+
+'\bblemph'
+ Typesets its argument using '\bblem', then inserts an italic
+ correction.
+
+'\bblsc'
+ In some styles, authors' names are printed in a caps-and-small-caps
+ font. In those cases, this font is used.
+
+'\bblnewblock'
+ This is invoked between each of the parts of a bibliography entry.
+ The default is to leave some extra space between the parts; you
+ could redefine it to start each part on a new line (for example). A
+ part is simply a main element of the entry; for example, the author
+ is a part. (It was LaTeX that introduced the (misleading, as far as
+ I am concerned) term 'block' for this.)
+
+'\biblabelextraspace'
+ Bibliography entries are typeset with a hanging indentation of
+ '\biblabelwidth' plus this. The default is '.5em', where the em
+ width is taken from the '\bblrm' font. If you want to change this,
+ you should do it inside '\bblhook'.
+
+'\bblhook'
+ This is expanded before reading the .bbl file. By default, it does
+ nothing. You could, for example, define it to set the bibliography
+ fonts, or produce the heading for the references. Two spacing
+ parameters must be changed inside '\bblhook': '\parskip', which
+ produces extra space between the items; and '\biblabelextraspace',
+ which is described above. (By the way, '\hookappend' won't work
+ with '\bblhook', despite the names. Just use '\def'.)
+
+ If you are desperate, of course you can also hand-edit the .bbl file
+that BibTeX produces to do anything you wish.
+
+
+File: eplain.info, Node: Commands from LaTeX, Prev: Formatting bibliographies, Up: Citations
+
+4.3.3 Commands from LaTeX
+-------------------------
+
+Because of the historical connection between BibTeX and LaTeX, in
+practice many bibliography styles and bibliographies use LaTeX commmands
+that are not part of bibliography handling, per se.
+
+ To support this, 'btxmac.tex' (and thus Eplain) define the following.
+In all cases, an existing definition (e.g., from 'miniltx.tex', *note
+Loading LaTeX packages: Loading LaTeX packages.) will not be
+overwritten. Here is the list:
+
+'\newcommand'
+'\renewcommand'
+'\providecommand'
+ Defining new commands in various ways. The Eplain versions do not
+ support the *-form of these; use 'miniltx' for that.
+
+'\em'
+'\emph'
+'\sc'
+'\textbf'
+ Selecting fonts.
+
+'\mbox'
+ A horizontal box.
+
+'\newblock'
+ Starts elements of a bibliography entry.
+
+ For full information about these, see the LaTeX manual and sources.
+
+
+File: eplain.info, Node: Displays, Next: Time of day, Prev: Citations, Up: User definitions
+
+4.4 Displays
+============
+
+By default, TeX centers displayed material. (Displayed material is just
+whatever you put between '$$''s--it's not necessarily mathematics.) Many
+layouts would be better served if the displayed material was
+left-justified. Therefore, Eplain provides the command '\leftdisplays',
+which indents displayed material by '\parindent' plus '\leftskip', plus
+'\leftdisplayindent'.
+
+ You can go back to centering displays with '\centereddisplays'. (It
+is usually poor typography to have both centered and left-justified
+displays in a single publication, though.)
+
+ '\leftdisplays' also changes the plain TeX commands that deal with
+alignments inside math displays, '\displaylines', '\eqalignno', and
+'\leqalignno', to produce left-justified text. You can still override
+this formatting by inserting '\hfill' glue, as explained in 'The
+TeXbook'.
+
+ Eplain defines '\eqnum' and '\eqalignnum' which can be set up to
+produce either left-aligned or right-aligned equation numbers.
+'\lefteqnumbers' ('\righteqnumbers') will define '\eqnum' to expand to
+'\eqno' ('\leqno'), and '\eqalignnum' to expand to '\eqalignno'
+('\leqalignno'). Default is '\righteqnumbers' (right-aligned equation
+numbers).
+
+* Menu:
+
+* Formatting displays:: General formatting of displays.
+
+
+File: eplain.info, Node: Formatting displays, Up: Displays
+
+4.4.1 Formatting displays
+-------------------------
+
+If you want some other kind of formatting, you can write a definition of
+your own, analogous to '\leftdisplays'. You need only make sure that
+'\leftdisplaysetup' is called at the beginning of every display
+(presumably by invoking it in TeX's '\everydisplay' parameter).
+
+ '\leftdisplays' expands the old value of '\everydisplay' before
+calling '\leftdisplaysetup', so that any changes you have made to it
+won't be lost. That old token list as available as the value of the
+token register '\previouseverydisplay'.
+
+
+File: eplain.info, Node: Time of day, Next: Lists, Prev: Displays, Up: User definitions
+
+4.5 Time of day
+===============
+
+TeX provides the day, month, and year as numeric quantities (unless your
+TeX implementation is woefully deficient). Eplain provides some control
+sequences to make them a little more friendly to humans.
+
+ '\monthname' produces the name of the current month, abbreviated to
+three letters.
+
+ '\fullmonthname' produces the name of the current month,
+unabbreviated (in English).
+
+ '\timestring' produces the current time, as in '1:14 p.m.'
+
+ '\timestamp' produces the current date and time, as in '23 Apr 64
+1:14 p.m.'. (Except the spacing is slightly different.)
+
+ '\today' produces the current date, as in '23 April 1964'.
+
+
+File: eplain.info, Node: Lists, Next: Verbatim listing, Prev: Time of day, Up: User definitions
+
+4.6 Lists
+=========
+
+Many documents require lists of items, either numbered or simply
+enumerated. Plain TeX defines one macro to help with creating lists,
+'\item', but that is insufficient in many cases. Therefore, Eplain
+provides two pairs of commands:
+
+'\numberedlist ... \endnumberedlist'
+'\orderedlist ... \endorderedlist'
+ These commands (they are synonyms) produce a list with the items
+ numbered sequentially, starting from one. A nested '\numberedlist'
+ labels the items with lowercase letters, starting with 'a'. Another
+ nested '\numberedlist' labels the items with roman numerals. Yet
+ more deeply nested numbered lists label items with '*'.
+
+'\unorderedlist ... \endunorderedlist'
+ This produces a list with the items labelled with small black boxes
+ ("square bullets"). A nested '\unorderedlist' labels items with
+ em-dashes. Doubly (and deeper) nested unordered lists label items
+ with '*'s.
+
+ The two kinds of lists can be nested within each other, as well.
+
+ In both kinds of lists, you begin an item with '\li'. An item may
+continue for several paragraphs. Each item starts a paragraph.
+
+ You can give '\li' an optional argument, a cross-reference label.
+It's defined to be the "marker" for the current item. This is useful if
+the list items are numbered. You can produce the value of the label with
+'\xrefn'. *Note Cross-references::.
+
+ Eplain can create hypertext links for the markers produced by
+'\xrefn' pointing to the relevant list item (*note List hyperlinks::).
+
+ You can also say '\listcompact' right after '\numberedlist' or
+'\unorderedlist'. The items in the list will then not have any extra
+space between them (*note Formatting lists::). You might want to do this
+if the items in this particular list are short.
+
+ Here is an example:
+
+ \numberedlist\listcompact
+ \li The first item.
+ \li The second item.
+
+ The second paragraph of the second item.
+ \endnumberedlist
+
+* Menu:
+
+* Formatting lists:: Changing how the lists look.
+
+
+File: eplain.info, Node: Formatting lists, Up: Lists
+
+4.6.1 Formatting lists
+----------------------
+
+Several registers define the spacing associated with lists. It is likely
+that their default values won't suit your particular layout.
+
+'\abovelistskipamount, \belowlistskipamount'
+ The vertical glue inserted before and after every list,
+ respectively.
+
+'\interitemskipamount'
+ The vertical glue inserted before each item except the first.
+ '\listcompact' resets this to zero, as mentioned above.
+
+'\listleftindent, \listrightindent'
+ '\listrightindent' is the amount of space by which the list is
+ indented on the right; i.e., it is added to '\rightskip'.
+ '\listleftindent' is the amount of space, _relative to_
+ '\parindent', by which the list is indented on the left. Why treat
+ the two parameters differently? Because (a) it is more useful to
+ make the list indentation depend on the paragraph indentation;
+ (b) footnotes aren't formatted right if '\parindent' is reset to
+ zero.
+
+ The three vertical glues are inserted by macros, and preceded by
+penalties: '\abovelistskip' does '\vpenalty\abovelistpenalty' and then
+'\vskip\abovelistskip'. '\belowlistskip' and '\interitemskip' are
+analogous.
+
+ In addition, the macro '\listmarkerspace' is called to separate the
+item label from the item text. This is set to '\enspace' by default.
+
+ If you want to change the labels on the items, you can redefine these
+macros: '\numberedmarker' or '\unorderedmarker'. The following registers
+might be useful if you do:
+
+'\numberedlistdepth, \unorderedlistdepth'
+ These keep track of the depth of nesting of the two kinds of lists.
+
+'\itemnumber, \itemletter'
+ These keep track of the number of items that have been seen in the
+ current numbered list. They are both integer registers. The
+ difference is that '\itemnumber' starts at one, and '\itemletter'
+ starts at 97, i.e., lowercase 'a'.
+
+ You can also redefine the control sequences that are used internally,
+if you want to do something radically different: '\beginlist' is invoked
+to begin both kinds of lists; '\printitem' is invoked to print the label
+(and space following the label) for each item; and '\endlist' is invoked
+to end both kinds of lists.
+
+
+File: eplain.info, Node: Verbatim listing, Next: Contents, Prev: Lists, Up: User definitions
+
+4.7 Verbatim listing
+====================
+
+It is sometimes useful to include a file verbatim in your document; for
+example, part of a computer program. The '\listing' command is given one
+argument, a filename, and produces the contents of that file in your
+document. '\listing' expands '\listingfont' to set the current font. The
+default value of '\listingfont' is '\tt'.
+
+ You can take arbitrary actions before reading the file by defining
+the macro '\setuplistinghook'. This is expanded just before the file is
+input.
+
+ If you want to have line numbers on the output, you can say
+'\let\setuplistinghook = \linenumberedlisting'. The line numbers are
+stored in the count register '\lineno' while the file is being read. You
+can redefine the macro '\printlistinglineno' to change how they are
+printed.
+
+ Normally, the '\listing' command will add a final empty line at the
+end of the output, even if the file does not end in a newline. To
+suppress this final line, you can say '\let\setuplistinghook =
+\nolastlinelisting'. This also works with line numbers (say
+'\def\setuplistinghook{\linenumberedlisting \nolastlinelisting}'), but
+only if '\printlistinglineno' consists exclusively of boxes at the top
+level (i.e., any '\kern's or glue should be wrapped up in a box).
+
+ You can use the form feed control character (ASCII code 12, typed as
+'CTRL-L') in the file to force a page break in the output.
+
+ You can produce in-line verbatim text in your document with
+'\verbatim'. End the text with '|endverbatim'. If you need a '|' in the
+text, double it. If the first character of the verbatim text is a space,
+use '| '. ('| ' will work elsewhere in the argument, too, but isn't
+necessary.)
+
+ For example:
+
+ \verbatim| ||\#%&!|endverbatim
+
+produces ' |\#%&!'.
+
+ Line breaks and spaces in the verbatim text are preserved.
+
+ You can change the verbatim escape character from the default '|'
+with '\verbatimescapechar CHAR'; for example, this changes it to '@'.
+
+ \verbatimescapechar \@
+
+The backslash is not necessary in some cases, but is in others,
+depending on the catcode of the character. The argument to
+'\verbatimescapechar' is used as '\catcode `CHAR', so the exact rules
+follow that for '\catcode'.
+
+ To reset the category code of all special characters to 12 ("other"),
+'\verbatim' uses '\uncatcodespecials' (*note Category codes::). If you
+make additional characters "special", you should extend '\dospecials' to
+include those characters, lest they be given special treatment inside
+verbatim environments. For example,
+
+ \catcode`\A=\active
+ % Try commenting out the following line.
+ \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\A}
+ \verbatimA#$%_^|endverbatim
+
+ Because '\verbatim' must change the category code of special
+characters, calling inside a macro definition of your own does not work
+properly. For example:
+
+ \def\mymacro{\verbatim &#%|endverbatim}% Doesn't work!
+
+To accomplish this, you must change the category codes yourself before
+making the macro definition. Perhaps '\uncatcodespecials' will help you
+(*note Category codes::).
+
+
+File: eplain.info, Node: Contents, Next: Cross-references, Prev: Verbatim listing, Up: User definitions
+
+4.8 Contents
+============
+
+Producing a table of contents that is both useful and aesthetic is one
+of the most difficult design problems in any work. Naturally, Eplain
+does not pretend to solve the design problem. Collecting the raw data
+for a table of contents, however, is much the same across documents.
+Eplain uses an auxiliary file with extension '.toc' (and the same root
+name as your document) to save the information.
+
+* Menu:
+
+* Writing the .toc file::
+* Reading the .toc file::
+* Changing the .toc file's root name::
+* Alternative contents files::
+
+
+File: eplain.info, Node: Writing the .toc file, Next: Reading the .toc file, Up: Contents
+
+4.8.1 Writing the .toc file
+---------------------------
+
+To write an entry for the table of contents, you say
+'\writetocentry{PART}{TEXT}', where PART is the type of part this entry
+is, e.g., 'chapter', and TEXT is the text of the title. '\writetocentry'
+puts an entry into the .toc file that looks like
+'\tocPARTentry{TEXT}{PAGE NUMBER}' (unless PART is an integer, see
+below). The TEXT is written unexpanded.
+
+ A related command, '\writenumberedtocentry', takes one additional
+argument, the first token of which is expanded at the point of the
+'\writenumberedtocentry', but the rest of the argument is not expanded.
+The usual application is when the parts of the document are numbered. On
+the other hand, the one-level expansion allows you to use the argument
+for other things as well (author's names in a proceedings, say), and not
+have accents or other control sequences expanded. The downside is that
+if you _want_ full expansion of the third argument, you don't get
+it--you must expand it yourself, before you call
+'\writenumberedtocentry'.
+
+ For example:
+
+ \writenumberedtocentry{chapter}{A $\sin$ wave}{\the\chapno}
+ \writetocentry{section}{A section title}
+
+Supposing '\the\chapno' expanded to '3' and that the '\write''s occurred
+on pages eight and nine, respectively, the above writes the following to
+the .toc file:
+
+ \tocchapterentry{A $\sin$ wave}{3}{8}
+ \tocsectionentry{A section title}{9}
+
+ A variation on '\writenumberedtocentry' is '\writenumberedtocline',
+differing only in the order of the parameters it takes and writes for
+the '\tocPARTentry' control sequences. To continue the previous example:
+
+ \writenumberedtocline{chapter}{\the\chapno}{A $\sin$ wave}
+
+writes the following to the .toc file:
+
+ \tocchapterentry{3}{A $\sin$ wave}{8}
+
+Such ordering of the parameters allows the '\tocPARTentry' macros to
+typeset the text of the entry without actually reading it as an
+argument. This is required for entries which need to change character
+catcodes, e.g., to produce verbatim text (*note Verbatim listing::).
+
+ Each of '\writetocentry', '\writenumberedtocentry' and
+'\writenumberedtocline' processes a numeric PART argument specially. If
+you pass PART expanding to an integer, these macros write into the .toc
+file an entry that starts with '\tocentry{PART}'. Thus, you can define a
+single '\tocentry' macro which formats all entries for a table of
+contents. To continue the previous examples:
+
+ \writenumberedtocentry{1}{A $\sin$ wave}{\the\chapno}
+ \writenumberedtocline{1}{\the\chapno}{A $\sin$ wave}
+ \writetocentry{2}{A section title}
+
+writes the following to the .toc file:
+
+ \tocentry{1}{A $\sin$ wave}{3}{8}
+ \tocentry{1}{3}{A $\sin$ wave}{8}
+ \tocentry{2}{A section title}{9}
+
+
+File: eplain.info, Node: Reading the .toc file, Next: Changing the .toc file's root name, Prev: Writing the .toc file, Up: Contents
+
+4.8.2 Reading the .toc file
+---------------------------
+
+You read the .toc file with the command '\readtocfile'. Naturally,
+whatever '\toc... entry' commands that were written to the file must be
+defined when '\readtocfile' is invoked. Eplain has minimal definitions
+for '\tocchapterentry', '\tocsectionentry', and '\tocsubsectionentry',
+just to prevent undefined control sequence errors in common cases. They
+aren't suitable for anything but preliminary proofs.
+
+ Each of '\writetocentry', '\writenumberedtocentry' and
+'\writenumberedtocline' opens the .toc file for writing, thereby
+deleting the information from the previous run. You should therefore
+arrange that '\readtocfile' be called _before_ the first call to a
+'\writetoc...' macro. '\readtocfile' does not itself delete the
+information from the .toc file, so that you can call it several times,
+e.g., to create both a short and normal table of contents. (To produce
+this in particular, define '\tocsectionentry' to produce nothing while
+you are reading .toc file for a short table of contents (*note Macro
+arguments::).)
+
+ On the other hand, if you don't want to rewrite the .toc file at all,
+perhaps because you are only running TeX on part of your manuscript, you
+can set '\rewritetocfilefalse'.
+
+
+File: eplain.info, Node: Changing the .toc file's root name, Next: Alternative contents files, Prev: Reading the .toc file, Up: Contents
+
+4.8.3 Changing the .toc file's root name
+----------------------------------------
+
+By default, the '.toc' file has the root '\jobname'. If your document
+has more than one contents--for example, if it is a collection of
+papers, some of which have their own contents--you can tell Eplain to
+use a different root name by defining the control sequence
+'\tocfilebasename'.
+
+ Note that '\writetocentry', '\writenumberedtocentry' and
+'\writenumberedtocline' will open the contents file for writing only at
+the first call, using the value of '\tocfilebasename' at that time.
+Changing the value of '\tocfilebasename' afterwards will not affect
+which file gets _written_, although it will affect which file gets
+_read_ by '\readcontentsfile'. In case you need to write several
+contents files from a single TeX job, use '\definecontentsfile' (*note
+Alternative contents files::).
+
+
+File: eplain.info, Node: Alternative contents files, Prev: Changing the .toc file's root name, Up: Contents
+
+4.8.4 Alternative contents files
+--------------------------------
+
+In addition to the usual table of contents, you may want to have a list
+of figures, list of tables, or other such contents-like list. You can do
+this with '\definecontentsfile{ABBREV}'. All of the above commands are
+actually a special case that Eplain predefines with
+
+ \definecontentsfile{toc}
+
+The ABBREV is used both for the file extension and in the control
+sequence names.
+
+
+File: eplain.info, Node: Cross-references, Next: Page references, Prev: Contents, Up: User definitions
+
+4.9 Cross-references
+====================
+
+It is often useful to refer the reader to other parts of your document;
+but putting literal page, section, equation, or whatever numbers in the
+text is certainly a bad thing.
+
+ Eplain therefore provides commands for symbolic cross-references. It
+uses an auxiliary file with extension .aux (and the same root name as
+your document) to keep track of the information. Therefore, it takes two
+passes to get the cross-references right--one to write them out, and one
+to read them in. Eplain automatically reads the .aux file at the first
+reference; after reading it, Eplain reopens it for writing.
+
+ You can control whether or not Eplain warns you about undefined
+labels. *Note Citations::.
+
+ Labels in Eplain's cross-reference commands can use characters of
+category code eleven (letter), twelve (other), ten (space), three (math
+shift), four (alignment tab), seven (superscript), or eight (subscript).
+For example, '(a1 $&^_' is a valid label (assuming the category codes of
+plain TeX), but '%#\{' has no valid characters.
+
+ You can also do symbolic cross-references for bibliographic citations
+and list items. *Note Citations::, and *note Lists::.
+
+ Eplain can create hypertext links for the cross-references (*note
+Cross-reference hyperlinks::).
+
+* Menu:
+
+* Defining generic references::
+* Using generic references::
+
+
+File: eplain.info, Node: Defining generic references, Next: Using generic references, Up: Cross-references
+
+4.9.1 Defining generic references
+---------------------------------
+
+Eplain provides the command '\definexref' for general cross-references.
+It takes three arguments: the name of the label (see section above for
+valid label names), the value of the label (which can be anything), and
+the "class" of the reference--whether it's a section, or theorem, or
+what. For example:
+
+ \definexref{sec-intro}{3.1}{section}
+
+Of course, the label value is usually generated by another macro using
+TeX count registers or some such.
+
+ '\definexref' doesn't actually define LABEL; instead, it writes out
+the definition to the .aux file, where Eplain will read it on the next
+TeX run.
+
+ The CLASS argument is used by the '\ref' and '\refs' commands. See
+the next section.
+
+
+File: eplain.info, Node: Using generic references, Prev: Defining generic references, Up: Cross-references
+
+4.9.2 Using generic references
+------------------------------
+
+To retrieve the value of the label defined via '\definexref' (see the
+previous section), Eplain provides the following macros:
+
+'\refn{LABEL}'
+'\xrefn{LABEL}'
+ '\refn' and '\xrefn' (they are synonyms) produce the bare
+ definition of LABEL. If LABEL isn't defined, issue a warning, and
+ produce LABEL itself instead, in typewriter. (The warning isn't
+ given if '\xrefwarningfalse'.)
+
+'\ref{LABEL}'
+ Given the class C for LABEL (see the description of '\definexref'
+ in the previous section), expand the control sequence '\C word' (if
+ it's defined) followed by a tie. Then call '\refn' on LABEL.
+ (Example below.)
+
+'\refs{LABEL}'
+ Like '\ref', but append the letter 's' to the '\...word'.
+
+ The purpose of the '\...word' macro is to produce the word 'Section'
+or 'Figure' or whatever that usually precedes the actual reference
+number.
+
+ Here is an example:
+
+ \def\sectionword{Section}
+ \definexref{sec-intro}{3.1}{section}
+ \definexref{sec-next}{3.2}{section}
+ See \refs{sec-intro} and \refn{sec-next} ...
+
+This produces 'See Sections 3.1 and 3.2 ...'
+
+
+File: eplain.info, Node: Page references, Next: Equation references, Prev: Cross-references, Up: User definitions
+
+4.10 Page references
+====================
+
+Eplain provides two commands for handling references to page numbers,
+one for definition and one for use.
+
+'\xrdef{LABEL}'
+ Define LABEL to be the current page number. This produces no
+ printed output, and ignores following spaces.
+
+'\xref{LABEL}'
+ Produce the text 'p. PAGENO', which is the usual form for
+ cross-references. The PAGENO is actually LABEL's definition; if
+ LABEL isn't defined, the text of the label itself is printed. The
+ 'p. ' prefix is defined by '\xrefpageword'. Its default definition
+ is 'p.\thinspace'.
+
+ Eplain can create hypertext links for the page references (*note Page
+reference hyperlinks::).
+
+
+File: eplain.info, Node: Equation references, Next: Indexing, Prev: Page references, Up: User definitions
+
+4.11 Equation references
+========================
+
+Instead of referring to pages, it's most useful if equation labels refer
+to equation numbers. Therefore, Eplain reserves a '\count' register,
+'\eqnumber', for the current equation number, and increments it at each
+numbered equation.
+
+ Here are the commands to define equation labels and then refer to
+them:
+
+'\eqdef{LABEL}'
+ This defines LABEL to be the current value of '\eqnumber', and, if
+ the current context is not inner, then produces a '\eqnum' command
+ (*note Displays::). (The condition makes it possible to use
+ '\eqdef' in an '\eqalignno' construction, for example.) The text of
+ the equation number is produced using '\eqprint'. *Note Formatting
+ equation references::.
+
+ If LABEL is empty, you still get an equation number (although
+ naturally you can't reliably refer to it). This is useful if you
+ want to put numbers on all equations in your document, and you
+ don't want to think up unique labels.
+
+ To refer to the last equation with the empty label, you use the
+ empty label in one of the equation reference macros (see below).
+ This can be handy when you want to refer to an equation shortly
+ after its definition, say, in the sentence following the displayed
+ equation, and do not intend to refer to the equation later. But use
+ this trick with extreme caution: if later you change the text and
+ insert another empty definition between the original definition and
+ the reference, the reference will start to refer to the new
+ empty-labeled equation.
+
+'\eqdefn{LABEL}'
+ This is like '\eqdef', except it always omits the '\eqnum' command.
+ It can therefore be used in places where '\eqdef' can't; for
+ example, in a non-displayed equation. The text of the equation
+ number is not produced, so you can also use it in the (admittedly
+ unusual) circumstance when you want to define an equation label but
+ not print that label.
+
+'\eqref{LABEL}'
+ This produces a formatted reference to LABEL. If LABEL is undefined
+ (perhaps because it is a forward reference), it just produces the
+ text of the label itself. Otherwise, it calls '\eqprint'.
+
+'\eqrefn{LABEL}'
+ This produces the cross-reference text for LABEL. That is, it is
+ like '\eqref', except it doesn't call '\eqprint'.
+
+ Equation labels can contain the same characters that are valid in
+general cross-references.
+
+ Eplain can create hypertext links for the equation references (*note
+Equation reference hyperlinks::).
+
+* Menu:
+
+* Formatting equation references::
+* Subequation references::
+
+
+File: eplain.info, Node: Formatting equation references, Next: Subequation references, Up: Equation references
+
+4.11.1 Formatting equation references
+-------------------------------------
+
+Both defining an equation label and referring to it should usually
+produce output. This output is produced with the '\eqprint' macro, which
+takes one argument, the equation number being defined or referred to. By
+default, this just produces '(NUMBER)', where NUMBER is the equation
+number. To produce the equation number in a different font, or with
+different surrounding symbols, or whatever, you can redefine '\eqprint'.
+For example, the following definition would print all equation numbers
+in italics. (The extra braces define a group, to keep the font change
+from affecting surrounding text.)
+
+ \def\eqprint#1{{\it (#1)}}
+
+ In addition to changing the formatting of equation numbers, you might
+want to add more structure to the equation number; for example, you
+might want to include the chapter number, to get equation numbers like
+'(1.2)'. To achieve this, you redefine '\eqconstruct'. For example:
+
+ \def\eqconstruct#1{\the\chapternumber.#1}
+
+(If you are keeping the chapter number in a count register named
+'\chapternumber', naturally.)
+
+ The reason for having both '\eqconstruct' and '\eqprint' may not be
+immediately apparent. The difference is that '\eqconstruct' affects the
+text that cross-reference label is defined to be, while '\eqprint'
+affects only what is typeset on the page. The example just below might
+help.
+
+ Usually, you want equation labels to refer to equation numbers. But
+sometimes you might want a more complicated text. For example, you might
+have an equation '(1)', and then have a variation several pages later
+which you want to refer to as '(1*)'.
+
+ Therefore, Eplain allows you to give an optional argument (i.e.,
+arbitrary text in square brackets) before the cross-reference label to
+'\eqdef'. Then, when you refer to the equation, that text is produced.
+Here's how to get the example just mentioned:
+
+ $$...\eqdef{a-eq}$$
+ ...
+ $$...\eqdef[\eqrefn{a-eq}*]{a-eq-var}$$
+ In \eqref{a-eq-var}, we expand on \eqref{a-eq}, ...
+
+We use '\eqrefn' in the cross-reference text, not '\eqref', so that
+'\eqprint' is called only once.
+
+ As another example, consider the following requirement: we want to
+include chapter number in all equation references, and additionally we
+want to include the part number when referencing an equation from any
+part other than the one where the equation appears. For example,
+references to the third equation in chapter 2 of part 1 should be
+typeset as '(2.3)' throughout part 1, but as '(I.2.3)' in any other
+part. Let's assume we have the current chapter and part numbers in count
+registers '\chapnum' and '\partnum', respectively.
+
+ The idea is to have '\eqconstruct' store the part number of the
+equation (that is, the part number _at the time of definition_), so that
+later '\eqprint' can compare the stored number with the current part
+number (that is, the part number _at the time of reference_). The
+complicating factor is that internally, the result of '\eqconstruct' is
+both expanded and written out to the '.aux' file, _and_ used to typeset
+the equation number, so the commands that store the part number should
+behave correctly in both situations. This is difficult to achieve with
+expandable commands; therefore, to avoid expansion problems, we are
+going to use only TeX primitives, which are non-expandable:
+
+ \newcount\eqpartnum
+
+ \def\eqconstruct#1{%
+ \global\eqpartnum=\the\partnum\relax
+ \number\chapnum.#1%
+ }
+
+ \def\eqprint#1{%
+ \setbox0=\hbox{#1}%
+ (\ifnum\partnum=\eqpartnum \else
+ \uppercase\expandafter{\romannumeral\eqpartnum}.%
+ \fi
+ \box0)%
+ }%
+
+In '\eqconstruct', besides constructing the base equation number (e.g.,
+'1.2'), we also store the part number of the equation in the count
+register '\eqpartnum' ('\the\partnum' is expanded when the equation
+number is written to the '.aux' file, so the equation label definition
+in the '.aux' file will contain the actual part number). In '\eqprint',
+we need to know the equation's part number before we typeset the base
+equation number, therefore we first put the argument in a box, thus
+causing '\eqpartnum' to be set.
+
+
+File: eplain.info, Node: Subequation references, Prev: Formatting equation references, Up: Equation references
+
+4.11.2 Subequation references
+-----------------------------
+
+Eplain also provides for one level of substructure for equations. That
+is, you might want to define a related group of equations with numbers
+like '2.1' and '2.2', and then be able to refer to the group as a whole:
+"... in the system of equations (2)...".
+
+ The commands to do this are '\eqsubdef' and '\eqsubdefn'. They take
+one LABEL argument like their counterparts above, and generally behave
+in the same way. The difference is in how they construct the equation
+number: instead of using just '\eqnumber', they also use another
+counter, '\subeqnumber'. This counter is advanced by one at every
+'\eqsubdef' or '\eqsubdefn', and reset to zero at every '\eqdef' or
+'\eqdefn'.
+
+ You use '\eqref' to refer to subequations as well as main equations.
+
+ To put the two together to construct the text that the label will
+produce, they use a macro '\eqsubreftext'. This macros takes two
+arguments, the "main" equation number (which, because the equation label
+can be defined as arbitrary text, as described in the previous section,
+might be anything at all) and the "sub" equation number (which is always
+just a number). Eplain's default definition just puts a period between
+them:
+
+ \def\eqsubreftext#1#2{#1.#2}%
+
+You can redefine '\eqsubreftext' to print however you like. For example,
+this definition makes the labels print as '2a', '2b', and so on.
+
+ \newcount\subref
+ \def\eqsubreftext#1#2{%
+ \subref = #2 % The space stops a <number>.
+ \advance\subref by 96 % `a' is character code 97.
+ #1\char\subref
+ }
+
+Sadly, we must define a new count register, '\subref', instead of using
+the scratch count register '\count255', because '#1' might include other
+macro calls which use '\count255'.
+
+
+File: eplain.info, Node: Indexing, Next: Justification, Prev: Equation references, Up: User definitions
+
+4.12 Indexing
+=============
+
+Eplain provides support for generating raw material for an index, and
+for typesetting a sorted index. A separate program must do the actual
+collection and sorting of terms, because TeX itself has no support for
+sorting.
+
+ Eplain can create hypertext links pointing from the index to the
+index terms (*note Index hyperlinks::).
+
+ Eplain's indexing commands were designed to work with the program
+MakeIndex (<https://ctan.org/pkg/makeindex>); MakeIndex is also commonly
+included in prepackaged TeX distributions. It is beyond the scope of
+this manual to explain how to run MakeIndex, and all of its many
+options.
+
+ The basic strategy for indexing works like this:
+
+ 1. For a document 'foo.tex', Eplain's indexing commands (e.g., '\idx';
+ see the section 'Indexing terms' below) write the raw index
+ material to 'foo.idx'.
+
+ 2. MakeIndex reads 'foo.idx', collects and sorts the index, and writes
+ the result to 'foo.ind'.
+
+ 3. Eplain reads and typesets 'foo.ind' on a subsequent run of TeX. See
+ the section 'Typesetting an index' below.
+
+The 'texi2dvi' program can help you automate this process (*note
+Invoking Eplain::).
+
+ If your document needs more than one index, each must have its own
+file. Therefore, Eplain provides the command '\defineindex', which takes
+an argument that is a single letter, which replaces 'i' in the filenames
+and in the indexing command names described below. For example,
+
+ \defineindex{m}
+
+defines the command '\mdx' to write to the file 'foo.mdx'. Eplain simply
+does '\defineindex{i}' to define the default commands.
+
+ Note that MakeIndex does not use the above naming scheme for multiple
+indexes. Unless instructed otherwise, MakeIndex always writes its output
+to a file with extension '.ind'. For example, if you define an
+additional index with the command '\defineindex{j}', you'll need to run
+MakeIndex like this:
+
+ $ makeindex book.jdx -o book.jnd
+
+ For each index defined with '\defineindex{N}', Eplain provides a
+switch '\ifNdx' which controls whether indexing commands write index
+entries to the corresponding index file. However, even when index term
+writing is disabled, indexing commands still do all other processing of
+their arguments, including typesetting of proof index terms (*note
+Proofing index terms::.
+
+ For example, if you write '\idxfalse' near the beginning of a
+document 'foo.tex' (before the first indexing command), Eplain will not
+open the default index file ('foo.idx') and the corresponding indexing
+commands ('\idx', '\sidx', etc.) will not write index entries there.
+This may be useful for draft compilations of a manuscript, e.g., to
+avoid the overhead of index file input/output.
+
+* Menu:
+
+* Indexing terms:: Specifying what to index.
+* Typesetting an index:: Printing the sorted output.
+* Customizing indexing:: Creating commands and specifying extra actions.
+
+
+File: eplain.info, Node: Indexing terms, Next: Typesetting an index, Up: Indexing
+
+4.12.1 Indexing terms
+---------------------
+
+Indexing commands in Eplain come in pairs: one command that only writes
+the index entry to the '.idx' file (see above section), and one that
+also typesets the term being indexed. The former always starts with 's'
+(for "silent"). In either case, the name always includes 'Idx', where I
+is the index letter, also described above. Eplain defines the index 'i'
+itself, so that's what we'll use in the names below.
+
+ The silent form of the commands take a subterm as a trailing optional
+argument. For example, '\sidx{truth}[definition of]' on page 75 makes an
+index entry that will eventually be typeset (by default) as
+
+ truth
+ definition of, 75
+
+ Also, the silent commands ignore trailing spaces. The non-silent ones
+do not.
+
+* Menu:
+
+* Indexing commands:: Making index entries.
+* Modifying index entries:: Ranges, see/see also, page number typesetting.
+* Index entries with special characters::
+* Proofing index terms:: Noting index entries in the margins.
+
+
+File: eplain.info, Node: Indexing commands, Next: Modifying index entries, Up: Indexing terms
+
+4.12.1.1 Indexing commands
+..........................
+
+Here are the commands.
+
+ * '\sidx{TERM}[SUBTERM]' makes an index entry for TERM, optionally
+ with subterm SUBTERM. '\idx{TERM}' also produces TERM as output.
+ Example:
+
+ \sidx{truth}[beauty of]
+ The beauty of truth is \idx{death}.
+
+ Subterms at the second and further levels can also be specified in
+ SUBTERM, using the '\idxsubentryseparator' character to separate
+ them. This character is by default '!'.
+
+ * '\sidxname{FIRST M.}{VON LAST}[SUBTERM]' makes an index entry for
+ 'VON LAST, FIRST M.'. You can change the ', ' by redefining
+ '\idxnameseparator'. '\idxname{FIRST M.}{VON LAST}' also produces
+ FIRST M. VON LAST as output. (These commands are useful special
+ cases of '\idx' and '\sidx'.) Example:
+
+ \sidxname{Richard}{Stark}
+ \idxname{Donald}{Westlake} has written many kinds of novels, under
+ almost as many names.
+
+ * '\sidxmarked\CS{TERM}[SUBTERM]' makes an index entry for
+ 'TERM[SUBTERM]', but TERM will be put in the index as '\CS{term}',
+ but still sorted as just TERM. '\idxmarked\CS{TERM}' also typesets
+ '\CS{term}'. This provides for the usual ways of changing the
+ typesetting of index entries. Example:
+
+ \def\article#1{``#1''}
+ \sidxmarked\article{Miss Elsa and Aunt Sophie}
+ Peter Drucker's \idxmarked\article{The Polanyis} is a remarkable
+ essay about a remarkable family.
+
+ * '\sidxsubmarked{TERM}\CS{subterm}' makes an index entry for TERM,
+ SUBTERM as usual, but also puts SUBTERM in the index as
+ '\CS{term}'. '\idxsubmarked{TERM}\CS{subterm}' also typesets 'TERM
+ \CS{subterm}', in the unlikely event that your syntax is convoluted
+ enough to make this useful. Example:
+
+ \def\title#1{{\sl #1}}
+ \sidxsubmarked{Anderson, Laurie}\title{Strange Angels}
+ The \idxsubmarked{Anderson}\title{Carmen} is a strange twist.
+
+ The commands above rely on MakeIndex's feature for separating sorting
+of an index entry's from its typesetting. You can use this directly by
+specifying an index entry as 'SORT@TYPESET'. For example:
+
+ \sidx{Ap-weight@$A_\pi$-weight}
+
+will sort as 'Ap-weight', but print with the proper math. The '@' here
+is MakeIndex's default character for this purpose. To make an index
+entry with an '@' in it, you have to escape it with a backslash; Eplain
+provides no macros for doing this.
+
+ After any index command, Eplain runs '\hookaction{afterindexterm}'.
+Because the index commands always add a whatsit item to the current
+list, you may wish to preserve a penalty or space past the new item. For
+example, given a conditional '\if@aftersctnhead' set true when you're at
+a section heading, you could do:
+
+ \hookaction{afterindexterm}{\if@aftersctnhead \nobreak \fi}
+
+
+File: eplain.info, Node: Modifying index entries, Next: Index entries with special characters, Prev: Indexing commands, Up: Indexing terms
+
+4.12.1.2 Modifying index entries
+................................
+
+All the index commands described in the previous section take an initial
+optional argument before the index term, which modify the index entry's
+meaning in various ways. You can specify only one of the following in
+any given command, except that 'begin' and 'end' can be specified
+together with 'pagemarkup=CS' (separate them with a comma without a
+following space, like this: '[begin,pagemarkup=defn]').
+
+ These work via MakeIndex's "encapsulation" feature. *Note Customizing
+indexing::, if you're not using the default characters for the MakeIndex
+operators. The other optional argument (specifying a subterm) is
+independent of these.
+
+ Here are the possibilities:
+
+'begin'
+'end'
+ These mark an index entry as the beginning or end of a range. The
+ index entries must match exactly for MakeIndex to recognize them.
+ Example:
+
+ \sidx[begin]{future}[Cohen, Leonard]
+ ...
+ \sidx[end]{future}[Cohen, Leonard]
+
+ will typeset as something like
+
+ future,
+ Cohen, Leonard, 65-94
+
+'see'
+ This marks an index entry as pointing to another; the real index
+ term is an additional (non-optional) argument to the command. Thus
+ you can anticipate a term readers may wish to look up, yet which
+ you have decided not to index. Example:
+
+ \sidx[see]{analysis}[archetypal]{archetypal criticism}
+
+ becomes
+
+ analysis,
+ archetypal, see archetypal criticism
+
+'seealso'
+ Similar to 'see' (the previous item), but also allows for normal
+ index entries of the referencing term. The normal index entries
+ have to be created separately--'seealso' does _not_ contribute a
+ page number to the index entry. For example, if you have indexed a
+ term on pages 75, 97 and 114, and then add a 'seealso' entry for
+ the term:
+
+ \sidx[seealso]{archetypal criticism}[elements of]{dichotomies}
+
+ the index will contain
+
+ archetypal criticism,
+ elements of, 75, 97, 114, see also dichotomies
+
+ (Aside for the academically curious: The archetypal critical book I
+ took these dichotomous examples from is Laurence Berman's 'The
+ Musical Image', which I happened to co-design and typeset.)
+
+'pagemarkup=CS'
+ This puts '\CS' before the page number in the typeset index, thus
+ allowing you to underline definitive entries, italicize examples,
+ and the like. You do _not_ precede the control sequence CS with a
+ backslash. (That just leads to expansive difficulties.) Naturally
+ it is up to you to define the control sequences you want to use.
+ Example:
+
+ \def\defn#1{{\sl #1}}
+ \sidx[pagemarkeup=defn]{indexing}
+
+ becomes something like
+
+ indexing, \defn{75}
+
+
+File: eplain.info, Node: Index entries with special characters, Next: Proofing index terms, Prev: Modifying index entries, Up: Indexing terms
+
+4.12.1.3 Index entries with special characters
+..............................................
+
+Indexing terms with special characters can become quite cumbersome
+because you have to keep both TeX and MakeIndex happy at the same time.
+For example, while '!' has no special meaning for TeX, it is a subentry
+separator for MakeIndex, therefore you'd have to escape occurrences of
+literal '!' in index terms. Things get even more interesting with
+characters which are special in both TeX and MakeIndex.
+
+ This in turn has some implications for the non-silent forms of the
+indexing commands (*note Indexing terms::), since TeX and MakeIndex use
+different conventions for escaping characters. For example, this will
+not typeset the exclamation point correctly within the text, while it
+will come out right inside the index, after MakeIndex strips the quoting
+character ('"'):
+
+ \idx{"!}
+
+This would have to be rewritten using the silent command:
+
+ !\sidx{"!}
+
+In general, it is a good idea to eschew the non-silent commands whenever
+index term contains anything unusual.
+
+ To understand this keep in mind that indexing commands read the terms
+verbatim so that the terms can embed almost any character, and that's
+what gets written into the '.idx' file. The non-silent forms then
+typeset the term by rescanning the verbatim copy, hence for the
+non-silent commands the term, besides being a valid MakeIndex input,
+must also represent a valid TeX input. The silent commands don't have
+this restriction--their terms only need to become valid TeX input
+_after_ MakeIndex processes the '.idx' file and writes the '.ind' file.
+This is what makes the non-silent commands less powerful and more
+troublesome when dealing with special characters.
+
+ Here's an example showing that terms for the silent commands can
+contain almost any character:
+
+ \sidx[see]{comments}[with %@with \verbatim %"|endverbatim]
+ {commenting with \verbatim %"|endverbatim}
+
+We didn't have to escape '%' in the sort string for MakeIndex, while we
+had to put it inside the verbatim environment (*note Verbatim listing::)
+in the part which MakeIndex will pass back to TeX. Also, we had to
+escape the '|' character because it is special for MakeIndex. If you
+have trouble understanding the reasons for the different types of
+escaping used, it is best to examine the '.idx' and '.ind' files
+resulting from processing the above input.
+
+ As was mentioned, index terms can embed "almost any character", so
+now we'll describe the exceptions.
+
+ The following characters are reset to their usual meanings because
+they are not useful verbatim: multiple consequent spaces are converted
+into a single space; ASCII tab characters are treated as spaces; ASCII
+return is treated as end-of-line (this means, among other things, that
+long terms can be broken across several lines).
+
+ You have to be careful with the begin- and end-group characters ('{'
+and '}' by default). If they are matched, you don't have to do anything
+special. For example:
+
+ \sidx {braces {, }@braces
+ \verbatim {"|endverbatim, \verbatim }"|endverbatim}
+
+However, if they are not matched you have two problems on hand. The
+first one is TeX--you have to instruct TeX to use something else as
+begin- and/or end-group characters. Eplain provides an easy way to do
+this: just define '\idxargopen' and/or '\idxargclose' to the begin- and
+end-group characters you are going to use with indexing macros, and use
+braces inside index terms without any restrictions. Here's an example:
+
+ \def\idxargopen{`\<}
+ \def\idxargclose{`\>}
+ \sidx <left brace "{@left brace \verbatim "{"|endverbatim>
+
+In this example we've also dealt with the second problem--braces are
+MakeIndex's grouping characters as well (by default), so we have escaped
+unmatched braces with '"'.
+
+ And the final note: if you need a subentry containing brackets ('['
+and ']'), avoid the optional argument of '\sidx' and friends, and use
+instead MakeIndex's subentry separator to create the subentry with the
+brackets in it:
+
+ \sidx{entry!subentry with a bracket [}
+
+
+File: eplain.info, Node: Proofing index terms, Prev: Index entries with special characters, Up: Indexing terms
+
+4.12.1.4 Proofing index terms
+.............................
+
+As you are reading through a manuscript, it is helpful to see what terms
+have been indexed, so you can add others, catch miscellaneous errors,
+etc. (Speaking from bitter experience, I can say it is extremely
+error-prone to leave all indexing to the end of the writing, since it
+involves adding many TeX commands to the source files.)
+
+ So Eplain puts index terms in the margin of each page, if you set
+'\indexproofingtrue'. It is 'false' by default. The terms are typeset by
+the macro '\indexproofterm', which takes a single argument, the term to
+be typeset. Eplain's definition of '\indexproofterm' just puts it into
+an '\hbox', first doing '\indexprooffont', which Eplain defines to
+select the font 'cmtt8'. With this definition long terms run off the
+page, but since this is just for proofreading anyway, it seems
+acceptable.
+
+ On the other hand, we certainly don't want the index term to run into
+the text of the page, so Eplain uses the right-hand side of the page
+rather than the left-hand page (assuming a language read left to right
+here). So '\ifodd\pageno', Eplain kerns by '\outsidemargin', otherwise
+by '\insidemargin'. If those macros are undefined, '\indexsetmargins'
+defines them to be one inch plus '\hoffset'.
+
+ To get the proofing index entries on the proper page, Eplain defines
+a new insertion class '\@indexproof'. To unbox any index proofing
+material, Eplain redefines '\makeheadline' to call '\indexproofunbox'
+before the original '\makeheadline'. Thus, if you have your own output
+routine, that redefines or doesn't use '\makeheadline', it's up to you
+to call '\indexproofunbox' at the appropriate time.
+
+
+File: eplain.info, Node: Typesetting an index, Next: Customizing indexing, Prev: Indexing terms, Up: Indexing
+
+4.12.2 Typesetting an index
+---------------------------
+
+The command '\readindexfile{i}' reads and typesets the '.ind' file that
+MakeIndex outputs (from the '.idx' file which the indexing commands in
+the previous sections write). Eplain defines a number of commands that
+support the default MakeIndex output.
+
+ More precisely, '\readindexfile' reads
+'\indexfilebasename.INDEX-LETTERnd', where the INDEX-LETTER is the
+argument. '\indexfilebasename' is '\jobname' by default, but if you have
+different indexes in different parts of a book, you may wish to change
+it, just as with bibliographies (*note Citations::).
+
+ MakeIndex was designed to work with LaTeX; therefore, by default the
+'.ind' file starts with '\begin{theindex}' and ends with
+'\end{theindex}'. If no '\begin' has been defined, Eplain defines one to
+ignore its argument and set up for typesetting the index (see below),
+and also defines a '\end' to ignore its argument. (In a group,
+naturally, since there is a primitive '\end').
+
+ Eplain calls '\indexfonts', sets '\parindent = 0pt', and does
+'\doublecolumns' (*note Multiple columns::) at the '\begin{theindex}'.
+'\indexfonts' does nothing by default; it's just there for you to
+override. (Indexes are usually typeset in smaller type than the main
+text.)
+
+ It ends the setup with '\hookrun{beginindex}', so you can override
+anything you like in that hook (*note Hooks::). For example:
+
+ \hookaction{beginindex}{\triplecolumns}
+
+ MakeIndex turns each main index entry into an '\item', subentries
+into '\subitem', and subsubentries into '\subsubitem'. By default, the
+first line of main entries are not indented, and subentries are indented
+1em per level. Main entries are preceded by a '\vskip' of
+'\aboveitemskipamount', '0pt plus2pt' by default. Page breaks are
+encouraged before main entries ('\penalty -100'), but prohibited
+afterwards--Eplain has no provision for "continued" index entries.
+
+ All levels do the following:
+
+ \hangindent = 1em
+ \raggedright
+ \hyphenpenalty = 10000
+
+ Each entry ends with '\hookrun{indexitem}', so you can change any of
+this. For example, to increase the allowable rag:
+
+ \hookaction{indexitem}{\advance\rightskip by 2em}
+
+ Finally, MakeIndex outputs '\indexspace' between each group of
+entries in the '.ind' file. Eplain makes this equivalent to '\bigbreak'.
+
+
+File: eplain.info, Node: Customizing indexing, Prev: Typesetting an index, Up: Indexing
+
+4.12.3 Customizing indexing
+---------------------------
+
+By default, MakeIndex outputs ', ' after each term in the index. To
+change this, you can add the following to your MakeIndex style ('.ist')
+file:
+
+ delim_0 "\\afterindexterm "
+ delim_1 "\\afterindexterm "
+ delim_2 "\\afterindexterm "
+
+Eplain makes '\afterindexterm' equivalent to '\quad'.
+
+ You can also change the keywords Eplain recognizes (*note Modifying
+index entries::):
+
+'\idxrangebeginword'
+ 'begin'
+
+'\idxrangeendword'
+ 'end'
+
+'\idxseecmdword'
+ 'see'
+
+'\idxseealsocmdword'
+ 'seealso'
+
+ You can also change the magic characters Eplain puts into the '.idx'
+file, in case you've changed them in the '.ist' file:
+
+'\idxsubentryseparator'
+ '!'
+
+'\idxencapoperator'
+ '|'
+
+'\idxbeginrangemark'
+ '('
+
+'\idxendrangemark'
+ ')'
+
+ There is no macro for the 'actual' ('@' by default) character,
+because it's impossible to make it expand properly.
+
+ You can change the (imaginary) page number that "see also" entries
+sort as by redefining '\idxmaxpagenum'. This is 99999 by default, which
+is one digit too many for old versions of MakeIndex.
+
+ The words output by Eplain for "see" and "see also" index entries are
+defined by '\indexseeword' and '\indexseealsowords' respectively. You
+can change the typeface used for these words by redefining
+'\seevariant'. And finally, the macros '\indexsee' and '\indexseealso'
+actually produce the "see ..." entries, so you can redefine them if you
+want something entirely different. If you do redefine them, make them
+take two parameters, the term being referenced and the '\idxmaxpagenum'
+(the latter should normally be ignored). See the example below.
+
+ Unfortunately, it is impossible to reliably control the commas
+produced by MakeIndex in front of "see ..." entries in the '.ind' file,
+either at MakeIndex level or at Eplain level. However, the 'sed' script
+contained in 'trimsee' distributed with Eplain in the 'util' directory
+can be used to filter out these commas from the output of MakeIndex. For
+example, suppose you want the following style for your "see ..."
+entries:
+
+ analysis,
+ archetypal (see archetypal criticism)
+ archetypal criticism,
+ elements of, 75, 97, 114 (see also dichotomies)
+
+You would need to redefine these macros in your TeX file:
+
+ \def\indexsee#1#2{({\seevariant \indexseeword\/ }#1)}
+ \def\indexseealso#1#2{({\seevariant \indexseealsowords\/ }#1)}
+
+and then filter out the commas in front of the "see ..." entries by
+running the following command to produce the '.ind' file (assuming the
+name of the '.idx' file is 'myfile.idx' and the 'trimsee' script is
+placed in the current directory):
+
+ prompt$ cat myfile.idx | makeindex | ./trimsee > myfile.ind
+
+ By default, 'trimsee' uses default page list separators and default
+"see ..." command names. If you set up MakeIndex to use different page
+list separator or change the names of '\indexsee' and '\indexseealso'
+commands, it is possible to adjust the 'trimsee' script through its
+command line options, which are the following:
+
+'-i IS'
+ Use IS as a regular expression matching separator before "see ..."
+ commands in the input (default: ', \+').
+
+'-o OS'
+ Use OS as a separator to replace IS before "see ..." commands
+ (default: ' ').
+
+'-s SEE'
+ Use SEE as a regular expression matching "see ..." commands
+ (default: '\\indexsee').
+
+'-h'
+'--help'
+ Print a usage message.
+
+'-v'
+'--version'
+ Print version.
+
+ 'trimsee' reads input from the standard input, and directs its output
+to the standard output.
+
+
+File: eplain.info, Node: Justification, Next: Tables, Prev: Indexing, Up: User definitions
+
+4.13 Justification
+==================
+
+Eplain defines three commands to conveniently justify multiple lines of
+text: '\flushright', '\flushleft', and '\center'.
+
+ They all work in the same way; let's take '\center' as the example.
+To start centering lines, you say '\center' inside a group; to stop, you
+end the group. Between the two commands, each end-of-line in the input
+file also starts a new line in the output file.
+
+ The entire block of text is broken into paragraphs at blank lines, so
+all the TeX paragraph-shaping parameters apply in the usual way. This is
+convenient, but it implies something else that isn't so convenient:
+changes to any linespacing parameters, such as '\baselineskip', will
+have _no effect_ on the paragraph in which they are changed. TeX does
+not handle linespacing changes within a paragraph (because it doesn't
+know where the line breaks are until the end of the paragraph).
+
+ The space between paragraphs is by default one blank line's worth.
+You can adjust this space by assigning to '\blanklineskipamount'; this
+(vertical) glue is inserted after each blank line.
+
+ Here is an example:
+
+ {\center First line.
+
+ Second line, with a blank line before.
+ }
+
+This produces:
+
+ First line.
+ Second line, with a blank line before.
+
+ You may wish to use the justification macros inside of your own
+macros. Just be sure to put them in a group. For example, here is how a
+title macro might be defined:
+
+ \def\title{\begingroup\titlefont\center}
+ \def\endtitle{\endgroup}
+
+ In addition, Eplain defines '\raggedleft', analogous to plain TeX's
+'\raggedright'. This macro is also typically used inside a group, but
+unlike the environments above, TeX does normal line breaking; that is,
+ends-of-lines in the input file aren't treated specially. Just like
+plain's '\raggedright', it also resets '\spaceskip' and '\xspaceskip' so
+that interword spacing is uniform. It also sets '\parfillskip' to zero
+so that last lines of paragraphs are also "ragged left". Finally,
+'\leftskip''s new value is taken from a new glue register,
+'\raggedleft'; its default value is '0pt plus 2em', the same as
+'\raggedright''s '\rightskip'.
+
+ Here's an example:
+
+ {\raggedleft This text will be set ragged left,
+ although the left margin won't be too ragged by default.
+ You may well want to increase the value of
+ {\tt \char`\\raggedleftskip} before calling the macro.
+ It's necessary to end the paragraph before ending the group
+ or the setting won't have any effect, so: {\tt \char`\\par}
+ }
+
+ Despite '\raggedleft' resetting '\parfillskip' to zero, TeX's line
+breaking may still prefer to make the last line of a paragraph
+considerably shorter than the rest, to minimize overall badness.
+Increasing '\raggedleftskip' may help somewhat, but using
+'\emergencystretch', retaining interword stretchability by assigning
+'\leftskip' directly, or even forcing line breaks may be necessary.
+
+
+File: eplain.info, Node: Tables, Next: Margins, Prev: Justification, Up: User definitions
+
+4.14 Tables
+===========
+
+Eplain provides a single command, '\makecolumns', to make generating one
+particular kind of table easier. More ambitious LaTeX styles and macro
+packages tackle more difficult applications. The 'autorows' feature of
+the Memoir package provides similar functionality to this.
+
+ Many tables are homogenous, i.e., all the entries are semantically
+the same. The arrangement into columns is to save space on the page, not
+to encode different meanings. In this kind of the table, it is useful to
+have the column breaks chosen automatically, so that you can add or
+delete entries without worrying about the column breaks.
+
+ '\makecolumns' takes two arguments: the number of entries in the
+table, and the number of columns to break them into. As you can see from
+the example below, the first argument is delimited by a slash, and the
+second by a colon and a space (or end-of-line). The entries for the
+table then follow, one per line (not including the line with the
+'\makecolumns' command itself).
+
+ '\parindent' defines the space to the left of the table. '\hsize'
+defines the width of the table. So you can adjust the position of the
+table on the page by assignments to these parameters, probably inside a
+group.
+
+ You can also control the penalty at a page break before the
+'\makecolumns' by setting the parameter '\abovecolumnspenalty'. Usually,
+the table is preceded by some explanatory text. You wouldn't want a page
+break to occur after the text and before the table, so Eplain sets it to
+'10000'. But if the table produced by '\makecolumns' is standing on its
+own, '\abovecolumnspenalty' should be decreased.
+
+ If you happen to give '\makecolumns' a smaller number of entries than
+you really have, some text beyond the (intended) end of the table will
+be incorporated into the table, probably producing an error message, or
+at least some strange looking entries. And if you give '\makecolumns' a
+larger number of entries than you really have, some of the entries will
+be typeset as straight text, probably also looking somewhat out of
+place.
+
+ Here is an example:
+
+ % Arrange 6 entries into 2 columns:
+ \makecolumns 6/2: % This line doesn't have an entry.
+ one
+ two
+ three
+ four
+ five
+ six
+ Text after the table.
+
+This produces 'one', 'two', and 'three' in the first column, and 'four',
+'five', and 'six' in the second.
+
+
+File: eplain.info, Node: Margins, Next: Multiple columns, Prev: Tables, Up: User definitions
+
+4.15 Margins
+============
+
+TeX's primitives describe the type area in terms of an offset from the
+upper left corner, and the width and height of the type. Some people
+prefer to think in terms of the "margins" at the top, bottom, left, and
+right of the page, and most composition systems other than TeX conceive
+of the page laid out in this way. Therefore, Eplain provides commands to
+directly assign and increment the margins.
+
+'\topmargin = DIMEN'
+'\bottommargin = DIMEN'
+'\leftmargin = DIMEN'
+'\rightmargin = DIMEN'
+ These commands set the specified margin to the DIMEN given. The '='
+ and the spaces around it are optional. The control sequences here
+ are not TeX registers, despite appearances; therefore, commands
+ like '\showthe\topmargin' will not do what you expect.
+
+'\advancetopmargin by DIMEN'
+'\advancebottommargin by DIMEN'
+'\advanceleftmargin by DIMEN'
+'\advancerightmargin by DIMEN'
+ These commands change the specified margin by the DIMEN given.
+
+ Regardless of whether you use the assignment or the advance commands,
+Eplain always changes the type area in response, not the other margins.
+For example, when TeX starts, the left and right margins are both one
+inch. If you then say '\leftmargin = 2in', the right margin will remain
+at one inch, and the width of the lines (i.e., '\hsize') will decrease
+by one inch.
+
+ When you use any of these commands, Eplain computes the old value of
+the particular margin, by how much you want to change it, and then
+resets the values of TeX's primitive parameters to correspond.
+Unfortunately, Eplain cannot compute the right or bottom margin without
+help: you must tell it the full width and height of the final output
+page. It defines two new parameters for this:
+
+'\paperheight'
+ The height of the output page; default is 11truein.
+
+'\paperwidth'
+ The width of the output page; default is 8.5truein.
+
+ If your output page has different dimensions than this, you must
+reassign to these parameters, as in
+
+ \paperheight = 11truein
+ \paperwidth = 17truein
+
+
+File: eplain.info, Node: Multiple columns, Next: Footnotes, Prev: Margins, Up: User definitions
+
+4.16 Multiple columns
+=====================
+
+Eplain provides for double, triple, and quadruple column output: say
+'\doublecolumns', '\triplecolumns', or '\quadcolumns', and from that
+point on, the manuscript will be set in columns. To go back to one
+column, say '\singlecolumn'.
+
+ You may need to invoke '\singlecolumn' to balance the columns on the
+last page of output.
+
+ To do a "column eject", i.e., move to the top of the next column, do
+'\columnfill'. This does not actually force an eject, however: it merely
+inserts an unbreakable space of (essentially) size '\@normalvsize' minus
+'\pagetotal' (where '\@normalvsize' is the usual height of the page; to
+implement multicolumns, Eplain multiplies '\vsize' itself by the number
+of columns). In most circumstances, a column break will be forced after
+this space (during the column splitting operation when the whole page is
+output). Bugs are easily possible, unfortunately.
+
+ The columns are separated by the value of the dimen parameter
+'\gutter'. Default value is two picas. If you want to add vertical
+material between the columns, use '\gutterbox'. For example, to put a
+vertical line between columns, define '\gutterbox' as
+
+ \def\gutterbox{\vbox to \dimen0{\vfil\hbox{\vrule height\dimen0}\vfil}}%
+
+The dimension counter '\dimen0' contains the height of the column.
+
+ All the '\...columns' macros insert the value of the glue parameter
+'\abovecolumnskip' before the multicolumn text, and the value of the
+glue parameter '\belowcolumnskip' after it. The default value for both
+of these parameters is '\bigskipamount', i.e., one linespace in plain
+TeX.
+
+ The macros take into account only the insertion classes defined by
+plain TeX; namely, footnotes and '\topinsert's. If you have additional
+insertion classes, you will need to change the implementation.
+
+ Also, Eplain makes insertions the full page width. There is no
+provision for column-width insertions.
+
+
+File: eplain.info, Node: Footnotes, Next: Fractions, Prev: Multiple columns, Up: User definitions
+
+4.17 Footnotes
+==============
+
+The most common reference mark for footnotes is a raised number,
+incremented on each footnote. The '\numberedfootnote' macro provides
+this. It takes one argument, the footnote text.
+
+ If your document uses only numbered footnotes, you could make typing
+'\numberedfootnote' more convenient with a command such as:
+
+ \let\footnote = \numberedfootnote
+
+After doing this, you can type your footnotes as '\footnote{FOOTNOTE
+TEXT}', instead of as '\numberedfootnote{FOOTNOTE TEXT}'.
+
+ Eplain keeps the current footnote number in the count register
+'\footnotenumber'. So, to reset the footnote number to zero, as you
+might want to do at, for example, the beginning of a chapter, you could
+say '\footnotenumber=0'.
+
+ Plain TeX separates the footnote marker from the footnote text by an
+en space (it uses the '\textindent' macro). In Eplain, you can change
+this space by setting the dimension register '\footnotemarkseparation'.
+The default is still an en.
+
+ You can produce a space between footenotes by setting the glue
+register '\interfootnoteskip'. The default is zero.
+
+ '\parskip' is also set to zero by default before the beginning of
+each footnote (but not for the text of the footnote).
+
+ You can also control footnote formatting in a more general way:
+Eplain expands the token register '\everyfootnote' before a footnote is
+typeset, but after the default values for all the parameters have been
+established. For example, if you want your footnotes to be printed in
+seven-point type, indented by one inch, you could say:
+
+ \everyfootnote = {\sevenrm \leftskip = 1in}
+
+ By default, an '\hrule' is typeset above each group of footnotes on a
+page. You can control the dimensions of this rule by setting the
+dimension registers '\footnoterulewidth' and '\footnoteruleheight'. The
+space between the rule and the first footnote on the page is determined
+by the dimension register '\belowfootnoterulespace'. If you don't want
+any rule at all, set '\footenoteruleheight=0pt', and, most likely,
+'\belowfootnoterulespace=0pt'. The defaults for these parameters typeset
+the rule in the same way as plain TeX: the rule is 0.4 points high, 2
+true inches wide, with 2.6 points below it.
+
+ The space above the rule and below the text on the page is controlled
+by the glue register '\skip\footins'. The default is a plain TeX
+'\bigskip'.
+
+ Eplain can create hypertext links for the footnote marks (*note
+Footnote hyperlinks::).
+
+
+File: eplain.info, Node: Fractions, Next: Paths, Prev: Footnotes, Up: User definitions
+
+4.18 Fractions
+==============
+
+Exercise 11.6 of 'The TeXbook' describes a macro '\frac' for setting
+fractions, but '\frac' never made it into plain TeX. So Eplain includes
+it.
+
+ '\frac' typesets the numerator and denominator in '\scriptfont0',
+slightly raised and lowered. The numerator and denominator are separated
+by a slash. The denominator must be enclosed in braces if it's more than
+one token long, but the numerator need not be. (This is a consequence of
+'\frac' taking delimited arguments; see page 203 of 'The TeXbook' for an
+explanation of delimited macro arguments.)
+
+ For example, '\frac 23/{64}' turns '23/64' into 23/64 (you can't see
+the difference in the Info file).
+
+
+File: eplain.info, Node: Paths, Next: Logos, Prev: Fractions, Up: User definitions
+
+4.19 Paths
+==========
+
+When you typeset long pathnames, electronic mail addresses, or other
+such "computer" names, you would like TeX to break lines at punctuation
+characters within the name, rather than trying to find hyphenation
+points within the words. For example, it would be better to break the
+email address 'letters@alpha.gnu.ai.mit.edu' at the '@' or a '.', rather
+than at the hyphenation points in 'letters' and 'alpha'.
+
+ If you use the '\path' macro to typeset the names, TeX will find
+these good breakpoints. The argument to '\path' is delimited by any
+character other than '\' which does not appear in the name itself. '|'
+is often a good choice, as in:
+
+ \path|letters@alpha.gnu.ai.mit.edu|
+
+ You can control the exact set of characters at which breakpoints will
+be allowed by calling '\discretionaries'. This takes the same sort of
+delimited argument; any character in the argument will henceforth be a
+valid breakpoint within '\path'. The default set is essentially all the
+punctuation characters:
+
+ \discretionaries |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/|
+
+ If for some reason you absolutely must use '\' as the delimiter
+character for '\path', you can set '\specialpathdelimiterstrue'. (Other
+delimiter characters can still be used.) TeX then processes the '\path'
+argument about four times more slowly.
+
+ The '\path' macro comes from 'path.sty', written by Nelson Beebe and
+Philip Taylor, and available at <https://ctan.org/pkg/path>.
+
+
+File: eplain.info, Node: Logos, Next: Boxes, Prev: Paths, Up: User definitions
+
+4.20 Logos
+==========
+
+Eplain redefines the '\TeX' macro of plain TeX to end with '\null', so
+that the proper spacing is produced when '\TeX' is used at the end of a
+sentence. The other ...TeX macros listed here do this, also.
+
+ Eplain defines '\AMSLaTeX', '\AMSTeX', '\BibTeX' '\eTeX', '\ExTeX',
+'\LAMSTeX', '\LaTeX', '\MF', '\SLiTeX', '\XeLaTeX', and '\XeTeX' to
+produce their respective logos. (Sorry, the logos are not shown here.)
+Some spelling variants of these are also supported.
+
+ Most of these macros come from 'texnames.sty', compiled by Nelson
+Beebe and available at
+<http://mirror.ctan.org/tex-archive/info/biblio/texnames.sty> (part of
+the 'biblio' package, <https://ctan.org/pkg/biblio>).
+
+
+File: eplain.info, Node: Boxes, Next: Checking for PDF output, Prev: Logos, Up: User definitions
+
+4.21 Boxes
+==========
+
+The solid rectangle that Eplain uses as a marker in unordered lists
+(*note Lists::) is available by itself: just say '\blackbox'.
+
+ You can create black boxes of arbitrary size with '\hrule' or
+'\vrule'.
+
+ You can also get unfilled rectangles with '\makeblankbox'. This takes
+two explicit arguments: the height and depth of the rules that define
+the top and bottom of the rectangle. (The two arguments are added to get
+the width of the left and right borders, so that the thickness of the
+border is the same on all four sides.) It also uses, as implicit
+arguments, the dimensions of '\box0' to define the dimensions of the
+rectangle it produces. (The contents of '\box0' are ignored.)
+
+ Here is an example. This small raised open box is suitable for
+putting next to numbers in, e.g., a table of contents.
+
+ \def\openbox{%
+ \ht0 = 1.75pt \dp0 = 1.75pt \wd0 = 3.5pt
+ \raise 2.75pt \makeblankbox{.2pt}{.2pt}
+ }
+
+ Finally, you can put a box around arbitrary text with '\boxit'. This
+takes one argument, which must itself be a (TeX) box, and puts a printed
+box around it, separated by '\boxitspace' white space (3 points by
+default) on all four sides. For example:
+
+ \boxit{\hbox{This text is boxed.}}
+
+ The reason that the argument must be a box is that when the text is
+more than one line long, TeX cannot figure out the line length for
+itself. Eplain does set '\parindent' to zero inside '\boxit', since it
+is very unlikely you would want indentation there. (If you do, you can
+always reset it yourself.)
+
+ '\boxit' uses '\ehrule' and '\evrule' so that you can easily adjust
+the thicknesses of the box rules. *Note Rules::.
+
+
+File: eplain.info, Node: Checking for PDF output, Next: Loading LaTeX packages, Prev: Boxes, Up: User definitions
+
+4.22 Checking for PDF output
+============================
+
+pdfTeX is an extended TeX that can output both '.dvi' and '.pdf'
+(Adobe's Portable Document Format) files (see
+<https://ctan.org/pkg/pdftex>). You might sometimes want to know whether
+the target format is '.pdf' or '.dvi'. The '\ifpdf' switch can be used
+to detect pdfTeX in PDF mode:
+
+ \ifpdf
+ This text is produced when pdfTeX is in PDF mode.
+ \else
+ This text is produced when pdfTeX is in DVI mode,
+ or when some program other than pdfTeX is used.
+ \fi
+
+ Keep in mind that '\ifpdf' is set based on the value of the
+'\pdfoutput' primitive of pdfTeX at the time Eplain is loaded. If you
+change the value of '\pdfoutput' after you load Eplain, '\ifpdf' will
+not reflect the change.
+
+ Eplain defines '\ifpdf' by incorporating Heiko Oberdiek's
+'ifpdf.sty', which is available at <https://ctan.org/pkg/ifpdf>.
+
+
+File: eplain.info, Node: Loading LaTeX packages, Prev: Checking for PDF output, Up: User definitions
+
+4.23 Loading LaTeX packages
+===========================
+
+Eplain provides a limited support for loading LaTeX packages ('.sty'
+files--not '.cls'). This will mostly work for packages which were
+designed with plain TeX compatibility in mind, which means that most
+LaTeX packages cannot be loaded. The packages which are known to work
+are listed below (*note Packages known to work::). If you discover a
+working package which is not in the list, please report it to the Eplain
+mailing list (*note Introduction::).
+
+ To set up a pseudo-LaTeX environment for the packages, Eplain uses
+'miniltx.tex' (<https://ctan.org/pkg/miniltx>) from the LaTeX graphics
+collection, written by David Carlisle and Sebastian Rahtz. Eplain
+extends 'miniltx.tex' to provide (primarily) support for package
+options.
+
+* Menu:
+
+* The \usepackage command:: Command to load packages.
+* Environment for loading packages:: Environment for the \usepackage commands.
+* Packages known to work:: Packages supported with Eplain.
+* Packages known not to work:: Packages known not to work with Eplain.
+
+
+File: eplain.info, Node: The \usepackage command, Next: Environment for loading packages, Up: Loading LaTeX packages
+
+4.23.1 The '\usepackage' command
+--------------------------------
+
+'\usepackage' loads a LaTeX package. Its syntax is similar to that of
+LaTeX's '\usepackage' command:
+
+ \usepackage[OPTIONS]{PACKAGES}[VERSION]
+
+where OPTIONS is a comma-separated list of package options, PACKAGES is
+a comma-separated list of packages to load (without the '.sty' suffix),
+and VERSION is a package version number given as a date in the format
+'YYYY/MM/DD'. If an older version of the package is found, a warning is
+issued. If several packages are loaded within a single '\usepackage'
+command, the OPTIONS will be applied to each of the packages. As usual,
+parameters in square brackets are optional and can be omitted (together
+with the square brackets).
+
+ For example:
+
+ \usepackage[foo,bar]{pack1,pack2}[2005/08/29]
+
+will load packages 'pack1' and 'pack2', each with the options 'foo' and
+'bar', and will check that each of the packages are dated 2005/08/29 or
+newer.
+
+
+File: eplain.info, Node: Environment for loading packages, Next: Packages known to work, Prev: The \usepackage command, Up: Loading LaTeX packages
+
+4.23.2 Environment for loading packages
+---------------------------------------
+
+Some packages request that certain commands are executed after all
+packages have been loaded. In LaTeX, this means that the commands are
+executed at the beginning of the document, after the so-called
+"preamble". Neither plain TeX nor Eplain have a concept of preamble;
+therefore, Eplain requires that all packages be loaded inside a
+'\beginpackages...\endpackages' block. For example:
+
+ \beginpackages
+ \usepackage[foo,bar]{pack1}
+ \usepackage{pack2}
+ \endpackages
+
+This requirement enables Eplain to execute the "delayed" commands at the
+end of the '\beginpackages...\endpackages' block.
+
+ For the same reason, it is advisable to specify only one such block
+per document, just like there is only one preamble in LaTeX.
+
+ Both the 'miniltx.tex' file used by Eplain and some LaTeX packages
+redefine TeX's primitive '\input' to be a macro. Under plain TeX, users
+probably expect the primitive '\input'. Therefore, at the beginning of
+the '\beginpackages...\endpackages' block Eplain saves the meaning of
+'\input' as '\eplaininput' and restores the original '\input' at the end
+of the block. This usually means that the primitive '\input' is
+restored, unless you (or some other macro package you've loaded
+directly) have redefined it before calling '\beginpackages'. In case you
+need to access the package-provided '\input', Eplain saves it as
+'\packageinput'.
+
+ Along the same lines, Eplain restores the catcode of '@' at
+'\endpackages' to whatever it was before (using '\resetatcatcode', as
+defined by 'miniltx.tex'). This is needed because 'miniltx.tex', read by
+'\beginpackages', does not restore the catcode of '@', but leaves it as
+11 (letter).
+
+ Sometimes you may encounter packages which make conflicting
+redefinitions of '\input'. Common symptoms are TeX spewing
+incomprehensible error messages or hanging in a loop at a call to
+'\input'. This sometimes can be cured by restoring '\input' to
+'\eplaininput' before loading each package. For example:
+
+ \beginpackages
+ \usepackage{pack1}
+ \let\input\eplaininput
+ \usepackage{pack2}
+ \endpackages
+
+
+File: eplain.info, Node: Packages known to work, Next: Packages known not to work, Prev: Environment for loading packages, Up: Loading LaTeX packages
+
+4.23.3 Packages known to work
+-----------------------------
+
+The following table lists packages that had been tested and are known to
+work with Eplain, and locations where you can find manuals for these
+packages. Some of the short descriptions of the packages were taken from
+the documentation for those packages.
+
+autopict ('2001/06/04 v1.1j Picture mode autoload file')
+ <https://tug.org/eplain/misc/ltpictur.pdf>
+
+ This is the LaTeX "picture mode", started by '\begin{picture}' and
+ ended by '\end{picture}' (in LaTeX, this package is not explicitly
+ loaded since it is part of the LaTeX kernel). It provides commands
+ to draw simple figures inside your document without resorting to
+ any external tools.
+
+color ('1999/02/16 v1.0i Standard LaTeX Color (DPC)')
+graphics ('2001/07/07 v1.0n Standard LaTeX Graphics (DPC,SPQR)')
+graphicx ('1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR)')
+ <https://ctan.org/pkg/graphics>
+
+ These packages are from the LaTeX graphics collection. (The
+ independent 'xcolor' package does not work with Eplain.) They
+ provide commands for changing text/page colors, text rotation and
+ scaling, and much more.
+
+ *Warning 1:* If you encounter problems loading one of these
+ packages under pdfTeX (when pdfTeX reads 'supp-mis.tex'), the cause
+ may be an outdated 'supp-mis.tex' (part of ConTeXt, a typesetting
+ system for TeX) installed on your system. The problem was fixed in
+ 'supp-mis.tex' version 2004.10.26. You can obtain up-to-date
+ versions of 'supp-mis.tex' and the accompanying 'supp-pdf.tex' from
+ <http://mirror.ctan.org/tex-archive/macros/pdftex/graphics>. To
+ convince TeX to use the new files, you have the following options:
+
+ 1. put the new files in the same directory with your document;
+
+ 2. overwrite the outdated files installed by your TeX
+ distribution;
+
+ 3. install the new 'supp-mis.tex' and 'supp-pdf.tex' files in the
+ relevant subdirectory of your local 'texmf' tree (for info on
+ TeX directory structure see <https://tug.org/tds/> and
+ <http://www.tex.ac.uk/cgi-bin/texfaq2html?label=tds>);
+
+ 4. upgrade your ConTeXt installation.
+
+ Note that option 1 is the safest but provides the fix only for your
+ current document. Options 2 and 3 will usually suffice for Eplain
+ but may break ConTeXt. Option 4 is the most general but is more
+ complicated than the first three. Be sure to backup any files you
+ overwrite. Also keep in mind that upgrading your TeX distribution
+ may overwrite files you install in the system 'texmf' tree.
+ *End of warning 1.*
+
+ *Warning 2:* If you encounter problems using the '\pagecolor'
+ command from the 'color.sty' package under pdfTeX, the cause may be
+ an outdated pdfTeX color and graphics driver 'pdftex.def'. The
+ problem was fixed in 'pdftex.def' version 0.03p. You can obtain an
+ up-to-date version from <http://ctan.org/pkg/pdftex-def>.
+ *End of warning 2.*
+
+ The '\fcolorbox' macro provided by the 'color' package requires the
+ macro '\fbox' to work, but 'miniltx' does not provide that. Here is
+ a definition for it that uses Eplain's '\boxit' (*note Boxes::),
+ thanks to Dan Luecking and Helmut Jarausch:
+
+ \makeatletter
+ \def\fbox#1{{%
+ \hruledefaultheight=\fboxrule
+ \hruledefaultdepth=0pt
+ \vruledefaultwidth=\fboxrule
+ \let\boxitspace\fboxsep % use miniltx register
+ \boxit{\color@begingroup\hbox{#1}\color@endgroup}%
+ }}
+ \makeatother
+
+ The 'graphics'/'graphicx' packages have the option 'draft' which
+ instructs '\includegraphics' not to include the graphics but
+ instead typeset a box with the dimensions of the graphics and the
+ name of the graphics file in typewriter type at the center of the
+ box. These packages expect the LaTeX-provided command '\ttfamily'
+ to switch to typewriter type. This command is not defined by
+ 'miniltx.tex', therefore Eplain defines it and makes it equivalent
+ to plain TeX's '\tt'.
+
+ *Note Hyperlinks (xhyper.tex)::, for the demonstration of text
+ rotation and graphics inclusion using the 'graphicx' package, and
+ using the 'color' package to colorize hypertext links.
+
+ Klaus Ho"ppner has written a nice introduction to the LaTeX
+ graphics packages and different graphics formats. You can download
+ it from
+ <https://tug.org/pracjourn/2005-3/hoeppner>
+
+epstopdf ('2009/07/16 v2.2 Conversion with epstopdf on the fly (HO)')
+ <https://ctan.org/pkg/epstopdf-pkg>
+
+ This package does on-the-fly conversion of Encapsulated PostScript
+ (EPS) graphics into Portable Document Format (PDF) graphics for
+ inclusion with the '\includegraphics' command from the
+ 'graphics'/'graphicx' packages, so that you do not have to
+ explicitly call the 'epstopdf' script.
+
+psfrag ('1998/04/11 v3.04 PSfrag (MCG)')
+ <https://ctan.org/pkg/psfrag>
+
+ PSfrag allows the user to precisely overlay Encapsulated PostScript
+ (EPS) files with arbitrary (La)TeX constructions. In order to
+ accomplish this, the user places a simple text "tag" in the
+ graphics file, as a "position marker" of sorts. Then, using simple
+ (La)TeX commands, the user instructs PSfrag to remove that tag from
+ the figure, and replace it with a properly sized, aligned, and
+ rotated (La)TeX equation.
+
+soul ('2003/11/17 v2.4 letterspacing/underlining (mf)')
+ <https://ctan.org/pkg/soul>
+
+ This package provides hyphenatable letterspacing (spacing out),
+ underlining, and some derivatives. The package is optimized for
+ LaTeX, but works with plain TeX--you don't actually need to load it
+ with the '\usepackage' command, just say '\input soul.sty'. If you
+ intend to use the highlighting macros of 'soul', don't forget to
+ load the 'color' package.
+
+url ('2005/06/27 ver 3.2 Verb mode for urls, etc.')
+ <https://ctan.org/pkg/url>
+
+ This package provides a form of '\verbatim' that allows line breaks
+ at certain characters or combinations of characters, accepts
+ reconfiguration, and can usually be used in the argument to another
+ command. It is intended for email addresses, hypertext links,
+ directories/paths, etc., which normally have no spaces.
+
+ Eplain can create hypertext links with the '\url' command (*note
+ URL hyperlinks::).
+
+ Be sure to get a version dated at least 2005/06/27, as older
+ versions have problems in plain TeX.
+
+
+File: eplain.info, Node: Packages known not to work, Prev: Packages known to work, Up: Loading LaTeX packages
+
+4.23.4 Packages known not to work
+---------------------------------
+
+The following packages are known not to work with Eplain:
+
+hyperref
+ <https://ctan.org/pkg/hyperref>
+
+ This package depends heavily on LaTeX, so that it is essentially
+ unusable outside of LaTeX. Eplain provides its own macros for
+ creating hyperlinks; *note Hyperlinks::.
+
+microtype ('2013/05/23 v2.51 Micro-typographical refinements (RS)')
+ <https://ctan.org/pkg/microtype>
+
+pict2e ('2005/07/15 v0.2r Improved picture commands (HjG,RN)')
+ <https://ctan.org/pkg/pict2e>
+
+xcolor ('2005/06/06 v2.03 LaTeX color extensions (UK)')
+ <https://ctan.org/pkg/xcolor>
+
+
+File: eplain.info, Node: Hyperlinks, Next: Arrow theoretic diagrams, Prev: User definitions, Up: Top
+
+5 Hyperlinks
+************
+
+This chapter describes the support which Eplain provides for hypertext
+links ("hyperlinks" for short). Hyperlinks can be created implicitly by
+the cross-reference, indexing and other macros in Eplain. Macros for
+constructing explicit hyperlinks are also provided.
+
+* Menu:
+
+* Introduction to hyperlinks::
+* Explicit hyperlinks::
+* Implicit hyperlinks::
+* Hyperlink drivers::
+* Setting hyperlink types and options::
+* Turning hyperlinks on/off::
+* Making PDF outlines:: Also known as bookmarks.
+
+
+File: eplain.info, Node: Introduction to hyperlinks, Next: Explicit hyperlinks, Up: Hyperlinks
+
+5.1 Introduction to hyperlinks
+==============================
+
+The original TeX engine has no built-in support for hyperlinks (a.k.a.
+hypertext links). Many of the present-day file formats with hyperlinking
+capabilities did not even exist at the time TeX was written. However,
+TeX's '\special' primitive can be used to instruct TeX to write special
+directives into its '.dvi' output file. These directives are not
+interpreted by TeX in any way; they are intended for programs which
+process the '.dvi' files produced by TeX, be it printing or converting
+to other formats, such as '.ps' or '.pdf'.
+
+ Another approach is to extend the original TeX engine with the
+ability to generate one of the hyperlinking formats; TeX's set of
+primitives can be extended to include hyperlink commands. This is the
+approach used by the pdfTeX engine, which is capable of producing '.pdf'
+files directly from the TeX source, skipping the '.dvi' generation and
+processing step.
+
+ It turns out that the sets of commands for different formats are
+mostly not interchangeable, as each of the file formats has its own
+quirks and capabilities. And this is where Eplain "hyperlink drivers"
+come into play.
+
+ In order for Eplain to generate proper commands, Eplain has to know
+two things: which engine or '.dvi' processor you are using, and the set
+of commands it understands.
+
+ The knowledge about the commands that the various processors
+understand is programmed into Eplain's hyperlink drivers. Eplain
+provides three drivers: 'hypertex' (implementation of the HyperTeX
+standard, see <http://arxiv.org/hypertex>), and 'pdftex' and 'dvipdfm'
+(named after the programs which process the hyperlink commands, pdfTeX
+and dvipdfm). Therefore, Eplain can only produce HyperTeX commands and
+hyperlink commands for one of these two programs--except that the
+extended 'dvipdfmx' program can be used as well as the original
+'dvipdfm', since they are compatible.
+
+ To tell Eplain which '.dvi' processor or extended TeX engine you are
+using, use the command '\enablehyperlinks'.
+
+ For example:
+
+ \enablehyperlinks
+
+instructs Eplain to attempt to automatically detect which driver to use,
+as follows: if it detects pdfTeX in PDF mode, it loads the 'pdftex'
+driver. If it does not detect pdfTeX in PDF mode, the 'hypertex' driver
+is loaded. The detection is based on the '\ifpdf' switch (*note Checking
+for PDF output::).
+
+ If necessary, you can explicitly specify the driver name:
+
+ \enablehyperlinks[dvipdfm]
+
+will start producing hyperlinks under the assumption that you are using
+pdfTeX.
+
+ Eplain does not produce any hyperlinks until you explicitly enable
+them with '\enablehyperlinks'. For one thing, this keeps Eplain
+backward-compatible with previous releases without hyperlink support.
+For another, you may be using a program other than pdfTeX or 'dvipdfm',
+which does not understand their hyperlink commands or the HyperTeX
+commands.
+
+Concepts and Terminology
+------------------------
+
+In general, hyperlinks work as follows. You mark some place in your
+document as a hyperlink destination, associating a "hyperlink label"
+with that destination. Next, somewhere within your document, you create
+a hyperlink, using a label to identify the destination you want this
+link to point to. A hyperlink is a region in the document (which can
+take many forms, for example, text or a picture); when a user clicks on
+that region, they will be taken to a place in the document marked by the
+corresponding destination. The following two sections (*note Explicit
+hyperlinks::, and *note Implicit hyperlinks::) describe the macros you
+can use to define destinations and create links pointing to those
+destinations.
+
+ In the rest of this chapter, we will often need to refer to links and
+destinations jointly, in which case we will use the term "hyperlinks".
+We will use the terms "links" and "destinations" in cases when we need
+to refer specifically to links or destinations.
+
+ Hyperlink drivers provide several kinds of links and destinations. We
+will refer to them as "link types" and "destination types".
+
+ For example, one of the destination types that the 'pdftex' driver
+provides is the 'xyz' type; when the user follows a link pointing to an
+'xyz' destination, the exact location marked by that destination is
+displayed. Another destination type provided by the 'pdftex' driver is
+the 'fit' type; when the user follows a link pointing to a 'fit'
+destination, the page containing that destination is zoomed to fit into
+the window in which the document is displayed.
+
+ Similarly, drivers support various link types. For example, with the
+'pdftex' driver, the usual link type used to refer to destinations in
+the current document is called 'name'. You can also create a link
+pointing to another local document (by using the 'filename' link type)
+or to a URL (by using the 'url' link type).
+
+ In addition, each hyperlink driver supports a number of destination
+and link "options". By setting these options you can customize hyperlink
+parameters (e.g., the thickness of the border drawn around a hyperlink)
+or pass information to hyperlinks (for example, file name of a document,
+for a link pointing to a destination in another document).
+
+ *Note Hyperlink drivers::, for the description of hyperlink types and
+options supported by the drivers. *Note Setting hyperlink types and
+options::, for the information on how to set hyperlink options.
+
+
+File: eplain.info, Node: Explicit hyperlinks, Next: Implicit hyperlinks, Prev: Introduction to hyperlinks, Up: Hyperlinks
+
+5.2 Explicit hyperlinks
+=======================
+
+Explicit hyperlinks are created by you, in the source of your document.
+The simplest command is '\hldest', which marks the current position in
+your document as a destination:
+
+ \hldest{TYPE}{OPTIONS}{LABEL}
+
+Here TYPE is one of the destination types supported by the hyperlink
+driver (*note Hyperlink drivers::), OPTIONS is a comma-separated list of
+option assignments, and LABEL is the hyperlink label to associate with
+this destination. This label will identify the destination when creating
+links pointing to this destination. For example, with the 'pdftex'
+driver, the command
+
+ \hldest{xyz}{zoom=2000}{index}
+
+creates a destination of type 'xyz' ("the current position"), sets the
+magnification ratio for this destination to be 200%, and associates the
+label 'index' with the destination.
+
+ Another command, '\hlstart', paired with '\hlend', turns all
+intervening material into a link:
+
+ \hlstart{TYPE}{OPTIONS}{LABEL} ... \hlend
+
+Here TYPE, OPTIONS and LABEL have the same meaning as for '\hldest'.
+Continuing the previous example,
+
+ \hlstart{name}{bstyle=U,bwidth=2}{index} Index\hlend
+
+typesets the word 'Index' as a link with underline border of
+width 2 PostScript points, pointing to the named destination 'index'
+defined in the previous example. (The other options, like highlight mode
+and border color, are determined by the defaults, *note Setting default
+types and options::).
+
+ The LABEL argument of both '\hldest' and '\hlstart' can contain
+special characters (such as '#', '%', '&', '~', etc.) without any
+escaping. This is especially important for URL links supported by some
+drivers (*note Hyperlink drivers::).
+
+ Both '\hldest' and '\hlstart' ignore following spaces.
+
+ Both '\hldest' and '\hlstart' expand the first token of OPTIONS once,
+so you can save a list of options in a macro and pass it for the
+OPTIONS. For example:
+
+ \def\linkopts{bstyle=U,bwidth=2}
+ \hlstart{name}{\linkopts}{index}Index\hlend
+
+is functionally equivalent to the previous example.
+
+ *Note Hyperlinks (xhyper.tex)::, for a demonstration of the usage of
+explicit hyperlinks.
+
+
+File: eplain.info, Node: Implicit hyperlinks, Next: Hyperlink drivers, Prev: Explicit hyperlinks, Up: Hyperlinks
+
+5.3 Implicit hyperlinks
+=======================
+
+"Implicit hyperlinks" are hyperlinks created implicitly by various
+Eplain macros, such as the macros for citations, cross-references,
+indexing, etc.
+
+ All such macros are divided into "link groups" and "destination
+groups" (or "linkgroups" and "destgroups" for short) so that parameters
+can be set individually for each group. For example, all equation macros
+which define a destination are assigned to the 'eq' destgroup; equation
+macros which create a link are assigned to the 'eq' linkgroup. By
+setting parameters for the 'eq' linkgroup (destgroup), you can uniformly
+customize all links (destinations) related to equation references,
+without interfering with settings for the other groups.
+
+ *Note Setting hyperlink types and options::, for information on how
+to set parameters for a group.
+
+ Here is the list of the linkgroups:
+
+ hrefint, hrefext, url, cite, ref, xref, eq, idx, foot, footback.
+
+ And here are the destgroups:
+
+ bib, li, definexref, xrdef, eq, idx, foot, footback.
+
+ *Note Hyperlinks (xhyper.tex)::, for a demonstration of the usage of
+implicit hyperlinks.
+
+ The following subsections describe each of the linkgroups and
+destgroups and the hyperlink support provided.
+
+* Menu:
+
+* General hyperlinks:: hrefint, hrefext
+* URL hyperlinks:: url
+* Citation hyperlinks:: cite, bib
+* List hyperlinks:: li
+* Cross-reference hyperlinks:: definexref, ref
+* Page reference hyperlinks:: xrdef, xref
+* Equation reference hyperlinks:: eq
+* Index hyperlinks:: idx
+* Footnote hyperlinks:: foot, footback
+* Contents hyperlinks::
+
+
+File: eplain.info, Node: General hyperlinks, Next: URL hyperlinks, Up: Implicit hyperlinks
+
+5.3.1 General hyperlinks: hrefint, hrefext
+------------------------------------------
+
+'\href{URL}{TEXT}' typesets TEXT as a link to URL. It basically does
+what the explicit hyperlink macros do (*note Explicit hyperlinks::), but
+is more convenient (at the expense of flexibility).
+
+ If URL starts with '#', the rest of URL is assumed to be a local
+hyperlink destination name (destination within the same document).
+Parameters for these links can be set by customizing the 'hrefint'
+linkgroup. For example:
+
+ See \href{#intro}{Introduction}
+
+will make 'Introduction' into an internal link, which might have been
+created, e.g., with '\xrdef{intro}'.
+
+ If URL does not start with '#', it is assumed to be a URL link.
+Parameters for these links can be set by customizing the 'hrefext'
+linkgroup. The special characters (such as '#' and '~') in the URL don't
+need to be escaped. For example:
+
+ \href{https://tug.org/eplain/doc/eplain.html#Hyperlinks}{Hyperlinks
+ in Eplain}
+ \href{mailto:tex-eplain@tug.org}{Eplain mailing list}
+
+*Note URL hyperlinks::, for another way to create URL hyperlinks.
+
+ The TEXT argument of '\href' can contain verbatim text (*note
+Verbatim listing::) or other macros which manipulate character catcodes.
+For example:
+
+ \href{#WeirdChars}{The weird chars \verbatim #&%$~|endverbatim}
+
+ '\href' does not currently handle other link types, such as 'file:'
+and 'run:' links.
+
+
+File: eplain.info, Node: URL hyperlinks, Next: Citation hyperlinks, Prev: General hyperlinks, Up: Implicit hyperlinks
+
+5.3.2 URL hyperlinks: url
+-------------------------
+
+The 'url' linkgroup covers the '\url' command from the LaTeX package
+'url' (*note Packages known to work::), as well as any new '\url'-like
+commands you define. The type for this linkgroup is set to 'url' by the
+drivers which support this link type. 'url' links use the parameter to
+the '\url' command as the URL to point to.
+
+ You may be using the '\url' command to typeset something other than a
+URL, e.g., a path, for which you do not want a link to be created; in
+that case, you can disable the 'url' linkgroup with the command
+'\hloff[url]' (*note Turning hyperlinks on/off for a group::).
+
+ By default, URL (and other types of) links are boxed, so that they
+are visually marked even if you do not load the LaTeX 'color' package
+(*note Loading LaTeX packages::) and therefore link text is not colored.
+You can see the effect by compiling the following code snippet (be sure
+to get a modern 'url.sty', older versions do not work in plain TeX;
+*note Packages known to work::):
+
+ \input eplain
+ \beginpackages
+ \usepackage{url}
+ \endpackages
+
+ \enablehyperlinks
+
+ \url{http://foo/bar}
+
+ \url{mailto:foobar@example.org}
+
+ \bye
+
+ If the hyperlink driver you use supports the link option 'bwidth'
+(*note Hyperlink drivers::), you can produce colored links with no
+border around them. Try this:
+
+ \input eplain
+ \beginpackages
+ \usepackage{url}
+ \usepackage{color}
+ \endpackages
+
+ \enablehyperlinks
+ \hlopts{bwidth=0}
+
+ \url{http://foo/bar}
+
+ \url{mailto:foobar@example.org}
+
+ \bye
+
+The command '\hlopts{bwidth=0}' sets border width to zero as the default
+for all links, and loading the 'color' package automatically colors
+links using the default color (*note Options supported by all
+drivers::). If you want the border width setting to apply to URL links
+only, say '\hlopts[url]{bwidth=0}' (*note Setting hyperlink types and
+options::).
+
+
+File: eplain.info, Node: Citation hyperlinks, Next: List hyperlinks, Prev: URL hyperlinks, Up: Implicit hyperlinks
+
+5.3.3 Citation hyperlinks: cite, bib
+------------------------------------
+
+The 'cite' linkgroup includes only the '\cite' command (*note
+Citations::). '\cite' turns each of the references in the list into a
+link pointing to the respective bibliography entry produced by the
+'\bibliography' command.
+
+ The 'bib' destgroup includes the macros related to the
+'\bibliography' command (*note Citations::). '\bibliography' inputs a
+'.bbl' file, which contains a list of bibliography entries. For each of
+the entries, a destination is defined.
+
+ Both commands use the citation label as the hyperlink label.
+
+
+File: eplain.info, Node: List hyperlinks, Next: Cross-reference hyperlinks, Prev: Citation hyperlinks, Up: Implicit hyperlinks
+
+5.3.4 List hyperlinks: li
+-------------------------
+
+The 'li' destgroup consists of the '\li' command (*note Lists::), which
+defines a destination if you supply the optional argument
+(cross-reference label). This label is also used as the hyperlink label.
+
+
+File: eplain.info, Node: Cross-reference hyperlinks, Next: Page reference hyperlinks, Prev: List hyperlinks, Up: Implicit hyperlinks
+
+5.3.5 Cross-reference hyperlinks: definexref, ref
+-------------------------------------------------
+
+The 'definexref' destgroup is for the '\definexref' command (*note
+Defining generic references::). '\definexref' defines a destination
+using the cross-reference label (the first argument) as the hyperlink
+label.
+
+ The 'ref' linkgroup includes '\refn' and '\xrefn' (they are
+synonyms), '\ref', and '\refs' (*note Using generic references::).
+
+ '\refn' turns the cross-reference it produces into a link, using the
+cross-reference label as the hyperlink label. If an optional argument is
+present, it is tied by '\reftie' to the reference and become part of the
+link.
+
+ '\ref' works similarly to '\refn'. It takes an optional argument,
+which is treated the same way as the optional argument to '\refn'. In
+addition, '\ref' can produce a "class word". Both the optional argument
+and the class word become part of the link, when present. The
+cross-reference is tied by '\reftie' to the preceding word. The optional
+argument is separated from the class word by '\refspace'.
+
+ Unlike '\ref', '\refs' does not take an optional argument and does
+not make the class word part of the link, which is appropriate for its
+intended use.
+
+
+File: eplain.info, Node: Page reference hyperlinks, Next: Equation reference hyperlinks, Prev: Cross-reference hyperlinks, Up: Implicit hyperlinks
+
+5.3.6 Page reference hyperlinks: xrdef, xref
+--------------------------------------------
+
+The 'xrdef' destgroup is for '\xrdef' (*note Page references::).
+'\xrdef' defines a destination using cross-reference label as the
+hyperlink label.
+
+ The 'xref' linkgroup includes the '\xref' command (*note Page
+references::). '\xref' turns its optional argument (followed by
+'\refspace'), '\xrefpageword' and the cross-reference (page number) into
+a link, using the cross-reference label as the hyperlink label.
+
+
+File: eplain.info, Node: Equation reference hyperlinks, Next: Index hyperlinks, Prev: Page reference hyperlinks, Up: Implicit hyperlinks
+
+5.3.7 Equation reference hyperlinks: eq
+---------------------------------------
+
+All commands that define equation labels are part of the 'eq' destgroup.
+These are '\eqdef', '\eqdefn', '\eqsubdef' and '\eqsubdefn' (*note
+Equation references::). All these commands use the equation label as the
+hyperlink label. However, if the equation label is empty, they make up a
+(hopefully) unique hyperlink label for the destination. This label will
+be used for the link when you refer to this empty-labeled equation with
+one of the equation reference macros.
+
+ The command '\phantomeqlabel' is called to generate hyperlink labels
+for the empty-labeled equations. By default, it produces the labels in
+the format 'PHEQNUMBER', where NUMBER comes from the count register
+'\phantomeqnumber'; this count register is incremented at every
+empty-labeled equation definition.
+
+ The commands '\eqref' and '\eqrefn' (*note Equation references::)
+form the 'eq' linkgroup. These commands take an optional argument,
+which, when present, is tied with '\reftie' to the equation reference
+and becomes part of the link. The equation label is used for the
+hyperlink label; if the label is empty, the link is for the label
+generated for the last empty-labeled equation.
+
+
+File: eplain.info, Node: Index hyperlinks, Next: Footnote hyperlinks, Prev: Equation reference hyperlinks, Up: Implicit hyperlinks
+
+5.3.8 Index hyperlinks: idx
+---------------------------
+
+All indexing commands ('\idx', '\idxname', '\idxmarked', '\idxsubmarked'
+and their silent equivalents, *note Indexing commands::) form the 'idx'
+destgroup. The 'idx' linkgroup consists of the macros which are used to
+typeset the index when you say '\readindexfile{INDEX-LETTER}' (*note
+Typesetting an index::).
+
+ To create the links in index entries, Eplain uses MakeIndex's
+"encapsulation" feature. When you use an indexing macro to mark an index
+term, Eplain writes out a line to the '.idx' file of the following
+general form:
+
+ \indexentry{ENTRY|PAGEMARKUP}{PAGENO}
+
+where ENTRY is the index entry (converted into the internal format that
+MakeIndex understands), CS is the markup command you specified with the
+'pagemarkup=CS' optional argument to the indexing commands (*note
+Modifying index entries::), and PAGENO is the page number on which the
+term appeared. When processing the '.idx' file, MakeIndex makes the page
+number an argument to the page markup command ("encapsulates" the page
+number), so the page number in the '.ind' file appears as '\CS{PAGENO}'.
+Eplain internally replaces the CS command name with its own command,
+which, in addition to calling the original '\CS' encapsulator, turns the
+page number into a link.
+
+ Eplain provides two approaches to linking page numbers in the index
+to locations of index terms in the text.
+
+* Menu:
+
+* Exact destinations for index terms::
+* Page destinations for index terms::
+* Choosing destination placement::
+* Index page list and page range parsers::
+* Hyperlinks in see and see also entries::
+
+
+File: eplain.info, Node: Exact destinations for index terms, Next: Page destinations for index terms, Up: Index hyperlinks
+
+5.3.8.1 Exact destinations for index terms
+..........................................
+
+In this approach, each command that marks an index term defines a unique
+destination and passes its label on to the '.idx' file as part of the
+'\indexentry' command. The '\indexentry' line that Eplain writes to the
+'.idx' file becomes
+
+ \indexentry{ENTRY|hlidx{LABEL}{CS}}{PAGENO}
+
+where '\hlidx' is the command that is defined by Eplain to take three
+arguments: a hyperlink label (LABEL), a name of page number encapsulator
+(CS) and a page number (PAGENO). In the '.ind' file that MakeIndex will
+generate, the page number will now appear as
+
+ \hlidx{LABEL}{CS}{PAGENO}
+
+The result of this command is '\CS{PAGENO}', wrapped up into a link
+pointing to LABEL destination.
+
+ The hyperlink labels for the index terms are generated by the
+'\hlidxlabel' command, by default in the format 'IDXNUMBER', where
+NUMBER is the value of the count register '\hlidxlabelnumber'. This
+count register is incremented at each index term.
+
+ The advantage of this approach, as compared to the second approach
+described below, is that links in the index point to exact locations of
+the indexed terms on the page. The disadvantage of this approach is that
+MakeIndex will regard _all_ index entries as distinct, because each one
+contains a (unique) hyperlink label. This disadvantage can be partially
+overcome by the script 'idxuniq' distributed with Eplain in the 'util'
+directory. This script filters out '\indexentry' lines differing only in
+the hyperlink label but identical otherwise. You should process the
+'.idx' with this script before passing it on to MakeIndex. For example:
+
+ prompt$ ./idxuniq file.idx | makeindex > file.ind
+
+Still, this solution is not ideal, as the page-range formation ability
+of MakeIndex will not work, and there will be problems of apparently
+identical index entries clashing (e.g., when a range-end entry appears
+on the same page as another entry with the same definition; 'idxuniq'
+will not filter out the second entry).
+
+
+File: eplain.info, Node: Page destinations for index terms, Next: Choosing destination placement, Prev: Exact destinations for index terms, Up: Index hyperlinks
+
+5.3.8.2 Page destinations for index terms
+.........................................
+
+In the second approach, Eplain does not write out any destination labels
+for the index terms. Instead, Eplain writes out a wrapper for page
+number encapsulator which can parse the page number and generate a link
+pointing to the _page_ on which the term appeared. On top of each page
+containing an index term, Eplain defines a destination with label
+produced by '\hlidxpagelabel'. The '\hlidxpagelabel' command takes a
+single argument (page number NUMBER) and by default produces the label
+in the format 'IDXPGNUMBER'.
+
+ With this approach, the '\indexentry' line which Eplain writes to the
+'.idx' file looks like this:
+
+ \indexentry{ENTRY|hlidxpage{CS}}{PAGENO}
+
+where '\hlidxpage' is the command that is defined by Eplain to take two
+arguments: a name of page number encapsulator (CS) and a page number
+(PAGENO). In the '.ind' file that MakeIndex will generate, the page
+number will appear as
+
+ \hlidxpage{CS}{PAGENO}
+
+ The advantage of this approach is that all features of MakeIndex are
+intact. The drawback is that links in the index do not point to exact
+locations of indexed terms on a page, but to the top of a page on which
+the term appears.
+
+ Another disadvantage is that this approach depends on the page range
+and page list separators which MakeIndex was configured to output.
+'\hlidxpage' must be able to parse the first page number in a page range
+like '1--4'. In addition, page list parsing is needed because MakeIndex
+combines two consecutive page numbers in one call to the page number
+encapsulator, so '\hlidxpage' can be passed, e.g., '1, 2' for the
+PAGENO. In this last case, '\hlidxpage' splits the two page numbers,
+applies '\CS' to each of them, and makes each of the page numbers a link
+to the appropriate page. Note that this will alter typesetting slightly,
+because now the page list separator (a comma followed by a space, by
+default) is not typeset using the page number encapsulator ('\CS').
+
+ Eplain's defaults for the page list and page number delimiters are
+the same as those in MakeIndex, a comma followed by a space (', ') and
+two dashes ('--'), respectively. If you customize MakeIndex to use
+different delimiters, you must not forget to let Eplain know about them
+with the commands
+
+ \setidxpagelistdelimiter{LIST-DELIM}
+ \setidxpagerangedelimiter{PAGE-DELIM}
+
+(*note Page list and page range parsers::).
+
+
+File: eplain.info, Node: Choosing destination placement, Next: Index page list and page range parsers, Prev: Page destinations for index terms, Up: Index hyperlinks
+
+5.3.8.3 Choosing destination placement
+......................................
+
+The approach that Eplain should use for the index terms can be selected
+in the '\enablehyperlinks' command. The optional argument it accepts is
+a comma-separated list of options. The 'idxexact' option selects the
+first approach, 'idxpage' the second, and 'idxnone' disables hyperlink
+support for the index terms altogether, in case you want to stop Eplain
+from writing its link wrappers into the '.idx' file. The default is
+'idxpage'.
+
+ For example:
+
+ \enablehyperlinks[idxexact]
+
+selects the first approach ("exact index links").
+
+
+File: eplain.info, Node: Index page list and page range parsers, Next: Hyperlinks in see and see also entries, Prev: Choosing destination placement, Up: Index hyperlinks
+
+5.3.8.4 Index page list and page range parsers
+..............................................
+
+The macros that Eplain uses to parse page lists and page ranges,
+'\idxparselist' and '\idxparserange', can sometimes be useful when
+defining page number encapsulators. *Note Page list and page range
+parsers::, for the description of these commands and an example of their
+usage.
+
+
+File: eplain.info, Node: Hyperlinks in see and see also entries, Prev: Index page list and page range parsers, Up: Index hyperlinks
+
+5.3.8.5 Hyperlinks in see and see also entries
+..............................................
+
+There is no automatic support for hyperlinks with "see" and "see also"
+index entries, as there is not enough information to trace the
+parameters of '\indexsee' and '\indexseealso' to corresponding index
+entries. But if desired, this can be implemented with '\hldest' and
+'\hlstart' (*note Explicit hyperlinks::); for example:
+
+ \sidx{semantic theory of truth@%
+ \leavevmode\hldest{}{}{idx:theo truth}semantic theory of truth}
+ ...
+ \sidx[seealso]{truth}[definition of]%
+ {\hlstart{}{}{idx:theo truth}semantic theory of truth\hlend}
+
+
+File: eplain.info, Node: Footnote hyperlinks, Next: Contents hyperlinks, Prev: Index hyperlinks, Up: Implicit hyperlinks
+
+5.3.9 Footnote hyperlinks: foot, footback
+-----------------------------------------
+
+The 'foot' link and destination groups include the '\numberedfootnote'
+and '\footnote' macros (*note Footnotes::). The 'footback' groups
+include the same macros, but control parameters for links and
+destinations created inside the footnote to point back to the footnote
+mark within the text body.
+
+ The macros use hyperlink labels generated by '\hlfootlabel' and
+'\hlfootbacklabel'. The default formats for the labels are 'FOOTNUMBER'
+and 'FOOTBNUMBER', respectively, where NUMBER is the value of the count
+register '\hlfootlabelnumber'. This register is incremented at every
+footnote.
+
+ Generally, footnote hyperlinks are not of much use, because the
+footnotes are usually placed on the same page as the footnote mark.
+Therefore, footnote hyperlinks are disabled by default. Here is how you
+can turn them on selectively, without affecting the other kinds of
+hyperlinks (*note Turning hyperlinks on/off for a group::):
+
+ \hldeston[foot,footback]
+ \hlon[foot,footback]
+
+
+File: eplain.info, Node: Contents hyperlinks, Prev: Footnote hyperlinks, Up: Implicit hyperlinks
+
+5.3.10 Contents hyperlinks
+--------------------------
+
+There is currently no special support for hyperlinks in the table of
+contents (*note Contents::), but implementing them with the '\hldest'
+and '\hlstart ... \hlend' commands (*note Explicit hyperlinks::) should
+be possible.
+
+
+File: eplain.info, Node: Hyperlink drivers, Next: Setting hyperlink types and options, Prev: Implicit hyperlinks, Up: Hyperlinks
+
+5.4 Hyperlink drivers
+=====================
+
+This section describes the hyperlink drivers: the types of hyperlinks
+they support, and the options they accept. During the first reading, you
+may only want to skim through this section.
+
+ Some of the descriptions below come from 'Portable Document Format
+Reference Manual Version 1.3', March 11, 1999.
+
+* Menu:
+
+* Options supported by all drivers::
+* Hyperlink driver hypertex::
+* Hyperlink drivers pdftex and dvipdfm::
+* Hyperlink driver nolinks::
+
+
+File: eplain.info, Node: Options supported by all drivers, Next: Hyperlink driver hypertex, Up: Hyperlink drivers
+
+5.4.1 Options supported by all drivers
+--------------------------------------
+
+This subsection describes the destination and link options which are
+supported by all hyperlink drivers.
+
+Destination options supported by all drivers
+............................................
+
+'raise'
+ Specifies how much to raise destinations above the baseline. When
+ set to zero or empty, destinations are placed at the baseline.
+
+ It is usually convenient to set this option to some variable
+ parameter, so that the height to which destinations are raised is
+ automatically adjusted according to the current context. For
+ example, setting it to '\normalbaselineskip' (or some fraction of
+ it, like '1.7\normalbaselineskip') makes the setting appropriate
+ for different point sizes, in case your document uses more than
+ one.
+
+ The default setting is '\normalbaselineskip'. Initially, the
+ destgroups do not define this option, so they fall back on the
+ default, except for the 'eq' destgroup, for which this option is
+ set to '1.7\normalbaselineskip', to accommodate the usual cases of
+ large operators in displayed math.
+
+ Example: '\hldestopts[eq]{raise=2.5\normalbaselineskip}'
+
+Link options supported by all drivers
+.....................................
+
+'colormodel'
+'color'
+ These two options define the color to be used for rendering the
+ link text. The colors are used only when a '\color' command is
+ defined, e.g., by loading the LaTeX 'color' package (*note Packages
+ known to work::). The '\color' command is called as
+ '\color[COLORMODEL]{COLOR}', where COLORMODEL and COLOR are the
+ definitions of the 'colormodel' and 'color' options, respectively.
+ However, if COLORMODEL is empty, the optional argument to '\color'
+ is omitted; and if COLOR is empty, the '\color' command is omitted
+ altogether. The default setting is 'COLORMODEL=cmyk' and
+ 'COLOR=0.28,1,1,0.35'.
+
+ When specifying colors with several components delimited by commas
+ (e.g., RGB and CMYK colors in the LaTeX 'color' package), it is not
+ possible to specify the components directly in the option list of
+ '\hlopts', because comma is the option list delimiter. With the
+ 'color' package, it is possible to specify such colors by defining
+ a custom color with '\definecolor' and using the new color name
+ with an empty COLORMODEL (see examples below).
+
+ Examples:
+
+ \hlopts{colormodel=,color=blue}% predefined color
+ \definecolor{mycolor}{rgb}{.3,.8,.95}
+ \hlopts{colormodel=,color=mycolor}% custom color
+ \hlopts{colormodel=gray,color=.4}
+
+
+File: eplain.info, Node: Hyperlink driver hypertex, Next: Hyperlink drivers pdftex and dvipdfm, Prev: Options supported by all drivers, Up: Hyperlink drivers
+
+5.4.2 Hyperlink driver 'hypertex'
+---------------------------------
+
+HyperTeX is a standard for inclusion of hyperlink information in TeX
+(and LaTeX) documents (see <http://arxiv.org/hypertex>). This standard
+defines a set of hyperlink tags implemented as '\special' commands
+written into the DVI file. The major advantage of such standard is that
+a single '.dvi' file containing HyperTeX commands can be viewed by any
+HyperTeX-enabled viewer (e.g., any more or less modern version of
+'xdvi') or converted to other file formats (e.g., PDF) by any
+HyperTeX-enabled DVI converter (e.g., 'dvipdfmx' or 'dvips' with
+Ghostscript's 'ps2pdf' script).
+
+ The downside to the standard is that it is by design "the common
+factor" of other formats supporting hyperlinks, so many features of a
+particular file format cannot be supported by HyperTeX. Therefore, if
+you need to use special features of a particular format, HyperTeX is not
+a good choice. For the PDF file format, Eplain provides the 'pdftex' and
+'dvipdfm' drivers which provide fine control over the PDF options (*note
+Hyperlink drivers pdftex and dvipdfm::).
+
+ For more information on programs which support the HyperTeX standard,
+please see
+
+ <http://arxiv.org/hypertex>
+ <http://mirror.ctan.org/tex-archive/support/hypertex/hypertex>
+
+For convenience, we list a few HyperTeX-enabled converters:
+
+'dvips'
+ Note that you need to pass the '-z' option to 'dvips' to tell it to
+ preserve the information about the hyperlinks. To generate a '.pdf'
+ file with hyperlinks, you can use the 'ps2pdf' script of
+ Ghostscript. For example, if 'foo.tex' is a TeX file using HyperTeX
+ commands, then
+
+ prompt$ tex foo.tex
+ prompt$ dvips -z foo.dvi -o
+ prompt$ ps2pdf foo.ps
+
+ will produce 'foo.pdf' with hyperlinks.
+
+'dvipdfm'
+'dvipdfmx'
+ No special command line arguments are required, these programs
+ automatically detect the HyperTeX commands.
+
+ One more note is in place: support for the HyperTeX commands varies
+from one previewer/converter to another, so you might need to experiment
+to see if what you need is supported by the program(s) you intend to
+use. For example, dvips(k) as of version 5.92b converts all internal
+hyperlinks into page links pointing to a page containing the
+destination, so that "exact" linking to destinations is not possible
+(this was confirmed to be a bug and most probably has already been fixed
+in later versions of dvips(k)); dvipdfm as of version 0.13.2c and
+dvipdfmx as of version 20040411 do not correctly parse links to external
+local files, and produce a URL link instead of a file link.
+
+* Menu:
+
+* Destination types for hypertex::
+* Destination options for hypertex::
+* Link types for hypertex::
+* Link options for hypertex::
+
+
+File: eplain.info, Node: Destination types for hypertex, Next: Destination options for hypertex, Up: Hyperlink driver hypertex
+
+5.4.2.1 Destination types for 'hypertex'
+........................................
+
+'xyz'
+ "Current position". This is the default type.
+
+ Example: '\hldest{xyz}{}{dest123}'
+
+'raw'
+ The destination specification (in the form of a HyperTeX
+ '\special') is taken from the command sequence '\CS', where CS is
+ the value of the 'cmd' option. In the definition of '\CS', use
+ '\@hllabel' to refer to the hyperlink label. This option is
+ intended to be used with destgroups (*note Setting hyperlink types
+ and options::), as it does not make sense in a direct call to
+ '\hldest'--you can just call the raw command.
+
+ Example:
+
+ \makeatletter
+ \def\mydest{\special{html:<a name="\@hllabel">}%
+ \special{html:</a>}}
+ \resetatcatcode
+ \indent\hldest{raw}{cmd=mydest}{SpecialDest}
+ Special destination.
+
+
+File: eplain.info, Node: Destination options for hypertex, Next: Link types for hypertex, Prev: Destination types for hypertex, Up: Hyperlink driver hypertex
+
+5.4.2.2 Destination options for 'hypertex'
+..........................................
+
+'cmd'
+ Name of the macro (without the leading '\') containing a HyperTeX
+ '\special' for the 'raw' destination.
+
+ *Note Destination types for hypertex::, the description of the
+ 'raw' destination, for an example.
+
+
+File: eplain.info, Node: Link types for hypertex, Next: Link options for hypertex, Prev: Destination options for hypertex, Up: Hyperlink driver hypertex
+
+5.4.2.3 Link types for 'hypertex'
+.................................
+
+'name'
+ Go to a "named destination". The label is the destination name. All
+ destinations in HyperTeX are named destinations. This is the
+ default type.
+
+ Example: '\hlstart{name}{}{dest123}Link to dest123\hlend'
+
+'url'
+ Go to a URL. The label is the URL.
+
+ Example:
+
+ \hlstart{url}{}{https://tug.org/eplain/}Eplain home\hlend
+
+'filename'
+ Go to a named destination in another file. The label is the
+ destination name. The file name is specified by the 'file' option.
+ The file name extension can be specified separately by the 'ext'
+ option. The idea is to set the 'ext' option globally at the
+ beginning of the document to avoid hard-coding the extension
+ together with the file name within each link--HyperTeX is not
+ restricted to any single output format, it can be DVI, PDF,
+ possibly other formats.
+
+ Example:
+
+ \hlopts{ext=.pdf}
+ \hlstart{filename}{file=book}{dest123}
+ Link to dest123 in file `book.pdf'\hlend
+
+'raw'
+ The link specification (in the form of a HyperTeX '\special') is
+ taken from the command sequence '\CS', where CS is the value of the
+ 'cmd' option. In the definition of '\CS', use '\@hllabel' to refer
+ to the hyperlink label. Use the predefined command '\hlhash' to
+ insert the '#' characters. This option is intended to be used with
+ linkgroups (*note Setting hyperlink types and options::), as it
+ does not make sense in a direct call to '\hlstart'--you can just
+ call the raw command.
+
+ Example:
+
+ \makeatletter
+ \def\mylink{\special{html:<a href="\hlhash\@hllabel">}}
+ \resetatcatcode
+ \hlstart{raw}{cmd=mylink}{SpecialDest}
+ Link to the special destination.\hlend
+
+
+File: eplain.info, Node: Link options for hypertex, Prev: Link types for hypertex, Up: Hyperlink driver hypertex
+
+5.4.2.4 Link options for 'hypertex'
+...................................
+
+'cmd'
+ Name of the macro (without the leading '\') containing a HyperTeX
+ '\special' for the 'raw' link.
+
+ *Note Link types for hypertex::, the description of the 'raw' link,
+ for an example.
+
+'file'
+ File name for the 'filename' link type. See also the 'ext' option.
+
+ *Note Link types for hypertex::, the description of the 'filename'
+ link, for an example.
+
+'ext'
+ File name extension for the 'filename' link type. The idea is to
+ set the 'ext' option globally at the beginning of the document to
+ avoid hard-coding the extension together with the file name within
+ each link--HyperTeX is not restricted to any single output format,
+ it can be DVI, PDF, possibly other formats.
+
+ *Note Link types for hypertex::, the description of the 'filename'
+ link, for an example.
+
+
+File: eplain.info, Node: Hyperlink drivers pdftex and dvipdfm, Next: Hyperlink driver nolinks, Prev: Hyperlink driver hypertex, Up: Hyperlink drivers
+
+5.4.3 Hyperlink drivers 'pdftex' and 'dvipdfm'
+----------------------------------------------
+
+This subsection describes link and destination types and options
+supported by the 'pdftex' and 'dvipdfm' drivers. Many of the hyperlink
+types and options are common to both drivers, so we describe them
+together.
+
+* Menu:
+
+* Destination types for pdftex and dvipdfm::
+* Destination options for pdftex and dvipdfm::
+* Link types for pdftex and dvipdfm::
+* Link options for pdftex and dvipdfm::
+
+
+File: eplain.info, Node: Destination types for pdftex and dvipdfm, Next: Destination options for pdftex and dvipdfm, Up: Hyperlink drivers pdftex and dvipdfm
+
+5.4.3.1 Destination types for 'pdftex' and 'dvipdfm'
+....................................................
+
+'xyz'
+ "Current position". The option 'zoom' specifies magnification to
+ use (zero or empty means leave magnification unchanged, which is
+ the default). This is the default type.
+
+ For 'dvipdfm': the options 'left' and 'top' specify position
+ coordinates to use (empty options mean current position coordinate,
+ which is the default).
+
+ Example: '\hldest{xyz}{zoom=2000}{dest123}'
+
+'fit'
+ Fit the page to the window.
+
+ Example: '\hldest{fit}{}{dest123}'
+
+'fith'
+ Fit the width of the page to the window.
+
+ For 'dvipdfm': the 'top' option specifies vertical position
+ (default is empty, meaning current position).
+
+ Example: '\hldest{fith}{}{dest123}'
+
+'fitv'
+ Fit the height of the page to the window.
+
+ For 'dvipdfm': The option 'left' specifies horizontal position
+ (default is empty, meaning current position).
+
+ Example: '\hldest{fitv}{}{dest123}'
+
+'fitb'
+ Fit the page's bounding box to the window.
+
+ Example: '\hldest{fitb}{}{dest123}'
+
+'fitbh'
+ Fit the width of the page's bounding box to the window.
+
+ For 'dvipdfm': the option 'top' specifies vertical position
+ (default is empty, meaning current position).
+
+ Example: '\hldest{fitbh}{}{dest123}'
+
+'fitbv'
+ Fit the height of the page's bounding box to the window.
+
+ For 'dvipdfm': the option 'left' specifies horizontal position
+ (default is empty, meaning current position).
+
+ Example: '\hldest{fitbv}{}{dest123}'
+
+'fitr'
+ For 'pdftex': fit the rectangle specified by the options 'width',
+ 'height' and 'depth' (as a TeX rule specification) in the window.
+ For dimensions set to empty, the corresponding value of the parent
+ box is used (these are the defaults).
+
+ For 'dvipdfm': fit the rectangle specified by the options 'left',
+ 'bottom', 'right' and 'top' (in PostScript points, 72 points per
+ inch) in the window. For dimensions set to empty, current position
+ coordinate is substituted (these are the defaults).
+
+ Example for 'pdftex':
+
+ \hldest{fitr}{width=\hsize,
+ height=.5\vsize,depth=0pt}{dest123}
+
+ Example for 'dvipdfm':
+
+ \hldest{fitr}{left=72,bottom=72,
+ right=720,top=360}{dest123}
+
+'raw'
+ The destination specification (in the form of a pdfTeX command or a
+ dvipdfm '\special') is taken from the command sequence '\CS', where
+ CS is the value of the 'cmd' option. In the definition of '\CS',
+ use '\@hllabel' to refer to the hyperlink label. This option is
+ intended to be used with destgroups (*note Setting hyperlink types
+ and options::), as it does not make sense in a direct call to
+ '\hldest'--you can just call the raw command.
+
+ Example for 'pdftex':
+
+ \makeatletter
+ \def\mydest{\pdfdest name{\@hllabel} xyz}
+ \resetatcatcode
+ \hldesttype{raw}
+ \hldestopts{cmd=mydest}
+
+ Example for 'dvipdfm':
+
+ \makeatletter
+ \def\mydest{\special{pdf: dest (\@hllabel)
+ [@thispage /XYZ @xpos @ypos 0]}}
+ \resetatcatcode
+ \hldesttype{raw}
+ \hldestopts{cmd=mydest}
+
+
+File: eplain.info, Node: Destination options for pdftex and dvipdfm, Next: Link types for pdftex and dvipdfm, Prev: Destination types for pdftex and dvipdfm, Up: Hyperlink drivers pdftex and dvipdfm
+
+5.4.3.2 Destination options for 'pdftex' and 'dvipdfm'
+......................................................
+
+With respect to the destination options, the 'pdftex' and 'dvipdfm'
+differ in the way the fit rectangle is specified (relative coordinates
+for 'pdftex', absolute coordinates for 'dvipdfm').
+
+Common destination options
+..........................
+
+'cmd'
+ Name of the macro (without the leading '\') containing a pdfTeX
+ command or a dvipdfm '\special' for the 'raw' destination.
+
+ *Note Destination types for pdftex and dvipdfm::, the description
+ of the 'raw' destination, for an example.
+
+'zoom'
+ Magnification ratio times 1000 (like TeX's scale factor). Zero or
+ empty means leave magnification unchanged, which is the default.
+
+ Example: '\hldest{xyz}{zoom=2000}{dest123}'
+
+'pdftex'-specific destination options
+.....................................
+
+The dimension options below must be specified as a TeX rule
+specification. When set to empty, the corresponding value of the parent
+box is used (this is the default for all dimension options).
+
+'depth'
+ Depth of the fit rectangle for the 'fitr' destination.
+
+'height'
+ Height of the fit rectangle for the 'fitr' destination.
+
+'width'
+ Width of the fit rectangle for the 'fitr' destination.
+
+ Example:
+
+ \hldest{fitr}{width=\hsize,
+ height=.5\vsize,depth=0pt}{dest123}
+
+'dvipdfm'-specific destination options
+......................................
+
+The dimension options below must be specified in PostScript points
+(72 points per inch), as a number without the 'bp' unit name. When set
+to empty, the current position coordinate is used (this is the default
+for all dimension options).
+
+'bottom'
+ Bottom position coordinate of a box specification for the various
+ destination types.
+
+'left'
+ Left position coordinate of a box specification for the various
+ destination types.
+
+'right'
+ Right position coordinate of a box specification for the various
+ destination types.
+
+'top'
+ Top position coordinate of a box specification for the various
+ destination types.
+
+ Example:
+
+ \hldest{fitr}{left=72,bottom=72,
+ right=720,top=360}{dest123}
+
+
+File: eplain.info, Node: Link types for pdftex and dvipdfm, Next: Link options for pdftex and dvipdfm, Prev: Destination options for pdftex and dvipdfm, Up: Hyperlink drivers pdftex and dvipdfm
+
+5.4.3.3 Link types for 'pdftex' and 'dvipdfm'
+.............................................
+
+Link types are the same for the 'pdftex' and 'dvipdfm' drivers, except
+that the 'pdftex' driver provides one additional link type 'num' (link
+to a numbered destination). dvipdfm does not support numbered
+destinations, therefore it does not have this link type. Note that all
+destinations created by Eplain hyperlink macros are named destinations;
+to define a numbered destination, you have to use low-level pdfTeX
+commands.
+
+Common link types
+.................
+
+'name'
+ Go to a "named destination". The label is the destination name. All
+ destinations created with '\hldest' are named destinations (*note
+ Explicit hyperlinks::). This is the default type.
+
+ Example: '\hlstart{name}{}{dest123}Link to dest123\hlend'
+
+'url'
+ Go to a URL. The label is the URL.
+
+ Example: '\hlstart{url}{}{https://tug.org/eplain/}Eplain
+ home\hlend'
+
+'page'
+ Go to a page. The label is the page number (counting from 1). Page
+ fitting is specified by the 'pagefit' option.
+
+ Example:
+
+ \hlstart{page}{pagefit=/FitH 600}{123}
+ Link to page~123\hlend
+
+'filename'
+ Go to a named destination in another file. The label is the
+ destination name. The file name is specified by the 'file' option.
+ Page fitting is specified by the 'pagefit' option. The 'newwin'
+ option specifies whether the destination document is opened in the
+ same window or in a new window.
+
+ Example:
+
+ \hlstart{filename}{file=book.pdf,newwin=1}{dest123}
+ Link to dest123 in file `book.pdf'\hlend
+
+'filepage'
+ Go to a page in another file. The label is the page number
+ (counting from 1). The file name is specified by the 'file' option.
+ Page fitting is specified by the 'pagefit' option. The 'newwin'
+ option specifies whether the destination document is opened in the
+ same window or in a new window.
+
+ Example:
+
+ \hlstart{filepage}{file=book.pdf,newwin=,
+ pagefit=/FitR 50 100 300 500}{1}
+ Link to page~1 in file `book.pdf'\hlend
+
+'raw'
+ The link specification (in the form of a pdfTeX command or a
+ dvipdfm '\special' primitive) is taken from the command sequence
+ '\CS', where CS is the value of the 'cmd' option. In the definition
+ of '\CS', use '\@hllabel' to refer to the hyperlink label. This
+ option is intended to be used with linkgroups (*note Setting
+ hyperlink types and options::), as it does not make sense in a
+ direct call to '\hlstart'--you can just call the raw command.
+
+ Example for 'pdftex':
+
+ % Redirect all \url links to the first page
+ \def\mycmd{\pdfstartlink goto page 1 {/Fit}}
+ \hltype[url]{raw}
+ \hlopts[url]{cmd=mycmd}
+
+ Example for 'dvipdfm':
+
+ % Redirect all \url links to the first page
+ \def\mycmd{\special{pdf: beginann <</Type/Annot /Subtype/Link
+ /Dest[0 /Fit]>>}}
+ \hltype[url]{raw}
+ \hlopts[url]{cmd=mycmd}
+
+'pdftex'-specific link types
+............................
+
+'num'
+ Go to a "numbered destination". The label is the destination
+ number.
+
+ Example: '\hlstart{num}{}{123}Link to 123\hlend'
+
+
+File: eplain.info, Node: Link options for pdftex and dvipdfm, Prev: Link types for pdftex and dvipdfm, Up: Hyperlink drivers pdftex and dvipdfm
+
+5.4.3.4 Link options for 'pdftex' and 'dvipdfm'
+...............................................
+
+Link options are mostly the same for the 'pdftex' and 'dvipdfm' drivers.
+The 'pdftex' driver has additional options to specify link dimensions.
+
+Common link options
+...................
+
+'bcolor'
+ Border color. An array of three numbers in the range 0 to 1,
+ representing a color in DeviceRGB.
+
+ Example: '\hlstart{name}{bcolor=.1 .5 1}{dest123}Link\hlend'
+
+'bdash'
+ Array of numbers representing on and off stroke lengths for drawing
+ dashes.
+
+ Example: '\hlstart{name}{bstyle=D,bdash=2 4}{dest123}Link\hlend'
+
+'bstyle'
+ Link border style:
+
+ 'S'
+ The border is drawn as a solid line.
+
+ 'D'
+ The border is drawn with a dashed line (the dash pattern is
+ specified by the 'bdash' option).
+
+ 'B'
+ The border is drawn in a beveled style.
+
+ 'I'
+ The border is drawn in an inset style.
+
+ 'U'
+ The border is drawn as a line on the bottom of the link
+ rectangle.
+
+ The default is 'S'.
+
+ Example: '\hlstart{name}{bstyle=D,bdash=2 4}{dest123}Link\hlend'
+
+'bwidth'
+ Border width in PostScript points (72 points per inch). The default
+ is 1.
+
+ Example: '\hlstart{name}{bwidth=2}{dest123}Link\hlend'
+
+'cmd'
+ Name of the macro (without the leading '\') containing a pdfTeX
+ command or a dvipdfm '\special' for the 'raw' link.
+
+ *Note Link types for pdftex and dvipdfm::, the description of the
+ 'raw' link, for an example.
+
+'file'
+ File name for the 'filename' and 'filepage' link types.
+
+ *Note Link types for pdftex and dvipdfm::, the descriptions of the
+ 'filename' and 'filepage' links, for an example.
+
+'hlight'
+ Link border highlight modes:
+
+ 'I'
+ The rectangle specified by the bounding box of the link is
+ inverted.
+
+ 'N'
+ No highlighting is done.
+
+ 'O'
+ The border of the link is inverted.
+
+ 'P'
+ The region underneath the bounding box of the link is drawn
+ inset into the page.
+
+ The default is 'I'.
+
+ Example: '\hlstart{name}{bstyle=S,hlight=O}{dest123}Link\hlend'
+
+'newwin'
+ For the 'filename' and 'filepage' links, specifies whether the
+ destination document is opened in the same window or in a new
+ window. The settings are:
+
+ '0'
+ Open in the same window.
+ 'non-0'
+ Open in a new window.
+ 'empty'
+ Behavior according to the viewer settings.
+
+ The default is empty.
+
+ *Note Link types for pdftex and dvipdfm::, the descriptions of the
+ 'filename' and 'filepage' links, for an example.
+
+'pagefit'
+ For the 'page' and 'filepage links', specifies how the page must be
+ fitted to the window. 'pagefit' specification is written to the PDF
+ file as is, so it must conform to the PDF standard.
+
+ *Note Link types for pdftex and dvipdfm::, the descriptions of the
+ 'page' and 'filepage' links, for an example.
+
+'pdftex'-specific link options
+..............................
+
+The dimension options below must be specified as a TeX rule
+specification. When set to empty, the corresponding value of the parent
+box is used (this is the default for all dimension options).
+
+'depth'
+ Depth of the link.
+
+'height'
+ Height of the link.
+
+'width'
+ Width of the link.
+
+ Example:
+
+ \hlstart{name}{width=5in,height=20pc,depth=0pt}{dest123}
+ Link\hlend
+
+
+File: eplain.info, Node: Hyperlink driver nolinks, Prev: Hyperlink drivers pdftex and dvipdfm, Up: Hyperlink drivers
+
+5.4.4 Hyperlink driver 'nolinks'
+--------------------------------
+
+Select this driver to suppress all hyperlinks in your document.
+
+ Selecting this driver is quite different from not selecting any
+driver at all, or from selecting some driver and then turning hyperlinks
+off for the entire document with '\hloff' and '\hldestoff' (*note
+Turning hyperlinks on/off::).
+
+ The purpose of '\hldestoff' and '\hloff' is to mark (parts) of your
+document where hyperlinks 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 hyperlinks and just want
+to compile a version without them, it is better to select the driver
+'nolinks'. This ensures that spacing and page-breaking are the same as
+what you were getting with hyperlinks enabled.
+
+ The reason for this is that hyperlinks are produced by the '\special'
+primitives or low-level hyperlink commands. Each such command is placed
+inside a "whatsit" (an internal TeX object), which may introduce
+legitimate breakpoints at places where none would exist without the
+whatsits. The macros '\hldestoff' and '\hloff' disable the hyperlink
+macros completely, so that no whatsits are produced.
+
+ In contrast, the 'nolinks' driver does not completely disable
+hyperlink macros. Instead, it defines them to merely write to the log
+file (what gets written is unimportant). This also produces whatsits,
+thus imitating the whatsits from the hyperlink commands. (This trick was
+borrowed from the LaTeX 'color' package.)
+
+ Another reason for using 'nolinks' is that in horizontal mode
+'\hldest' places destinations inside boxes of zero width, height, and
+depth. When you say '\hldestoff', '\hldest' will omit both destination
+definitions and these boxes. The missing boxes can again cause the
+typesetting to be inconsistent with that with destinations enabled. Here
+again, the 'nolinks' driver helps by defining '\hldest' to produce the
+empty boxes.
+
+ So, if you are planning to produce versions of your PDF document both
+with and without hyperlinks, here is the recommended way to enable the
+hyperlinks under pdfTeX:
+
+ \ifpdf
+ \enablehyperlinks
+ \else
+ \enablehyperlinks[nolinks]%
+ \fi
+
+
+File: eplain.info, Node: Setting hyperlink types and options, Next: Turning hyperlinks on/off, Prev: Hyperlink drivers, Up: Hyperlinks
+
+5.5 Setting hyperlink types and options
+=======================================
+
+You can define default types for links and destinations, which will be
+used when you do not specify a type in '\hlstart' or '\hldest'.
+Similarly, you can define default values for the options; the default
+value for an option is used when you do not set the option in the
+argument to '\hlstart' or '\hldest'.
+
+ The parameters for implicit links and destinations can be customized
+by setting the "group" types and options. When not set, the defaults are
+used.
+
+ All these settings are local to the current (TeX) group, so if you
+want to set an option temporarily, you can do so inside a
+'\begingroup...\endgroup' block; when the group ends, the previous
+settings are restored.
+
+* Menu:
+
+* Setting default types and options::
+* Setting group types::
+* Setting group options::
+
+
+File: eplain.info, Node: Setting default types and options, Next: Setting group types, Up: Setting hyperlink types and options
+
+5.5.1 Setting default types and options
+---------------------------------------
+
+The default types for links and destinations can be set with the
+following commands:
+
+ \hltype{TYPE}
+ \hldesttype{TYPE}
+
+where TYPE is one of the link/destination types supported by the
+selected hyperlink driver (*note Hyperlink drivers::).
+
+ Default values for the options can be set with the following
+commands:
+
+ \hlopts{OPTIONS}
+ \hldestopts{OPTIONS}
+
+where OPTIONS is a comma-separated list of option assignments in the
+format 'OPTION=VALUE'. Again, what options are allowed depends on the
+selected hyperlink driver.
+
+ Many people regard the default boxed links as not aesthetic and
+intruding on page layout. The reason why boxed links are the default is
+that the links are not colored until you load the LaTeX 'color' package
+(*note Loading LaTeX packages::) or use other means to define the
+'\color' command; therefore, not producing any kind of link border may
+result in the links not being marked in any way. However, when the links
+are actually colored, there is no need to produce the link boxes
+anymore; to avoid the boxes, you can set the default border width to
+zero (if the driver you use supports the link option 'bwidth'; *note
+Hyperlink drivers::):
+
+ \hlopts{bwidth=0}
+
+
+File: eplain.info, Node: Setting group types, Next: Setting group options, Prev: Setting default types and options, Up: Setting hyperlink types and options
+
+5.5.2 Setting group types
+-------------------------
+
+When called with an optional argument, as in
+
+ \hltype[GROUPS]{TYPE}
+ \hldesttype[GROUPS]{TYPE}
+
+where GROUPS is a comma-separated list of groups, '\hltype' and
+'\hldesttype' set the type for each group from GROUPS to TYPE. The
+default type is used for all groups with an empty type (this is the
+initial setting for all groups, except that the type for the 'url'
+linkgroup is set to 'url' by the drivers which support this link type).
+
+ There are two special "groups" which can be used inside the GROUPS
+list. An empty group sets the default type. This allows to set the
+default type and group types in one command, for example:
+
+ \hltype[eq,]{TYPE}
+
+sets the link type for the 'eq' linkgroup and the default link type to
+TYPE.
+
+ Another special group is a star ('*') group, which signifies all
+defined groups. For example, the command
+
+ \hldesttype[*,]{TYPE}
+
+sets the destination type to TYPE for each group, as well as the default
+destination type.
+
+
+File: eplain.info, Node: Setting group options, Prev: Setting group types, Up: Setting hyperlink types and options
+
+5.5.3 Setting group options
+---------------------------
+
+Option values for each group are stored as a list of option assignments.
+This list does not have to contain every supported option. Values for
+options missing from this list are taken from the default option values.
+
+ To manipulate the list of option values for the groups, you use the
+'\hlopts' and '\hldestopts' commands with an optional argument:
+
+ \hlopts[GROUPS]{OPTIONS}
+ \hldestopts[GROUPS]{OPTIONS}
+ \hlopts![GROUPS]{OPTIONS}
+ \hldestopts![GROUPS]{OPTIONS}
+
+where GROUPS is a comma-separated list of groups and OPTIONS is a
+comma-separated list of option assignments. The two special "groups",
+the empty group and the star ('*') group, have the same meaning as for
+'\hltype' and '\hldesttype'. When used without the exclamation mark,
+'\hlopts' and '\hldestopts' preserve the current list of options for the
+groups, and only update the options listed in OPTIONS. If you add the
+exclamation mark, the current list of options for each group in GROUPS
+is discarded and the new list is set to OPTIONS.
+
+ The "overriding" nature of the '!' is appropriate when you give a
+complete specification of the options for a group, e.g., at the
+beginning of your document. On the other hand, when you want to adjust
+some option(s) and leave others intact, you should use the macros
+without the '!'.
+
+ For example, with displayed mathematical formulas, you often need to
+adjust the 'raise' option for the 'eq' destgroup, because the formulas
+often contain large parentheses and brackets. But when doing so, you
+want to leave the other settings unchanged. To achieve this, call
+'\hldestopts' without the '!', for example:
+
+ $$\hldestopts[eq]{raise=2.5\normalbaselineskip}
+ ...
+ $$
+
+The display commands ('$$') implicitly put the entire formula inside a
+(TeX) group ('\begingroup...\endgroup'), so you do not need to isolate
+the setting of the 'raise' option--it will be restored after the closing
+'$$'.
+
+ Initially, Eplain sets the option lists for almost all groups to
+empty, so that the groups fall back on the default values for all
+options. The one exception to this rule is the 'eq' destgroup, whose
+initial option list contains one setting:
+
+ raise=1.7\normalbaselineskip
+
+This setting usually accommodates the large operators, which often
+appear in displayed math.
+
+
+File: eplain.info, Node: Turning hyperlinks on/off, Next: Making PDF outlines, Prev: Setting hyperlink types and options, Up: Hyperlinks
+
+5.6 Turning hyperlinks on/off
+=============================
+
+Links and/or destinations can be turned on or off globally by disabling
+the low-level commands, or for each group individually.
+
+ All these settings are local to the current (TeX) group, so if you
+want to enable or disable links/destinations temporarily, you can do so
+inside a '\begingroup...\endgroup' block; when the group ends, the
+previous settings are restored.
+
+* Menu:
+
+* Turning low-level commands on/off::
+* Turning hyperlinks on/off for a group::
+
+
+File: eplain.info, Node: Turning low-level commands on/off, Next: Turning hyperlinks on/off for a group, Up: Turning hyperlinks on/off
+
+5.6.1 Turning low-level commands on/off
+---------------------------------------
+
+The low-level commands '\hlstart', '\hlend' and '\hldest' can be turned
+on/off with the following commands:
+
+ \hldeston
+ \hldestoff
+ \hlon
+ \hloff
+
+*Note Hyperlink driver nolinks::, for the implications of using these
+commands to disable hyperlinks for the entire document.
+
+
+File: eplain.info, Node: Turning hyperlinks on/off for a group, Prev: Turning low-level commands on/off, Up: Turning hyperlinks on/off
+
+5.6.2 Turning hyperlinks on/off for a group
+-------------------------------------------
+
+If you want to disable links/destinations produced by certain groups,
+you can give a list of the groups as an optional argument to these
+commands:
+
+ \hldeston[GROUPS]
+ \hldestoff[GROUPS]
+ \hlon[GROUPS]
+ \hloff[GROUPS]
+
+where GROUPS is the list of linkgroups/destgroups. This list can contain
+two special groups. The empty group switches the low-level commands
+(*note Turning low-level commands on/off::), and the star ('*') group
+operates on all defined groups.
+
+ Note that turning off the low-level commands disables all hyperlinks
+globally, including groups which have them enabled. Turning off certain
+linkgroups/destgroups records the fact that the macros in the group
+should not produce links/destinations. To illustrate the distinction,
+assume that all links are on; after the following sequence of commands:
+
+ \hloff
+ \hloff[eq]
+ \hlon
+
+all links are on except for the 'eq' linkgroup.
+
+
+File: eplain.info, Node: Making PDF outlines, Prev: Turning hyperlinks on/off, Up: Hyperlinks
+
+5.7 Making PDF outlines
+=======================
+
+PDF outlines (a.k.a. bookmarks) are more or less a table of contents
+that PDF viewers can display alongside the main document. Eplain's
+hyperlink features can be used to create them; there isn't any special
+support for them. A continuing example interspersed with commentary
+follows.
+
+ First we must enable hyperlinks.
+ \input eplain
+ \enablehyperlinks %[dvipdfm] doesn't work
+
+ We will separate the code to support 'pdftex' from 'dvips' with the
+'\ifpdf' conditional (provided by Eplain).
+
+ For 'pdftex', we can use the '\pdfoutline' primitive. The keyword
+"count" is followed by the number of subentries in this entry. If
+negative, the bookmark is closed (that is, subentries are hidden).
+
+ \ifpdf
+ \pdfoutline goto name {sec1} count -1 {Mysec-pdf}%
+ \pdfoutline goto name {sec1.1} {Mysubsec-pdf}%
+
+ For 'dvips', we use TeX's '\special' command to emit a 'ps:' special
+using the PDF 'pdfmark' operator. The 'ps:' prefix tells 'dvips' that
+the following is literal PostScript.
+
+ '[ ... pdfmark' (there is no closing ']') is a extension to the
+PostScript language for specifying various PDF-related things. It is
+recognized by Ghostscript, Distiller, et al. Adobe publishes a reference
+manual for it:
+<https://adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdfmark_reference.pdf>.
+
+ The '/DOCVIEW' pdfmark used here says the outline panel should be
+used.
+
+ \else % not pdf output
+ \special{ps:[/PageMode /UseOutlines /DOCVIEW pdfmark}
+ %
+ % The individual outline entries, using a different syntax
+ % than pdftex, but the same information.
+ \special{ps:[/Count -1 /Dest (sec1) cvn /Title (Mysec-dvi)
+ /OUT pdfmark}
+ \special{ps:[/Count -0 /Dest (sec1.1) cvn /Title (Mysubsec-dvi)
+ /OUT pdfmark}
+ \fi
+
+ The '-pdf' and '-dvi' suffixes in the strings above in the outline
+entries are just to make it clear which branch is being executed, for
+purposes of this example. Ordinarily the entries would be the same in
+both branches.
+
+ Also, the strings above are literal PostScript constants, again for
+this example. Usually they would come from control sequences, e.g., as
+the table of contents is read.
+
+ It is necessary to "pdf-escape" such arbitrary strings, else
+backslashes, parentheses, etc., would not come out right. pdfTeX's
+'\pdfescapestring' primitive is an easy way to do this, e.g.,
+'\xdef#1{\pdfescapestring{#1}}'.
+
+ Here is the document text, constructing three pages with the section
+and subsection given above in the outlines.
+
+ First page.\vfil\eject
+
+ \hldest{}{}{sec1}%
+ 1. Mysec on second page.\vfil\eject
+
+ \hldest{}{}{sec1.1}%
+ 1.1. Mysubsec on third page.
+
+ \end
+
+
+File: eplain.info, Node: Arrow theoretic diagrams, Next: Programming definitions, Prev: Hyperlinks, Up: Top
+
+6 Arrow theoretic diagrams
+**************************
+
+This chapter describes definitions for producing commutative diagrams.
+
+ Steven Smith wrote this documentation (and the macros).
+
+* Menu:
+
+* Slanted lines and vectors::
+* Commutative diagrams::
+
+
+File: eplain.info, Node: Slanted lines and vectors, Next: Commutative diagrams, Up: Arrow theoretic diagrams
+
+6.1 Slanted lines and vectors
+=============================
+
+The macros '\drawline' and '\drawvector' provide the capability found in
+LaTeX's picture mode to draw slanted lines and vectors of certain
+directions. Both of these macros take three arguments: two integer
+arguments to specify the direction of the line or vector, and one
+argument to specify its length. For example, '\drawvector(-4,1){60pt}'
+produces the vector
+
+ (A vector in the 2d quadrant of length 60 pt appears here.)
+
+ which lies in the 2d quadrant, has a slope of minus 1/4, and a width
+of 60 pt.
+
+ Note that if an '\hbox' is placed around '\drawline' or
+'\drawvector', then the width of the '\hbox' will be the positive
+dimension specified in the third argument, except when a vertical line
+or vector is specified, e.g., '\drawline(0,1){1in}', which has zero
+width. If the specified direction lies in the 1st or 2d quadrant (e.g.,
+'(1,1)' or '(-2,3)'), then the '\hbox' will have positive height and
+zero depth. Conversely, if the specified direction lies in the 3d or 4th
+quadrant (e.g., '(-1,-1)' or '(2,-3)'), then the '\hbox' will have
+positive depth and zero height.
+
+ There are a finite number of directions that can be specified. For
+'\drawline', the absolute value of each integer defining the direction
+must be less than or equal to six, i.e., '(7,-1)' is incorrect, but
+'(6,-1)' is acceptable. For '\drawvector', the absolute value of each
+integer must be less than or equal to four. Furthermore, the two
+integers cannot have common divisors; therefore, if a line with slope 2
+is desired, say '(2,1)' instead of '(4,2)'. Also, specify '(1,0)'
+instead of, say, '(3,0)' for horizontal lines and likewise for vertical
+lines.
+
+ Finally, these macros depend upon the LaTeX font 'line10'. If your
+site doesn't have this font, ask your system administrator to get it.
+Future enhancements will include macros to draw dotted lines and dotted
+vectors of various directions.
+
+
+File: eplain.info, Node: Commutative diagrams, Prev: Slanted lines and vectors, Up: Arrow theoretic diagrams
+
+6.2 Commutative diagrams
+========================
+
+The primitive commands '\drawline' and '\drawvector' can be used to
+typeset arrow theoretic diagrams. This section describes (1) macros to
+facilitate typesetting arrows and morphisms, and (2) macros to
+facilitate the construction of commutative diagrams. All macros
+described in this section must be used in math mode.
+
+* Menu:
+
+* Arrows and morphisms::
+* Construction of commutative diagrams::
+* Commutative diagram parameters::
+
+
+File: eplain.info, Node: Arrows and morphisms, Next: Construction of commutative diagrams, Up: Commutative diagrams
+
+6.2.1 Arrows and morphisms
+--------------------------
+
+The macros '\mapright' and '\mapleft' produce right and left pointing
+arrows, respectively. Use superscript ('^') to place a morphism above
+the arrow, e.g., '\mapright^\alpha'; use subscript ('_') to place a
+morphism below the arrow, e.g., '\mapright_{\tilde l}'. Superscripts and
+subscripts may be used simultaneously, e.g., '\mapright^\pi_{\rm
+epimor.}'.
+
+ Similarly, the macros '\mapup' and '\mapdown' produce up and down
+pointing arrows, respectively. Use '\rt' to place a morphism to the
+right of the arrow, e.g., '\mapup\rt{\rm id}'; use '\lft' to place a
+morphism to the left of the arrow, e.g., '\mapup\lft\omega'. '\lft' and
+'\rt' may be used simultaneously, e.g., '\mapdown\lft\pi\rt{\rm
+monomor.}'.
+
+ Slanted arrows are produced by the macro '\arrow', which takes a
+direction argument (e.g., '\arrow(3,-4)'). Use '\rt' and '\lft' to place
+morphisms to the right and left, respectively, of the arrow. A slanted
+line (no arrowhead) is produced with the macro '\sline', whose syntax is
+identical to that of '\arrow'.
+
+ The length of these macros is predefined by the default TeX
+dimensions '\harrowlength', for horizontal arrows (or lines),
+'\varrowlength', for vertical arrows (or lines), and '\sarrowlength',
+for slanted arrows (or lines). To change any of these dimensions, say,
+e.g., '\harrowlength=40pt'. As with all other TeX dimensions, the change
+may be as global or as local as you like. Furthermore, the placement of
+morphisms on the arrows is controlled by the dimensions '\hmorphposn',
+'\vmorphposn', and '\morphdist'. The first two dimensions control the
+horizontal and vertical position of the morphism from its default
+position; the latter dimension controls the distance of the morphism
+from the arrow. If you have more than one morphism per arrow (i.e., a
+'^'/'_' or '\lft'/'\rt' construction), use the parameters
+'\hmorphposnup', '\hmorphposndn', '\vmorphposnup', '\vmorphposndn',
+'\hmorphposnrt', '\hmorphposnlft', '\vmorphposnrt', and
+'\vmorphposnlft'. The default values of all these dimensions are
+provided in the section on parameters that follows below.
+
+ There is a family of macros to produce horizontal lines, arrows, and
+adjoint arrows. The following macros produce horizontal maps and have
+the same syntax as '\mapright':
+
+'\mapright'
+ '$X\mapright Y$' = (a right arrow).
+
+'\mapleft'
+ '$X\mapleft Y$' = (a left arrow).
+
+'\hline'
+ '$X\hline Y$' = (horizontal line)
+
+'\bimapright'
+ '$X\bimapright Y$' = (two right arrows).
+
+'\bimapleft'
+ '$X\bimapleft Y$' = (two left arrows)
+
+'\adjmapright'
+ '$X\adjmapright Y$' = (two adjoint arrows; left over right)
+
+'\adjmapleft'
+ '$X\adjmapleft Y$' = (two adjoint arrows; right over left)
+
+'\bihline'
+ '$X\bihline Y$' = (two horizontal lines)
+
+ There is also a family of macros to produce vertical lines, arrows,
+and adjoint arrows. The following macros produce vertical maps and have
+the same syntax as '\mapdown':
+
+'\mapdown'
+ (a down arrow)
+
+'\mapup'
+ (an up arrow)
+
+'\vline'
+ (vertical line)
+
+'\bimapdown'
+ (two down arrows)
+
+'\bimapup'
+ (two up arrows)
+
+'\adjmapdown'
+ (two adjoint arrows; down then up)
+
+'\adjmapup'
+ (two adjoint arrows; up then down)
+
+'\bivline'
+ (two vertical lines)
+
+ Finally, there is a family of macros to produce slanted lines,
+arrows, and adjoint arrows. The following macros produce slanted maps
+and have the same syntax as '\arrow':
+
+'\arrow'
+ (a slanted arrow)
+
+'\sline'
+ (a slanted line)
+
+'\biarrow'
+ (two straight arrows)
+
+'\adjarrow'
+ (two adjoint arrows)
+
+'\bisline'
+ (two straight lines)
+
+ The width between double arrows is controlled by the parameter
+'\channelwidth'. The parameters '\hchannel' and '\vchannel', if nonzero,
+override '\channelwidth' by controlling the horizontal and vertical
+shifting from the first arrow to the second.
+
+ There are no adornments on these arrows to distinguish inclusions
+from epimorphisms from monomorphisms. Many texts, such as Lang's book
+'Algebra', use as a tasteful alternative the symbol 'inc' (in roman)
+next to an arrow to denote inclusion.
+
+ Future enhancements will include a mechanism to draw curved arrows
+found in, e.g., the Snake Lemma, by employing a version of the '\path'
+macros of Appendix D of 'The TeXbook'.
+
+
+File: eplain.info, Node: Construction of commutative diagrams, Next: Commutative diagram parameters, Prev: Arrows and morphisms, Up: Commutative diagrams
+
+6.2.2 Construction of commutative diagrams
+------------------------------------------
+
+There are two approaches to the construction of commutative diagrams
+described here. The first approach, and the simplest, treats commutative
+diagrams like fancy matrices, as Knuth does in Exercise 18.46 of 'The
+TeXbook'. This case is covered by the macro '\commdiag', which is an
+altered version of the Plain TeX macro '\matrix'. An example suffices to
+demonstrate this macro. The following commutative diagram (illustrating
+the covering homotopy property; Bott and Tu, 'Differential Forms in
+Algebraic Topology')
+
+ (A commutative diagram appears here in the printed output.)
+
+ is produced with the code
+
+ $$\commdiag{Y&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft{f_t}&\mapdown\cr
+ Y\times I&\mapright^{\bar f_t}&X}$$
+
+ Of course, the parameters may be changed to produce a different
+effect. The following commutative diagram (illustrating the universal
+mapping property; Warner, 'Foundations of Differentiable Manifolds and
+Lie Groups')
+
+ (A commutative diagram appears here in the printed output.)
+
+ is produced with the code
+
+ $$\varrowlength=20pt
+ \commdiag{V\otimes W\cr \mapup\lft\phi&\arrow(3,-1)\rt{\tilde l}\cr
+ V\times W&\mapright^l&U\cr}$$
+
+ A diagram containing isosceles triangles is achieved by placing the
+apex of the triangle in the center column, as shown in the example
+(illustrating all constant minimal realizations of a linear system;
+Brockett, 'Finite Dimensional Linear Systems')
+
+ (A commutative diagram appears here in the printed output.)
+
+ which is produced with the code
+
+ $$\sarrowlength=.42\harrowlength
+ \commdiag{&R^m\cr &\arrow(-1,-1)\lft{\bf B}\quad \arrow(1,-1)\rt{\bf G}\cr
+ R^n&\mapright^{\bf P}&R^n\cr
+ \mapdown\lft{e^{{\bf A}t}}&&\mapdown\rt{e^{{\bf F}t}}\cr
+ R^n&\mapright^{\bf P}&R^n\cr
+ &\arrow(1,-1)\lft{\bf C}\quad \arrow(-1,-1)\rt{\bf H}\cr
+ &R^q\cr}$$
+
+ Other commutative diagram examples appear in the file
+'commdiags.tex', which is distributed with this package.
+
+ In these examples the arrow lengths and line slopes were carefully
+chosen to blend with each other. In the first example, the default
+settings for the arrow lengths are used, but a direction for the arrow
+must be chosen. The ratio of the default horizontal and vertical arrow
+lengths is approximately the golden mean gamma=1.618...; the arrow
+direction closest to this mean is '(3,2)'. In the second example, a
+slope of -1/3 is desired and the default horizontal arrow length is 60
+pt; therefore, choose a vertical arrow length of 20 pt. You may affect
+the interline glue settings of '\commdiag' by redefining the macro
+'\commdiagbaselines'. (cf. Exercise 18.46 of 'The TeXbook' and the
+section on parameters below.)
+
+ The width, height, and depth of all morphisms are hidden so that the
+morphisms' size do not affect arrow positions. This can cause a large
+morphism at the top or bottom of a diagram to impinge upon the text
+surrounding the diagram. To overcome this problem, use TeX's '\noalign'
+primitive to insert a '\vskip' immediately above or below the offending
+line, e.g., '$$\commdiag{\noalign{\vskip6pt}X&\mapright^\int&Y\cr ...}'.
+
+ The macro '\commdiag' is too simple to be used for more complicated
+diagrams, which may have intersecting or overlapping arrows. A second
+approach, borrowed from Francis Borceux's 'Diagram' macros for LaTeX,
+treats the commutative diagram like a grid of identically shaped boxes.
+To compose the commutative diagram, first draw an equally spaced grid,
+e.g.,
+
+ . . . . . .
+ . . . . . .
+ . . . . . .
+ . . . . . .
+
+ on a piece of scratch paper. Then draw each element (vertices and
+arrows) of the commutative diagram on this grid, centered at each grid
+point. Finally, use the macro '\gridcommdiag' to implement your design
+as a TeX alignment. For example, the cubic diagram
+
+ (A commutative diagram appears here.)
+
+ that appears in Francis Borceux's documentation can be implemented on
+a 7 by 7 grid, and is achieved with the code
+
+ $$\harrowlength=48pt \varrowlength=48pt \sarrowlength=20pt
+ \def\cross#1#2{\setbox0=\hbox{$#1$}%
+ \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+ \gridcommdiag{&&B&&\mapright^b&&D\cr
+ &\arrow(1,1)\lft a&&&&\arrow(1,1)\lft d\cr
+ A&&\cross{\hmorphposn=12pt\mapright^c}{\vmorphposn=-12pt\mapdown\lft f}
+ &&C&&\mapdown\rt h\cr\cr
+ \mapdown\lft e&&F&&\cross{\hmorphposn=-12pt\mapright_j}
+ {\vmorphposn=12pt\mapdown\rt g}&&H\cr
+ &\arrow(1,1)\lft i&&&&\arrow(1,1)\rt l\cr
+ E&&\mapright_k&&G\cr}$$
+
+ The dimensions '\hgrid' and '\vgrid' control the horizontal and
+vertical spacing of the grid used by '\gridcommdiag'. The default
+setting for both of these dimensions is 15 pt. Note that in the example
+of the cube the arrow lengths must be adjusted so that the arrows
+overlap into neighboring boxes by the desired amount. Hence, the
+'\gridcommdiag' method, albeit more powerful, is less automatic than the
+simpler '\commdiag' method. Furthermore, the ad hoc macro '\cross' is
+introduced to allow the effect of overlapping arrows. Finally, note that
+the positions of four of the morphisms are adjusted by setting
+'\hmorphposn' and '\vmorphposn'.
+
+ One is not restricted to a square grid. For example, the proof of
+Zassenhaus's Butterfly Lemma can be illustrated by the diagram
+(appearing in Lang's book 'Algebra')
+
+ (A commutative diagram appears here.)
+
+ This diagram may be implemented on a 9 by 12 grid with an aspect
+ratio of 1/2, and is set with the code
+
+ $$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt
+ \def\cross#1#2{\setbox0=\hbox{$#1$}%
+ \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+ \def\l#1{\llap{$#1$\hskip.5em}}
+ \def\r#1{\rlap{\hskip.5em$#1$}}
+ \gridcommdiag{&&U&&&&V\cr &&\bullet&&&&\bullet\cr
+ &&\sarrowlength=16pt\sline(0,1)&&&&\sarrowlength=16pt\sline(0,1)\cr
+ &&\l{u(U\cap V)}\bullet&&&&\bullet\r{(U\cap V)v}\cr
+ &&&\sline(2,-1)&&\sline(2,1)\cr
+ &&\cross{=}{\sline(0,1)}&&\bullet&&\cross{=}{\sline(0,1)}\cr\cr
+ &&\l{^{\textstyle u(U\cap v)}}\bullet&&\cross{=}{\sline(0,1)}&&
+ \bullet\r{^{\textstyle(u\cap V)v}}\cr
+ &\sline(2,1)&&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)\cr
+ \l{u}\bullet&&&&\bullet&&&&\bullet\r{v}\cr
+ &\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)\cr
+ &&\bullet&&&&\bullet\cr &&u\cap V&&&&U\cap v\cr}$$
+
+ Again, the construction of this diagram requires careful choices for
+the arrow lengths and is facilitated by the introduction of the ad hoc
+macros '\cross', '\r', and '\l'. Note also that superscripts were used
+to adjust the position of the vertices u(U intersection v) and (u
+intersection V)v. Many diagrams may be typeset with the predefined
+macros that appear here; however, ingenuity is often required to handle
+special cases.
+
+
+File: eplain.info, Node: Commutative diagram parameters, Prev: Construction of commutative diagrams, Up: Commutative diagrams
+
+6.2.3 Commutative diagram parameters
+------------------------------------
+
+The following is a list describing the parameters used in the
+commutative diagram macros. These dimensions may be changed globally or
+locally.
+
+'\harrowlength'
+ (Default: 60 pt) The length of right or left arrows.
+
+'\varrowlength'
+ (Default: 0.618'\harrowlength') The length of up or down arrows.
+
+'\sarrowlength'
+ (Default: 60 pt) The horizontal length of slanted arrows.
+
+'\hmorphposn'
+ (Default: 0 pt) The horizontal position of the morphism with
+ respect to its default position. There are also the dimensions
+ '\hmorphposnup', '\hmorphposndn', '\hmorphposnrt', and
+ '\hmorphposnlft' for '^'/'_' or '\lft'/'\rt' constructions.
+
+'\vmorphposn'
+ (Default: 0 pt) The vertical position of the morphism with respect
+ to its default position. There are also the dimensions
+ '\vmorphposnup', '\vmorphposndn', '\vmorphposnrt', and
+ '\vmorphposnlft' for '^'/'_' or '\lft'/'\rt' constructions.
+
+'\morphdist'
+ (Default: 4 pt) The distance of morphisms from slanted lines or
+ arrows.
+
+'\channelwidth'
+ (Default: 3 pt) The distance between double lines or arrows.
+
+'\hchannel, \vchannel'
+ (Defaults: 0 pt) Overrides '\channelwidth'. The horizontal and
+ vertical shifts between double lines or arrows.
+
+'\commdiagbaselines'
+ (Default: '\baselineskip=15pt \lineskip=3pt \lineskiplimit=3pt ')
+ The parameters used by '\commdiag' for setting interline glue.
+
+'\hgrid'
+ (Default: 15 pt) The horizontal spacing of the grid used by
+ '\gridcommdiag'.
+
+'\vgrid'
+ (Default: 15 pt) The vertical spacing of the grid used by
+ '\gridcommdiag'.
+
+
+File: eplain.info, Node: Programming definitions, Next: Demo files, Prev: Arrow theoretic diagrams, Up: Top
+
+7 Programming definitions
+*************************
+
+The definitions in this section are only likely to be useful when you
+are writing nontrivial macros, not when writing a document.
+
+* Menu:
+
+* Category codes:: Changing category codes.
+* Allocation macros:: Non-outer versions of \newcount et al.
+* Iteration:: Doing 'for' and 'while' loops in TeX.
+* Macro arguments:: Reading and ignoring them.
+* Converting to characters:: Normalizing control sequences and spaces.
+* Expansion:: Controlling expansion.
+* Obeying spaces:: Making whitespace count anywhere.
+* Writing out numbers:: Making '1' into 'one'.
+* Mode-specific penalties::
+* Auxiliary files:: Testing for their existence.
+* User-defined environments:: User-defined environments.
+* Page list and page range parsers::
+
+
+File: eplain.info, Node: Category codes, Next: Allocation macros, Up: Programming definitions
+
+7.1 Category codes
+==================
+
+Plain TeX defines '\active' (as the number 13) for use in changing
+category codes. Although the author of 'The TeXbook' has "intentionally
+kept the category codes numeric", two other categories are commonly
+used: letters (category code 11) and others (12). Therefore, Eplain
+defines '\letter' and '\other'.
+
+ Sometimes it is cleaner to make a character active without actually
+writing a '\catcode' command. The '\makeactive' command takes a
+character as an argument to make active (and ignores following spaces).
+For example, here are two commands which both make '\' active:
+
+ \makeactive\\ \makeactive92
+
+ Sometimes you might want to temporarily change the category code of
+the '@' character to '\letter', so that you can use or define macros
+which are normally inaccessible to the user. For such situations, Eplain
+provides the '\makeatletter' command. It sets the category code of '@'
+to '\letter' (11) and defines '\resetatcatcode' to restore the category
+code to whatever it was before the call to '\makeatletter'. For example:
+
+ \makeatletter
+ \def\@hidden@macro{This macro cannot normally be
+ called / redefined by the user}
+ \resetatcatcode
+
+There is also '\makeatother' which works similarly but sets the category
+code of '@' to '\other' (12).
+
+ Usually, when you give a definition to an active character, you have
+to do so inside a group where you temporarily make the character active,
+and then give it a global definition (cf. the definition of
+'\obeyspaces' in 'The TeXbook'). This is inconvenient if you are writing
+a long macro, or if the character already has a global definition you do
+not wish to transcend. Eplain provides '\letreturn', which defines the
+usual end-of-line character to be the argument. For example:
+
+ \def\mymacro{... \letreturn\myreturn ... }
+ \mymacro hello
+ there
+
+The end-of-line between 'hello' and 'there' causes '\myreturn' to be
+expanded.
+
+ 'The TeXbook' describes '\uncatcodespecials', which makes all
+characters which are normally "special" into "other" characters, but the
+definition never made it into plain TeX. Eplain therefore defines it.
+For notes on the usage, *note Verbatim listing::.
+
+ Finally, '\percentchar' expands into a literal '%' character. This is
+useful when you '\write' TeX output to a file, and want to avoid
+spurious spaces. For example, Eplain writes a '\percentchar' after the
+definition of cross-references. The macros '\lbracechar' and
+'\rbracechar' expand similarly.
+
+
+File: eplain.info, Node: Allocation macros, Next: Iteration, Prev: Category codes, Up: Programming definitions
+
+7.2 Allocation macros
+=====================
+
+Plain TeX provides macros that allocate registers of each primitive type
+in TeX, to prevent different sets of macros from using the same register
+for two different things. The macros are all named starting with 'new',
+e.g., '\newcount' allocates a new "count" (integer) register. Such
+allocations are usually needed only at the top level of some macro
+definition file; therefore, plain TeX makes the allocation registers
+'\outer', to help find errors. (The error this helps to find is a
+missing right brace in some macro definition.)
+
+ Sometimes, however, it is useful to allocate a register as part of
+some macro. An outer control sequence cannot be used as part of a macro
+definition (or in a few other contexts: the parameter text of a
+definition, an argument to a definition, the preamble of an alignment,
+or in conditional text that is being skipped). Therefore, Eplain defines
+"inner" versions of all the allocation macros, named with the prefix
+'inner': '\innernewbox', '\innernewcount', '\innernewdimen',
+'\innernewfam', '\innernewhelp', '\innernewif', '\innernewinsert',
+'\innernewlanguage', '\innernewread',
+'\innernewskip', '\innernewtoks', '\innernewwrite'.
+
+ You can also define non-outer versions of other macros in the same
+way that Eplain defines the above. The basic macro is called
+'\innerdef':
+
+ \innerdef \INNERNAME {OUTERNAME}
+
+ The first argument (\INNERNAME) to '\innerdef' is the control
+sequence that you want to define. Any previous definition of \INNERNAME
+is replaced. The second argument (OUTERNAME) is the _characters_ in the
+name of the outer control sequence. (You can't use the actual control
+sequence name, since it's outer!)
+
+ If the outer control sequence is named \CS, and you want to define
+'innerCS' as the inner one, you can use '\innerinnerdef', which is just
+an abbreviation for a call to '\innerdef'. For example, these two calls
+are equivalent:
+
+ \innerdef\innerproclaim{proclaim}
+ \innerinnerdef{proclaim}
+
+
+File: eplain.info, Node: Iteration, Next: Macro arguments, Prev: Allocation macros, Up: Programming definitions
+
+7.3 Iteration
+=============
+
+You can iterate through a comma-separated list of items with '\for'.
+Here is an example:
+
+ \for\name:=karl,kathy\do{%
+ \message{\name}%
+ }%
+
+This writes 'karl' and 'kathy' to the terminal. Spaces before or after
+the commas in the list, or after the ':=', are _not_ ignored. To strip
+leading spaces off the items, use '\For':
+
+ \For\name:=
+ karl,
+ kathy\do{%
+ \message{\name}%
+ }%
+
+Note that trailing spaces are still _not_ ignored.
+
+ Both '\for' and '\For' expand the first token of the item list fully,
+so this is equivalent to the above:
+
+ \def\namelist{karl,kathy}%
+ \for\name:=\namelist\do ...
+
+However, this won't work, either with '\for' or with '\For':
+
+ \def\namelist{karl,kathy}%
+ \For\name:= \namelist\do ...
+
+because '\for' and '\For' expand the first token after ':=' which is
+space, not '\namelist'.
+
+ Eplain provides another kind of loops, which is an extension of plain
+TeX's '\loop'. If you say:
+
+ \loop
+ LOOP-TEXT
+ \if CONDITION
+ IF-TEXT
+ \repeat
+
+then LOOP-TEXT will be repeated as long as CONDITION is satisfied ('\if'
+can be any of the TeX's conditional commands, without the matching
+'\fi'). Eplain extends this with the optional else clause:
+
+ \loop
+ LOOP-TEXT
+ \if CONDITION
+ IF-TEXT
+ \else
+ ELSE-TEXT
+ \repeat
+
+Here, LOOP-TEXT will be repeated as long as CONDITION is _not_
+satisfied. This extension is from Victor Eijkhout's TeX by Topic
+(page 104).
+
+
+File: eplain.info, Node: Macro arguments, Next: Converting to characters, Prev: Iteration, Up: Programming definitions
+
+7.4 Macro arguments
+===================
+
+It is occasionally useful to redefine a macro that takes arguments to do
+nothing. Eplain defines '\gobble', '\gobbletwo', and '\gobblethree' to
+swallow one, two, and three arguments, respectively.
+
+ For example, if you want to produce a "short" table of contents--one
+that includes only chapters, say--the easiest thing to do is read the
+entire '.toc' file (*note Contents::), and just ignore the commands that
+produce section or subsection entries. To be specific:
+
+ \let\tocchapterentry = \shorttocchapter
+ \let\tocsectionentry = \gobbletwo
+ \let\tocsubsectionentry = \gobbletwo
+ \readtocfile
+
+(Of course, this assumes you only have chapters, sections, and
+subsections in your document.)
+
+ In addition, Eplain defines '\eattoken' to swallow the single
+following token, using '\let'. Thus, '\gobble' followed by '{...}'
+ignores the entire brace-enclosed text. '\eattoken' followed by the same
+ignores only the opening left brace.
+
+ Eplain defines a macro '\identity' which takes one argument and
+expands to that argument. This may be useful if you want to provide a
+function for the user to redefine, but don't need to do anything by
+default. (For example, the default definition of '\eqconstruct' (*note
+Formatting equation references::) is '\identity'.)
+
+ You may also want to read an optional argument. The established
+convention is that optional arguments are put in square brackets, so
+that is the syntax Eplain recognizes. Eplain ignores space tokens before
+and after optional arguments, via '\futurenonspacelet'.
+
+ You test for an optional argument by using '\@getoptionalarg'. It
+takes one argument, a control sequence to expand after reading the
+argument, if present. If an optional argument is present, the control
+sequence '\@optionalarg' expands to it; otherwise, '\@optionalarg' is
+'\empty'. You must therefore have the category code of '@' set to 11
+(letter). Here is an example:
+
+ \catcode`@=\letter
+ \def\cmd{\@getoptionalarg\finishcmd}
+ \def\finishcmd{%
+ \ifx\@optionalarg\empty
+ % No optional argument present.
+ \else
+ % One was present.
+ \fi
+ }
+
+ It's possible to define macros that appear to accept optional
+arguments intermixed with mandatory arguments in any imaginable way. For
+example:
+
+ \makeatletter
+ % \mo{m}[o]
+ \def\mo#1{\def\mo@arg{#1}\@getoptionalarg\fin@mo}
+ \def\fin@mo{\vskip1pc
+ ARG: \mo@arg \par
+ OPTARG: \@optionalarg \par
+ }
+ % \mom{m}[o]{m}
+ \def\mom#1{\def\mom@arg{#1}\@getoptionalarg\fin@mom}
+ \def\fin@mom#1{\vskip1pc
+ ARG1: \mom@arg \par
+ OPTARG: \@optionalarg \par
+ ARG2: #1\par
+ }
+ % \omo[o]{m}[o]
+ \def\omo{\@getoptionalarg\fin@omo}
+ \def\fin@omo#1{\let\omo@optarg\@optionalarg
+ \def\omo@arg{#1}\@getoptionalarg\@fin@omo}
+ \def\@fin@omo{\vskip1pc
+ OPTARG1: \omo@optarg \par
+ ARG: \omo@arg \par
+ OPTARG2: \@optionalarg \par
+ }
+ \makeatother
+
+ If an optional argument contains another optional argument, the inner
+one will need to be enclosed in braces, so TeX does not mistake the end
+of the first for the end of the second.
+
+
+File: eplain.info, Node: Converting to characters, Next: Expansion, Prev: Macro arguments, Up: Programming definitions
+
+7.5 Converting to characters
+============================
+
+Eplain defines '\xrlabel' to produce control sequence names for
+cross-reference labels, et al. This macro expands to its argument with
+an '_' appended. (It does this because the usual use of '\xrlabel' is to
+generate a control sequence name, and we naturally want to avoid
+conflicts between control sequence names.)
+
+ Because '\xrlabel' is fully expandable, to make a control sequence
+name out of the result you need only do
+
+ \csname \xrlabel{LABEL}\endcsname
+
+The '\csname' primitive makes a control sequence name out of any
+sequence of character tokens, regardless of category code. Labels can
+therefore include any characters except for '\', '{', '}', and '#', all
+of which are used in macro definitions themselves.
+
+ '\sanitize' takes a control sequence as an argument and converts the
+expansion of the control sequence into a list of character tokens. This
+is the behavior you want when writing information like chapter titles to
+an output file. For example, here is part of the definition of
+'\writenumberedtocentry'; '#2' is the title that the user has given.
+
+ ...
+ \def\temp{#2}%
+ ...
+ \write\tocfile{%
+ ...
+ \sanitize\temp
+ ...
+ }%
+
+
+File: eplain.info, Node: Expansion, Next: Obeying spaces, Prev: Converting to characters, Up: Programming definitions
+
+7.6 Expansion
+=============
+
+This section describes some miscellanous macros for expansion, etc.
+
+* Menu:
+
+* \csn and \ece:: Abbreviations for \csname expansions.
+* \edefappend::
+* Hooks:: Manipulating and executing named actions.
+* Properties:: Associating information with a csname.
+* \expandonce::
+* \ifundefined::
+* \ifempty::
+* \ifinteger and \isinteger::
+* \futurenonspacelet::
+
+
+File: eplain.info, Node: \csn and \ece, Next: \edefappend, Up: Expansion
+
+7.6.1 '\csn' and '\ece'
+-----------------------
+
+'\csn'{NAME} simply abbreviates '\csname' NAME '\endcsname', thus saving
+some typing. The extra level of expansion does take some time, though,
+so I don't recommend it for an inner loop.
+
+ '\ece'{TOKEN}{NAME} abbreviates
+
+ \expandafter TOKEN \csname NAME \endcsname
+
+For example,
+
+ \def\fontabbrevdef#1#2{\ece\def{@#1font}{#2}}
+ \fontabbrevdef{normal}{ptmr}
+
+defines a control sequence '\@normalfont' to expand to 'ptmr'.
+
+
+File: eplain.info, Node: \edefappend, Next: Hooks, Prev: \csn and \ece, Up: Expansion
+
+7.6.2 '\edefappend'
+-------------------
+
+'\edefappend' is a way of adding on to an existing definition. It takes
+two arguments: the first is the control sequence name, the second the
+new tokens to append to the definition. The second argument is fully
+expanded (in the '\edef' that redefines the control sequence).
+
+ For example:
+
+ \def\foo{abc}
+ \def\bar{xyz}
+ \edefappend\foo{\bar karl}
+
+results in '\foo' being defined as 'abcxyzkarl'.
+
+
+File: eplain.info, Node: Hooks, Next: Properties, Prev: \edefappend, Up: Expansion
+
+7.6.3 Hooks
+-----------
+
+A "hook" is simply a name for a group of actions which is executed in
+certain places--presumably when it is most useful to allow customization
+or modification. TeX already provides many builtin hooks; for example,
+the '\every ...' token lists are all examples of hooks.
+
+ Eplain provides several macros for adding actions to hooks. They all
+take two arguments: the name of the hook and the new actions.
+
+'hookaction NAME ACTIONS'
+'hookappend NAME ACTIONS'
+'hookprepend NAME ACTIONS'
+ Each of these adds ACTIONS to the hook NAME. (Any
+ previously-defined actions are retained.) NAME is not a control
+ sequence, but rather the characters of the name.
+
+'hookactiononce NAME \CS'
+ '\hookactiononce' adds CS to NAME, like the macros above, but first
+ it adds
+
+ \global\let \CS \relax
+
+ to the definition of \CS. (This implies \CS must be a true
+ expandable macro, not a control sequence '\let' to a primitive or
+ some other such thing.) Thus, \CS is expanded the next time the
+ hook NAME is run, but it will disappear after that.
+
+ The '\global' is useful because '\hookactiononce' is most useful
+ when the grouping structure of the TeX code could be anything.
+ Neither this nor the other hook macros do global assignments to the
+ hook variable itself, so TeX's usual grouping rules apply.
+
+ The companion macro to defining hook actions is '\hookrun', for
+running them. This takes a single argument, the name of the hook. If no
+actions for the hook are defined, no error ensues.
+
+ Here is a skeleton of general '\begin' and '\end' macros that run
+hooks, and a couple of calls to define actions. The use of
+'\hookprepend' for the begin action and '\hookappend' for the end action
+ensures that the actions are executed in proper sequence with other
+actions (as long as the other actions use '\hookprepend' and
+'\hookappend' also).
+
+ \def\begin#1{ ... \hookrun{begin} ... }
+ \def\end#1{ ... \hookrun{end} ... }
+ \hookprepend{begin}\start_underline
+ \hookappend{end}\finish_underline
+
+
+File: eplain.info, Node: Properties, Next: \expandonce, Prev: Hooks, Up: Expansion
+
+7.6.4 Properties
+----------------
+
+A "property" is a name/value pair associated with another symbol,
+traditionally called an "atom". Both atom and property names are control
+sequence names.
+
+ Eplain provides two macros for dealing with property lists:
+'\setproperty' and '\getproperty'.
+
+'\setproperty ATOM PROPNAME VALUE'
+ '\setproperty' defines the property PROPERTY on the atom ATOM to be
+ VALUE. ATOM and PROPNAME can be anything acceptable to '\csname'.
+ VALUE can be anything.
+
+'\getproperty ATOM PROPNAME'
+ '\getproperty' expands to the value stored for PROPNAME on ATOM. If
+ PROPNAME is undefined, it expands to nothing (i.e., '\empty').
+
+ The idea of properties originated in Lisp (I believe). There, the
+implementation truly does associate properties with atoms. In TeX, where
+we have no builtin support for properties, the association is only
+conceptual.
+
+ The following example typesets 'xyz'.
+
+ \setproperty{a}{pr}{xyz}
+ \getproperty{a}{pr}
+
+
+File: eplain.info, Node: \expandonce, Next: \ifundefined, Prev: Properties, Up: Expansion
+
+7.6.5 '\expandonce'
+-------------------
+
+'\expandonce' is defined as '\expandafter\noexpand'. Thus, '\expandonce
+TOKEN' expands TOKEN once, instead of to TeX primitives. This is most
+useful in an '\edef'.
+
+ For example, the following defines '\temp' to be '\foo', not 'abc'.
+
+ \def\foo{abc}
+ \def\bar{\foo}
+ \edef\temp{\expandonce\bar}
+
+
+File: eplain.info, Node: \ifundefined, Next: \ifempty, Prev: \expandonce, Up: Expansion
+
+7.6.6 '\ifundefined'
+--------------------
+
+'\ifundefined{CS} T \else F \fi' expands the T text if the control
+sequence '\CS' is undefined or has been '\let' to '\relax', and the F
+text otherwise.
+
+ Since '\ifundefined' is not a primitive conditional, it cannot be
+used in places where TeX might skip tokens "at high speed", e.g., within
+another conditional--TeX can't match up the '\if''s and '\fi''s.
+
+ This macro was taken directly from 'The TeXbook', page 308.
+
+
+File: eplain.info, Node: \ifempty, Next: \ifinteger and \isinteger, Prev: \ifundefined, Up: Expansion
+
+7.6.7 '\ifempty'
+----------------
+
+'\ifempty{ARG} T \else F \fi' expands the T text if ARG is the empty
+string, and the F text otherwise. This macro is useful when you need to
+test for empty arguments to your macros, for example:
+
+ \def\foo#1{\ifempty{#1} T \else F \fi}
+
+ Since '\ifempty' is not a primitive conditional, it cannot be used in
+places where TeX might skip tokens "at high speed", e.g., within another
+conditional--TeX can't match up the '\if''s and '\fi''s.
+
+ Note that the following code
+
+ \def\empty{}
+ \ifempty\empty\message{empty}\else\message{not empty}\fi
+
+will produce the message 'not empty'.
+
+
+File: eplain.info, Node: \ifinteger and \isinteger, Next: \futurenonspacelet, Prev: \ifempty, Up: Expansion
+
+7.6.8 '\ifinteger' and '\isinteger'
+-----------------------------------
+
+'\ifinteger{ARG} T \else F \fi' expands the T text if ARG is an integer,
+and the F text otherwise. This macro can detect positive and negative
+integers.
+
+ Since '\ifinteger' is not a primitive conditional, it cannot be used
+in places where TeX might skip tokens "at high speed", e.g., within
+another conditional--TeX can't match up the '\if''s and '\fi''s. For
+such situations Eplain provides '\isinteger', which can be used as
+follows:
+
+ \if\isinteger{ARG} T \else F \fi
+
+ Although '\ifinteger' and '\isinteger' work well with regular input,
+they are not bullet-proof. For example, the following code
+
+ \ifinteger{12_ab}integer\else not integer\fi
+
+will expand to 'ab_integer' (and thus would not even compile outside
+math mode).
+
+ These macros come from the TeX Frequently Asked Questions
+(<http://www.tex.ac.uk/cgi-bin/texfaq2html>).
+
+
+File: eplain.info, Node: \futurenonspacelet, Prev: \ifinteger and \isinteger, Up: Expansion
+
+7.6.9 '\futurenonspacelet'
+--------------------------
+
+The '\futurelet' primitive allows you to look at the next token from the
+input. Sometimes, though, you want to look ahead while ignoring any
+spaces. This is what '\futurenonspacelet' does. It is otherwise the same
+as '\futurelet': you give it two control sequences as arguments, and it
+assigns the next nonspace token to the first, and then expands the
+second. For example:
+
+ \futurenonspacelet\temp\finishup
+ \def\finishup{\ifx\temp ...}
+
+
+File: eplain.info, Node: Obeying spaces, Next: Writing out numbers, Prev: Expansion, Up: Programming definitions
+
+7.7 Obeying spaces
+==================
+
+'\obeywhitespace' makes both end-of-lines and space characters in the
+input be respected in the output. Unlike plain TeX's '\obeyspaces', even
+spaces at the beginnings of lines turn into blank space.
+
+ By default, the size of the space that is produced by a space
+character is the natural space of the current font, i.e., what '\ '
+produces.
+
+ Ordinarily, a blank line in the input produces as much blank vertical
+space as a line of text would occupy. You can adjust this by assigning
+to the parameter '\blanklineskipamount': if you set this negative, the
+space produced by a blank line will be smaller; if positive, larger.
+
+ Tabs are not affected by this routine. In particular, if tabs occur
+at the beginning of a line, they will disappear. (If you are trying to
+make TeX do the "right thing" with tabs, don't. Use a utility program
+like expand instead.)
+
+
+File: eplain.info, Node: Writing out numbers, Next: Mode-specific penalties, Prev: Obeying spaces, Up: Programming definitions
+
+7.8 Writing out numbers
+=======================
+
+'\numbername' produces the written-out form of its argument, i.e.,
+'zero' through 'ten' for the numbers 0-10, and numerals for all others.
+
+
+File: eplain.info, Node: Mode-specific penalties, Next: Auxiliary files, Prev: Writing out numbers, Up: Programming definitions
+
+7.9 Mode-specific penalties
+===========================
+
+TeX's built-in '\penalty' command simply appends to the current list, no
+matter what kind of list it is. You might intend a particular penalty to
+always be a "vertical" penalty, however, i.e., appended to a vertical
+list. Therefore, Eplain provides '\vpenalty' and '\hpenalty' which first
+leave the other mode and then do '\penalty'.
+
+ More precisely, '\vpenalty' inserts '\par' if the current mode is
+horizontal, and '\hpenalty' inserts '\leavevmode' if the current mode is
+vertical. (Thus, '\vpenalty' cannot be used in math mode.)
+
+
+File: eplain.info, Node: Auxiliary files, Next: User-defined environments, Prev: Mode-specific penalties, Up: Programming definitions
+
+7.10 Auxiliary files
+====================
+
+It is common to write some information out to a file to be used on a
+subsequent run. But when it is time to read the file again, you only
+want to do so if the file actually exists. '\testfileexistence' is given
+an argument which is appended to '\jobname', and sets the conditional
+'\iffileexists' appropriately. For example:
+
+ \testfileexistence{toc}%
+ \iffileexists
+ \input \jobname.toc
+ \fi
+
+ '\testfileexistence' takes an optional parameter; when given, it will
+override '\jobname' for the root part of the file name. For example, if
+you want to test for the file 'answers.aux', you can do this with the
+following:
+
+ \testfileexistence[answers]{aux}%
+ \iffileexists
+ \input answers.aux
+ \fi
+
+
+File: eplain.info, Node: User-defined environments, Next: Page list and page range parsers, Prev: Auxiliary files, Up: Programming definitions
+
+7.11 User-defined environments
+==============================
+
+Plain TeX does not provide "named" block structures, only the anonymous
+'\begingroup' and '\endgroup' pair. The disadvantage of this is that
+when there are several such groups and one is mismatched, it can be
+difficult to find the error. Eplain provides a named block structure so
+that if you forget an '\environment' or an '\endenvironment', you will
+(probably) get an error message about it.
+
+ For example:
+
+ \def\itpar{
+ \environment{@italicpar}
+ \it\par
+ }
+ \def\enditpar{
+ \par
+ \endenvironment{@italicpar}%
+ }
+
+which could then be used to set italicized paragraphs:
+
+ \itpar
+ If I reprehend anything in this world, it is the use of my oracular
+ tongue, and a nice derangement of epitaphs!
+ \enditpar
+
+ The above sort of environment allows nesting. But environments
+shouldn't always be allowed to nest. Put the control sequence
+'\checkenv' at the beginning of a macro that is going to define an
+environment that should not be nested.
+
+
+File: eplain.info, Node: Page list and page range parsers, Prev: User-defined environments, Up: Programming definitions
+
+7.12 Page list and page range parsers
+=====================================
+
+The macros which Eplain uses to parse the page lists and ranges in the
+index, '\idxparselist' and '\idxparserange' (*note Page destinations for
+index terms::), are sometimes useful when defining page number
+encapsulators. They take one argument, text to parse. When a page list
+(range) is not present, they set '\idxpagei' to be '\empty'; when a list
+(range) is detected, they set '\idxpagei' and '\idxpageii' to the first
+and the second page numbers, respectively.
+
+ Eplain's defaults for the page list and page range delimiters are the
+same as those in MakeIndex, a comma followed by a space (', ') and two
+dashes ('--'), respectively. If you customize MakeIndex to use different
+delimiters, you must not forget to let Eplain know about them with the
+commands
+
+ \setidxpagelistdelimiter{LIST-DELIM}
+ \setidxpagerangedelimiter{PAGE-DELIM}
+
+These commands save the LIST-DELIM and PAGE-DELIM delimiters in
+'\idxpagelistdelimiter' and '\idxpagerangedelimiter', respectively.
+
+ For example, you may want to define a page number markup command
+which italicizes and properly underlines page ranges by underlining only
+the page numbers and not the delimiter:
+
+ \def\ituline#1{%
+ {\it
+ \idxparserange{#1}%
+ \ifx\idxpagei\empty
+ % The argument is a single page number.
+ \underbar{#1}%
+ \else
+ % The argument is a page range.
+ \underbar{\idxpagei}\idxpagerangedelimiter\underbar{\idxpageii}%
+ \fi}%
+ }
+
+Note that the '\ituline' macro is not aware of page lists. This is not
+needed if you use hyperlinks in the index, because '\hlidx' and
+'\hlidxpage' will break up the page lists before calling the user's page
+encapsulator (*note Page destinations for index terms::), so '\ituline'
+will never see the lists. If, however, you need to design a macro which
+also takes care of the lists, you can extend '\ituline' with an
+additional call to '\idxparselist'.
+
+
+File: eplain.info, Node: Demo files, Next: Macro index, Prev: Programming definitions, Up: Top
+
+8 Demo files
+************
+
+This chapter contains listings of source files, along with the output
+they produce (where appropriate), which illustrate various aspects of
+Eplain. The files can be found in the 'demo' subdirectory of Eplain
+distribution. These demos, both the sources and the compiled PDF and PS
+files, are also available from <https://tug.org/eplain/demo>.
+
+* Menu:
+
+* Hyperlinks (xhyper.tex)::
+* Highlighting TeX comments in listings (lscommnt.tex)::
+
+
+File: eplain.info, Node: Hyperlinks (xhyper.tex), Next: Highlighting TeX comments in listings (lscommnt.tex), Up: Demo files
+
+8.1 Hyperlinks ('xhyper.tex')
+=============================
+
+
+
+% (This file is public domain.)
+%
+% This file demonstrates the following features of Eplain:
+%
+% - explicit and implicit hyperlinks;
+% - symbolic cross-references;
+% - inserting external graphics using |\includegraphics| from
+% the \LaTeX\ package |graphicx.sty|.
+% - rotating text using |\rotatebox| from |graphicx.sty|.
+%
+% The compiled demo can be downloaded from
+%
+% http://tug.org/eplain/demo
+%
+% In order to compile this file yourself, you will need the CTAN lion
+% drawing by Duane Bibby from
+%
+% ftp://tug.ctan.org/ftpmaint/CTAN_lion/ctan_lion_350x350.png
+%
+% (thanks, |www.ctan.org|). Place the image file in the same
+% directory with this file, and change to that directory. Now, to
+% produce a PDF, run twice the command
+%
+% pdftex xhyper.tex
+%
+% During the first run, Eplain will write the information about the
+% cross-references into |xhyper.aux|, and during the second run this
+% information will be read by Eplain to typeset the references.
+%
+% Demo case:
+%
+% Suppose you are using pdf\TeX, have a figure you want to insert
+% scaled to $200\,pt$ horizontally, and you want this figure to
+% completely fill the PDF viewer's window whenever the reader
+% selects a link pointing to this figure. Additionally, you want to
+% typeset some text as live hyperlinks, clicking on which will start
+% a Web browser and open a URL.
+
+\input eplain
+
+% Load \LaTeX\ packages.
+\beginpackages
+ % |url.sty| provides the |\url| command which we will use to typeset
+ % a URL. We request that |url.sty| be the version from June~27,
+ % 2005, or later, because earlier versions had problems interacting
+ % with plain \TeX.
+ \usepackage{url}[2005/06/27]
+ % |color.sty| provides support for colored text; all hyperlinks are
+ % automatically colored by Eplain when this package is loaded. We give
+ % the |dvipsnames| option because we want to use named colors from the
+ % |dvips| graphics driver.
+ \usepackage[dvipsnames]{color}
+ % Finally, we load |graphicx.sty|, for the macros |\includegraphics|
+ % and |\rotatebox|.
+ \usepackage{graphicx}
+\endpackages
+
+% Remember that hyperlinks are off by default. Therefore, we need to
+% enable them.
+\enablehyperlinks
+
+% Customize some hyperlink options. First, we set border width to~$0$
+% for all links to get rid of the default boxes around links (we
+% prefer colored links over the boxed links). Next, we say that all
+% links created by the |url| hyperlink group (which means the |\url|
+% command from |url.sty|) must be colored using the named color
+% |BlueViolet|.
+\hlopts{bwidth=0}
+\hlopts[url]{colormodel=named,color=BlueViolet}
+
+% Inhibit page numbering (we have only one page).
+\nopagenumbers
+
+% Define a class word for the cross-reference class |figure|. This
+% word, when defined, will be automatically prepended by Eplain to the
+% reference created by |\ref| (read on to see its use).
+\def\figureword{fig.}
+
+% Allocate a count register for the figure's number, and a box
+% register which we'll use to measure dimensions of the image.
+\newcount\fignumber
+\newbox\imgbox
+
+% Now comes the fun part--constructing the figure for the image of the
+% \CTAN\ lion. We define a macro
+%
+% \fig{LABEL}{FILENAME}{CAPTION}{WIDTH}
+%
+% which creates a figure using LABEL for the cross-reference and
+% hyperlink label, reading the image from file FILENAME, using CAPTION
+% to name the figure, and WIDTH to scale the image horizontally.
+\def\fig#1#2#3#4{%
+ % Leave some space above the figure. This will also ensure that we
+ % are in the vertical mode before we produce a |\vbox|.
+ \medskip
+ % Advance the figure number. |\global| ensures that the change to
+ % the count register is global, even when |\fig| is buried inside a
+ % group.
+ \global\advance\fignumber by 1
+ % We use |\includegraphics| (from |graphicx.sty|) to load the image,
+ % scaled to the specified width, into our ``measuring'' box
+ % |\imgbox|.
+ \setbox\imgbox = \hbox{\includegraphics[width=#4]{#2}}%
+ % To make the demo even more exciting, let's put the figure's
+ % caption to the left of the image into the |\indent| space of the
+ % new paragraph, and rotate the caption~$90^\circ$.
+ \textindent{%
+ \rotatebox{90}{F{\sc IGURE}~\the\fignumber. #3}%
+ }%
+ % Continue the paragraph by constructing a |\vbox| with the image of
+ % the lion. We use |\definexref| to define the cross-reference
+ % label.
+ \vbox{%
+ % In addition to the cross-reference label, |\definexref| will
+ % create a hyperlink destination with the same label. Therefore,
+ % we customize this destination to do what we need. We say that
+ % destination type for the hyperlink group |definexref| (to which
+ % |\definexref| belongs) should be |fitr|. This destination type
+ % will magnify the rectangle specified by the options |width|,
+ % |height| and |depth| to the PDF viewer's window. Therefore, we
+ % set those options accordingly with |\hldestopts| (notice the use
+ % of |depth| instead of |height|---we will want the rectangle to
+ % extend {\it downward}, to cover the image which will come
+ % next). Notice that these settings will be isolated within the
+ % current group (i.e., the |\vbox| we're constructing).
+ \hldesttype[definexref]{fitr}%
+ \hldestopts[definexref]{width=\wd\imgbox,height=0pt,depth=\ht\imgbox}%
+ % We define a symbolic label so that we can later refer
+ % to the figure with |\ref|. The command |\definexref| does
+ % exactly that. The last argument to |\definexref| specifies
+ % class of the label, which determines the word used by |\ref| in
+ % front of the reference text (remember that we've defined
+ % |\figureword| above).
+ \definexref{#1}{\the\fignumber}{figure}%
+ % Finally, produce the image which we've been stashing in the box
+ % register |\imgbox|.
+ \box\imgbox
+ }%
+ \medskip
+}
+
+% Create the figure.
+\fig{CTANlion}{ctan_lion_350x350}{Lion in the archives}{200pt}
+
+% Finished with the fun part, we can relax and typeset some
+% hyperlinks. The easiest way to do that is to use the |\ref|
+% cross-reference command. We can even pass an optional argument
+% (|the lion in|), which will be placed before the class word (|fig.|)
+% and become part of the link (to make sure the reader does not have
+% to aim too hard).
+Show me \ref[the lion in]{CTANlion}.
+
+% If you are the restless kind, here's another way to create a
+% hyperlink to the image: we create a link explicitly by using
+% |\hlstart ... \hlend|. We don't specify the link type, therefore
+% the default type |name| will be used (these are ``named links'',
+% i.e., links pointing to destinations identified by labels). In the
+% options argument, we specify that the border of the link should be
+% inverted when the user clicks the link (|hlight=O|), and also set
+% special color for this link, overriding the default dark-red. The
+% label for the destination is the same as the cross-reference label,
+% |CTANlion|.
+Show me
+\hlstart{}{hlight=O,colormodel=named,color=OliveGreen}{CTANlion}
+ the CTAN lion\hlend.
+
+% Let's now point somewhere outside our document. Eplain homepage is
+% a good target. In the similar spirit, let's consider two
+% approaches. The easy one is to use the |\url| command from
+% |url.sty|. Remember that we have customized the color of |url|
+% hyperlinks, so this one will show up with a different color than the
+% default dark-red.
+Take me to \url{http://tug.org/eplain}.
+
+% The second approach is to create an explicit URL link. We specify
+% yet another border highlighting mode, |P|, which means that the
+% region underneath the bounding box of the link will be drawn inset
+% into the page. Also, let's set the color of the hyperlink to an RGB
+% color |0.4,0.1,0.4|. Since we cannot use commas to separate the
+% color elements inside the options parameter to |\hlstart| (commas
+% there separate options), we have to first create a user-defined
+% color with |\definecolor| from |color.sty|, and use that in
+% |\hlstart|.
+\definecolor{mycolor}{rgb}{0.4,0.1,0.4}
+
+Take me to
+\hlstart{url}{hlight=P,colormodel=,color=mycolor}{http://tug.org/eplain}
+ Eplain homepage\hlend.
+
+\bye
+
+
+File: eplain.info, Node: Highlighting TeX comments in listings (lscommnt.tex), Prev: Hyperlinks (xhyper.tex), Up: Demo files
+
+8.2 Highlighting TeX comments in listings ('lscommnt.tex')
+==========================================================
+
+
+
+% (This file is public domain.)
+% Demonstrate how Eplain can be used to include a TeX source file
+% verbatim, typesetting comments in colored italic typewriter type.
+
+% Load Eplain and LaTeX's color.sty package.
+\input eplain
+\beginpackages \usepackage{color} \endpackages
+\nopagenumbers % Disable page numbers.
+\font\commentfont = cmitt10 % Font for the comments (italic \tt).
+% We'll define some `protected' macros with `@' in their names.
+\makeatletter
+% Define an equivalent of Eplain's \letreturn, to be able to assign
+% various actions to the (active) percent character.
+\begingroup \makeactive\%
+ \gdef\letpercent{\let%}
+\endgroup
+% The listing hook to be called in \setuplistinghook, see below. It
+% makes `%' active and assigns it a `start comment' action.
+\def\hlightcommentslisting{\makeactive\% \letpercent\start@comment}%
+% This is what `%' is aliased to before a comment is started.
+\def\start@comment{%
+ \leavevmode % Needed in the very first line of the input to process
+ % the new par (possibly inserting line number) before we
+ % kick in with the color and stuff.
+ \begingroup % Isolate color and font changes and the redefinitions.
+ \commentfont
+ \color[cmyk]{0.28,1,1,0.35}%
+ \percentchar % Produce the actual `%' and
+ \letpercent\percentchar % make all following `%'s do the same.
+ \letreturn\end@comment % Call \end@comment at end-of-line.
+}
+% \end@comment (alias for ^^M inside a comment) will end the comment
+% started by \start@comment. We make ^^M active temporarily so that
+% the active version of ^^M gets "frozen" into \end@comment.
+\begingroup \makeactive\^^M % Avoid ^^M's from here on.
+ \gdef\end@comment{\endgroup ^^M}%
+\endgroup
+\resetatcatcode % Make `@' again inaccessible for use in macro names.
+
+% Define \setuplistinghook to setup comments highlighting, line
+% numbering and omitting the last (empty) line of input.
+\def\setuplistinghook{\hlightcommentslisting \linenumberedlisting
+ \nolastlinelisting}
+% Isn't this fun? This file typesets itself, with the extra bonus of
+% the pretty-printed comments and numbered source lines!
+\listing{lscommnt}
+\bye
+
+
+File: eplain.info, Node: Macro index, Next: Concept index, Prev: Demo files, Up: Top
+
+Macro index
+***********
+
+
+* Menu:
+
+* @getoptionalarg: Macro arguments. (line 39)
+* @hllabel: Destination types for hypertex.
+ (line 14)
+* @hllabel <1>: Link types for hypertex.
+ (line 39)
+* @hllabel <2>: Destination types for pdftex and dvipdfm.
+ (line 84)
+* @hllabel <3>: Link types for pdftex and dvipdfm.
+ (line 68)
+* @indexproof insertion class: Proofing index terms.
+ (line 28)
+* abovecolumnskip: Multiple columns. (line 33)
+* abovecolumnspenalty: Tables. (line 30)
+* abovelistpenalty: Formatting lists. (line 29)
+* abovelistskip: Formatting lists. (line 29)
+* abovelistskipamount: Formatting lists. (line 10)
+* adjarrow: Arrows and morphisms.
+ (line 113)
+* adjmapdown: Arrows and morphisms.
+ (line 91)
+* adjmapleft: Arrows and morphisms.
+ (line 66)
+* adjmapright: Arrows and morphisms.
+ (line 63)
+* adjmapup: Arrows and morphisms.
+ (line 94)
+* advancebottommargin: Margins. (line 26)
+* advanceleftmargin: Margins. (line 26)
+* advancerightmargin: Margins. (line 26)
+* advancetopmargin: Margins. (line 26)
+* afterindexterm: Customizing indexing.
+ (line 6)
+* afterindexterm hook: Indexing commands. (line 61)
+* AMSLaTeX: Logos. (line 10)
+* AMSTeX: Logos. (line 10)
+* arrow: Arrows and morphisms.
+ (line 20)
+* arrow <1>: Arrows and morphisms.
+ (line 104)
+* bblem: Formatting bibliographies.
+ (line 41)
+* bblemph: Formatting bibliographies.
+ (line 45)
+* bblfilebasename: Citations. (line 30)
+* bblhook: Formatting bibliographies.
+ (line 67)
+* bblnewblock: Formatting bibliographies.
+ (line 53)
+* bblrm: Formatting bibliographies.
+ (line 38)
+* bblsc: Formatting bibliographies.
+ (line 49)
+* bcolor (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 13)
+* bdash (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 19)
+* bdash (hyperlink option) <1>: Link options for pdftex and dvipdfm.
+ (line 32)
+* begin for index entries: Modifying index entries.
+ (line 22)
+* beginindex hook: Typesetting an index.
+ (line 30)
+* beginlist: Formatting lists. (line 50)
+* beginpackages: Environment for loading packages.
+ (line 6)
+* begin{picture}: Packages known to work.
+ (line 14)
+* begin{theindex}: Typesetting an index.
+ (line 17)
+* belowcolumnskip: Multiple columns. (line 34)
+* belowfootnoterulespace: Footnotes. (line 46)
+* belowlistskip: Formatting lists. (line 30)
+* belowlistskipamount: Formatting lists. (line 10)
+* biarrow: Arrows and morphisms.
+ (line 110)
+* biblabelcontents: Formatting bibliographies.
+ (line 23)
+* biblabelextraspace: Formatting bibliographies.
+ (line 61)
+* biblabelpostcontents: Formatting bibliographies.
+ (line 30)
+* biblabelprecontents: Formatting bibliographies.
+ (line 30)
+* biblabelprint: Formatting bibliographies.
+ (line 17)
+* biblabelwidth: Formatting bibliographies.
+ (line 11)
+* bibliography: Citations. (line 61)
+* bibliography (hyperlinks): Citation hyperlinks. (line 11)
+* bibliographystyle: Citations. (line 68)
+* BibTeX: Logos. (line 10)
+* bihline: Arrows and morphisms.
+ (line 69)
+* bimapdown: Arrows and morphisms.
+ (line 85)
+* bimapleft: Arrows and morphisms.
+ (line 60)
+* bimapright: Arrows and morphisms.
+ (line 57)
+* bimapup: Arrows and morphisms.
+ (line 88)
+* bisline: Arrows and morphisms.
+ (line 116)
+* bivline: Arrows and morphisms.
+ (line 97)
+* blackbox: Boxes. (line 7)
+* blanklineskipamount in justified text: Justification. (line 23)
+* blanklineskipamount in obeyed text: Obeying spaces. (line 16)
+* bottom (destination option): Destination types for pdftex and dvipdfm.
+ (line 65)
+* bottom (destination option) <1>: Destination options for pdftex and dvipdfm.
+ (line 56)
+* bottommargin: Margins. (line 17)
+* boxit: Boxes. (line 28)
+* boxitspace: Boxes. (line 30)
+* bstyle (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 25)
+* bwidth (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 49)
+* catcode: Category codes. (line 13)
+* center: Justification. (line 7)
+* centereddisplays: Displays. (line 13)
+* channelwidth: Arrows and morphisms.
+ (line 119)
+* channelwidth <1>: Commutative diagram parameters.
+ (line 36)
+* cite: Citations. (line 42)
+* cite (hyperlinks): Citation hyperlinks. (line 6)
+* cmd (destination option): Destination types for hypertex.
+ (line 14)
+* cmd (destination option) <1>: Destination options for hypertex.
+ (line 7)
+* cmd (destination option) <2>: Destination types for pdftex and dvipdfm.
+ (line 83)
+* cmd (destination option) <3>: Destination options for pdftex and dvipdfm.
+ (line 14)
+* cmd (hyperlink option): Link types for hypertex.
+ (line 39)
+* cmd (hyperlink option) <1>: Link options for hypertex.
+ (line 7)
+* cmd (hyperlink option) <2>: Link types for pdftex and dvipdfm.
+ (line 67)
+* cmd (hyperlink option) <3>: Link options for pdftex and dvipdfm.
+ (line 56)
+* color (hyperlink option): Options supported by all drivers.
+ (line 37)
+* colormodel (hyperlink option): Options supported by all drivers.
+ (line 37)
+* columnfill: Multiple columns. (line 14)
+* commdiag: Construction of commutative diagrams.
+ (line 9)
+* commdiagbaselines: Construction of commutative diagrams.
+ (line 64)
+* commdiagbaselines <1>: Commutative diagram parameters.
+ (line 43)
+* csn: \csn and \ece. (line 6)
+* definecolor: Hyperlinks (xhyper.tex).
+ (line 7)
+* definecontentsfile: Alternative contents files.
+ (line 6)
+* defineindex: Indexing. (line 35)
+* definexref: Defining generic references.
+ (line 6)
+* definexref <1>: Hyperlinks (xhyper.tex).
+ (line 7)
+* definexref (hyperlinks): Cross-reference hyperlinks.
+ (line 6)
+* depth (destination option): Destination types for pdftex and dvipdfm.
+ (line 61)
+* depth (destination option) <1>: Destination options for pdftex and dvipdfm.
+ (line 34)
+* depth (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 122)
+* discretionaries: Paths. (line 20)
+* displaylines: Displays. (line 18)
+* DOCVIEW pdfmark: Making PDF outlines. (line 37)
+* dospecials: Verbatim listing. (line 57)
+* doublecolumns: Multiple columns. (line 7)
+* drawline: Slanted lines and vectors.
+ (line 6)
+* drawvector: Slanted lines and vectors.
+ (line 6)
+* dvipdfm (hyperlink driver): Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* eattoken: Macro arguments. (line 23)
+* ece: \csn and \ece. (line 10)
+* edefappend: \edefappend. (line 6)
+* ehrule: Rules. (line 17)
+* em: Commands from LaTeX. (line 25)
+* emph: Commands from LaTeX. (line 25)
+* enablehyperlinks: Introduction to hyperlinks.
+ (line 42)
+* enablehyperlinks <1>: Choosing destination placement.
+ (line 7)
+* enablehyperlinks <2>: Hyperlink driver nolinks.
+ (line 48)
+* end for index entries: Modifying index entries.
+ (line 22)
+* endlist: Formatting lists. (line 52)
+* endnumberedlist: Lists. (line 13)
+* endorderedlist: Lists. (line 13)
+* endpackages: Environment for loading packages.
+ (line 6)
+* endunorderedlist: Lists. (line 20)
+* end{picture}: Packages known to work.
+ (line 14)
+* end{theindex}: Typesetting an index.
+ (line 17)
+* eplain: Invoking Eplain. (line 30)
+* eplaininput: Environment for loading packages.
+ (line 24)
+* eqalignno: Displays. (line 18)
+* eqalignno <1>: Displays. (line 23)
+* eqalignnum: Displays. (line 23)
+* eqconstruct: Formatting equation references.
+ (line 21)
+* eqdef: Equation references. (line 15)
+* eqdef (hyperlinks): Equation reference hyperlinks.
+ (line 6)
+* eqdefn: Equation references. (line 38)
+* eqdefn (hyperlinks): Equation reference hyperlinks.
+ (line 6)
+* eqno: Displays. (line 23)
+* eqnum: Displays. (line 23)
+* eqnum <1>: Equation references. (line 15)
+* eqnum <2>: Equation references. (line 38)
+* eqnumber: Equation references. (line 8)
+* eqprint: Formatting equation references.
+ (line 12)
+* eqref: Equation references. (line 46)
+* eqref <1>: Equation reference hyperlinks.
+ (line 20)
+* eqrefn: Equation references. (line 51)
+* eqrefn <1>: Equation reference hyperlinks.
+ (line 20)
+* eqsubdef: Subequation references.
+ (line 11)
+* eqsubdef (hyperlinks): Equation reference hyperlinks.
+ (line 6)
+* eqsubdefn: Subequation references.
+ (line 11)
+* eqsubdefn (hyperlinks): Equation reference hyperlinks.
+ (line 6)
+* eqsubreftext: Subequation references.
+ (line 22)
+* eTeX: Logos. (line 10)
+* everyfootnote: Footnotes. (line 35)
+* evrule: Rules. (line 18)
+* expandonce: \expandonce. (line 6)
+* ext (hyperlink option): Link types for hypertex.
+ (line 23)
+* ext (hyperlink option) <1>: Link options for hypertex.
+ (line 20)
+* ExTeX: Logos. (line 10)
+* file (hyperlink option): Link types for hypertex.
+ (line 22)
+* file (hyperlink option) <1>: Link options for hypertex.
+ (line 14)
+* file (hyperlink option) <2>: Link types for pdftex and dvipdfm.
+ (line 41)
+* file (hyperlink option) <3>: Link types for pdftex and dvipdfm.
+ (line 53)
+* file (hyperlink option) <4>: Link options for pdftex and dvipdfm.
+ (line 63)
+* fileexists (conditional): Auxiliary files. (line 10)
+* filename (hyperlink type): Link types for hypertex.
+ (line 21)
+* filename (hyperlink type) <1>: Link types for pdftex and dvipdfm.
+ (line 40)
+* filepage (hyperlink type): Link types for pdftex and dvipdfm.
+ (line 52)
+* fit (destination type): Destination types for pdftex and dvipdfm.
+ (line 18)
+* fitb (destination type): Destination types for pdftex and dvipdfm.
+ (line 39)
+* fitbh (destination type): Destination types for pdftex and dvipdfm.
+ (line 44)
+* fitbv (destination type): Destination types for pdftex and dvipdfm.
+ (line 52)
+* fith (destination type): Destination types for pdftex and dvipdfm.
+ (line 23)
+* fitr (destination type): Destination types for pdftex and dvipdfm.
+ (line 60)
+* fitv (destination type): Destination types for pdftex and dvipdfm.
+ (line 31)
+* flushleft: Justification. (line 7)
+* flushright: Justification. (line 7)
+* fmtversion: Introduction. (line 51)
+* footnote (hyperlinks): Footnote hyperlinks. (line 7)
+* footnotemarkseparation: Footnotes. (line 25)
+* footnoteruleheight: Footnotes. (line 44)
+* footnoterulewidth: Footnotes. (line 44)
+* for: Iteration. (line 6)
+* For: Iteration. (line 15)
+* frac: Fractions. (line 6)
+* fullmonthname: Time of day. (line 13)
+* futurenonspacelet: \futurenonspacelet. (line 6)
+* getproperty: Properties. (line 18)
+* gloggingall: Diagnostics. (line 22)
+* gobble: Macro arguments. (line 7)
+* gobbletwo: Macro arguments. (line 7)
+* gridcommdiag: Construction of commutative diagrams.
+ (line 88)
+* gtracingall: Diagnostics. (line 22)
+* gutter: Multiple columns. (line 23)
+* gutterbox: Multiple columns. (line 24)
+* hangindent for index entries: Typesetting an index.
+ (line 45)
+* harrowlength: Arrows and morphisms.
+ (line 27)
+* harrowlength <1>: Commutative diagram parameters.
+ (line 11)
+* hchannel: Commutative diagram parameters.
+ (line 39)
+* height (destination option): Destination types for pdftex and dvipdfm.
+ (line 60)
+* height (destination option) <1>: Destination options for pdftex and dvipdfm.
+ (line 37)
+* height (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 125)
+* hgrid: Construction of commutative diagrams.
+ (line 108)
+* hgrid <1>: Commutative diagram parameters.
+ (line 47)
+* hldest: Explicit hyperlinks. (line 6)
+* hldest <1>: Destination types for hypertex.
+ (line 17)
+* hldest <2>: Destination types for pdftex and dvipdfm.
+ (line 86)
+* hldest <3>: Setting hyperlink types and options.
+ (line 7)
+* hldestoff: Hyperlink driver nolinks.
+ (line 10)
+* hldestoff <1>: Turning low-level commands on/off.
+ (line 6)
+* hldeston: Turning low-level commands on/off.
+ (line 6)
+* hldestopts: Setting default types and options.
+ (line 15)
+* hldestopts <1>: Setting group options.
+ (line 10)
+* hldestopts <2>: Hyperlinks (xhyper.tex).
+ (line 7)
+* hldesttype: Setting default types and options.
+ (line 6)
+* hldesttype <1>: Setting group types. (line 6)
+* hldesttype <2>: Hyperlinks (xhyper.tex).
+ (line 7)
+* hlend: Explicit hyperlinks. (line 25)
+* hlend <1>: Hyperlinks (xhyper.tex).
+ (line 7)
+* hlfootbacklabel: Footnote hyperlinks. (line 12)
+* hlfootlabel: Footnote hyperlinks. (line 12)
+* hlfootlabelnumber: Footnote hyperlinks. (line 15)
+* hlhash: Link types for hypertex.
+ (line 40)
+* hlidx: Exact destinations for index terms.
+ (line 13)
+* hlidxlabel: Exact destinations for index terms.
+ (line 23)
+* hlidxlabelnumber: Exact destinations for index terms.
+ (line 25)
+* hlidxpage: Page destinations for index terms.
+ (line 20)
+* hlidxpagelabel: Page destinations for index terms.
+ (line 11)
+* hlight (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 69)
+* hlightcommentslisting: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* hline: Arrows and morphisms.
+ (line 54)
+* hloff: Hyperlink driver nolinks.
+ (line 10)
+* hloff <1>: Turning low-level commands on/off.
+ (line 6)
+* hlon: Turning low-level commands on/off.
+ (line 6)
+* hlopts: Setting default types and options.
+ (line 15)
+* hlopts <1>: Setting group options.
+ (line 10)
+* hlopts <2>: Hyperlinks (xhyper.tex).
+ (line 7)
+* hlstart: Explicit hyperlinks. (line 25)
+* hlstart <1>: Link types for hypertex.
+ (line 43)
+* hlstart <2>: Link types for pdftex and dvipdfm.
+ (line 71)
+* hlstart <3>: Setting hyperlink types and options.
+ (line 7)
+* hlstart <4>: Hyperlinks (xhyper.tex).
+ (line 7)
+* hltype: Setting default types and options.
+ (line 6)
+* hltype <1>: Setting group types. (line 6)
+* hmorphposn: Arrows and morphisms.
+ (line 32)
+* hmorphposn <1>: Commutative diagram parameters.
+ (line 20)
+* hmorphposndn: Arrows and morphisms.
+ (line 38)
+* hmorphposndn <1>: Commutative diagram parameters.
+ (line 22)
+* hmorphposnlft: Arrows and morphisms.
+ (line 39)
+* hmorphposnlft <1>: Commutative diagram parameters.
+ (line 23)
+* hmorphposnrt: Arrows and morphisms.
+ (line 39)
+* hmorphposnrt <1>: Commutative diagram parameters.
+ (line 22)
+* hmorphposnup: Arrows and morphisms.
+ (line 38)
+* hmorphposnup <1>: Commutative diagram parameters.
+ (line 22)
+* hoffset: Proofing index terms.
+ (line 21)
+* hookaction: Hooks. (line 14)
+* hookactiononce: Hooks. (line 21)
+* hookappend: Hooks. (line 15)
+* hookprepend: Hooks. (line 16)
+* hookrun: Hooks. (line 37)
+* href: General hyperlinks. (line 6)
+* hruledefaultdepth: Rules. (line 9)
+* hruledefaultheight: Rules. (line 9)
+* hsize: Margins. (line 32)
+* hypertex (hyperlink driver): Hyperlink driver hypertex.
+ (line 6)
+* hyphenpenalty for index entries: Typesetting an index.
+ (line 45)
+* identity: Macro arguments. (line 28)
+* idx: Indexing commands. (line 8)
+* idx (hyperlinks): Index hyperlinks. (line 6)
+* idxargclose: Index entries with special characters.
+ (line 73)
+* idxargopen: Index entries with special characters.
+ (line 73)
+* idxbeginrangemark: Customizing indexing.
+ (line 41)
+* idxencapoperator: Customizing indexing.
+ (line 38)
+* idxendrangemark: Customizing indexing.
+ (line 44)
+* idxexact: Choosing destination placement.
+ (line 8)
+* idxmarked: Indexing commands. (line 29)
+* idxmarked (hyperlinks): Index hyperlinks. (line 6)
+* idxname: Indexing commands. (line 19)
+* idxname (hyperlinks): Index hyperlinks. (line 6)
+* idxnameseparator: Indexing commands. (line 19)
+* idxnone: Choosing destination placement.
+ (line 9)
+* idxpage: Choosing destination placement.
+ (line 9)
+* idxpagei: Page list and page range parsers.
+ (line 6)
+* idxpageii: Page list and page range parsers.
+ (line 6)
+* idxpagelistdelimiter: Page list and page range parsers.
+ (line 23)
+* idxpagenum: Customizing indexing.
+ (line 49)
+* idxpagerangedelimiter: Page list and page range parsers.
+ (line 23)
+* idxpagerangedelimiter <1>: Page list and page range parsers.
+ (line 30)
+* idxparselist: Page list and page range parsers.
+ (line 6)
+* idxparserange: Page list and page range parsers.
+ (line 6)
+* idxrangebeginword: Customizing indexing.
+ (line 20)
+* idxrangeendword: Customizing indexing.
+ (line 23)
+* idxseealsocmdword: Customizing indexing.
+ (line 29)
+* idxseecmdword: Customizing indexing.
+ (line 26)
+* idxsubentryseparator: Customizing indexing.
+ (line 35)
+* idxsubmarked: Indexing commands. (line 40)
+* idxsubmarked (hyperlinks): Index hyperlinks. (line 6)
+* ifempty: \ifempty. (line 6)
+* iffileexists: Auxiliary files. (line 10)
+* ifidx: Indexing. (line 53)
+* ifindexproofing: Proofing index terms.
+ (line 12)
+* ifinteger: \ifinteger and \isinteger.
+ (line 6)
+* ifpdf: Checking for PDF output.
+ (line 9)
+* ifpdf <1>: Introduction to hyperlinks.
+ (line 51)
+* ifpdf <2>: Making PDF outlines. (line 16)
+* ifrewritetocfile: Reading the .toc file.
+ (line 26)
+* ifundefined: \ifundefined. (line 6)
+* includegraphics: Hyperlinks (xhyper.tex).
+ (line 7)
+* indexfilebasename: Typesetting an index.
+ (line 11)
+* indexfonts: Typesetting an index.
+ (line 24)
+* indexitem hook: Typesetting an index.
+ (line 49)
+* indexprooffont: Proofing index terms.
+ (line 12)
+* indexproofingfalse: Proofing index terms.
+ (line 12)
+* indexproofingtrue: Proofing index terms.
+ (line 12)
+* indexproofterm: Proofing index terms.
+ (line 12)
+* indexproofunbox: Proofing index terms.
+ (line 28)
+* indexsee: Customizing indexing.
+ (line 53)
+* indexsee <1>: Hyperlinks in see and see also entries.
+ (line 8)
+* indexseealso: Customizing indexing.
+ (line 53)
+* indexseealso <1>: Hyperlinks in see and see also entries.
+ (line 8)
+* indexseealsowords: Customizing indexing.
+ (line 53)
+* indexseeword: Customizing indexing.
+ (line 53)
+* indexsetmargins: Proofing index terms.
+ (line 21)
+* indexspace: Typesetting an index.
+ (line 54)
+* innerdef: Allocation macros. (line 28)
+* innerinnerdef: Allocation macros. (line 39)
+* innernewbox: Allocation macros. (line 21)
+* innernewcount: Allocation macros. (line 21)
+* innernewdimen: Allocation macros. (line 21)
+* innernewfam: Allocation macros. (line 22)
+* innernewhelp: Allocation macros. (line 22)
+* innernewif: Allocation macros. (line 22)
+* innernewinsert: Allocation macros. (line 22)
+* innernewlanguage: Allocation macros. (line 23)
+* innernewread: Allocation macros. (line 24)
+* innernewskip: Allocation macros. (line 24)
+* innernewtoks: Allocation macros. (line 24)
+* innernewwrite: Allocation macros. (line 24)
+* input: Environment for loading packages.
+ (line 24)
+* insidemargin: Proofing index terms.
+ (line 21)
+* interfootnoteskip: Footnotes. (line 29)
+* interitemskip: Formatting lists. (line 30)
+* interitemskipamount: Formatting lists. (line 14)
+* isinteger: \ifinteger and \isinteger.
+ (line 13)
+* item in indexes: Typesetting an index.
+ (line 35)
+* itemletter: Formatting lists. (line 44)
+* itemnumber: Formatting lists. (line 44)
+* ituline: Page list and page range parsers.
+ (line 26)
+* jobname: Citations. (line 17)
+* jobname <1>: Typesetting an index.
+ (line 11)
+* jobname <2>: Auxiliary files. (line 9)
+* LAMSTeX: Logos. (line 11)
+* LaTeX: Logos. (line 11)
+* lbracechar: Category codes. (line 57)
+* left (destination option): Destination types for pdftex and dvipdfm.
+ (line 11)
+* left (destination option) <1>: Destination types for pdftex and dvipdfm.
+ (line 33)
+* left (destination option) <2>: Destination types for pdftex and dvipdfm.
+ (line 54)
+* left (destination option) <3>: Destination types for pdftex and dvipdfm.
+ (line 65)
+* left (destination option) <4>: Destination options for pdftex and dvipdfm.
+ (line 60)
+* leftdisplayindent: Displays. (line 11)
+* leftdisplays: Displays. (line 9)
+* leftdisplaysetup: Formatting displays. (line 8)
+* lefteqnumbers: Displays. (line 23)
+* leftmargin: Margins. (line 17)
+* leftskip: Justification. (line 45)
+* leqalignno: Displays. (line 19)
+* leqalignno <1>: Displays. (line 23)
+* leqno: Displays. (line 23)
+* letreturn: Category codes. (line 40)
+* letter: Category codes. (line 10)
+* lft: Arrows and morphisms.
+ (line 15)
+* li: Lists. (line 27)
+* li (hyperlinks): List hyperlinks. (line 6)
+* linenumberedlisting: Verbatim listing. (line 17)
+* linenumberedlisting <1>: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* listcompact: Lists. (line 38)
+* listing: Verbatim listing. (line 7)
+* listing <1>: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* listingfont: Verbatim listing. (line 10)
+* listleftindent: Formatting lists. (line 18)
+* listmarkerspace: Formatting lists. (line 33)
+* listrightindent: Formatting lists. (line 18)
+* loggingall: Diagnostics. (line 11)
+* loop: Iteration. (line 40)
+* makeactive: Category codes. (line 13)
+* makeatletter: Category codes. (line 22)
+* makeatother: Category codes. (line 31)
+* makeblankbox: Boxes. (line 12)
+* makecolumns: Tables. (line 6)
+* makeheadline: Proofing index terms.
+ (line 28)
+* mapdown: Arrows and morphisms.
+ (line 13)
+* mapdown <1>: Arrows and morphisms.
+ (line 76)
+* mapleft: Arrows and morphisms.
+ (line 6)
+* mapleft <1>: Arrows and morphisms.
+ (line 51)
+* mapright: Arrows and morphisms.
+ (line 6)
+* mapright <1>: Arrows and morphisms.
+ (line 48)
+* mapup: Arrows and morphisms.
+ (line 13)
+* mapup <1>: Arrows and morphisms.
+ (line 79)
+* matrix: Construction of commutative diagrams.
+ (line 10)
+* mbox: Commands from LaTeX. (line 28)
+* MF: Logos. (line 11)
+* monthname: Time of day. (line 10)
+* morphdist: Arrows and morphisms.
+ (line 33)
+* morphdist <1>: Commutative diagram parameters.
+ (line 32)
+* name (hyperlink type): Link types for hypertex.
+ (line 7)
+* name (hyperlink type) <1>: Link types for pdftex and dvipdfm.
+ (line 18)
+* new...: Allocation macros. (line 8)
+* newblock: Commands from LaTeX. (line 31)
+* newcommand: Commands from LaTeX. (line 18)
+* newwin (hyperlink option): Link types for pdftex and dvipdfm.
+ (line 42)
+* newwin (hyperlink option) <1>: Link types for pdftex and dvipdfm.
+ (line 54)
+* newwin (hyperlink option) <2>: Link options for pdftex and dvipdfm.
+ (line 90)
+* noarrow: Invoking Eplain. (line 84)
+* noauxfile: Invoking Eplain. (line 89)
+* nobibtex: Invoking Eplain. (line 73)
+* nocite: Citations. (line 58)
+* nolastlinelisting: Verbatim listing. (line 25)
+* nolastlinelisting <1>: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* nolinks (hyperlink driver): Hyperlink driver nolinks.
+ (line 6)
+* normalbaselineskip: Options supported by all drivers.
+ (line 19)
+* num (hyperlink type): Link types for pdftex and dvipdfm.
+ (line 92)
+* numberedfootnote: Footnotes. (line 7)
+* numberedfootnote (hyperlinks): Footnote hyperlinks. (line 6)
+* numberedlist: Lists. (line 13)
+* numberedlistdepth: Formatting lists. (line 41)
+* numberedmarker: Formatting lists. (line 37)
+* numbername: Writing out numbers. (line 6)
+* obeywhitespace: Obeying spaces. (line 6)
+* orderedlist: Lists. (line 13)
+* other: Category codes. (line 10)
+* outer: Allocation macros. (line 12)
+* outsidemargin: Proofing index terms.
+ (line 21)
+* page (hyperlink type): Link types for pdftex and dvipdfm.
+ (line 31)
+* pagefit (hyperlink option): Link types for pdftex and dvipdfm.
+ (line 32)
+* pagefit (hyperlink option) <1>: Link types for pdftex and dvipdfm.
+ (line 42)
+* pagefit (hyperlink option) <2>: Link types for pdftex and dvipdfm.
+ (line 54)
+* pagefit (hyperlink option) <3>: Link options for pdftex and dvipdfm.
+ (line 107)
+* pageno: Proofing index terms.
+ (line 21)
+* pagetotal: Multiple columns. (line 14)
+* paperheight: Margins. (line 43)
+* paperwidth: Margins. (line 46)
+* parfillskip, reset by \ragged...: Justification. (line 45)
+* parindent in indexes: Typesetting an index.
+ (line 24)
+* path: Paths. (line 13)
+* pdfescapestring pdfTeX primitive: Making PDF outlines. (line 60)
+* pdfmark (PDF language primitive): Making PDF outlines. (line 31)
+* pdfoutline (pdftex primitive): Making PDF outlines. (line 19)
+* pdfoutput: Checking for PDF output.
+ (line 20)
+* pdftex (hyperlink driver): Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* percentchar: Category codes. (line 54)
+* phantomeqlabel: Equation reference hyperlinks.
+ (line 14)
+* phantomeqnumber: Equation reference hyperlinks.
+ (line 14)
+* previouseverydisplay: Formatting displays. (line 14)
+* printbetweencitations: Formatting citations.
+ (line 20)
+* printcitefinish: Formatting citations.
+ (line 15)
+* printcitenote: Formatting citations.
+ (line 26)
+* printcitestart: Formatting citations.
+ (line 15)
+* printitem: Formatting lists. (line 51)
+* printlistinglineno: Verbatim listing. (line 19)
+* printlistinglineno <1>: Verbatim listing. (line 27)
+* providecommand: Commands from LaTeX. (line 18)
+* quadcolumns: Multiple columns. (line 7)
+* raggedleft: Justification. (line 45)
+* raggedleftskip: Justification. (line 45)
+* raggedright: Justification. (line 45)
+* raggedright for index entries: Typesetting an index.
+ (line 45)
+* raise (hyperlink option): Options supported by all drivers.
+ (line 13)
+* raise (hyperlink option) <1>: Setting group options.
+ (line 33)
+* raw (destination type): Destination types for hypertex.
+ (line 12)
+* raw (destination type) <1>: Destination types for pdftex and dvipdfm.
+ (line 81)
+* raw (hyperlink type): Link types for hypertex.
+ (line 37)
+* raw (hyperlink type) <1>: Link types for pdftex and dvipdfm.
+ (line 65)
+* rbracechar: Category codes. (line 58)
+* readindexfile: Typesetting an index.
+ (line 6)
+* readindexfile (hyperlinks): Index hyperlinks. (line 9)
+* readtocfile: Reading the .toc file.
+ (line 6)
+* ref: Using generic references.
+ (line 16)
+* ref <1>: Hyperlinks (xhyper.tex).
+ (line 7)
+* ref (hyperlinks): Cross-reference hyperlinks.
+ (line 19)
+* refn: Using generic references.
+ (line 9)
+* refn (hyperlinks): Cross-reference hyperlinks.
+ (line 14)
+* refs: Using generic references.
+ (line 22)
+* refs (hyperlinks): Cross-reference hyperlinks.
+ (line 26)
+* refspace: Cross-reference hyperlinks.
+ (line 24)
+* refspace <1>: Page reference hyperlinks.
+ (line 10)
+* reftie: Cross-reference hyperlinks.
+ (line 16)
+* reftie <1>: Cross-reference hyperlinks.
+ (line 23)
+* reftie <2>: Equation reference hyperlinks.
+ (line 20)
+* renewcommand: Commands from LaTeX. (line 18)
+* repeat: Iteration. (line 42)
+* resetatcatcode: Environment for loading packages.
+ (line 35)
+* resetatcatcode <1>: Category codes. (line 23)
+* rewritetocfile (conditional): Reading the .toc file.
+ (line 26)
+* right (destination option): Destination types for pdftex and dvipdfm.
+ (line 66)
+* right (destination option) <1>: Destination options for pdftex and dvipdfm.
+ (line 64)
+* righteqnumbers: Displays. (line 23)
+* rightmargin: Margins. (line 17)
+* rotatebox: Hyperlinks (xhyper.tex).
+ (line 7)
+* rt: Arrows and morphisms.
+ (line 14)
+* sanitize: Converting to characters.
+ (line 22)
+* sarrowlength: Arrows and morphisms.
+ (line 28)
+* sarrowlength <1>: Commutative diagram parameters.
+ (line 17)
+* sc: Commands from LaTeX. (line 25)
+* see for index entries: Modifying index entries.
+ (line 36)
+* see for index entries <1>: Customizing indexing.
+ (line 62)
+* seealso for index entries: Modifying index entries.
+ (line 49)
+* seevariant: Customizing indexing.
+ (line 53)
+* setidxpagelistdelimiter: Page list and page range parsers.
+ (line 14)
+* setidxpagerangedelimiter: Page list and page range parsers.
+ (line 14)
+* setproperty: Properties. (line 13)
+* setuplistinghook: Verbatim listing. (line 13)
+* setuplistinghook <1>: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* sidx: Indexing commands. (line 8)
+* sidxmarked: Indexing commands. (line 29)
+* sidxname: Indexing commands. (line 19)
+* sidxsubmarked: Indexing commands. (line 40)
+* singlecolumn: Multiple columns. (line 9)
+* sline: Arrows and morphisms.
+ (line 23)
+* sline <1>: Arrows and morphisms.
+ (line 107)
+* SLiTeX: Logos. (line 11)
+* spaceskip, reset by \ragged...: Justification. (line 45)
+* special: Introduction to hyperlinks.
+ (line 9)
+* special ps: for dvips: Making PDF outlines. (line 27)
+* specialpathdelimiters (conditional): Paths. (line 28)
+* subeqnumber: Subequation references.
+ (line 15)
+* subitem in indexes: Typesetting an index.
+ (line 35)
+* subsubitem in indexes: Typesetting an index.
+ (line 35)
+* testfileexistence: Auxiliary files. (line 8)
+* TeX: Logos. (line 6)
+* textbf: Commands from LaTeX. (line 25)
+* timestamp: Time of day. (line 18)
+* timestring: Time of day. (line 16)
+* toc...entry: Writing the .toc file.
+ (line 9)
+* toc...entry <1>: Writing the .toc file.
+ (line 54)
+* tocfilebasename: Changing the .toc file's root name.
+ (line 10)
+* today: Time of day. (line 21)
+* top (destination option): Destination types for pdftex and dvipdfm.
+ (line 11)
+* top (destination option) <1>: Destination types for pdftex and dvipdfm.
+ (line 25)
+* top (destination option) <2>: Destination types for pdftex and dvipdfm.
+ (line 46)
+* top (destination option) <3>: Destination types for pdftex and dvipdfm.
+ (line 66)
+* top (destination option) <4>: Destination options for pdftex and dvipdfm.
+ (line 68)
+* topmargin: Margins. (line 17)
+* tracingall: Diagnostics. (line 8)
+* tracingboxes: Diagnostics. (line 16)
+* tracingoff: Diagnostics. (line 18)
+* triplecolumns: Multiple columns. (line 7)
+* tt: Packages known to work.
+ (line 90)
+* ttfamily: Packages known to work.
+ (line 86)
+* uncatcodespecials: Verbatim listing. (line 57)
+* uncatcodespecials <1>: Category codes. (line 49)
+* unorderedlist: Lists. (line 20)
+* unorderedlistdepth: Formatting lists. (line 41)
+* unorderedmarker: Formatting lists. (line 37)
+* url: Hyperlinks (xhyper.tex).
+ (line 7)
+* url (hyperlink type): Link types for hypertex.
+ (line 14)
+* url (hyperlink type) <1>: Link types for pdftex and dvipdfm.
+ (line 25)
+* url (hyperlinks): URL hyperlinks. (line 6)
+* usepackage: The \usepackage command.
+ (line 6)
+* varrowlength: Arrows and morphisms.
+ (line 28)
+* varrowlength <1>: Commutative diagram parameters.
+ (line 14)
+* vchannel: Commutative diagram parameters.
+ (line 39)
+* verbatim: Verbatim listing. (line 34)
+* verbatimescapechar: Verbatim listing. (line 47)
+* vgrid: Construction of commutative diagrams.
+ (line 108)
+* vgrid <1>: Commutative diagram parameters.
+ (line 51)
+* vline: Arrows and morphisms.
+ (line 82)
+* vmorphposn: Arrows and morphisms.
+ (line 33)
+* vmorphposn <1>: Commutative diagram parameters.
+ (line 26)
+* vmorphposndn: Arrows and morphisms.
+ (line 38)
+* vmorphposndn <1>: Commutative diagram parameters.
+ (line 28)
+* vmorphposnlft: Arrows and morphisms.
+ (line 40)
+* vmorphposnlft <1>: Commutative diagram parameters.
+ (line 29)
+* vmorphposnrt: Arrows and morphisms.
+ (line 39)
+* vmorphposnrt <1>: Commutative diagram parameters.
+ (line 28)
+* vmorphposnup: Arrows and morphisms.
+ (line 38)
+* vmorphposnup <1>: Commutative diagram parameters.
+ (line 28)
+* vpenalty: Mode-specific penalties.
+ (line 9)
+* vruledefaultwidth: Rules. (line 10)
+* width (destination option): Destination types for pdftex and dvipdfm.
+ (line 60)
+* width (destination option) <1>: Destination options for pdftex and dvipdfm.
+ (line 40)
+* width (hyperlink option): Link options for pdftex and dvipdfm.
+ (line 128)
+* writenumberedtocentry: Writing the .toc file.
+ (line 13)
+* writenumberedtocline: Writing the .toc file.
+ (line 36)
+* writetocentry: Writing the .toc file.
+ (line 7)
+* XeLaTeX: Logos. (line 11)
+* XeTeX: Logos. (line 11)
+* xrdef: Page references. (line 10)
+* xrdef (hyperlinks): Page reference hyperlinks.
+ (line 6)
+* xref: Page references. (line 14)
+* xref (hyperlinks): Page reference hyperlinks.
+ (line 10)
+* xrefn: Using generic references.
+ (line 10)
+* xrefn (hyperlinks): Cross-reference hyperlinks.
+ (line 14)
+* xrefpageword: Page references. (line 18)
+* xrefpageword <1>: Page reference hyperlinks.
+ (line 10)
+* xrefwarning conditional: Using generic references.
+ (line 14)
+* xrefwarningfalse: Citations. (line 78)
+* xrlabel: Converting to characters.
+ (line 6)
+* xspaceskip, reset by \ragged...: Justification. (line 45)
+* xyz (destination type): Destination types for hypertex.
+ (line 7)
+* xyz (destination type) <1>: Destination types for pdftex and dvipdfm.
+ (line 7)
+* zoom (destination option): Destination types for pdftex and dvipdfm.
+ (line 7)
+* zoom (destination option) <1>: Destination options for pdftex and dvipdfm.
+ (line 21)
+
+
+File: eplain.info, Node: Concept index, Prev: Macro index, Up: Top
+
+Concept index
+*************
+
+
+* Menu:
+
+* *-form of LaTeX commands: Commands from LaTeX. (line 18)
+* .aux file: Citations. (line 17)
+* .aux file <1>: Cross-references. (line 11)
+* .bbl file: Citations. (line 21)
+* .bib file: Citations. (line 20)
+* .bst files: Citations. (line 70)
+* .cls files: Loading LaTeX packages.
+ (line 6)
+* .eps files: Packages known to work.
+ (line 104)
+* .eps files <1>: Packages known to work.
+ (line 113)
+* .fmt file: Installation. (line 27)
+* .fmt file <1>: Invoking Eplain. (line 14)
+* .idx files: Indexing. (line 22)
+* .idx files <1>: Index hyperlinks. (line 14)
+* .ind files: Indexing. (line 26)
+* .ind files <1>: Index hyperlinks. (line 25)
+* .pdf files: Checking for PDF output.
+ (line 6)
+* .pdf files <1>: Packages known to work.
+ (line 104)
+* .pdf files <2>: Introduction to hyperlinks.
+ (line 13)
+* .ps files: Introduction to hyperlinks.
+ (line 13)
+* .sty files: Loading LaTeX packages.
+ (line 6)
+* .toc file: Contents. (line 10)
+* active characters: Category codes. (line 12)
+* after index terms: Customizing indexing.
+ (line 6)
+* alignments: Tables. (line 6)
+* all groups, specifying: Setting group types. (line 26)
+* allocation macros: Allocation macros. (line 6)
+* alphanumeric references: Citations. (line 128)
+* AMSLaTeX: Logos. (line 10)
+* amsppt.sty: Invoking Eplain. (line 92)
+* AMSTeX: Logos. (line 10)
+* AMSTeX conflicts: Invoking Eplain. (line 92)
+* arguments, ignoring: Macro arguments. (line 6)
+* arrows: Arrows and morphisms.
+ (line 6)
+* atom: Properties. (line 6)
+* autopict.sty: Packages known to work.
+ (line 12)
+* auxiliary files, existence of: Auxiliary files. (line 6)
+* avoiding boxed links: URL hyperlinks. (line 17)
+* avoiding boxed links <1>: Setting default types and options.
+ (line 25)
+* backslash character: Category codes. (line 15)
+* balancing of columns with \singlecolumn: Multiple columns. (line 11)
+* Berry, Karl: Introduction. (line 31)
+* beveled hyperlink border: Link options for pdftex and dvipdfm.
+ (line 25)
+* bibliographies: Citations. (line 6)
+* bibliography fonts: Formatting bibliographies.
+ (line 38)
+* bibliography items, extra space between: Formatting bibliographies.
+ (line 67)
+* bibliography, formatting the: Formatting bibliographies.
+ (line 6)
+* bibliography, hyperlinks: Citation hyperlinks. (line 11)
+* bibtex: Invoking Eplain. (line 103)
+* BibTeX: Citations. (line 9)
+* BibTeX <1>: Logos. (line 10)
+* black boxes: Boxes. (line 6)
+* bookmarks, making PDF: Making PDF outlines. (line 6)
+* Borceux, Francis: Construction of commutative diagrams.
+ (line 79)
+* border color, hyperlink: Link options for pdftex and dvipdfm.
+ (line 13)
+* border style, hyperlink: Link options for pdftex and dvipdfm.
+ (line 19)
+* border style, hyperlink <1>: Link options for pdftex and dvipdfm.
+ (line 25)
+* border width, hyperlink: Link options for pdftex and dvipdfm.
+ (line 49)
+* Bott, Raoul: Construction of commutative diagrams.
+ (line 13)
+* boxed links, avoiding: URL hyperlinks. (line 17)
+* boxed links, avoiding <1>: Setting default types and options.
+ (line 25)
+* boxes, open: Boxes. (line 12)
+* braces, inside index entries: Index entries with special characters.
+ (line 63)
+* brackets, inside index entries: Index entries with special characters.
+ (line 85)
+* Brockett, Roger W.: Construction of commutative diagrams.
+ (line 38)
+* Butterfly Lemma: Construction of commutative diagrams.
+ (line 121)
+* Carlisle, David: Loading LaTeX packages.
+ (line 14)
+* catcode of @: Environment for loading packages.
+ (line 35)
+* category codes: Category codes. (line 6)
+* centering: Justification. (line 6)
+* characters, converting to: Converting to characters.
+ (line 6)
+* characters, special: Verbatim listing. (line 57)
+* citations: Citations. (line 6)
+* citations, formatting: Formatting citations.
+ (line 6)
+* citations, hyperlinks: Citation hyperlinks. (line 6)
+* citations, undefined: Citations. (line 48)
+* cmtt8: Proofing index terms.
+ (line 12)
+* color: Packages known to work.
+ (line 25)
+* color, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* color, hyperlink border: Link options for pdftex and dvipdfm.
+ (line 13)
+* color, hyperlinks: URL hyperlinks. (line 17)
+* color, hyperlinks <1>: Options supported by all drivers.
+ (line 37)
+* color, hyperlinks <2>: Setting default types and options.
+ (line 25)
+* color, problems with pdfTeX: Packages known to work.
+ (line 30)
+* color.sty: Packages known to work.
+ (line 21)
+* color.sty <1>: URL hyperlinks. (line 18)
+* color.sty <2>: Hyperlink driver nolinks.
+ (line 34)
+* color.sty <3>: Setting default types and options.
+ (line 27)
+* color.sty <4>: Hyperlinks (xhyper.tex).
+ (line 7)
+* colored links: URL hyperlinks. (line 17)
+* colored links <1>: Options supported by all drivers.
+ (line 37)
+* colored links <2>: Setting default types and options.
+ (line 25)
+* column balancing with \singlecolumn: Multiple columns. (line 11)
+* column eject: Multiple columns. (line 14)
+* commas after index terms: Customizing indexing.
+ (line 6)
+* commas in cross-referencing index entries: Customizing indexing.
+ (line 62)
+* comments, highlighting in listings: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* commutative diagrams: Commutative diagrams.
+ (line 6)
+* contents: Contents. (line 6)
+* contents, and verbatim text: Writing the .toc file.
+ (line 49)
+* contents, hyperlinks: Contents hyperlinks. (line 6)
+* ConTeXt: Packages known to work.
+ (line 30)
+* continued index entries: Typesetting an index.
+ (line 35)
+* covering homotopy property: Construction of commutative diagrams.
+ (line 13)
+* cross-references: Cross-references. (line 6)
+* cross-references, defining general: Defining generic references.
+ (line 6)
+* cross-references, defining general <1>: Using generic references.
+ (line 6)
+* cross-references, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* cross-references, hyperlinks: Cross-reference hyperlinks.
+ (line 6)
+* cross-referencing index entries: Modifying index entries.
+ (line 36)
+* cross-referencing index entries <1>: Customizing indexing.
+ (line 62)
+* CTRL-L, and verbatim listing: Verbatim listing. (line 30)
+* cube: Construction of commutative diagrams.
+ (line 89)
+* customizing indexing: Customizing indexing.
+ (line 6)
+* dashed hyperlink border: Link options for pdftex and dvipdfm.
+ (line 19)
+* dashed hyperlink border <1>: Link options for pdftex and dvipdfm.
+ (line 25)
+* date: Time of day. (line 6)
+* default hyperlink options: Setting hyperlink types and options.
+ (line 6)
+* default hyperlink options <1>: Setting group types. (line 17)
+* default hyperlink type: Setting hyperlink types and options.
+ (line 6)
+* default hyperlink type <1>: Setting group types. (line 17)
+* defining general references: Defining generic references.
+ (line 6)
+* defining general references <1>: Using generic references.
+ (line 6)
+* definitions, global: Category codes. (line 37)
+* demo files: Demo files. (line 6)
+* destgroup: Implicit hyperlinks. (line 10)
+* destgroup options: Setting hyperlink types and options.
+ (line 12)
+* destgroup options <1>: Setting group options.
+ (line 6)
+* destgroup options, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* destgroup type: Setting hyperlink types and options.
+ (line 12)
+* destgroup type <1>: Setting group types. (line 6)
+* destgroup type, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* destgroup 'bib': Citation hyperlinks. (line 11)
+* destgroup 'definexref': Cross-reference hyperlinks.
+ (line 6)
+* destgroup 'eq': Equation reference hyperlinks.
+ (line 6)
+* destgroup 'foot': Footnote hyperlinks. (line 6)
+* destgroup 'footback': Footnote hyperlinks. (line 6)
+* destgroup 'idx': Index hyperlinks. (line 6)
+* destgroup 'li': List hyperlinks. (line 6)
+* destgroup 'xrdef': Page reference hyperlinks.
+ (line 6)
+* destination group: Implicit hyperlinks. (line 10)
+* destination options: Introduction to hyperlinks.
+ (line 105)
+* destination options, common: Options supported by all drivers.
+ (line 12)
+* destination options, dvipdfm: Destination options for pdftex and dvipdfm.
+ (line 6)
+* destination options, hypertex: Destination options for hypertex.
+ (line 6)
+* destination options, pdftex: Destination options for pdftex and dvipdfm.
+ (line 6)
+* destination type: Introduction to hyperlinks.
+ (line 88)
+* destination types, dvipdfm: Destination types for pdftex and dvipdfm.
+ (line 6)
+* destination types, hypertex: Destination types for hypertex.
+ (line 6)
+* destination types, pdftex: Destination types for pdftex and dvipdfm.
+ (line 6)
+* destinations, default options: Setting hyperlink types and options.
+ (line 6)
+* destinations, default options <1>: Setting group types. (line 17)
+* destinations, default type: Setting hyperlink types and options.
+ (line 6)
+* destinations, default type <1>: Setting group types. (line 17)
+* destinations, dimensions: Destination options for pdftex and dvipdfm.
+ (line 34)
+* destinations, dimensions <1>: Destination options for pdftex and dvipdfm.
+ (line 37)
+* destinations, dimensions <2>: Destination options for pdftex and dvipdfm.
+ (line 40)
+* destinations, dimensions <3>: Destination options for pdftex and dvipdfm.
+ (line 56)
+* destinations, dimensions <4>: Destination options for pdftex and dvipdfm.
+ (line 60)
+* destinations, dimensions <5>: Destination options for pdftex and dvipdfm.
+ (line 64)
+* destinations, dimensions <6>: Destination options for pdftex and dvipdfm.
+ (line 68)
+* destinations, disabling: Hyperlink driver nolinks.
+ (line 6)
+* destinations, disabling <1>: Turning hyperlinks on/off.
+ (line 6)
+* destinations, group options: Setting hyperlink types and options.
+ (line 12)
+* destinations, group options <1>: Setting group options.
+ (line 6)
+* destinations, group options, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* destinations, group type: Setting hyperlink types and options.
+ (line 12)
+* destinations, group type <1>: Setting group types. (line 6)
+* destinations, group type, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* destinations, in another file: Link types for hypertex.
+ (line 21)
+* destinations, in another file <1>: Link types for pdftex and dvipdfm.
+ (line 40)
+* destinations, in another file <2>: Link types for pdftex and dvipdfm.
+ (line 52)
+* destinations, large operators: Options supported by all drivers.
+ (line 27)
+* destinations, large operators <1>: Setting group options.
+ (line 33)
+* destinations, magnification: Destination options for pdftex and dvipdfm.
+ (line 21)
+* destinations, named: Link types for hypertex.
+ (line 7)
+* destinations, named <1>: Link types for pdftex and dvipdfm.
+ (line 18)
+* destinations, numbered: Link types for pdftex and dvipdfm.
+ (line 92)
+* destinations, page: Link types for pdftex and dvipdfm.
+ (line 31)
+* destinations, raising: Options supported by all drivers.
+ (line 13)
+* destinations, URL: Link types for hypertex.
+ (line 14)
+* destinations, URL <1>: Link types for pdftex and dvipdfm.
+ (line 25)
+* detecting numbers: \ifinteger and \isinteger.
+ (line 6)
+* diagnostics: Diagnostics. (line 6)
+* Diagram, macros for LaTeX: Construction of commutative diagrams.
+ (line 79)
+* dimensions, hyperlink: Link options for pdftex and dvipdfm.
+ (line 122)
+* dimensions, hyperlink <1>: Link options for pdftex and dvipdfm.
+ (line 125)
+* dimensions, hyperlink <2>: Link options for pdftex and dvipdfm.
+ (line 128)
+* dimensions, hyperlink destination: Destination options for pdftex and dvipdfm.
+ (line 34)
+* dimensions, hyperlink destination <1>: Destination options for pdftex and dvipdfm.
+ (line 37)
+* dimensions, hyperlink destination <2>: Destination options for pdftex and dvipdfm.
+ (line 40)
+* dimensions, hyperlink destination <3>: Destination options for pdftex and dvipdfm.
+ (line 56)
+* dimensions, hyperlink destination <4>: Destination options for pdftex and dvipdfm.
+ (line 60)
+* dimensions, hyperlink destination <5>: Destination options for pdftex and dvipdfm.
+ (line 64)
+* dimensions, hyperlink destination <6>: Destination options for pdftex and dvipdfm.
+ (line 68)
+* disabling hyperlinks: Hyperlink driver nolinks.
+ (line 6)
+* disabling hyperlinks <1>: Turning hyperlinks on/off.
+ (line 6)
+* disabling indexes: Indexing. (line 53)
+* displayed math and hyperlinks: Options supported by all drivers.
+ (line 27)
+* displayed math and hyperlinks <1>: Setting group options.
+ (line 33)
+* displays, left-justifying: Displays. (line 6)
+* do...while loops: Iteration. (line 6)
+* double column output: Multiple columns. (line 6)
+* double columns in indexes: Typesetting an index.
+ (line 24)
+* draft, option for graphics.sty: Packages known to work.
+ (line 82)
+* driver dvipdfm: Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* driver hypertex: Hyperlink driver hypertex.
+ (line 6)
+* driver nolinks: Hyperlink driver nolinks.
+ (line 6)
+* driver pdftex: Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* drivers, hyperlink: Introduction to hyperlinks.
+ (line 6)
+* dvipdfm: Introduction to hyperlinks.
+ (line 36)
+* dvipdfm <1>: Hyperlink driver hypertex.
+ (line 13)
+* dvipdfm <2>: Hyperlink driver hypertex.
+ (line 47)
+* dvipdfm, destination options: Destination options for pdftex and dvipdfm.
+ (line 6)
+* dvipdfm, destination types: Destination types for pdftex and dvipdfm.
+ (line 6)
+* dvipdfm, hyperlink driver: Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* dvipdfm, link options: Link options for pdftex and dvipdfm.
+ (line 6)
+* dvipdfm, link types: Link types for pdftex and dvipdfm.
+ (line 6)
+* dvips: Hyperlink driver hypertex.
+ (line 13)
+* dvips <1>: Hyperlink driver hypertex.
+ (line 32)
+* dvips, making PDF outlines for: Making PDF outlines. (line 16)
+* Eijkhout, Victor: Iteration. (line 61)
+* eject in multicolumns: Multiple columns. (line 14)
+* electronic mail addresses, breaking: Paths. (line 6)
+* electronic mail addresses, breaking <1>: Packages known to work.
+ (line 134)
+* empty argument, checking for: \ifempty. (line 6)
+* empty equation labels: Equation references. (line 22)
+* empty equation labels, referring to: Equation references. (line 27)
+* empty string, checking for: \ifempty. (line 6)
+* Encapsulated PostScript: Packages known to work.
+ (line 104)
+* Encapsulated PostScript <1>: Packages known to work.
+ (line 113)
+* environments, user-defined: User-defined environments.
+ (line 6)
+* Eplain, installing: Installation. (line 6)
+* Eplain, invoking: Invoking Eplain. (line 6)
+* Eplain, purpose of: Introduction. (line 6)
+* Eplain, upgrading: Installation. (line 6)
+* eplain.aux: Installation. (line 40)
+* eplain.fmt: Installation. (line 27)
+* EPS: Packages known to work.
+ (line 104)
+* EPS <1>: Packages known to work.
+ (line 113)
+* epstopdf: Packages known to work.
+ (line 104)
+* epstopdf.sty: Packages known to work.
+ (line 102)
+* equation labels, characters valid in: Equation references. (line 54)
+* equation numbers, formatting of: Formatting equation references.
+ (line 6)
+* equation numbers, left-alignment: Displays. (line 6)
+* equations, giving numbers to all: Equation references. (line 22)
+* equations, groups of: Subequation references.
+ (line 6)
+* equations, hyperlinks: Equation reference hyperlinks.
+ (line 6)
+* equations, numbering: Equation references. (line 6)
+* equations, references to: Equation references. (line 6)
+* error messages: Diagnostics. (line 24)
+* error on \input: Environment for loading packages.
+ (line 41)
+* escape character, changing verbatim: Verbatim listing. (line 47)
+* eTeX: Logos. (line 10)
+* exact index hyperlinks: Exact destinations for index terms.
+ (line 28)
+* expansion, one-level: \expandonce. (line 6)
+* explicit hyperlinks: Explicit hyperlinks. (line 6)
+* explicit hyperlinks, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* ExTeX: Logos. (line 10)
+* file, hyperlink to: Link types for hypertex.
+ (line 21)
+* file, hyperlink to <1>: Link types for pdftex and dvipdfm.
+ (line 40)
+* file, hyperlink to <2>: Link types for pdftex and dvipdfm.
+ (line 52)
+* file: links: General hyperlinks. (line 37)
+* filenames, breaking: Paths. (line 6)
+* filenames, breaking <1>: Packages known to work.
+ (line 134)
+* files, verbatim listing of: Verbatim listing. (line 6)
+* files, verbatim listing of, demo: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* filtering index entries with hyperlinks: Exact destinations for index terms.
+ (line 33)
+* footnotes, hyperlinks: Footnote hyperlinks. (line 6)
+* footnotes, numbered: Footnotes. (line 6)
+* for loops: Iteration. (line 6)
+* form feed character, and verbatim listing: Verbatim listing.
+ (line 30)
+* format file: Installation. (line 27)
+* formatting index entries: Typesetting an index.
+ (line 35)
+* fractions: Fractions. (line 6)
+* Ghostscript: Hyperlink driver hypertex.
+ (line 13)
+* Ghostscript <1>: Hyperlink driver hypertex.
+ (line 35)
+* gobbling arguments: Macro arguments. (line 6)
+* golden mean: Construction of commutative diagrams.
+ (line 59)
+* golden mean <1>: Construction of commutative diagrams.
+ (line 59)
+* Graham, Ronald L.: Citations. (line 91)
+* graphics collection, LaTeX: Loading LaTeX packages.
+ (line 14)
+* graphics collection, LaTeX <1>: Packages known to work.
+ (line 25)
+* graphics collection, LaTeX <2>: Hyperlink driver nolinks.
+ (line 34)
+* graphics collection, LaTeX, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* graphics, omitting typesetting of: Packages known to work.
+ (line 82)
+* graphics, problems with pdfTeX: Packages known to work.
+ (line 30)
+* graphics.sty: Packages known to work.
+ (line 22)
+* graphicx.sty: Packages known to work.
+ (line 23)
+* graphicx.sty <1>: Hyperlinks (xhyper.tex).
+ (line 7)
+* grid: Construction of commutative diagrams.
+ (line 79)
+* group option list: Setting group options.
+ (line 48)
+* group options, hyperlink: Setting hyperlink types and options.
+ (line 12)
+* group options, hyperlink <1>: Setting group options.
+ (line 6)
+* group options, hyperlink, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* group type, hyperlink: Setting hyperlink types and options.
+ (line 12)
+* group type, hyperlink <1>: Setting group types. (line 6)
+* group type, hyperlink, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* group '' (empty): Setting group types. (line 17)
+* group '*': Setting group types. (line 26)
+* group 'bib': Citation hyperlinks. (line 11)
+* group 'cite': Citation hyperlinks. (line 6)
+* group 'definexref': Cross-reference hyperlinks.
+ (line 6)
+* group 'eq': Equation reference hyperlinks.
+ (line 6)
+* group 'eq' <1>: Equation reference hyperlinks.
+ (line 20)
+* group 'eq' <2>: Setting group options.
+ (line 34)
+* group 'foot': Footnote hyperlinks. (line 6)
+* group 'footback': Footnote hyperlinks. (line 6)
+* group 'hrefext': General hyperlinks. (line 21)
+* group 'hrefint': General hyperlinks. (line 12)
+* group 'idx': Index hyperlinks. (line 6)
+* group 'li': List hyperlinks. (line 6)
+* group 'ref': Cross-reference hyperlinks.
+ (line 11)
+* group 'url': URL hyperlinks. (line 6)
+* group 'xrdef': Page reference hyperlinks.
+ (line 6)
+* group 'xref': Page reference hyperlinks.
+ (line 10)
+* group, destination: Implicit hyperlinks. (line 10)
+* group, disabling hyperlinks: Turning hyperlinks on/off for a group.
+ (line 6)
+* group, link: Implicit hyperlinks. (line 10)
+* group, preserving option list: Setting group options.
+ (line 21)
+* groups, specifying all: Setting group types. (line 26)
+* hanging on \input: Environment for loading packages.
+ (line 41)
+* help messages: Diagnostics. (line 24)
+* highlight modes, hyperlink: Link options for pdftex and dvipdfm.
+ (line 69)
+* highlighting: Packages known to work.
+ (line 124)
+* highlighting, in listings: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* Ho"ppner, Klaus: Packages known to work.
+ (line 96)
+* hooks: Hooks. (line 6)
+* hyperlink border color: Link options for pdftex and dvipdfm.
+ (line 13)
+* hyperlink color: URL hyperlinks. (line 17)
+* hyperlink color <1>: Options supported by all drivers.
+ (line 37)
+* hyperlink color <2>: Setting default types and options.
+ (line 25)
+* hyperlink destination, dimensions: Destination options for pdftex and dvipdfm.
+ (line 34)
+* hyperlink destination, dimensions <1>: Destination options for pdftex and dvipdfm.
+ (line 37)
+* hyperlink destination, dimensions <2>: Destination options for pdftex and dvipdfm.
+ (line 40)
+* hyperlink destination, dimensions <3>: Destination options for pdftex and dvipdfm.
+ (line 56)
+* hyperlink destination, dimensions <4>: Destination options for pdftex and dvipdfm.
+ (line 60)
+* hyperlink destination, dimensions <5>: Destination options for pdftex and dvipdfm.
+ (line 64)
+* hyperlink destination, dimensions <6>: Destination options for pdftex and dvipdfm.
+ (line 68)
+* hyperlink destination, magnification: Destination options for pdftex and dvipdfm.
+ (line 21)
+* hyperlink destination, named: Link types for hypertex.
+ (line 7)
+* hyperlink destination, named <1>: Link types for pdftex and dvipdfm.
+ (line 18)
+* hyperlink destination, numbered: Link types for pdftex and dvipdfm.
+ (line 92)
+* hyperlink destination, page: Link types for pdftex and dvipdfm.
+ (line 31)
+* hyperlink destination, raising: Options supported by all drivers.
+ (line 13)
+* hyperlink dimensions: Link options for pdftex and dvipdfm.
+ (line 122)
+* hyperlink dimensions <1>: Link options for pdftex and dvipdfm.
+ (line 125)
+* hyperlink dimensions <2>: Link options for pdftex and dvipdfm.
+ (line 128)
+* hyperlink driver dvipdfm: Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* hyperlink driver hypertex: Hyperlink driver hypertex.
+ (line 6)
+* hyperlink driver nolinks: Hyperlink driver nolinks.
+ (line 6)
+* hyperlink driver pdftex: Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* hyperlink drivers: Introduction to hyperlinks.
+ (line 6)
+* hyperlink group, disabling hyperlinks: Turning hyperlinks on/off for a group.
+ (line 6)
+* hyperlink group, preserving option list: Setting group options.
+ (line 21)
+* hyperlink options, common: Options supported by all drivers.
+ (line 6)
+* hyperlinks, bibliography: Citation hyperlinks. (line 11)
+* hyperlinks, border style: Link options for pdftex and dvipdfm.
+ (line 19)
+* hyperlinks, border style <1>: Link options for pdftex and dvipdfm.
+ (line 25)
+* hyperlinks, border width: Link options for pdftex and dvipdfm.
+ (line 49)
+* hyperlinks, citations: Citation hyperlinks. (line 6)
+* hyperlinks, cross-references: Cross-reference hyperlinks.
+ (line 6)
+* hyperlinks, default options: Setting hyperlink types and options.
+ (line 6)
+* hyperlinks, default options <1>: Setting group types. (line 17)
+* hyperlinks, default type: Setting hyperlink types and options.
+ (line 6)
+* hyperlinks, default type <1>: Setting group types. (line 17)
+* hyperlinks, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* hyperlinks, disabling: Hyperlink driver nolinks.
+ (line 6)
+* hyperlinks, disabling <1>: Turning hyperlinks on/off.
+ (line 6)
+* hyperlinks, equations: Equation reference hyperlinks.
+ (line 6)
+* hyperlinks, explicit: Explicit hyperlinks. (line 6)
+* hyperlinks, explicit, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* hyperlinks, filtering index entries: Exact destinations for index terms.
+ (line 33)
+* hyperlinks, footnotes: Footnote hyperlinks. (line 6)
+* hyperlinks, group option list: Setting group options.
+ (line 48)
+* hyperlinks, group options: Setting hyperlink types and options.
+ (line 12)
+* hyperlinks, group options <1>: Setting group options.
+ (line 6)
+* hyperlinks, group options, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* hyperlinks, group type: Setting hyperlink types and options.
+ (line 12)
+* hyperlinks, group type <1>: Setting group types. (line 6)
+* hyperlinks, highlight mode: Link options for pdftex and dvipdfm.
+ (line 69)
+* hyperlinks, implicit: Implicit hyperlinks. (line 6)
+* hyperlinks, implicit, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* hyperlinks, index: Index hyperlinks. (line 6)
+* hyperlinks, index destination placement: Choosing destination placement.
+ (line 6)
+* hyperlinks, index, exact: Exact destinations for index terms.
+ (line 28)
+* hyperlinks, large operators: Options supported by all drivers.
+ (line 27)
+* hyperlinks, large operators <1>: Setting group options.
+ (line 33)
+* hyperlinks, lists: List hyperlinks. (line 6)
+* hyperlinks, opening in a new window: Link options for pdftex and dvipdfm.
+ (line 90)
+* hyperlinks, page references: Page reference hyperlinks.
+ (line 6)
+* hyperlinks, preserving page-breaking: Hyperlink driver nolinks.
+ (line 6)
+* hyperlinks, preserving spacing: Hyperlink driver nolinks.
+ (line 6)
+* hyperlinks, see and see also index entries: Hyperlinks in see and see also entries.
+ (line 6)
+* hyperlinks, table of contents: Contents hyperlinks. (line 6)
+* hyperlinks, to another file: Link types for hypertex.
+ (line 21)
+* hyperlinks, to another file <1>: Link types for pdftex and dvipdfm.
+ (line 40)
+* hyperlinks, to another file <2>: Link types for pdftex and dvipdfm.
+ (line 52)
+* hyperlinks, URL: General hyperlinks. (line 20)
+* hyperlinks, URL <1>: URL hyperlinks. (line 6)
+* hyperlinks, URL <2>: Link types for hypertex.
+ (line 14)
+* hyperlinks, URL <3>: Link types for pdftex and dvipdfm.
+ (line 25)
+* hyperref.sty: Packages known not to work.
+ (line 9)
+* hypertex, destination options: Destination options for hypertex.
+ (line 6)
+* hypertex, destination types: Destination types for hypertex.
+ (line 6)
+* hypertex, hyperlink driver: Hyperlink driver hypertex.
+ (line 6)
+* hypertex, link options: Link options for hypertex.
+ (line 6)
+* hypertex, link types: Link types for hypertex.
+ (line 6)
+* hypertext links: Hyperlinks. (line 6)
+* identifying numbers: \ifinteger and \isinteger.
+ (line 6)
+* idxuniq: Exact destinations for index terms.
+ (line 33)
+* ifpdf.sty: Checking for PDF output.
+ (line 24)
+* ignoring arguments: Macro arguments. (line 6)
+* implicit hyperlinks: Implicit hyperlinks. (line 6)
+* implicit hyperlinks, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* inaccessible macros: Category codes. (line 19)
+* index entries and ranges: Modifying index entries.
+ (line 22)
+* index entries containing braces: Index entries with special characters.
+ (line 63)
+* index entries containing brackets: Index entries with special characters.
+ (line 85)
+* index entries with special characters: Index entries with special characters.
+ (line 6)
+* index entries' page numbers, modifying: Modifying index entries.
+ (line 6)
+* index entries, and cross-referencing: Modifying index entries.
+ (line 36)
+* index entries, and cross-referencing <1>: Customizing indexing.
+ (line 62)
+* index entries, proofing: Proofing index terms.
+ (line 6)
+* index entries, with verbatim text: Index entries with special characters.
+ (line 40)
+* index entry continuations: Typesetting an index.
+ (line 35)
+* index entry formatting: Typesetting an index.
+ (line 35)
+* index entry general sorting: Indexing commands. (line 50)
+* index fonts: Typesetting an index.
+ (line 24)
+* index groupings: Typesetting an index.
+ (line 54)
+* index hyperlink: Index hyperlinks. (line 6)
+* index typesetting: Typesetting an index.
+ (line 6)
+* index, and verbatim text: Index entries with special characters.
+ (line 40)
+* index, choosing destination placement: Choosing destination placement.
+ (line 6)
+* index, destination placement: Choosing destination placement.
+ (line 6)
+* index, exact hyperlinks: Exact destinations for index terms.
+ (line 28)
+* index, hyperlinks in see and see also entries: Hyperlinks in see and see also entries.
+ (line 6)
+* index, parsing page numbers: Page destinations for index terms.
+ (line 32)
+* index, placement of destinations: Choosing destination placement.
+ (line 6)
+* index, selecting destination placement: Choosing destination placement.
+ (line 6)
+* index, underlining page numbers: Page list and page range parsers.
+ (line 26)
+* indexes, disabling: Indexing. (line 53)
+* indexes, multiple: Indexing. (line 35)
+* indexing: Indexing. (line 6)
+* indexing and trailing spaces: Indexing terms. (line 20)
+* indexing commands: Indexing commands. (line 6)
+* indexing terms: Indexing terms. (line 6)
+* insertion classes: Multiple columns. (line 38)
+* inset hyperlink border: Link options for pdftex and dvipdfm.
+ (line 25)
+* installation: Installation. (line 6)
+* integers, detecting: \ifinteger and \isinteger.
+ (line 6)
+* italic correction: Formatting bibliographies.
+ (line 45)
+* item labels, changing: Formatting lists. (line 53)
+* iteration: Iteration. (line 6)
+* justification: Justification. (line 6)
+* Knuth, Donald Ervin: Citations. (line 91)
+* Knuth, Donald Ervin <1>: Category codes. (line 7)
+* labels on items, changing: Formatting lists. (line 53)
+* labels, characters valid in: Cross-references. (line 20)
+* labels, empty equation: Equation references. (line 22)
+* labels, empty equation, referring to: Equation references. (line 27)
+* Lamport, Leslie: Introduction. (line 15)
+* LAMSTeX: Logos. (line 11)
+* Lang, Serge: Arrows and morphisms.
+ (line 126)
+* Lang, Serge <1>: Construction of commutative diagrams.
+ (line 121)
+* large operators and hyperlinks: Options supported by all drivers.
+ (line 27)
+* large operators and hyperlinks <1>: Setting group options.
+ (line 33)
+* LaTeX: Introduction. (line 15)
+* LaTeX <1>: Citations. (line 10)
+* LaTeX <2>: Logos. (line 11)
+* LaTeX <3>: Slanted lines and vectors.
+ (line 7)
+* LaTeX commands, in btxmac.tex: Commands from LaTeX. (line 6)
+* LaTeX graphics collection: Loading LaTeX packages.
+ (line 14)
+* LaTeX graphics collection <1>: Packages known to work.
+ (line 25)
+* LaTeX graphics collection <2>: Hyperlink driver nolinks.
+ (line 34)
+* LaTeX graphics collection, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* LaTeX packages: Loading LaTeX packages.
+ (line 6)
+* LaTeX packages <1>: Packages known to work.
+ (line 6)
+* LaTeX packages <2>: Packages known not to work.
+ (line 6)
+* LaTeX packages, restoring \input: Environment for loading packages.
+ (line 24)
+* left-alignment of equation numbers: Displays. (line 6)
+* left-justification: Justification. (line 6)
+* left-justification of displays: Displays. (line 6)
+* letterspacing: Packages known to work.
+ (line 124)
+* linear systems theory: Construction of commutative diagrams.
+ (line 38)
+* lines: Slanted lines and vectors.
+ (line 15)
+* link group: Implicit hyperlinks. (line 10)
+* link options: Introduction to hyperlinks.
+ (line 105)
+* link options, common: Options supported by all drivers.
+ (line 35)
+* link options, dvipdfm: Link options for pdftex and dvipdfm.
+ (line 6)
+* link options, hypertex: Link options for hypertex.
+ (line 6)
+* link options, pdftex: Link options for pdftex and dvipdfm.
+ (line 6)
+* link type: Introduction to hyperlinks.
+ (line 88)
+* link types, dvipdfm: Link types for pdftex and dvipdfm.
+ (line 6)
+* link types, hypertex: Link types for hypertex.
+ (line 6)
+* link types, pdftex: Link types for pdftex and dvipdfm.
+ (line 6)
+* link, group options: Setting hyperlink types and options.
+ (line 12)
+* link, group options <1>: Setting group options.
+ (line 6)
+* link, group options, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* link, group type: Setting hyperlink types and options.
+ (line 12)
+* link, group type <1>: Setting group types. (line 6)
+* linkgroup: Implicit hyperlinks. (line 10)
+* linkgroup options: Setting hyperlink types and options.
+ (line 12)
+* linkgroup options <1>: Setting group options.
+ (line 6)
+* linkgroup options, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* linkgroup type: Setting hyperlink types and options.
+ (line 12)
+* linkgroup type <1>: Setting group types. (line 6)
+* linkgroup 'cite': Citation hyperlinks. (line 6)
+* linkgroup 'eq': Equation reference hyperlinks.
+ (line 20)
+* linkgroup 'eq' <1>: Setting group options.
+ (line 34)
+* linkgroup 'foot': Footnote hyperlinks. (line 6)
+* linkgroup 'footback': Footnote hyperlinks. (line 6)
+* linkgroup 'hrefext': General hyperlinks. (line 21)
+* linkgroup 'hrefint': General hyperlinks. (line 12)
+* linkgroup 'idx': Index hyperlinks. (line 6)
+* linkgroup 'ref': Cross-reference hyperlinks.
+ (line 11)
+* linkgroup 'url': URL hyperlinks. (line 6)
+* linkgroup 'xref': Page reference hyperlinks.
+ (line 10)
+* links, hypertext: Hyperlinks. (line 6)
+* list of figures: Alternative contents files.
+ (line 6)
+* list of tables: Alternative contents files.
+ (line 6)
+* listing files: Verbatim listing. (line 6)
+* listing files, demo: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* lists: Lists. (line 6)
+* lists, formatting: Formatting lists. (line 6)
+* lists, hyperlinks: List hyperlinks. (line 6)
+* loading packages, environment for: Environment for loading packages.
+ (line 6)
+* logos: Logos. (line 6)
+* lookahead without spaces: \futurenonspacelet. (line 6)
+* loops: Iteration. (line 6)
+* lscommnt.tex: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* magnification, hyperlink destination: Destination options for pdftex and dvipdfm.
+ (line 21)
+* makeindex: Invoking Eplain. (line 103)
+* makeindex <1>: Indexing. (line 14)
+* makeindex <2>: Index hyperlinks. (line 12)
+* margins, changing: Margins. (line 6)
+* margins, index terms in: Proofing index terms.
+ (line 6)
+* mathematics displays, formatting: Displays. (line 6)
+* mathematics displays, hyperlinks: Options supported by all drivers.
+ (line 27)
+* mathematics displays, hyperlinks <1>: Setting group options.
+ (line 33)
+* Metafont: Logos. (line 11)
+* microtype.sty: Packages known not to work.
+ (line 16)
+* miniltx.tex: Loading LaTeX packages.
+ (line 14)
+* minimal realizations: Construction of commutative diagrams.
+ (line 38)
+* modifying index entries' page numbers: Modifying index entries.
+ (line 6)
+* morphisms: Arrows and morphisms.
+ (line 6)
+* multiple column output: Multiple columns. (line 6)
+* multiple indexes: Indexing. (line 35)
+* named destination: Link types for hypertex.
+ (line 7)
+* named destination <1>: Link types for pdftex and dvipdfm.
+ (line 18)
+* names, of TeX variants: Logos. (line 6)
+* new window, opening hyperlink in: Link options for pdftex and dvipdfm.
+ (line 90)
+* newlinechar: Diagnostics. (line 26)
+* newlines, obeying: Obeying spaces. (line 6)
+* nolinks, hyperlink driver: Hyperlink driver nolinks.
+ (line 6)
+* numbered destination: Link types for pdftex and dvipdfm.
+ (line 92)
+* numbered lists: Lists. (line 6)
+* numbered references: Citations. (line 91)
+* numbers, detecting: \ifinteger and \isinteger.
+ (line 6)
+* numbers, written form of: Writing out numbers. (line 6)
+* Oberdiek, Heiko: Checking for PDF output.
+ (line 24)
+* omitting hyperlinks: Hyperlink driver nolinks.
+ (line 6)
+* omitting hyperlinks <1>: Turning hyperlinks on/off.
+ (line 6)
+* omitting typesetting of graphics: Packages known to work.
+ (line 82)
+* open boxes: Boxes. (line 12)
+* option list, group: Setting group options.
+ (line 48)
+* option list, preserving for group: Setting group options.
+ (line 21)
+* options, destination, common: Options supported by all drivers.
+ (line 12)
+* options, destination, dvipdfm: Destination options for pdftex and dvipdfm.
+ (line 6)
+* options, destination, hypertex: Destination options for hypertex.
+ (line 6)
+* options, destination, pdftex: Destination options for pdftex and dvipdfm.
+ (line 6)
+* options, link and destination: Introduction to hyperlinks.
+ (line 105)
+* options, link, common: Options supported by all drivers.
+ (line 35)
+* options, link, dvipdfm: Link options for pdftex and dvipdfm.
+ (line 6)
+* options, link, hypertex: Link options for hypertex.
+ (line 6)
+* options, link, pdftex: Link options for pdftex and dvipdfm.
+ (line 6)
+* ordered list: Lists. (line 6)
+* outlines, making PDF: Making PDF outlines. (line 6)
+* output routine and index proofing: Proofing index terms.
+ (line 28)
+* overstriking: Packages known to work.
+ (line 124)
+* packages, LaTeX: Loading LaTeX packages.
+ (line 6)
+* packages, LaTeX <1>: Packages known to work.
+ (line 6)
+* packages, LaTeX <2>: Packages known not to work.
+ (line 6)
+* page destination: Link types for pdftex and dvipdfm.
+ (line 31)
+* page list, parsing: Page destinations for index terms.
+ (line 32)
+* page range, parsing: Page destinations for index terms.
+ (line 32)
+* page reference hyperlink: Page reference hyperlinks.
+ (line 6)
+* page-breaking, preserving with hyperlinks: Hyperlink driver nolinks.
+ (line 6)
+* parsing page numbers: Page destinations for index terms.
+ (line 32)
+* Patashnik, Oren: Citations. (line 9)
+* pathnames, breaking: Paths. (line 6)
+* pathnames, breaking <1>: Packages known to work.
+ (line 134)
+* PDF: Packages known to work.
+ (line 104)
+* PDF outlines (a.k.a. bookmarks): Making PDF outlines. (line 6)
+* PDF output: Checking for PDF output.
+ (line 6)
+* pdftex: Invoking Eplain. (line 114)
+* pdftex <1>: Checking for PDF output.
+ (line 6)
+* pdftex <2>: Introduction to hyperlinks.
+ (line 35)
+* pdftex, destination options: Destination options for pdftex and dvipdfm.
+ (line 6)
+* pdftex, destination types: Destination types for pdftex and dvipdfm.
+ (line 6)
+* pdftex, hyperlink driver: Hyperlink drivers pdftex and dvipdfm.
+ (line 6)
+* pdftex, link options: Link options for pdftex and dvipdfm.
+ (line 6)
+* pdftex, link types: Link types for pdftex and dvipdfm.
+ (line 6)
+* pdftex, making PDF outlines for: Making PDF outlines. (line 16)
+* pdfTeX, problems using color and graphics: Packages known to work.
+ (line 30)
+* pdfTeX, problems with supp-mis.tex: Packages known to work.
+ (line 30)
+* pict2e.sty: Packages known not to work.
+ (line 19)
+* picture mode: Packages known to work.
+ (line 14)
+* picture mode <1>: Slanted lines and vectors.
+ (line 7)
+* Portable Document Format: Packages known to work.
+ (line 104)
+* PostScript point: Destination types for pdftex and dvipdfm.
+ (line 66)
+* PostScript point <1>: Destination options for pdftex and dvipdfm.
+ (line 50)
+* PostScript point <2>: Link options for pdftex and dvipdfm.
+ (line 49)
+* proofing index terms: Proofing index terms.
+ (line 6)
+* properties: Properties. (line 6)
+* ps2pdf: Hyperlink driver hypertex.
+ (line 14)
+* ps2pdf <1>: Hyperlink driver hypertex.
+ (line 35)
+* psfrag.sty: Packages known to work.
+ (line 111)
+* quadruple column output: Multiple columns. (line 6)
+* Rahtz, Sebastian: Loading LaTeX packages.
+ (line 14)
+* raising hyperlink destinations: Options supported by all drivers.
+ (line 13)
+* raising hyperlink destinations <1>: Setting group options.
+ (line 33)
+* ranges and index entry: Modifying index entries.
+ (line 22)
+* recognizing numbers: \ifinteger and \isinteger.
+ (line 6)
+* rectangles: Boxes. (line 6)
+* references, alphanumeric: Citations. (line 128)
+* references, defining general: Defining generic references.
+ (line 6)
+* references, defining general <1>: Using generic references.
+ (line 6)
+* references, numbered: Citations. (line 91)
+* register allocation: Allocation macros. (line 6)
+* restoring \input, LaTeX packages: Environment for loading packages.
+ (line 24)
+* return character: Category codes. (line 40)
+* right-justification: Justification. (line 6)
+* rms: Introduction. (line 16)
+* rotation: Packages known to work.
+ (line 25)
+* rotation, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* rule thickness: Rules. (line 7)
+* run: links: General hyperlinks. (line 38)
+* scaling: Packages known to work.
+ (line 25)
+* scaling, demo: Hyperlinks (xhyper.tex).
+ (line 7)
+* sed: Customizing indexing.
+ (line 64)
+* see also index entries and hyperlinks: Hyperlinks in see and see also entries.
+ (line 6)
+* see also index entries and sorting: Customizing indexing.
+ (line 49)
+* see, and index entries: Modifying index entries.
+ (line 36)
+* see, and index entries <1>: Customizing indexing.
+ (line 62)
+* see, and index entries, hyperlinks: Hyperlinks in see and see also entries.
+ (line 6)
+* silent indexing: Indexing terms. (line 6)
+* skipping tokens: \ifundefined. (line 10)
+* skipping tokens <1>: \ifempty. (line 12)
+* SLiTeX: Logos. (line 11)
+* Snake Lemma: Arrows and morphisms.
+ (line 130)
+* solid hyperlink border: Link options for pdftex and dvipdfm.
+ (line 25)
+* sorting an index: Indexing. (line 6)
+* sorting of index entries: Indexing commands. (line 50)
+* soul.sty: Packages known to work.
+ (line 122)
+* space above index entries: Typesetting an index.
+ (line 35)
+* spaces, ignoring: \futurenonspacelet. (line 6)
+* spaces, obeying: Obeying spaces. (line 6)
+* spaces, trailing and indexing commands: Indexing terms. (line 20)
+* spacing out: Packages known to work.
+ (line 124)
+* spacing, preserving with hyperlinks: Hyperlink driver nolinks.
+ (line 6)
+* special characters: Verbatim listing. (line 57)
+* special characters, in index entries: Index entries with special characters.
+ (line 6)
+* special characters, in table of contents: Writing the .toc file.
+ (line 49)
+* Stallman, Richard: Introduction. (line 16)
+* striking out: Packages known to work.
+ (line 124)
+* style, hyperlink border: Link options for pdftex and dvipdfm.
+ (line 25)
+* subequations, referring to: Subequation references.
+ (line 6)
+* subterm in indexing: Indexing terms. (line 13)
+* supp-mis.tex, problems with pdfTeX: Packages known to work.
+ (line 30)
+* supp-pdf.tex: Packages known to work.
+ (line 30)
+* table of contents: Contents. (line 6)
+* table of contents, and verbatim text: Writing the .toc file.
+ (line 49)
+* table of contents, hyperlinks: Contents hyperlinks. (line 6)
+* table of contents, short: Reading the .toc file.
+ (line 19)
+* table of contents, short <1>: Macro arguments. (line 10)
+* tables: Tables. (line 6)
+* tabs: Obeying spaces. (line 22)
+* TeX by Topic: Iteration. (line 61)
+* TeX Frequently Asked Questions: \ifinteger and \isinteger.
+ (line 26)
+* TEXFORMATS: Installation. (line 43)
+* texi2dvi: Invoking Eplain. (line 103)
+* texi2dvi <1>: Citations. (line 102)
+* texi2dvi <2>: Indexing. (line 32)
+* Texinfo: Introduction. (line 15)
+* TEXINPUTS: Installation. (line 23)
+* texnames.sty: Logos. (line 15)
+* time of day: Time of day. (line 6)
+* toc files, writing several: Changing the .toc file's root name.
+ (line 12)
+* tracing: Diagnostics. (line 6)
+* trailing spaces and indexing commands: Indexing terms. (line 20)
+* trimsee: Customizing indexing.
+ (line 65)
+* triple column output: Multiple columns. (line 6)
+* Tu, Loring W.: Construction of commutative diagrams.
+ (line 13)
+* TUGboat: Introduction. (line 65)
+* type, link and destination: Introduction to hyperlinks.
+ (line 88)
+* types, destination, dvipdfm: Destination types for pdftex and dvipdfm.
+ (line 6)
+* types, destination, hypertex: Destination types for hypertex.
+ (line 6)
+* types, destination, pdftex: Destination types for pdftex and dvipdfm.
+ (line 6)
+* types, link, dvipdfm: Link types for pdftex and dvipdfm.
+ (line 6)
+* types, link, hypertex: Link types for hypertex.
+ (line 6)
+* types, link, pdftex: Link types for pdftex and dvipdfm.
+ (line 6)
+* typesetting an index: Typesetting an index.
+ (line 6)
+* undefined control sequence, checking for: \ifundefined. (line 10)
+* undefined labels, warnings about: Installation. (line 40)
+* underline hyperlink border: Link options for pdftex and dvipdfm.
+ (line 25)
+* underlining: Packages known to work.
+ (line 124)
+* underlining page numbers in index: Page list and page range parsers.
+ (line 26)
+* universal mapping property: Construction of commutative diagrams.
+ (line 25)
+* unordered lists: Lists. (line 6)
+* upgrading: Installation. (line 6)
+* URL for path.sty: Paths. (line 33)
+* URL for pdfTeX: Checking for PDF output.
+ (line 6)
+* URL hyperlink: General hyperlinks. (line 20)
+* URL hyperlink <1>: URL hyperlinks. (line 6)
+* URL hyperlink <2>: Link types for hypertex.
+ (line 14)
+* URL hyperlink <3>: Link types for pdftex and dvipdfm.
+ (line 25)
+* url.sty: Packages known to work.
+ (line 132)
+* url.sty <1>: URL hyperlinks. (line 6)
+* url.sty <2>: Hyperlinks (xhyper.tex).
+ (line 7)
+* user-inaccessible macros: Category codes. (line 19)
+* vectors: Slanted lines and vectors.
+ (line 15)
+* verbatim listing: Verbatim listing. (line 6)
+* verbatim listing, demo: Highlighting TeX comments in listings (lscommnt.tex).
+ (line 7)
+* verbatim text, in index: Index entries with special characters.
+ (line 40)
+* verbatim text, in table of contents: Writing the .toc file.
+ (line 49)
+* version number: Introduction. (line 51)
+* Walden, David: Introduction. (line 62)
+* Warner, Frank W.: Construction of commutative diagrams.
+ (line 25)
+* whatsits made by hyperlinks: Hyperlink driver nolinks.
+ (line 25)
+* whatsits made by index entries: Indexing commands. (line 61)
+* while loops: Iteration. (line 6)
+* whitespace: Obeying spaces. (line 6)
+* width, hyperlink border: Link options for pdftex and dvipdfm.
+ (line 49)
+* writing several toc files: Changing the .toc file's root name.
+ (line 12)
+* xcolor.sty: Packages known not to work.
+ (line 22)
+* xdvi: Hyperlink driver hypertex.
+ (line 11)
+* XeLaTeX: Logos. (line 11)
+* xeplain.tex: Introduction. (line 6)
+* XeTeX: Logos. (line 11)
+* xhyper.tex: Hyperlinks (xhyper.tex).
+ (line 7)
+* Zassenhaus, Hans: Construction of commutative diagrams.
+ (line 121)
+* zooming, hyperlink destination: Destination options for pdftex and dvipdfm.
+ (line 21)
+
+
+
+Tag Table:
+Node: Top796
+Node: Introduction8126
+Node: Installation11167
+Node: Invoking Eplain13219
+Node: User definitions17817
+Node: Diagnostics19644
+Node: Rules21209
+Node: Citations22040
+Node: Formatting citations28468
+Node: Formatting bibliographies30007
+Node: Commands from LaTeX33243
+Node: Displays34217
+Node: Formatting displays35604
+Node: Time of day36237
+Node: Lists36996
+Node: Formatting lists39136
+Node: Verbatim listing41419
+Node: Contents44639
+Node: Writing the .toc file45308
+Node: Reading the .toc file48170
+Node: Changing the .toc file's root name49573
+Node: Alternative contents files50589
+Node: Cross-references51153
+Node: Defining generic references52633
+Node: Using generic references53509
+Node: Page references54793
+Node: Equation references55612
+Node: Formatting equation references58364
+Node: Subequation references62714
+Node: Indexing64630
+Node: Indexing terms67652
+Node: Indexing commands68764
+Node: Modifying index entries71725
+Node: Index entries with special characters74693
+Node: Proofing index terms78935
+Node: Typesetting an index80748
+Node: Customizing indexing83214
+Node: Justification86910
+Node: Tables90005
+Node: Margins92496
+Node: Multiple columns94649
+Node: Footnotes96686
+Node: Fractions99261
+Node: Paths100044
+Node: Logos101600
+Node: Boxes102395
+Node: Checking for PDF output104181
+Node: Loading LaTeX packages105207
+Node: The \usepackage command106409
+Node: Environment for loading packages107495
+Node: Packages known to work109835
+Node: Packages known not to work116602
+Node: Hyperlinks117375
+Node: Introduction to hyperlinks118024
+Node: Explicit hyperlinks123561
+Node: Implicit hyperlinks125846
+Node: General hyperlinks127667
+Node: URL hyperlinks129190
+Node: Citation hyperlinks131290
+Node: List hyperlinks132017
+Node: Cross-reference hyperlinks132408
+Node: Page reference hyperlinks133779
+Node: Equation reference hyperlinks134440
+Node: Index hyperlinks135830
+Node: Exact destinations for index terms137588
+Node: Page destinations for index terms139755
+Node: Choosing destination placement142373
+Node: Index page list and page range parsers143162
+Node: Hyperlinks in see and see also entries143714
+Node: Footnote hyperlinks144512
+Node: Contents hyperlinks145706
+Node: Hyperlink drivers146089
+Node: Options supported by all drivers146723
+Node: Hyperlink driver hypertex149519
+Node: Destination types for hypertex152467
+Node: Destination options for hypertex153501
+Node: Link types for hypertex153983
+Node: Link options for hypertex155991
+Node: Hyperlink drivers pdftex and dvipdfm157013
+Node: Destination types for pdftex and dvipdfm157658
+Node: Destination options for pdftex and dvipdfm161137
+Node: Link types for pdftex and dvipdfm163588
+Node: Link options for pdftex and dvipdfm167108
+Node: Hyperlink driver nolinks170746
+Node: Setting hyperlink types and options173149
+Node: Setting default types and options174150
+Node: Setting group types175576
+Node: Setting group options176765
+Node: Turning hyperlinks on/off179246
+Node: Turning low-level commands on/off179912
+Node: Turning hyperlinks on/off for a group180425
+Node: Making PDF outlines181578
+Node: Arrow theoretic diagrams184463
+Node: Slanted lines and vectors184830
+Node: Commutative diagrams186904
+Node: Arrows and morphisms187501
+Node: Construction of commutative diagrams191956
+Node: Commutative diagram parameters199121
+Node: Programming definitions200937
+Node: Category codes201938
+Node: Allocation macros204583
+Node: Iteration206718
+Node: Macro arguments208370
+Node: Converting to characters211745
+Node: Expansion213130
+Node: \csn and \ece213693
+Node: \edefappend214258
+Node: Hooks214805
+Node: Properties216979
+Node: \expandonce218058
+Node: \ifundefined218506
+Node: \ifempty219070
+Node: \ifinteger and \isinteger219812
+Node: \futurenonspacelet220852
+Node: Obeying spaces221453
+Node: Writing out numbers222477
+Node: Mode-specific penalties222800
+Node: Auxiliary files223529
+Node: User-defined environments224448
+Node: Page list and page range parsers225661
+Node: Demo files227793
+Node: Hyperlinks (xhyper.tex)228360
+Node: Highlighting TeX comments in listings (lscommnt.tex)236709
+Node: Macro index239165
+Node: Concept index308026
+
+End Tag Table
diff --git a/macros/eplain/doc/eplain.man1.pdf b/macros/eplain/doc/eplain.man1.pdf
new file mode 100644
index 0000000000..60011f4721
--- /dev/null
+++ b/macros/eplain/doc/eplain.man1.pdf
Binary files differ
diff --git a/macros/eplain/doc/eplain.pdf b/macros/eplain/doc/eplain.pdf
new file mode 100644
index 0000000000..3db8a2d4c5
--- /dev/null
+++ b/macros/eplain/doc/eplain.pdf
Binary files differ
diff --git a/macros/eplain/doc/lscommnt.jpg b/macros/eplain/doc/lscommnt.jpg
new file mode 100644
index 0000000000..356fccb23d
--- /dev/null
+++ b/macros/eplain/doc/lscommnt.jpg
Binary files differ
diff --git a/macros/eplain/doc/util/idxuniq b/macros/eplain/doc/util/idxuniq
new file mode 100755
index 0000000000..599d9b593c
--- /dev/null
+++ b/macros/eplain/doc/util/idxuniq
@@ -0,0 +1,39 @@
+#!/usr/bin/awk -f
+#
+# (This file is public domain.)
+#
+# This file is part of the Eplain macro package.
+#
+# 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/macros/eplain/doc/util/trimsee b/macros/eplain/doc/util/trimsee
new file mode 100755
index 0000000000..00459956f4
--- /dev/null
+++ b/macros/eplain/doc/util/trimsee
@@ -0,0 +1,106 @@
+#!/bin/sh
+# (This file is public domain.)
+# This file is part of the Eplain macro package.
+
+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 test "$1" -lt 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/macros/eplain/doc/xhyper.jpg b/macros/eplain/doc/xhyper.jpg
new file mode 100644
index 0000000000..de24043507
--- /dev/null
+++ b/macros/eplain/doc/xhyper.jpg
Binary files differ
diff --git a/macros/eplain/source/xeplain.tex b/macros/eplain/source/xeplain.tex
new file mode 100644
index 0000000000..ef1d96191b
--- /dev/null
+++ b/macros/eplain/source/xeplain.tex
@@ -0,0 +1,5568 @@
+% xeplain.tex: macros for nonformatting. Written 1989--94 by (mostly)
+% Karl Berry. Some additions/changes 1997--98 by Adam Lewenberg,
+% with subsequent contributions from many people.
+% These macros are in the public domain.
+%
+% This is the ``extended plain'' TeX format that's described in
+% `eplain.texi', which you should have received with this file.
+% It assumes that 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. The original sources
+%% can be found in Eplain sources in your TeX
+%% distribution, on CTAN or on Eplain's home page at
+%% http://tug.org/eplain. 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}%
+%
+% True if #1 is an integer. From the UK List of TeX Frequently Asked
+% Questions, http://www.tex.ac.uk/cgi-bin/texfaq2html.
+\def\@gobbleminus#1{\ifx-#1\else#1\fi}%
+\def\ifinteger#1{\ifcat_\ifnum9<1\@gobbleminus#1 _\else A\fi}%
+% This is a convenience to be used in places where TeX might be
+% skipping tokens, e.g., in conditionals. Usage:
+% \if\isinteger{<subject of test>}%
+% <deal with integer>%
+% \else
+% <deal with non-integer>%
+% \fi
+\def\isinteger{TT\fi\ifinteger}%
+%
+% 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}%
+}%
+%
+% btxmac.tex defines a \@for loop. We provide an alternative \For
+% loop, extended to strip an optional leading space off list items.
+\def\@Nnil{\@Nil}%
+\def\@Fornoop#1\@@#2#3{}%
+%
+\def\For#1:=#2\do#3{%
+ \edef\@Fortmp{#2}%
+ \ifx\@Fortmp\empty \else
+ \expandafter\@Forloop#2,\@Nil,\@Nil\@@#1{#3}%
+ \fi
+}%
+%
+\def\@Forloop#1,#2,#3\@@#4#5{\@Fordef#1\@@#4\ifx #4\@Nnil \else
+ #5\@Fordef#2\@@#4\ifx #4\@Nnil \else#5\@iForloop #3\@@#4{#5}\fi\fi
+}%
+%
+\def\@iForloop#1,#2\@@#3#4{\@Fordef#1\@@#3\ifx #3\@Nnil
+ \let\@Nextwhile=\@Fornoop \else
+ #4\relax\let\@Nextwhile=\@iForloop\fi\@Nextwhile#2\@@#3{#4}%
+}%
+% \@Fordef<TEXT>\@@<COMMAND> defines COMMAND to the TEXT trimmed off
+% optional space tokens at the beginning. Assume spaces are of
+% category 10 (won't work when \obeyspaces is in effect).
+\def\@Forspc{ }%
+%
+\def\@Fordef{\futurelet\@Fortmp\@@Fordef}% Peep at the next token.
+%
+\def\@@Fordef{%
+ \expandafter\ifx\@Forspc\@Fortmp % Next token is a space.
+ \expandafter\@Fortrim
+ \else
+ \expandafter\@@@Fordef
+ \fi
+}%
+%
+\expandafter\def\expandafter\@Fortrim\@Forspc#1\@@{\@Fordef#1\@@}%
+%
+\def\@@@Fordef#1\@@#2{\def#2{#1}}%
+%
+% From texinfo.tex. Emulate eTeX's \scantokens with a temporary file
+% in ordinary TeX.
+\def\tmpfileextension{.tmp}%
+\let\tmpfilebasename = \jobname
+\ifx\eTeXversion\undefined
+ \innernewwrite\eplain@tmpfile
+ \def\scantokens#1{%
+ \toks@={#1}%
+ \immediate\openout\eplain@tmpfile=\tmpfilebasename\tmpfileextension
+ \immediate\write\eplain@tmpfile{\the\toks@}%
+ \immediate\closeout\eplain@tmpfile
+ \input \tmpfilebasename\tmpfileextension\relax
+ }%
+\fi
+%
+%
+%
+% 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{\unhcopy0}% Preserve \box0 so we can put it back.
+ \ifdim\wd2=0pt
+ % Don't put it back: it was an indentation box.
+ % This \ignorespaces ignores spaces after the group.
+ \ignorespaces
+ \else
+ \box0 % 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]]]
+%
+%
+% More TeX logos.
+%
+% Adapted from tugboat.dtx.
+\ifx\eTeX\undefined
+ \def\eTeX{\hbox{\mathsurround=0pt $\varepsilon$-\kern-.125em\TeX}}%
+\fi
+%
+\ifx\ExTeX\undefined
+ \def\ExTeX{\hbox{\mathsurround=0pt
+ $\textstyle\varepsilon_{\kern-0.15em\cal{X}}$\kern-.2em\TeX}}%
+\fi
+%
+% XeTeX require the graphics package for reflecting/rotating. From
+% tugboat.dtx: "Also, at Barbara's suggestion, if the current font is
+% slanted, we rotate by 180 instead of reflecting so there is at least
+% a chance to look ok. (The magic values here seem more or less ok
+% for \texttt{cmsl} and \texttt{cmti}.)".
+\def\eplain@Xe@reflect#1{%
+ \ifx\reflectbox\undefined
+ \errmessage{A graphics package must be loaded for \string\XeTeX}%
+ \else
+ \ifdim \fontdimen1\font>0pt
+ \raise 1.75ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em
+ \else
+ \reflectbox{#1}%
+ \fi
+ \fi
+}%
+\def\eplain@Xe#1{\leavevmode
+ \smash{\hbox{X%
+ \setbox0=\hbox{\TeX}\setbox2=\hbox{E}%
+ \lower\dp0\hbox{\raise\dp2\hbox{\kern-.125em\eplain@Xe@reflect{E}}}%
+ \kern-.1667em #1}}}%
+\ifx\XeTeX\undefined
+ \def\XeTeX{\eplain@Xe\TeX}%
+\fi
+\ifx\XeLaTeX\undefined
+ \def\XeLaTeX{\eplain@Xe{\thinspace\LaTeX}}%
+\fi
+%
+%
+% 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{&}%
+ \def\leqno{&}%
+ \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{&}%
+ \def\leqno{&}%
+ \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. To omit last
+% (empty) line of input, say \let\setuplistinghook = \nolastlinelisting.
+% (This works with line numbers, too, but only if \printlistinglineno
+% consists of boxes only.)
+\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}}%
+% Remove the last line by removing all boxes (indentation \hbox and/or
+% line number from \everypar).
+\def\nolastlinelisting{\aftergroup\@removeboxes}%
+% Remove boxes until we remove all of them, or until we
+% encounter something other than a box.
+\def\@removeboxes{%
+ \setbox0 = \lastbox
+ \ifvoid0
+ \ignorespaces % Ignore spaces after the \obeywhitespace's group.
+ \else
+ \expandafter\@removeboxes
+ \fi
+}%
+%
+%
+%
+% \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\def{writenumbered#1line}{\writenumberedcontentsline{#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.
+%
+% One special case is for #1 to be an integer (once fully expanded).
+% If it is, we produce a line in the .toc file that looks like:
+% \tocentry{#1}{#2}{page number}
+% This might be useful if you want to write one generic \tocentry
+% macro to format all TOC entries on the basis of their depth (#1).
+%
+% 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
+ % Set \toks0 to the initial part (command name and possible PART argument).
+ \writenumberedcontents@cmdname{#1}{#2}%
+ %
+ \def\temp{#3}% the text
+ %
+ % 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
+}%
+% This is very similar to \writenumberedcontentsentry, differing only
+% in the order of parameters it takes and writes for the
+% \toc...entry control sequence. #3 is the chapter (section, etc.)
+% number, and #4 is the text.
+\def\writenumberedcontentsline#1#2#3#4{%
+ \csname ifrewrite#1file\endcsname
+ % Set \toks0 to the initial part (command name and possible PART argument).
+ \writenumberedcontents@cmdname{#1}{#2}%
+ %
+ \def\temp{#4}% the text
+ %
+ % Usually #3 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{#3}%
+ \edef\cs{\the\toks2}%
+ \edef\@wr{%
+ \write\csname #1file\endcsname{%
+ \the\toks0 % the \toc...entry control sequence
+ \ifx\empty\cs\else {\sanitize\cs}\fi % a secondary number, or nothing
+ {\sanitize\temp}% the text
+ {\noexpand\folio}% the page number
+ }%
+ }%
+ \@wr
+ \fi
+ \ignorespaces
+}%
+% This is the common part of \writenumberedcontentsentry and
+% \writenumberedcontentsline. It takes `toc' and PART arguments,
+% opens toc file and sets \toks0 to `\tocentry{PART}' (if PART is an
+% integer) or `\tocPARTentry' (otherwise).
+\def\writenumberedcontents@cmdname#1#2{%
+ \csname open#1file\endcsname
+ \edef\temp{#2}% Expand PART fully and see if this produced an integer.
+ \expandafter\if\expandafter\isinteger\expandafter{\temp}%
+ \toks0 = {\expandafter\noexpand \csname #1entry\endcsname}%
+ \edef\temp{\the\toks0{\temp}}%
+ \toks0 = \expandafter{\temp}%
+ \else
+ \toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}%
+ \fi
+}%
+%
+% 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}}%
+\def\tocentry#1#2#3{\line{\rm\hskip#1em #2 \dotfill\ #3}}%
+%
+%
+%
+% 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.
+%
+% We check for multiply defined labels during the reading of the aux
+% file, not at the time a cross-reference macro is called by the user.
+% (From Tomas Penicka <tom.penicka@centrum.cz>.)
+%
+%
+% \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
+ \ignorespaces
+}%
+%
+% \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 and #3 will be read later.
+ % The following group will keep the save stack from overflowing:
+ % We are reading the .aux file inside a group. For undefined
+ % commands, \csname...\endcsname makes them equivalent to \relax
+ % locally in that group; when we globally redefine them, TeX enters
+ % the definitions on the save stack, once for each label. When done
+ % in the topmost group, this can overflow stack of any size, given
+ % sufficient number of label definitions. So, we put these
+ % \csname...\endcsname's inside another group, to pop the stack for
+ % every label.
+ \begingroup % Will be ended in \@definelabel@nocheck.
+ % Warn if we see that another label with the same name has been
+ % defined. Remember, we are called when the aux file is being read,
+ % which means that no labels have been defined yet except the ones
+ % which come earlier in this aux file.
+ \expandafter\ifx\csname\xrlabel{#1}\endcsname \relax
+ \expandafter\@definelabel@nocheck
+ \else
+ \expandafter\@definelabel@warn
+ \fi
+ % Define the control sequences or warn.
+ {#1}%
+}%
+% Define a label without checking for redefinitions.
+\def\@definelabel@nocheck#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}%
+ \endgroup % From \@definelabel.
+}%
+% Warn and then redefine a label.
+\def\@definelabel@warn#1#2#3{%
+ \message{^^J\linenumber Label `#1' multiply defined,
+ value `#2' of class `#3' overwriting value
+ `\csname\xrlabel{#1}\endcsname' of class
+ `\getproperty{\xrlabel{#1}}{class}'.}%
+ \@definelabel@nocheck{#1}{#2}{#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\@generalref@class{\getproperty{\xrlabel{#3}}{class}}%
+ % If the word for this class is not defined, don't complain.
+ \expandafter\ifx\csname \@generalref@class 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 \@generalref@class 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. This however needs special
+% treatment with respect to hyperlink labels which should not be
+% duplicated. For each \eqdef{}, we define a destination with a
+% unique hyperlink label. These labels can be customized with:
+\newcount\phantomeqnumber
+\def\phantomeqlabel{PHEQ\the\phantomeqnumber}%
+%
+\def\@eqdefn#1#2{%
+ % Write out xref into the aux file to allow forward references, but
+ % only if the label is not empty. Otherwise numerous redefinitions
+ % of the empty label might be reported.
+ \ifempty{#1}%
+ % LABEL is empty, so generate a `phantom' label.
+ \global\advance\phantomeqnumber by 1
+ \edef\hl@eqlabel{\phantomeqlabel}%
+ % Do not write to the aux file but read it anyway, so that
+ % \@definelabel's get a chance to do the checks for multiple
+ % definitions before we define any cross-references.
+ \readauxfile
+ \else
+ % LABEL is not empty, so use it for hyperlinks.
+ \def\hl@eqlabel{#1}%
+ % Write the definition to the aux file, but do not create
+ % hyperlink destination (we'll create it ourselves below).
+ % This also reads the aux file.
+ {\@@hldestoff \definexref{#1}{#2}{eq}}%
+ \fi
+ % Define hyperlink destination.
+ \hldest@impl{eq}{\hl@eqlabel}%
+ % Define the LABEL omitting redefinition check.
+ \begingroup % \@definelabel@nocheck will end this group.
+ \@definelabel@nocheck{#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{%
+ \@maybedisableeqno
+ \eqnum #1{#2}% Define the label and hyperlink destination.
+ \let\@optionalarg\empty % \@fineqref will examine \@optionalarg.
+ {\@@hloff\@fineqref{#2}}% Print the text without a hyperlink.
+ \@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\leqno = \relax
+ \global\let\@mayberestoreeqno = \@restoreeqno
+ \fi
+}%
+%
+% This makes `\eqno' mean \eqno again.
+%
+\let\@primitiveeqno = \eqno
+\let\@primitiveleqno = \leqno
+\def\@restoreeqno{%
+ \global\let\eqno = \@primitiveeqno
+ \global\let\leqno = \@primitiveleqno
+ \global\let\@mayberestoreeqno = \empty
+}%
+%
+%
+% \righteqnumbers/\lefteqnumbers configure \eqnum, \eqdef
+% and \eqalignnum to place the equation number against right/left
+% margin respectively.
+%
+\def\righteqnumbers{%
+ \def\eqnum{\eqno}%
+ \def\eqalignnum{\eqalignno}%
+}%
+%
+\def\lefteqnumbers{%
+ \def\eqnum{\leqno}%
+ \def\eqalignnum{\leqalignno}%
+}%
+%
+\righteqnumbers
+%
+%
+% \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@impl{eq}%
+}%
+%
+% \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
+%
+\def\defineindex#1{%
+ \def\@idxprefix{#1}%
+ %
+ % Define a switch to control opening and writing of the index file
+ % for this prefix.
+ \expandafter\innernewif\csname if\@idxprefix dx\endcsname
+ \csname \@idxprefix dxtrue\endcsname
+ %
+ % 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. We
+% only write out the index term if this has not been disabled with
+% \csname\@idxprefix dxfalse\endcsname.
+%
+\let\indexfilebasename = \jobname
+%
+\def\@idxwrite#1#2{%
+ \csname if\@idxprefix dx\endcsname
+ % Be sure the file is opened.
+ \@openidxfile
+ %
+ % 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
+ \else
+ % Produce a whatsit anyway, to ensure consistent page-breaking.
+ \write-1{}%
+ \fi
+ %
+ % Marginalize the index term, if desired. We \sanitize the term to
+ % avoid expansion of any (user-defined) active characters that made
+ % it through (e.g., because they had not been added to \dospecials
+ % and hence were not read verbatim by the indexing commands).
+ \ifindexproofing
+ \def\temp{#1}%
+ \edef\temp{%
+ \insert\@indexproof{\noexpand\indexproofterm{\sanitize\temp}}%
+ }%
+ \temp
+ % Allow `infinitesimal' in \sidx{Infinitesimal}infinitesimal to be
+ % hyphenated.
+ \ifhmode\allowhyphens\fi
+ \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
+}%
+%
+\def\@openidxfile{%
+ \csname if@\@idxprefix indexfileopened\endcsname \else
+ \expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname =
+ \indexfilebasename.\@idxprefix dx
+ \expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname
+ \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 `page anchor' is defined.
+ \expandafter\ifx\csname\idxpageanchor{\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%
+ % Since \@getoptionalarg scans ahead, it might scan the \idxargopen
+ % character of the following non-optional argument if the optional
+ % argument is missing. To make sure that \idxargopen gets the right
+ % catcode, we need to set it up before calling \@getoptionalarg.
+ \begingroup
+ \catcode\idxargopen=1
+ \@getoptionalarg\@finidxgetopt
+}%
+\def\@finidxgetopt{%
+ \global\let\@idxgetrange@arg\@optionalarg
+ \endgroup
+ %
+ \@hlidxencaptrue
+ %
+ \for\@idxarg:=\@idxgetrange@arg\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
+ % `page anchor' will tell \makeheadline on which pages to
+ % generate an \hldest.
+ \definepageanchor{\noexpand\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}%
+%
+% \idxpageanchor{PAGE} expands to index page anchor internal name.
+% This page anchor is used when index entries point to pages. Like in
+% \xrlabel, we append an _ character to NAME, to help avoid conflicts.
+% And we append a `p' 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\idxpageanchor#1{#1_p}%
+\endgroup
+% \definepageanchor{PAGE} defines a page anchor for the page PAGE.
+% \makeheadline will then define a hyperlink destination on top of
+% each page for which an anchor is defined. 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\definepageanchor#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\@definepageanchor{#1}}}%
+ \@wr
+ \ignorespaces
+}%
+% \@definepageanchor{PAGE} actually defines page anchor for the PAGE.
+\def\@definepageanchor#1{%
+ \expandafter\gdef\csname\idxpageanchor{#1}\endcsname{}%
+}%
+%
+% 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{%
+ \ifempty{#2}%
+ \let\@idxpageencap\relax
+ \else
+ \expandafter\let\expandafter\@idxpageencap\csname #2\endcsname
+ \fi
+ \hlstart@impl{idx}{#1}%
+ \@idxpageencap{#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.
+ \ifempty{#1}%
+ \let\@idxpageencap\relax
+ \else
+ \expandafter\let\expandafter\@idxpageencap\csname #1\endcsname
+ \fi
+ % 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\idx@getverbatimarg
+ {\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
+}%
+%
+%
+% Macros for reading verbatim the TERM, SUBTERM, SEE and SEEALSO
+% arguments of indexing commands.
+%
+% These can be customized by the user to different beginning and
+% end of group characters, so that `{' and `}' can be used inside
+% index terms.
+\def\idxargopen{`\{}%
+\def\idxargclose{`\}}%
+% \idx@getverbatimarg#1{ARG} reads ARG verbatim and then calls #1 with
+% that argument. We use it to read all TERM, (non-optional) SUBTERM,
+% SEE and SEEALSO arguments.
+\def\idx@getverbatimarg#1{%
+ \def\idx@getverbatimarg@cmd{#1}% Save the command, allowing it to be
+ % more than just a command sequence.
+ \begingroup
+ \uncatcodespecials
+ \catcode\idxargopen=1
+ \catcode\idxargclose=2
+ \catcode`\ =10 % Swallow multiple consequent spaces.
+ \catcode`\^^I=10 % Just in case, to avoid dependence on
+ \catcode`\^^M=5 % current meanings of tabs and newlines.
+ \idx@fingetverbatimarg
+}%
+\def\idx@fingetverbatimarg#1{\endgroup\idx@getverbatimarg@cmd{#1}}%
+% \idx@getverboptarg#1[ARG] reads ARG verbatim and then calls #1 with
+% that argument. We use it to read all optional SUBTERM arguments.
+% This is adopted from btxmac.tex's \@getoptionalarg.
+\def\idx@getverboptarg#1{%
+ \def\idx@optionaltemp{#1}% Save the command, allowing it to be more
+ % than just a command sequence (unlike \@getoptionalarg).
+ \let\idx@optionalnext = \relax
+ % If this is a SEE or SEEALSO entry, we know that another
+ % non-optional arg follows, delimited by the \idxargopen and
+ % \idxargclose characters. Since \@futurenonspacelet scans ahead,
+ % it might scan \idxargopen if the optional argument is missing. To
+ % make sure that \idxargopen gets the right catcode, we need to set
+ % it up before calling \@futurenonspacelet.
+ \begingroup
+ \if@idxsee \catcode\idxargopen=1 \fi
+ \@futurenonspacelet\idx@optionalnext\idx@bracketcheck
+}%
+% The \expandafter's in this macro let us avoid the use of \aftergroup,
+% which is somewhat more expensive.
+\def\idx@bracketcheck{%
+ \ifx [\idx@optionalnext
+ \endgroup % Cancel \catcode\idxargopen=1.
+ \expandafter\idx@finbracketcheck
+ \else
+ \endgroup % Cancel \catcode\idxargopen=1.
+ \let\@optionalarg = \empty
+ % We can't do the \temp after the \fi, because then the \temp gets
+ % in the way of reading the optional argument from the input, if
+ % we do have one.
+ \expandafter\idx@optionaltemp
+ \fi
+}%
+%
+\def\idx@finbracketcheck{%
+ \begingroup
+ \uncatcodespecials
+ % `[' should already be \other since \idx@bracketcheck succeeded;
+ % we assume that the user also didn't give `]' a funky catcode
+ % (otherwise it should have been added to \dospecials, anyway).
+ %\catcode`\[=\other
+ %\catcode`\]=\other
+ \catcode`\ =10 % Swallow multiple consequent spaces.
+ \catcode`\^^I=10 % Just in case, to avoid dependence on
+ \catcode`\^^M=5 % current meanings of tabs and newlines.
+ \idx@@getoptionalarg
+}%
+%
+\def\idx@@getoptionalarg[#1]{%
+ \endgroup
+ \def\@optionalarg{#1}%
+ \idx@optionaltemp
+}%
+%
+% Produce term (which has been scanned verbatim) as output, rescanning
+% with `real' catcodes. \endinput ensures TeX does not see the ending
+% newline. Stepan Kasal verified that it is necessary both for e-TeX
+% and for ordinary TeX (see texinfo.tex). We reset catcode of newline
+% because \scantokens (both the e-TeX primitive and the Eplain's
+% emulation) generate a trailing newline when newline is catcode 13
+% (putting \scantokens in an \hbox also fixes that newline--strange).
+% We don't write `\endinput' directly because the merge script strips
+% any lines with an \endinput.
+{\catcode`\&=0
+\gdef\idx@scanterm#1{%
+ \edef\idx@scanterm@nl@catcode{\the\catcode`\^^M\relax}%
+ \catcode`\^^M=5
+ \scantokens{#1&endinput}%
+ \catcode`\^^M=\idx@scanterm@nl@catcode
+}}%
+%
+%
+% 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{\idx@getverbatimarg\@finidx}%
+\def\@finidx#1{%
+ \idx@scanterm{#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{\idx@getverbatimarg\@finsidx}%
+\def\@finsidx#1{\@idxmaintoks = {#1}\idx@getverboptarg\@finfinsidx}%
+\def\@finfinsidx{%
+ \@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 makes an index entry
+% sorted by TERM but producing \CS{TERM}.
+%
+\def\@idxmarked#1{\idx@getverbatimarg{\@finidxmarked{#1}}}%
+\def\@finidxmarked#1#2{%
+ \idx@scanterm{#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{\idx@getverbatimarg{\@finsidxmarked{#1}}}%
+\def\@finsidxmarked#1#2{%
+ \@idxconstructmarked\toks@{#1}{#2}%
+ \edef\temp{{\the\toks@}}%
+ \expandafter\@finsidx\temp
+}%
+%
+%
+% \@idxsubmarked{TERM}\CS{SUBTERM} is like \@idxmarked, except that it's
+% SUBTERM that's marked instead of TERM.
+%
+\def\@idxsubmarked{%
+ \let\sidxsubmarked@print\idxsubmarked@print
+ \idx@getverbatimarg\@finsidxsubmarked
+}%
+\def\idxsubmarked@print{\expandafter\idx@scanterm\expandafter}%
+%
+% \@sidxsubmarked{TERM}\CS{SUBTERM} is to \@sidxmarked as \@idxsubmarked
+% is to \@idxmarked.
+%
+\def\@sidxsubmarked{%
+ \let\sidxsubmarked@print\gobble
+ \idx@getverbatimarg\@finsidxsubmarked
+}%
+\def\@finsidxsubmarked#1{\@idxmaintoks = {#1}\@@finsidxsubmarked}% Reads TERM.
+\def\@@finsidxsubmarked#1{\idx@getverbatimarg{\@@@finsidxsubmarked{#1}}}% Reads \CS.
+\def\@@@finsidxsubmarked#1#2{% Reads {\CS}{SUBTERM}.
+ \sidxsubmarked@print % Prints for \@idxsubmarked, gobbles for \@sidxsubmarked.
+ {\the\@idxmaintoks\space #1{#2}}% Maybe produce `TERM \CS{SUBTERM}' as output.
+ \@idxconstructmarked\@idxsubtoks{#1}{#2}%
+ \@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@ = \expandafter{\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{\idx@getverbatimarg\@finidxname}%
+\def\@finidxname#1{\idx@getverbatimarg{\@finfinidxname{#1}}}%
+\def\@finfinidxname#1#2{%
+ \idx@scanterm{#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{\idx@getverbatimarg\@finsidxname}%
+\def\@finsidxname#1{\idx@getverbatimarg{\@finfinsidxname{#1}}}%
+\def\@finfinsidxname#1#2{%
+ \@idxcollectname{#1}{#2}%
+ \expandafter\@finsidx\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{\idx@getverbatimarg\@finindexsee}%
+\def\@finindexsee#1#2{{\seevariant \indexseeword\/ }\idx@scanterm{#1}}%
+%
+% \indexseealso{TERM}{PAGENO} is similar.
+\def\indexseealsowords{see also}%
+\def\indexseealso{\idx@getverbatimarg\@finindexseealso}%
+\def\@finindexseealso#1#2{{\seevariant \indexseealsowords\/ }\idx@scanterm{#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
+}%
+%
+\ifx\@undefined\raggedleft
+% like plain's \raggedright except for \parfillskip.
+\innernewskip\raggedleftskip \raggedleftskip=0pt plus2em
+\def\raggedleft{\leftskip\raggedleftskip \parindent=0pt
+ \spaceskip.3333em \xspaceskip.5em \parfillskip0pt \relax}
+\fi % \raggedleft undefined
+%
+%
+% 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 its macros) has to be fixed.
+%
+% Gather this many baselines
+\chardef\@col@extralines = 3
+% of additional material per each column than the combined height of the
+% columns, before attempting to break the columns. This sometimes
+% considerably improves the last column, when it would become too spaced
+% out because TeX had to squeeze some lines into the previous columns
+% due to unfortunate column breaks.
+%
+% The larger \@col@extralines, the better, but we don't want to make
+% it too large. If there are less than \@col@extralines * num_columns
+% lines left before we start gathering these extra lines, we'll hit
+% \@endcolumns while gathering material for this page. If the extra
+% lines will not actually fit in the columns, we'll have to move them
+% to the next page. But we won't move them if there are any
+% insertions on this page (see \@balancecolumns), so in such case
+% we'll stuff everything on the current page, producing an overfull
+% box, even though these extra lines could successfully be moved to
+% the next page.
+%
+\newdimen\@col@extraheight
+%
+% 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
+ %
+ % Gather some extra material, to improve the last column.
+ \@col@extraheight=\@col@extralines\baselineskip
+ \multiply\@col@extraheight by \@numcolumns
+ \global\advance\vsize by \@col@extraheight
+}%
+%
+% 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}}%
+%
+\def\@columnsplit{%
+ \splittopskip = \topskip
+ \splitmaxdepth = \baselineskip
+ %
+ % \dimen@ should be the height that columns 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 in \@columns and \@endcolumns.
+ %
+ % Unfortunately, we lose on flexible glue because we must
+ % \vsplit to a <dimen>.
+ %
+ % 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.
+ %d\message{^^J starting columnsplit, splitting to \the\dimen@}%
+ %d\showbox255
+ \global\setbox1 = \vsplit255 to \dimen@ \global\wd1 = \hsize
+ %d\message{^^J split off to this box1:}%
+ %d\showbox1
+ %
+ % 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
+ %
+ % 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{%
+ %d\message{^^J starting columnoutput, ht255: \the\ht255}%
+ \dimen@ = \ht255
+ \advance\dimen@ by -\@col@extraheight
+ %d\message{^^J minus col@extraheight: \the\@col@extraheight}%
+ \divide\dimen@ by \@numcolumns
+ \@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, plus the ``extra height''.
+ \global\vsize = \@numcolumns\@normalvsize
+ \global\advance\vsize by \@col@extraheight
+}%
+%
+% Go back to single-column typesetting. Assume \doublecolumns has
+% been called.
+%
+\def\singlecolumn{%
+ \@ndcolumns
+ \chardef\@numcolumns = 1
+ \vskip\belowcolumnskip
+ \nointerlineskip
+}%
+%
+\newbox\@singlecolumnbox
+\newdimen\column@pagegoal
+\newdimen\column@vsize
+%
+\def\@endcolumns{%
+ \global\let\@ndcolumns = \relax
+ \par % Shouldn't start in horizontal mode.
+ % Save the combined height of the columns and the page goal. We
+ % have to be careful -- the last line of the multi-column material
+ % might have taken \pagetotal just over \pagegoal, in which case we
+ % have to use \pagegoal for the height, otherwise the box produced
+ % when splitting the columns will not fit on the page.
+ \column@pagegoal = \pagegoal
+ \advance\column@pagegoal by-\@col@extraheight
+ \ifdim \pagetotal > \column@pagegoal
+ \column@vsize = \column@pagegoal
+ \else
+ \column@vsize = \pagetotal
+ \fi
+ % Grab whatever is left of the multi-column material.
+ \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.
+ % We won't need \columnoutput anymore.
+ \global\output = \expandafter{\the\previousoutput}%
+ % Save single column material (in case the multi-column material
+ % ends on the same page where it starts; otherwise \@partialpage
+ % will be void). This also voids \@partialpage.
+ \setbox\@singlecolumnbox = \box\@partialpage
+ % Try to fit what's left into the columns.
+ \@balancecolumns
+}%
+%
+% There are many caveats when balancing columns at the end of
+% multi-column material. The core of all problems is the following.
+% Eplain collects multi-column material in one long scroll until the
+% scroll's length is at least \vsize * \@numcolumns. But when we try
+% to split that scroll into columns, there is no guarantee that all
+% the collected material will fit (for example, because a column break
+% occured inside a large unbreakable block, so we had to carry it over
+% to the next column and stretch out the previous column). So every
+% time we call \@columnsplit, we should expect it to leave something
+% for us in \@partialpage.
+%
+% Now, what should we do with these left-overs? We increase column
+% height a bit and try to split the scroll again, and so on until
+% everything fits.
+%
+% However, while doing this, we might increase column height so much
+% that the columns no longer fit on a page. What we do then is output
+% the highest fitting columns, break the page and then restart the
+% whole process on what's left.
+%
+% However, there's another catch -- if a page contains insertions,
+% there's a slight chance that the footnotes or top insertions were
+% inserted by the multi-column material we are going to carry over to
+% the next page, so those footnotes or top insertions will appear one
+% page ahead of their references. The worst thing is that the user
+% will get no warning of this. Therefore, when we have left-overs on
+% a page with insertions, we just stuff them into columns to produce
+% an overfull box warning.
+%
+\def\@balancecolumns{%
+ % Split the scroll to the new column height.
+ \global\setbox255 = \copy2 % Retrieve what the fake \output set.
+ \dimen@ = \column@vsize
+ \divide\dimen@ by \@numcolumns
+ \@columnsplit
+ %
+ \ifvoid\@partialpage
+ % Everything fits -- we're done.
+ \global\vsize = \@normalvsize
+ \global\hsize = \@normalhsize
+ \dump@balanced@columns
+ \let\next\relax
+ \else
+ % There is some left-over. Increase column height.
+ \advance \column@vsize by \@numcolumns pt
+ % Check what we should do with the left-over.
+ \test@spill@columns
+ \ifspill@columns
+ % We are to break the page here. Make up a page from the
+ % single-column material followed by the columns that we've
+ % already split off into \box255.
+ \begingroup
+ \vsize = \@normalvsize
+ \hsize = \@normalhsize
+ \dump@balanced@columns
+ \break
+ \@recoverclubpenalty
+ \endgroup
+ % Now put back what didn't fit and process it recursively.
+ \unvbox\@partialpage
+ \let\next\@endcolumns
+ \else
+ % We should continue incrementing column height.
+ \setbox0=\box\@partialpage % Merely to void \@partialpage.
+ \let\next\@balancecolumns
+ \fi
+ \fi
+ \next
+}%
+%
+\def\dump@balanced@columns{%
+ \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
+ \unvbox\@singlecolumnbox
+ % Avoid interline glue here -- we didn't (couldn't) account for it
+ % when assessing \vsize for the columns in \@columns, which means
+ % the columns may not fit if we also add the interline glue.
+ \nointerlineskip
+ \box255
+}%
+%
+% If we hit page bottom while balancing columns and there are no
+% insertions on the page, we can let the left-over spill to the next
+% page. If there are insertions on the page, we shouldn't let
+% \@partialpage to the next page, to avoid separating a possible
+% reference from an insertion. The following flag and test are to
+% check these conditions.
+\newif\ifspill@columns
+\def\test@spill@columns{%
+ \spill@columnsfalse
+ \ifdim \column@vsize > \column@pagegoal
+ \ifvoid\footins
+ \ifvoid\topins
+ \spill@columnstrue
+ \fi
+ \fi
+ \fi
+}%
+%
+% [\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 so far.
+ %d\message{^^J pagetotal start (dimen@): \the\dimen@}%
+ %
+ \temp@dimen = \vsize % = \@numcolumns * columnheight
+ %d\message{^^J temp@dimen (total height): \the\temp@dimen}%
+ %
+ \advance\temp@dimen by -\@col@extraheight
+ %d\message{^^J reducing temp@dimen \the\temp@dimen (-@col@extraheight)}%
+ %
+ \divide\temp@dimen by \@numcolumns % Compute column height
+ %d\message{^^J col height (tempdimen@): \the\temp@dimen}%
+ %
+ \loop
+ %d\message{^^J looping}%
+ \ifdim \dimen@ > \temp@dimen % more material than a column?
+ \advance \dimen@ by -\temp@dimen
+ \advance \dimen@ by \topskip % fudge factor
+ %d\message{^^J reducing dimen@ to \the\dimen@ (tempdimen@ + \the\topskip)}%
+ \repeat
+ \advance \temp@dimen by -\dimen@
+ %d\message{^^J reducing temp@dimen to \the\temp@dimen (-dimen@)}%
+ %
+ \advance \temp@dimen by -\prevdepth
+ %d\message{ reducing temp@dimen to \the\temp@dimen (-prevdepth)}%
+ %
+ \@saveclubpenalty
+ \clubpenalty=10000\relax
+ \hrule height\temp@dimen width0pt depth0pt\relax % fill space with rule
+ \nointerlineskip
+ \par
+ \nointerlineskip
+ \allowbreak \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{% We'll read #3 (LABEL) later.
+ % 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 hyperlink 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
+ }%
+ % Now read the third argument, LABEL. Do so inside a group with
+ % \uncatcodespecials, to allow `#' and `~' in it (LABEL can be a URL
+ % for some link types).
+ \bgroup
+ \uncatcodespecials
+ \catcode`\{=1 \catcode`\}=2
+ \@hl@getparam
+}%
+%
+\def\@hl@getparam#1{%
+ \egroup
+ % Save LABEL in \@hllabel.
+ \edef\@hllabel{#1}%
+ % 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 hyperlink 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,hrefint,hrefext}%
+% \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 (except 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.
+% This will become \hl@setparam in \enablehyperlinks.
+\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 `\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. Even if we simply need to override the old option list,
+ % we still call \hl@update@opts@with@list to go through the
+ % options and trim possible leading space token in option keys.
+ \if@params@override
+ \expandafter\let\csname\hl@prefix @\hl@param @\hl@group\endcsname\empty
+ \fi
+ \hl@update@opts@with@list{#1}% #1 will be used in the \for
+ % loop, so it will be expanded once.
+ \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 hyperlink 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@opts@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). Changing them here has no
+% effect, modify \enablehyperlinks to set defaults.
+\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). Changing them here has no
+% effect, modify \enablehyperlinks to set defaults.
+\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
+\def\hl@on@hrefint{0}% \href with internal #labels
+\def\hl@on@hrefext{0}% \href with external labels (URLs)
+% 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)
+\let\hl@type@hrefint\empty % \href with internal #labels
+\let\hl@type@hrefext\empty % \href with external labels (URLs) (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
+\let\hl@opts@hrefint\empty % \href with internal #labels
+\let\hl@opts@hrefext\empty % \href with external labels (URLs)
+%
+% \@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 `hypertex'.
+\def\hl@idxexact@word{idxexact}%
+\def\hl@idxpage@word{idxpage}%
+\def\hl@idxnone@word{idxnone}%
+\def\hl@raw@word{raw}%
+%
+\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{^^JEplain: using `pdftex' hyperlink driver.}%
+ \else
+ \def\hl@selecteddriver{hypertex}%
+ \message{^^JEplain: using `hypertex' 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
+ % Enable \hltype, \hlopts, \hldest and \hldestopts now (the driver's
+ % initialization routine may change this).
+ \let\hl@setparam\@hl@setparam
+ % 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@hypertex\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
+ % By default turn everything on except the footnotes.
+ \hlon[*,]\hloff[foot,footback]%
+ \hldeston[*,]\hldestoff[foot,footback]%
+}%
+%
+% 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.
+%
+% Additionally, `nolinks' driver defines the \hldesttype, \hldestopts,
+% \hltype, \hlopts macros to gobble their parameters, to avoid error
+% messages about "unknown" options and types under the `nolinks'
+% driver.
+\def\hldriver@nolinks{%
+ \def\@hldest##1##2##3{%
+ \edef\temp{\write-1{hldest: ##3}}%
+ \ifvmode
+ \temp
+ \else
+ \allowhyphens
+ \expandafter\smash\expandafter{\temp}%
+ \allowhyphens
+ \fi
+ \ignorespaces
+ }%
+ \def\@hlstart##1##2##3{%
+ \leavevmode
+ \begingroup % Start the color group.
+ \edef\temp{\write-1{hlstart: ##3}}%
+ \temp
+ \ignorespaces
+ }%
+ \def\@hlend{%
+ \edef\temp{\write-1{hlend}}%
+ \temp
+ \endgroup % End the color group from \@hlstart.
+ }%
+ % Make \hltype, \hlopts, \hldesttype and \hldestopts ignore their
+ % parameters.
+ \let\hl@setparam\gobble
+}%
+%
+% Driver `hypertex'.
+%
+{\catcode`\#=\other
+\gdef\hlhash{#}}%
+%
+\def\hldriver@hypertex{%
+ %
+ % Hyperlink destinations.
+ %
+ % Default type.
+ \def\hldest@type{xyz}%
+ % Set defaults for the options (this also tells \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@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
+ \special{html:<a name="\@hllabel">}\special{html:</a>}%
+ \fi
+ }%
+ % Define handlers for each supported destination type (this also
+ % tells \hl@getparam what types we support).
+ \let\hldest@typeh@raw \empty
+ \let\hldest@typeh@xyz \empty
+ %
+ % Hyperlinks.
+ %
+ % Default type.
+ \def\hl@type{name}%
+ % We support `url' hyperlinks, so set some group types.
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ \ifx\hl@type@hrefext\empty
+ \def\hl@type@hrefext{url}%
+ \fi
+ % Set defaults for the options (this also tells \hl@set@opt what
+ % options we support).
+ \let\hl@opt@cmd \empty
+ \let\hl@opt@ext \empty
+ \let\hl@opt@file \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
+ % Construct common preamble of a link.
+ \def\hlstart@preamble{html:<a href="}%
+ % Call the handler.
+ \csname hl@typeh@\@hltype\endcsname
+ \fi
+ }%
+ % Define handlers for each supported link type (this also tells
+ % \hl@getparam what types we support).
+ \let\hl@typeh@raw \empty
+ \def\hl@typeh@name{\special{\hlstart@preamble \hlhash\@hllabel">}}%
+ \def\hl@typeh@filename{%
+ \special{%
+ \hlstart@preamble
+ file:\hl@opt@file\hl@opt@ext
+ \ifempty\@hllabel \else \hlhash\@hllabel\fi
+ ">%
+ }%
+ }%
+ \def\hl@typeh@url{%
+ \special{%
+ \hlstart@preamble
+ \@hllabel
+ ">%
+ }%
+ }%
+ %
+ \def\@hlend{\special{html:</a>}\endgroup}% End the group from \@hlstart.
+}%
+%
+% Driver `pdftex'.
+%
+\def\hldriver@pdftex{%
+\ifpdf % PDF output is enabled.
+ %
+ % Hyperlink destinations.
+ %
+ % Default type.
+ \def\hldest@type{xyz}%
+ % Set defaults for the options (this also tells \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 (this also
+ % tells \hl@getparam what types we support).
+ \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 some group types.
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ \ifx\hl@type@hrefext\empty
+ \def\hl@type@hrefext{url}%
+ \fi
+ % Set defaults for the options (this also tells \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
+ }%
+ % Define handlers for each supported link type (this also tells
+ % \hl@getparam what types we support).
+ \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{Eplain warning: `pdftex' hyperlink driver: PDF output is^^J
+ \space not enabled, falling back on `nolinks' driver.}%
+ \hldriver@nolinks
+\fi
+}%
+%
+% Driver `dvipdfm'.
+%
+\def\hldriver@dvipdfm{%
+ %
+ % Hyperlink destinations.
+ %
+ % Default type.
+ \def\hldest@type{xyz}%
+ % Set defaults for the options (this also tells \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 (this also
+ % tells \hl@getparam what types we support).
+ \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 some group types.
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ \ifx\hl@type@hrefext\empty
+ \def\hl@type@hrefext{url}%
+ \fi
+ % Set defaults for the options (this also tells \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
+ }%
+ % Define handlers for each supported link type (this also tells
+ % \hl@getparam what types we support).
+ \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.
+}%
+%
+% Miscellaneous hyperlink macros.
+%
+%
+% \href{URL}{TEXT} typesets TEXT as a link to the URL. If URL starts
+% with a #, the rest of the URL is assumed to be this document's local
+% anchor. Special chars (like # and ~) in URL don't need to be
+% escaped in any way.
+\def\href{%
+ % Read #1 (URL) inside a group with \uncatcodespecials, to get the #
+ % and ~ right.
+ \bgroup
+ \uncatcodespecials
+ \catcode`\{=1 \catcode`\}=2
+ \@href
+}%
+%
+\def\@href#1{% We'll read #2 (TEXT) later.
+ \egroup
+ \edef\@hreftmp{\ifempty{#1}{}\fi}% Parameter stuffing for \@@href.
+ \expandafter\@@href\@hreftmp#1\@@
+}%
+%
+\def\href@end@int{\hlend@impl{hrefint}}%
+\def\href@end@ext{\hlend@impl{hrefext}}%
+% Split out the first token and check if it is a #.
+\def\@@href#1#2\@@{%
+ \def\@hreftmp{#1}%
+ \ifx\@hreftmp\hlhash
+ \let\href@end\href@end@int
+ \hlstart@impl{hrefint}{#2}%
+ \else
+ \let\href@end\href@end@ext
+ \hlstart@impl{hrefext}{#1#2}%
+ \fi
+ \@@@href
+}%
+% Now some tricks to avoid reading the TEXT as an argument (from the
+% \footnote definition in plain TeX).
+\def\@@@href{%
+ \futurelet\@hreftmp\href@
+}%
+%
+\def\href@{%
+ \ifcat\bgroup\noexpand\@hreftmp
+ \let\@hreftmp\href@@
+ \else
+ \let\@hreftmp\href@@@
+ \fi
+ \@hreftmp
+}%
+%
+\def\href@@{\bgroup\aftergroup\href@end \let\@hreftmp}%
+%
+\def\href@@@#1{#1\href@end}%
+%
+% Make all user-visible \hl* macros to give errors until hyperlinks
+% are explicitly enabled with \enablehyperlinks.
+\def\hldeston{\errmessage{Please enable hyperlinks with
+ \string\enablehyperlinks\space before using hyperlink commands
+ (consider selecting the `nolinks' driver to ignore all hyperlink
+ commands in your document)}}%
+\let\hldestoff\hldeston \let\hlon\hldeston \let\hloff\hldeston
+\let\hlstart\hldeston \let\hlend\hldeston \let\hldest\hldeston
+% This catches \hltype, \hlopts, \hldesttype, \hldestopts.
+\let\hl@setparam\hldeston
+% Turn off all groups to make sure \hlstart@impl, \hlend@impl and
+% \hldest@impl do not call \hlstart, \hlend and \hldest until
+% hyperlinks are enabled.
+\@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.
+%
+% At the end of the \beginpackages...\endpackages block, we restore
+% the \input command to whatever it was defined before the
+% package(s), because miniltx.tex and some packages make (sometimes
+% incompatible) redefinitions of \input, and under plain TeX
+% non-primitive \input is probably not what the user expects. But in
+% case the redefined \input is actually needed, we save it as
+% \packageinput.
+%
+% Define \DoNotLoadEpstopdf so that graphics.cfg does not try to load
+% epstopdf.sty, which is a complication surely not wanted by default.
+%
+\long\def\beginpackages#1\endpackages{%
+ \let\usepackage\real@usepackage
+ \let\DoNotLoadEpstopdf=t
+ \let\eplaininput=\input
+ #1%
+ \usepkg@at@begin@document
+ \global\let\usepkg@at@begin@document\empty
+ \global\let\usepackage\fake@usepackage
+ \let\packageinput=\input
+ \let\input=\eplaininput
+ % should always be defined (from miniltx), but just in case:
+ \ifx\resetatcatcode\@undefined \else\resetatcatcode \fi
+}%
+%
+% \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
+ \gdef\ProcessOptions{\@ifstar\eplain@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 superset 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}%
+ \expandafter\@finusepkg@load@pkg
+ \else
+ \immediate\write-1{^^J\linenumber Eplain: package `\usepkg@pkg' already
+ loaded, skipping reloading}%
+ \fi
+}%
+\def\@finusepkg@load@pkg{%
+ \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 }%
+% For the `draft' option to graphic{s,x}.sty.
+\let\ttfamily\tt
+\def\strip@prefix#1>{}%
+% Definitions for epstopdf.sty.
+\def\@ifpackageloaded#1{%
+ \expandafter\ifx\csname ver@#1.sty\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}%
+\long\def\g@addto@macro#1#2{%
+ \begingroup
+ \toks@\expandafter{#1#2}%
+ \xdef#1{\the\toks@}%
+ \endgroup
+}%
+% These are for the warnings from epstopdf.sty when graphics.sty is
+% not loaded. From pdftex.def.
+\def\PackageWarning#1#2{%
+ \begingroup
+ \newlinechar=10 %
+ \def\MessageBreak{%
+ ^^J(#1)\@spaces\@spaces\@spaces\@spaces
+ }%
+ \immediate\write16{^^JPackage #1 Warning: #2\on@line.^^J}%
+ \endgroup
+}%
+\def\PackageWarningNoLine#1#2{%
+ \PackageWarning{#1}{#2\@gobble}%
+}%
+\def\on@line{ on input line \the\inputlineno}%
+% 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\protected@edef\edef
+%
+%
+%
+\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:
diff --git a/macros/eplain/tex/arrow.tex b/macros/eplain/tex/arrow.tex
new file mode 100644
index 0000000000..9c43c2fe3c
--- /dev/null
+++ b/macros/eplain/tex/arrow.tex
@@ -0,0 +1,597 @@
+% arrow.tex: macros for commutative diagrams.
+%
+% Copyright (C) 1991,1992 Steven T. Smith.
+% stsmith@ll.mit.edu
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2, or (at your option)
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this file; see the file COPYING. If not, write to the
+% Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+% Boston, MA 02110-1301, USA.
+%
+% As a special exception, when this file is read by TeX when
+% processing a TeX source document, you may use the result without
+% restriction.
+
+% Version 0 Released for alpha testing, November 16, 1991.
+% Version 0.1 Morphism positions for slanted lines improved, Nov. 17, 1991.
+% Version 0.11 \biline changed to \bisline for compatible naming. 11/21/91
+% Version 0.2 Equate \lft & \rt w. _ and ^ instead of L_{12} & R_{12}. 1/20/92
+% Version 1.0 Distributed with Eplain. 1/20/92
+% Version 1.1 Purged \newcount's, etc.; Warner ref.; \getch@nnel logic. 4/21/92
+% Version 1.11 Replace \smash with \smash@@ (for amstex compatibility) 3/27/96
+
+
+
+% Syntax: \[arrow](X,Y) or
+% \[arrow](X,Y)\lft{MOR} (morphism placed left of arrow) or
+% \[arrow](X,Y)\rt{MOR} (morphism placed right of arrow)
+%
+% [arrow] is one of
+% sline (straight line)
+% dotline (dotted line) * Unimplemented
+% arrow (straight arrow)
+% dotarrow (dotted arrow) * Unimplemented
+%
+% The following allow plain versions and some combination of \lft and \rt.
+% biarrow (two straight arrows)
+% adjarrow (two adjoint arrows)
+% bisline (two straight lines)
+%
+% Also, for left, right, up, and down mappings:
+%
+% \mapright (or \mapright^{f_*}, \mapright_{f_*})
+% \mapleft (ditto)
+% \mapup (use \rt and \lft as above)
+% \mapdown (ditto)
+%
+% And variants of these (can use combinations of ^/_ and lft/rt):
+%
+% \bimapright (two right arrows)
+% \bimapleft (two left arrows)
+% \adjmapright (two adjoint arrows; <- over ->)
+% \adjmapleft (two adjoint arrows; -> over <-)
+% \hline (horizontal line)
+% \dothline (dotted horizontal line) * Unimplemented
+% \bihline (two horizontal lines)
+%
+% \bimapdown (two down arrows)
+% \bimapup (two left arrows)
+% \adjmapdown (two adjoint arrows; down then up)
+% \adjmapup (two adjoint arrows; up then down)
+% \vline (vertical line)
+% \dotvline (dotted vertical line) * Unimplemented
+% \bivline (two vertical lines)
+
+% Use \thinlines temporarily to find the current catcode of @, so we can
+% restore it at the end.
+\edef\thinlines{\the\catcode`@ }%
+\catcode`@ = 11
+\let\@oldatcatcode = \thinlines
+
+
+% I changed \smash to \smash@@ in these macros to avoid AMSTEX conflict.
+
+\def\smash@@{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+% Adapted LaTeX code for drawing lines and vectors
+
+% Note: to ensure compatibility with LaTeX, all LaTeX control
+% sequences have been renamed. Control sequence names containing the
+% at sign (@) have been changed to contain an ampersand (&) instead.
+\edef\@oldandcatcode{\the\catcode`& }%
+\catcode`& = 11
+
+% LaTeX macros changed here:
+% \line - changed to \drawline
+% \vector - changed to \drawvector
+% \@badlinearg - simply uses \errmessage now
+% \@height, \@width, and \@depth are changed to height, width, and depth
+% \@sline and \@svector - changed so that \hbox{\drawline...} yields
+% a box of positive width and positive height for a positive slope
+% and positive depth for a negative slope.
+% \@hline and \@hvector - likewise
+% \unitlength eliminated; pass dimensions to \drawline and \drawvector.
+
+% LaTeX's while loop
+\def\&whilenoop#1{}%
+\def\&whiledim#1\do #2{\ifdim #1\relax#2\&iwhiledim{#1\relax#2}\fi}%
+\def\&iwhiledim#1{\ifdim #1\let\&nextwhile=\&iwhiledim
+ \else\let\&nextwhile=\&whilenoop\fi\&nextwhile{#1}}%
+
+% LaTeX's \line and \vector macros:
+\newif\if&negarg
+\newdimen\&wholewidth
+\newdimen\&halfwidth
+
+\font\tenln=line10
+
+\def\thinlines{\let\&linefnt\tenln \let\&circlefnt\tencirc
+ \&wholewidth\fontdimen8\tenln \&halfwidth .5\&wholewidth}%
+\def\thicklines{\let\&linefnt\tenlnw \let\&circlefnt\tencircw
+ \&wholewidth\fontdimen8\tenlnw \&halfwidth .5\&wholewidth}%
+
+\def\drawline(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax \&linelen=#3\relax
+ \ifnum\&xarg =0 \&vline \else \ifnum\&yarg =0 \&hline \else \&sline\fi\fi}%
+
+\def\&sline{\leavevmode
+ \ifnum\&xarg< 0 \&negargtrue \&xarg -\&xarg \&yyarg -\&yarg
+ \else \&negargfalse \&yyarg \&yarg \fi
+ \ifnum \&yyarg >0 \&tempcnta\&yyarg \else \&tempcnta -\&yyarg \fi
+ \ifnum\&tempcnta>6 \&badlinearg \&yyarg0 \fi
+ \ifnum\&xarg>6 \&badlinearg \&xarg1 \fi
+ \setbox\&linechar\hbox{\&linefnt\&getlinechar(\&xarg,\&yyarg)}%
+ \ifnum \&yyarg >0 \let\&upordown\raise \&clnht\z@
+ \else\let\&upordown\lower \&clnht \ht\&linechar\fi
+ \&clnwd=\wd\&linechar
+ \&whiledim \&clnwd <\&linelen \do {%
+ \&upordown\&clnht\copy\&linechar
+ \advance\&clnht \ht\&linechar
+ \advance\&clnwd \wd\&linechar
+ }%
+ \advance\&clnht -\ht\&linechar
+ \advance\&clnwd -\wd\&linechar
+ \&tempdima\&linelen\advance\&tempdima -\&clnwd
+ \&tempdimb\&tempdima\advance\&tempdimb -\wd\&linechar
+ \hskip\&tempdimb \multiply\&tempdima \@m
+ \&tempcnta \&tempdima \&tempdima \wd\&linechar \divide\&tempcnta \&tempdima
+ \&tempdima \ht\&linechar \multiply\&tempdima \&tempcnta
+ \divide\&tempdima \@m
+ \advance\&clnht \&tempdima
+ \ifdim \&linelen <\wd\&linechar \hskip \wd\&linechar
+ \else\&upordown\&clnht\copy\&linechar\fi}%
+
+\def\&hline{\vrule height \&halfwidth depth \&halfwidth width \&linelen}%
+
+\def\&getlinechar(#1,#2){\&tempcnta#1\relax\multiply\&tempcnta 8
+ \advance\&tempcnta -9 \ifnum #2>0 \advance\&tempcnta #2\relax\else
+ \advance\&tempcnta -#2\relax\advance\&tempcnta 64 \fi
+ \char\&tempcnta}%
+
+\def\drawvector(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax
+ \&tempcnta \ifnum\&xarg<0 -\&xarg\else\&xarg\fi
+ \ifnum\&tempcnta<5\relax \&linelen=#3\relax
+ \ifnum\&xarg =0 \&vvector \else \ifnum\&yarg =0 \&hvector
+ \else \&svector\fi\fi\else\&badlinearg\fi}%
+
+\def\&hvector{\ifnum\&xarg<0 \rlap{\&linefnt\&getlarrow(1,0)}\fi \&hline
+ \ifnum\&xarg>0 \llap{\&linefnt\&getrarrow(1,0)}\fi}%
+
+\def\&vvector{\ifnum \&yarg <0 \&downvector \else \&upvector \fi}%
+
+\def\&svector{\&sline
+ \&tempcnta\&yarg \ifnum\&tempcnta <0 \&tempcnta=-\&tempcnta\fi
+ \ifnum\&tempcnta <5
+ \if&negarg\ifnum\&yarg>0 % 3d quadrant; dp > 0
+ \llap{\lower\ht\&linechar\hbox to\&linelen{\&linefnt
+ \&getlarrow(\&xarg,\&yyarg)\hss}}\else % 4th quadrant; ht > 0
+ \llap{\hbox to\&linelen{\&linefnt\&getlarrow(\&xarg,\&yyarg)\hss}}\fi
+ \else\ifnum\&yarg>0 % 1st quadrant; ht > 0
+ \&tempdima\&linelen \multiply\&tempdima\&yarg
+ \divide\&tempdima\&xarg \advance\&tempdima-\ht\&linechar
+ \raise\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\else
+ \&tempdima\&linelen \multiply\&tempdima-\&yarg % 2d quadrant; dp > 0
+ \divide\&tempdima\&xarg
+ \lower\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\fi\fi
+ \else\&badlinearg\fi}%
+
+\def\&getlarrow(#1,#2){\ifnum #2 =\z@ \&tempcnta='33\else
+\&tempcnta=#1\relax\multiply\&tempcnta \sixt@@n \advance\&tempcnta
+-9 \&tempcntb=#2\relax\multiply\&tempcntb \tw@
+\ifnum \&tempcntb >0 \advance\&tempcnta \&tempcntb\relax
+\else\advance\&tempcnta -\&tempcntb\advance\&tempcnta 64
+\fi\fi\char\&tempcnta}%
+
+\def\&getrarrow(#1,#2){\&tempcntb=#2\relax
+\ifnum\&tempcntb < 0 \&tempcntb=-\&tempcntb\relax\fi
+\ifcase \&tempcntb\relax \&tempcnta='55 \or
+\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
+24 \advance\&tempcnta -6 \else \ifnum #1=3 \&tempcnta=49
+\else\&tempcnta=58 \fi\fi\or
+\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
+24 \advance\&tempcnta -3 \else \&tempcnta=51\fi\or
+\&tempcnta=#1\relax\multiply\&tempcnta
+\sixt@@n \advance\&tempcnta -\tw@ \else
+\&tempcnta=#1\relax\multiply\&tempcnta
+\sixt@@n \advance\&tempcnta 7 \fi\ifnum #2<0 \advance\&tempcnta 64 \fi
+\char\&tempcnta}%
+
+\def\&vline{\ifnum \&yarg <0 \&downline \else \&upline\fi}%
+
+\def\&upline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
+ height \&linelen depth \z@\hss}}%
+
+\def\&downline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
+ height \z@ depth \&linelen \hss}}%
+
+\def\&upvector{\&upline\setbox\&tempboxa\hbox{\&linefnt\char'66}\raise
+ \&linelen \hbox to\z@{\lower \ht\&tempboxa\box\&tempboxa\hss}}%
+
+\def\&downvector{\&downline\lower \&linelen
+ \hbox to \z@{\&linefnt\char'77\hss}}%
+
+\def\&badlinearg{\errmessage{Bad \string\arrow\space argument.}}%
+
+%INITIALIZATION
+\thinlines
+
+% Allocate registers using the rules of p.~346 of {\sl The \TeX book}.
+\countdef\&xarg 0
+\countdef\&yarg 2
+\countdef\&yyarg 4
+\countdef\&tempcnta 6
+\countdef\&tempcntb 8
+
+\dimendef\&linelen 0
+\dimendef\&clnwd 2
+\dimendef\&clnht 4
+\dimendef\&tempdima 6
+\dimendef\&tempdimb 8
+
+\chardef\@arrbox 0
+\chardef\&linechar 2
+\chardef\&tempboxa 2 % \&linechar and \&tempboxa don't interfere.
+
+
+% Macros for abstract nonsense
+
+% Macros for slanted lines and arrows.
+
+\let\lft^%
+\let\rt_% distinguish between \rt and \lft
+
+\newif\if@pslope % test for positive slope
+\def\@findslope(#1,#2){\ifnum#1>0
+ \ifnum#2>0 \@pslopetrue \else\@pslopefalse\fi \else
+ \ifnum#2>0 \@pslopefalse \else\@pslopetrue\fi\fi}%
+
+\def\generalsmap(#1,#2){\getm@rphposn(#1,#2)\plnmorph\futurelet\next\addm@rph}%
+
+% Put arrow in \@arrbox, then add morphisms later.
+
+% Single lines and arrows.
+\def\sline(#1,#2){\setbox\@arrbox=\hbox{\drawline(#1,#2){\sarrowlength}}%
+ \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
+\def\arrow(#1,#2){\setbox\@arrbox=\hbox{\drawvector(#1,#2){\sarrowlength}}%
+ \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
+
+% Double lines, arrows, and adjoint arrows.
+\newif\ifd@@blearr
+
+\def\bisline(#1,#2){\@findslope(#1,#2)%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
+ \rlap{\drawline(#1,#2){\sarrowlength}}%
+ \hskip\@hchannel\hbox{\drawline(#1,#2){\sarrowlength}}}%
+ \d@@blearrtrue\generalsmap(#1,#2)}%
+\def\biarrow(#1,#2){\@findslope(#1,#2)%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
+ \rlap{\drawvector(#1,#2){\sarrowlength}}%
+ \hskip\@hchannel\hbox{\drawvector(#1,#2){\sarrowlength}}}%
+ \d@@blearrtrue\generalsmap(#1,#2)}%
+\def\adjarrow(#1,#2){\@findslope(#1,#2)%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
+ \rlap{\drawvector(#1,#2){\sarrowlength}}%
+ \hskip\@hchannel\hbox{\drawvector(-#1,-#2){\sarrowlength}}}%
+ \d@@blearrtrue\generalsmap(#1,#2)}%
+
+% Morphism placement.
+
+% Logic for positioning morphisms on slanted arrows:
+% If \lft then
+% \hskip by -\@hmorphdflt
+% if \@pslopetrue then \raise by \@vmorphdflt
+% else \lower by \@vmorphdflt
+% Else if \rt then
+% \hskip by \@hmorphdflt
+% if \@pslopetrue then \lower by \@vmorphdflt
+% else \raise by \@vmorphdflt
+%
+% \@hmorphdflt and \@vmorphdflt defined by \getm@rphposn
+% Advance \morphdist by .5\channelwidth if double arrows
+%
+% Use \@shiftmorph to allow users to move morphisms
+
+% Logic for \@shiftmorph:
+% If \rtm@rph then
+% if \hmorphposnrt=0 then hshift by\hmorphposn else hshift by\hmorphposnrt
+% if \vmorphposnrt=0 then vshift by\vmorphposn else vshift by\vmorphposnrt
+% Else
+% if \hmorphposnlft=0 then hshift by\hmorphposn else hshift by\hmorphposnlft
+% if \vmorphposnlft=0 then vshift by\vmorphposn else vshift by\vmorphposnlft
+
+\newif\ifrtm@rph
+\def\@shiftmorph#1{\hbox{\setbox0=\hbox{$\scriptstyle#1$}%
+ \setbox1=\hbox{\hskip\@hm@rphshift\raise\@vm@rphshift\copy0}%
+ \wd1=\wd0 \ht1=\ht0 \dp1=\dp0 \box1}}%
+\def\@hm@rphshift{\ifrtm@rph
+ \ifdim\hmorphposnrt=\z@\hmorphposn\else\hmorphposnrt\fi \else
+ \ifdim\hmorphposnlft=\z@\hmorphposn\else\hmorphposnlft\fi \fi}%
+\def\@vm@rphshift{\ifrtm@rph
+ \ifdim\vmorphposnrt=\z@\vmorphposn\else\vmorphposnrt\fi \else
+ \ifdim\vmorphposnlft=\z@\vmorphposn\else\vmorphposnlft\fi \fi}%
+
+\def\addm@rph{\ifx\next\lft\let\temp=\lftmorph\else
+ \ifx\next\rt\let\temp=\rtmorph\else\let\temp\relax\fi\fi \temp}%
+
+\def\plnmorph{\dimen1\wd\@arrbox \ifdim\dimen1<\z@ \dimen1-\dimen1\fi
+ \vcenter{\box\@arrbox}}%
+\def\lftmorph\lft#1{\rtm@rphfalse \setbox0=\@shiftmorph{#1}%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss % \dimen1=\wd\@arrbox
+ \llap{\box0}\hss}\hskip\@hmorphdflt}\futurelet\next\addm@rph}%
+\def\rtmorph\rt#1{\rtm@rphtrue \setbox0=\@shiftmorph{#1}%
+ \if@pslope \let\@upordown\lower \else \let\@upordown\raise\fi
+ \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss
+ \rlap{\box0}\hss}\hskip-\@hmorphdflt}\futurelet\next\addm@rph}%
+
+% Get appropriate shifts for morphisms and double lines at various slopes
+% Syntax e.g.: \@getshift(1,2){\@hchannel}{\@vchannel}{\channelwidth}%
+
+\def\getm@rphposn(#1,#2){\ifd@@blearr \dimen@\morphdist \advance\dimen@ by
+ .5\channelwidth \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\dimen@}\else
+ \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\morphdist}\fi}%
+
+\def\getch@nnel(#1,#2){\ifdim\hchannel=\z@ \ifdim\vchannel=\z@
+ \@getshift(#1,#2){\@hchannel}{\@vchannel}{\channelwidth}%
+ \else \@hchannel\hchannel \@vchannel\vchannel \fi
+ \else \@hchannel\hchannel \@vchannel\vchannel \fi}%
+
+\def\@getshift(#1,#2)#3#4#5{\dimen@ #5\relax
+ \&xarg #1\relax \&yarg #2\relax
+ \ifnum\&xarg<0 \&xarg -\&xarg \fi
+ \ifnum\&yarg<0 \&yarg -\&yarg \fi
+ \ifnum\&xarg<\&yarg \&negargtrue \&yyarg\&xarg \&xarg\&yarg \&yarg\&yyarg\fi
+ \ifcase\&xarg \or % There is no case 0
+ \ifcase\&yarg % case 1
+ \dimen@i \z@ \dimen@ii \dimen@ \or % case (1,0)
+ \dimen@i .7071\dimen@ \dimen@ii .7071\dimen@ \fi \or
+ \ifcase\&yarg % case 2
+ \or % case 0,2 wrong
+ \dimen@i .4472\dimen@ \dimen@ii .8944\dimen@ \fi \or
+ \ifcase\&yarg % case 3
+ \or % case 0,3 wrong
+ \dimen@i .3162\dimen@ \dimen@ii .9486\dimen@ \or
+ \dimen@i .5547\dimen@ \dimen@ii .8321\dimen@ \fi \or
+ \ifcase\&yarg % case 4
+ \or % case 0,2,4 wrong
+ \dimen@i .2425\dimen@ \dimen@ii .9701\dimen@ \or\or
+ \dimen@i .6\dimen@ \dimen@ii .8\dimen@ \fi \or
+ \ifcase\&yarg % case 5
+ \or % case 0,5 wrong
+ \dimen@i .1961\dimen@ \dimen@ii .9801\dimen@ \or
+ \dimen@i .3714\dimen@ \dimen@ii .9284\dimen@ \or
+ \dimen@i .5144\dimen@ \dimen@ii .8575\dimen@ \or
+ \dimen@i .6247\dimen@ \dimen@ii .7801\dimen@ \fi \or
+ \ifcase\&yarg % case 6
+ \or % case 0,2,3,4,6 wrong
+ \dimen@i .1645\dimen@ \dimen@ii .9864\dimen@ \or\or\or\or
+ \dimen@i .6402\dimen@ \dimen@ii .7682\dimen@ \fi \fi
+ \if&negarg \&tempdima\dimen@i \dimen@i\dimen@ii \dimen@ii\&tempdima\fi
+ #3\dimen@i\relax #4\dimen@ii\relax }%
+
+\catcode`\&=4 % Back to alignment tab
+
+
+% Macros for horizontal and vertical lines and arrows.
+% These macros use an idea from Appendix~D, p.~374 of the Texbook.
+% Usage: `\mapright^f', `\mapleft', etc.
+% `\mapdown\lft{f}', `\mapup\rt{g}', `\mapdown', etc.
+
+% \toks@ will contain the token sequence that defines the arrow and morphisms;
+% ensure that \toks@={\mathop{\vcenter{\smash@@{horiz. arrow}}}\limits} to start.
+\def\generalhmap{\futurelet\next\@generalhmap}%
+\def\@generalhmap{\ifx\next^ \let\temp\generalhm@rph\else
+ \ifx\next_ \let\temp\generalhm@rph\else \let\temp\m@kehmap\fi\fi \temp}%
+\def\generalhm@rph#1#2{\ifx#1^
+ \toks@=\expandafter{\the\toks@#1{\rtm@rphtrue\@shiftmorph{#2}}}\else
+ \toks@=\expandafter{\the\toks@#1{\rtm@rphfalse\@shiftmorph{#2}}}\fi
+ \generalhmap}%
+\def\m@kehmap{\mathrel{\smash@@{\the\toks@}}}%
+
+\def\mapright{\toks@={\mathop{\vcenter{\smash@@{\drawrightarrow}}}\limits}%
+ \generalhmap}%
+\def\mapleft{\toks@={\mathop{\vcenter{\smash@@{\drawleftarrow}}}\limits}%
+ \generalhmap}%
+\def\bimapright{\toks@={\mathop{\vcenter{\smash@@{\drawbirightarrow}}}\limits}%
+ \generalhmap}%
+\def\bimapleft{\toks@={\mathop{\vcenter{\smash@@{\drawbileftarrow}}}\limits}%
+ \generalhmap}%
+\def\adjmapright{\toks@={\mathop{\vcenter{\smash@@{\drawadjrightarrow}}}\limits}%
+ \generalhmap}%
+\def\adjmapleft{\toks@={\mathop{\vcenter{\smash@@{\drawadjleftarrow}}}\limits}%
+ \generalhmap}%
+\def\hline{\toks@={\mathop{\vcenter{\smash@@{\drawhline}}}\limits}%
+ \generalhmap}%
+\def\bihline{\toks@={\mathop{\vcenter{\smash@@{\drawbihline}}}\limits}%
+ \generalhmap}%
+
+\def\drawrightarrow{\hbox{\drawvector(1,0){\harrowlength}}}%
+\def\drawleftarrow{\hbox{\drawvector(-1,0){\harrowlength}}}%
+\def\drawbirightarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(1,0){\harrowlength}}}}%
+\def\drawbileftarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(-1,0){\harrowlength}}}}%
+\def\drawadjrightarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(1,0){\harrowlength}}}}%
+\def\drawadjleftarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(-1,0){\harrowlength}}}}%
+\def\drawhline{\hbox{\drawline(1,0){\harrowlength}}}%
+\def\drawbihline{\hbox{\raise.5\channelwidth
+ \hbox{\drawline(1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawline(1,0){\harrowlength}}}}%
+
+% Vertical arrows are handled differently because there is no \mathop.
+% \toks@ will contain the token sequence that defines the arrow and morphisms;
+% ensure that \toks@={\vcenter{vertical arrow}} to start.
+\def\generalvmap{\futurelet\next\@generalvmap}%
+\def\@generalvmap{\ifx\next\lft \let\temp\generalvm@rph\else
+ \ifx\next\rt \let\temp\generalvm@rph\else \let\temp\m@kevmap\fi\fi \temp}%
+% Prepend or append to \toks@ depending on \rt or \lft.
+\toksdef\toks@@=1
+\def\generalvm@rph#1#2{\ifx#1\rt % append
+ \toks@=\expandafter{\the\toks@
+ \rlap{$\vcenter{\rtm@rphtrue\@shiftmorph{#2}}$}}\else % prepend
+ \toks@@={\llap{$\vcenter{\rtm@rphfalse\@shiftmorph{#2}}$}}%
+ \toks@=\expandafter\expandafter\expandafter{\expandafter\the\expandafter
+ \toks@@ \the\toks@}\fi \generalvmap}%
+\def\m@kevmap{\the\toks@}%
+
+\def\mapdown{\toks@={\vcenter{\drawdownarrow}}\generalvmap}%
+\def\mapup{\toks@={\vcenter{\drawuparrow}}\generalvmap}%
+\def\bimapdown{\toks@={\vcenter{\drawbidownarrow}}\generalvmap}%
+\def\bimapup{\toks@={\vcenter{\drawbiuparrow}}\generalvmap}%
+\def\adjmapdown{\toks@={\vcenter{\drawadjdownarrow}}\generalvmap}%
+\def\adjmapup{\toks@={\vcenter{\drawadjuparrow}}\generalvmap}%
+\def\vline{\toks@={\vcenter{\drawvline}}\generalvmap}%
+\def\bivline{\toks@={\vcenter{\drawbivline}}\generalvmap}%
+
+\def\drawdownarrow{\hbox to5pt{\hss\drawvector(0,-1){\varrowlength}\hss}}%
+\def\drawuparrow{\hbox to5pt{\hss\drawvector(0,1){\varrowlength}\hss}}%
+\def\drawbidownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
+ \hskip\channelwidth\hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
+\def\drawbiuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
+ \hskip\channelwidth\hbox{\drawvector(0,1){\varrowlength}}\hss}}%
+\def\drawadjdownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
+ \hskip\channelwidth\lower\varrowlength
+ \hbox{\drawvector(0,1){\varrowlength}}\hss}}%
+\def\drawadjuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
+ \hskip\channelwidth\raise\varrowlength
+ \hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
+\def\drawvline{\hbox to5pt{\hss\drawline(0,1){\varrowlength}\hss}}%
+\def\drawbivline{\hbox to5pt{\hss\hbox{\drawline(0,1){\varrowlength}}%
+ \hskip\channelwidth\hbox{\drawline(0,1){\varrowlength}}\hss}}%
+
+
+% Macros for setting commutative diagrams.
+
+% A macro inspired by Ex.~18.46 of the TeXbook.
+\def\commdiag#1{\null\,
+ \vcenter{\commdiagbaselines
+ \m@th\ialign{\hfil$##$\hfil&&\hfil$\mkern4mu ##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}%
+
+\def\commdiagbaselines{\baselineskip15pt \lineskip3pt \lineskiplimit3pt }%
+% A macro inspired by Francis Borceux's Diagram macros for LaTeX
+% (FBORCEUX@BUCLLN11.BITNET).
+\def\gridcommdiag#1{\null\,
+ \vcenter{\offinterlineskip
+ \m@th\ialign{&\vbox to\vgrid{\vss
+ \hbox to\hgrid{\hss\smash@@{$##$}\hss}}\crcr
+ \mathstrut\crcr\noalign{\kern-\vgrid}
+ #1\crcr\mathstrut\crcr\noalign{\kern-.5\vgrid}}}\,}%
+
+% Default parameters
+% Define default heights and widths for arrows using the golden ratio.
+% Note that 5:3 (for sline) and 3:2 (for vector) approximate this ratio.
+\newdimen\harrowlength \harrowlength=60pt
+\newdimen\varrowlength \varrowlength=.618\harrowlength
+\newdimen\sarrowlength \sarrowlength=\harrowlength
+
+% Morphism placement
+\newdimen\hmorphposn \hmorphposn=\z@
+\newdimen\vmorphposn \vmorphposn=\z@
+\newdimen\morphdist \morphdist=4pt
+
+\dimendef\@hmorphdflt 0 % These two dimensions are
+\dimendef\@vmorphdflt 2 % defined by \getm@rphposn
+
+\newdimen\hmorphposnrt \hmorphposnrt=\z@
+\newdimen\hmorphposnlft \hmorphposnlft=\z@
+\newdimen\vmorphposnrt \vmorphposnrt=\z@
+\newdimen\vmorphposnlft \vmorphposnlft=\z@
+\let\hmorphposnup=\hmorphposnrt
+\let\hmorphposndn=\hmorphposnlft
+\let\vmorphposnup=\vmorphposnrt
+\let\vmorphposndn=\vmorphposnlft
+
+% Default grid size for \gridcommdiag
+\newdimen\hgrid \hgrid=15pt
+\newdimen\vgrid \vgrid=15pt
+
+% Horizontal and vertical distance between double lines and arrows.
+\newdimen\hchannel \hchannel=0pt
+\newdimen\vchannel \vchannel=0pt
+\newdimen\channelwidth \channelwidth=3pt
+
+\dimendef\@hchannel 0 % Defined via the
+\dimendef\@vchannel 2 % macro \getch@nnel
+
+\catcode`& = \@oldandcatcode
+\catcode`@ = \@oldatcatcode
+
+
+% Some examples
+
+%\parskip=20pt
+%
+%The first example:
+%$$\commdiag{A&\mapright^f&B&\mapleft^g&C\cr
+%\mapdown\lft\psi&\arrow(3,-2)\rt s&\mapup\rt\phi&
+%\arrow(-3,2)\lft l&\mapdown\rt\theta\cr
+%D&\mapright_h&E&\mapleft_{\int_0^t{\bf A}\,d\sigma}&F\cr}$$
+%
+%
+%Covering homotopy property (Bott and Tu, {\it Differential Forms in
+%Algebraic Topology}):
+%$$\commdiag{Y&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft{f_t}&\mapdown\cr
+%Y\times I&\mapright^{\bar f_t}&X}$$
+%
+%
+%Universal mapping property (Warner, {\it Foundations of Differentiable
+%Manifolds and Lie Groups}): $$\varrowlength=20pt
+%\commdiag{V\otimes W\cr \mapup\lft\phi&\arrow(3,-1)\rt{\tilde l}\cr
+%V\times W&\mapright^l&U\cr}$$
+%
+%
+%A cube (Francis Borceux):
+%$$\harrowlength=48pt \varrowlength=48pt \sarrowlength=20pt
+%\def\cross#1#2{\setbox0=\hbox{$#1$}%
+% \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+%\gridcommdiag{&&B&&\mapright^b&&D\cr
+%&\arrow(1,1)\lft a&&&&\arrow(1,1)\lft d\cr
+%A&&\cross{\hmorphposn=12pt\mapright^c}{\vmorphposn=-12pt\mapdown\lft f}
+%&&C&&\mapdown\rt h\cr\cr
+%\mapdown\lft e&&F&&\cross{\hmorphposn=-12pt\mapright_j}
+%{\vmorphposn=12pt\mapdown\rt g}&&H\cr
+%&\arrow(1,1)\lft i&&&&\arrow(1,1)\rt l\cr
+%E&&\mapright_k&&G\cr}$$
+%
+%Zassenhaus's Butterfly Lemma (Lang, {\it Algebra}):
+%$$\hgrid=16pt \vgrid=8pt \sarrowlength=32pt
+%\def\cross#1#2{\setbox0=\hbox{$#1$}%
+% \hbox to\wd0{\hss\hbox{$#2$}\hss}\llap{\unhbox0}}
+%\def\l#1{\llap{$#1$\hskip.5em}}
+%\def\r#1{\rlap{\hskip.5em$#1$}}
+%\gridcommdiag{&&U&&&&V\cr &&\bullet&&&&\bullet\cr
+%&&\sarrowlength=16pt\sline(0,1)&&&&\sarrowlength=16pt\sline(0,1)\cr
+%&&\l{u(U\cap V)}\bullet&&&&\bullet\r{(U\cap V)v}\cr
+%&&&\sline(2,-1)&&\sline(2,1)\cr
+%&&\cross{=}{\sline(0,1)}&&\bullet&&\cross{=}{\sline(0,1)}\cr\cr
+%&&\l{^{\textstyle u(U\cap v)}}\bullet&&\cross{=}{\sline(0,1)}&&
+% \bullet\r{^{\textstyle(u\cap V)v}}\cr
+%&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)\cr
+%\l{u}\bullet&&&&\bullet&&&&\bullet\r{v}\cr
+%&\sline(2,-1)&&\sline(2,1)&&\sline(2,-1)&&\sline(2,1)\cr
+%&&\bullet&&&&\bullet\cr &&u\cap V&&&&U\cap v\cr}$$
diff --git a/macros/eplain/tex/btxmac.tex b/macros/eplain/tex/btxmac.tex
new file mode 100644
index 0000000000..9fd3e20415
--- /dev/null
+++ b/macros/eplain/tex/btxmac.tex
@@ -0,0 +1,929 @@
+%% @texfile{
+%% author = "Karl Berry and Oren Patashnik",
+%% version = "0.99p",
+%% date = "30 May 2019",
+%% filename = "btxmac.tex",
+%% address = "tex-eplain@tug.org",
+%% supported = "yes",
+%% docstring = "Defines macros that make BibTeX work with plain TeX",
+%% }
+% BibTeX-for-TeX macros for BibTeX 0.99c, TeX 3.0 or later.
+% Copyright 1990, 1991, 1992, 1995, 2005, 2007, 2013, 2016, 2019 Karl Berry &
+% Oren Patashnik.
+%
+% Unlimited copying and redistribution of this file are permitted as
+% long as this file is not modified. Modifications (and redistribution
+% thereof) are permitted, but only if the resulting file is not named
+% btxmac.tex.
+%
+% This file contains TeX macros that allow BibTeX, a bibliography
+% program that was originally designed for use with LaTeX, to work with
+% plain TeX. Please report any bugs (outright goofs, improvable macros,
+% misfeatures, or unclear documentation) to Oren Patashnik
+% (opbibtex@cs.stanford.edu). These macros will become frozen shortly
+% after BibTeX version 1.00 is released.
+%
+% AMS-TEX WARNING: We tried very hard, as of version .99i of these macros,
+% to make them compatible with AmS-TeX. We succeeded to the extent
+% that, if you use one of the standard bibliography styles, you probably
+% won't notice any problems with version 0.99i of btxmac.tex. But
+% ultimately we failed, in that the inherent incompatibilities between
+% plain TeX and AmS-TeX kept making these macros break, for certain
+% inputs or certain styles. Examples: (1) AmS-TeX treats at-signs as
+% special, in ways that plain TeX and LaTeX don't, so that, for example,
+% you can't have any `@' characters in an argument to the \cite command,
+% the way you can in TeX or LaTeX; (2) AmS-TeX decided that plain TeX's
+% and LaTeX's macron-accent control sequence `\=' should be undefined;
+% so you'll need to define `\=' to be `\B' to get the xampl.bib example
+% suggested below to work with AmS-TeX; (3) AmS-TeX redefines the tie
+% character `~' of plain TeX, and AmS-TeX's `amsppt' style redefines
+% plain TeX's `\nobreak' macro, so that if you use an author-date style
+% like `apalike' and you have a multiple-author reference for which the
+% author-date style automatically produces a citation in the text like
+% `(Jones et~al., 1992)' you will throw AmS-TeX's `amsppt' style into
+% an infinite loop, exceeding its input stack size.
+%
+% In practice, such incompatibilities surface infrequently; but it is
+% now clear to us that it's not worth the effort (perhaps it's not even
+% possible) to make the btxmac.tex macros robust when used both with
+% plain TeX and Ams-TeX. If the BibTeX/AmS-TeX results attainable with
+% the current btxmac.tex macros are sufficient, fine. But if there's a
+% demand for more robust BibTeX/AmS-TeX behavior, then someone who's
+% very familiar with the AmS-TeX package should probably make an
+% amsbtxmc.tex version of the macros. Until then, if you're an AmS-TeX
+% user, or a LaTeX or plain TeX user sharing files with an AmS-TeX user,
+% beware.
+% END OF AMS-TEX WARNING.
+%
+% To use these macros you should be familiar with how BibTeX interacts
+% with LaTeX, since BibTeX's interaction with TeX is very similar; that
+% interaction is explained in the LaTeX manual. It also helps to
+% have read "BibTeXing", the documentation that accompanies BibTeX.
+%
+% Then, if you want, you should redefine any of the macros that begin
+% with `\bbl' or `\biblabel' or `\print' that you need to get formatting
+% different from the default (the default settings are designed to
+% accompany a bibliography style like BibTeX's standard style `plain').
+% The macros you might want to change are described briefly a few
+% paragraphs hence.
+%
+% To get started without reading any documentation, try running the
+% short .tex file below through TeX and BibTeX.
+%
+% Remember the general scheme: Running (La)TeX writes information on the
+% .aux (auxiliary) file; then running BibTeX reads information from the
+% .aux, .bst (style), and .bib (database) files, and writes information
+% (the bibliography) on a .bbl file; then running (La)TeX incorporates
+% the bibliography; then running (La)TeX once more fixes the remaining
+% forward references into the bibliography. Thus, to get everything
+% incorporated into your output, you'll have to run (La)TeX, BibTeX,
+% (La)TeX, (La)TeX. (Standup, sitdown, fight, fight, fight.)
+%
+% These macros can stand alone or they can be \input into a macro
+% package, like Eplain, that is sufficiently compatible with plain TeX.
+% To use these macros to format the 0.99 version of the xampl.bib file
+% that's distributed with BibTeX (that version of the file has no
+% self-identification), you'll need to define \mbox, which is a LaTeX
+% command, to be \hbox, as in the example below.
+%
+% Here's an eight-line plain TeX file for trying out btxmac.tex; of course
+% you'll have to remove the comment characters at the beginning of each
+% line, and, depending on your system, you might have to take steps so
+% that BibTeX can "see" the files xampl.bib and plain.bst (BibTeX will
+% give you two empty-field warning messages that you should ignore).
+%
+% \input btxmac
+% \noindent This cites Aamport's gnominious article~\cite{article-full}.
+% \medskip
+% \leftline{\bf References}
+% \nocite{*} % put all database entries into the reference list
+% \bibliographystyle{plain} % specify plain.bst as the style file
+% \bibliography{xampl} % specify the database files; here, just xampl.bib
+% \bye
+%
+%
+% HISTORY
+%
+% Karl Berry wrote the original version of these macros in 1989 and
+% 1990, for use in his `Eplain' package. Oren Patashnik modified them
+% slightly in July 1990, as part of the official BibTeX distribution.
+%
+% 1-Aug-90 Version 0.99a, not released to the general public.
+% 14-Aug-90 0.99b, first general release.
+% 26-Aug-90 0.99c, made \@undefinedmessage work with other macro packages.
+% 6-Sep-90 0.99d, allowed for general formatting of bibliography labels,
+% for general formatting of (in-text) citations, and for
+% changing certain catcodes while reading the .aux file.
+% 14-Nov-90 0.99e, changed the way \@setletters works, made some \new...'s
+% non-outer, and changed the way Eplain reads this file.
+% 12-Dec-90 0.99f, made \@resetnumerals change the `,' and `.' catcodes; and
+% added \biblabelextrahang, \@getoptionalarg, and \bblsc.
+% 11-Mar-91 0.99g, made a few minor changes required by the way Eplain reads
+% this file, but no functional changes.
+% 24-Apr-91 0.99h, inhibited the reading and writing of the .aux file if it
+% isn't used or if the \noauxfile macro is defined, and
+% removed some .aux-file-opening detritus; printed the
+% cite-key of undefined citations in \tt font; changed the
+% catcode of `_' inside \cite; and called \@resetnumerals
+% from inside a group.
+% 29-Feb-92 0.99i, made these macros semi-compatible with AmS-TeX; removed
+% \@resetnumerals, \@setletters, \@tokstostring, and
+% friends; changed the way \cite handles catcodes; changed
+% \@getoptionalarg, and had \bibitem and \newcommand use
+% it; added \@futurenonspacelet and (to facilitate the use
+% of multiple reference lists) \bblfilebasename; changed
+% \biblabelprint to use the new macros \biblabelprecontents
+% and \biblabelpostcontents, and to, by default, right-
+% justify numeric labels; and renamed \biblabelextrahang to
+% the more descriptive \biblabelextraspace.
+% 14-Mar-92 0.99j, made 0.99i's use of `\\' local to btxmac.tex.
+% 13-Nov-95 0.99k, defined \begin and \end (while reading bbl file) only if
+% it wasn't already defined.
+% 11-Aug-03 0.99l, defined \renewcommand and \providecommand, since some AMS
+% style files use them. Also defined \emph, \textbf, and
+% \mbox, since many .bib files use them. This version was
+% never actually released, but these changes appear
+% starting with 0.99k-18aug05.
+% 18-Aug-05 0.99k-18aug05, made the \em, \emph, etc., definitions effective
+% only if not already defined. Provided
+% \printcite{pre,post}item, \bblitemhook.
+% 09-Sep-07 0.99k-09sep07, executed \@citedef in a group to avoid potential
+% save-stack overflow.
+% 07-Feb-13 0.99m, made \newcommand and \providecommand be \long, and not
+% use \edef. Defined \bbltextbf.
+% 30-Sep-13 0.99n, made \@futurenonspacelet be \long,
+% renamed \@optionaltemp to \@optionalusercs,
+% ignored spaces after the optional argument.
+% 12-May-16 0.99o, renamed \@newcommand and others to \@btx..., to avoid
+% conflict with Babel's file plain.def.
+% 30-May-19 0.99p, one missed rename of \@continuenewcommand to \@btx...,
+% that made \providecommand fail.
+%
+% The LaTeX-related commands defined in this file include
+% (a) the four commands that a user types (\bibliography,
+% \bibliographystyle, \cite, and \nocite);
+% (b) three commands that BibTeX looks for in the .aux
+% file (\bibdata, \bibstyle, and \citation---there is a fourth command
+% that BibTeX looks for, but that command is related to LaTeX's \include
+% facility, so these macros ignore that command); and
+% (c) the LaTeX commands (\newcommand, \renewcommand, \providecommand)
+% that are written by a standard (alpha) or AMS bibliography style.
+% (d) a few more LaTeX commands (\emph, \mbox, \textbf) which many .bib
+% files use.
+%
+% The definitions here are not the same as the corresponding LaTeX
+% definitions (those LaTeX definitions depend on a significant fraction
+% of LaTeX itself). But the only significant differences are with the
+% \*command macros, which in LaTeX (a) give warnings in various
+% circumstances; (b) allow a second optional argument; and (c) make the
+% defined control sequences \long. The versions here don't do any of
+% those things.
+%
+% To summarize: Unless you know what you're doing, you shouldn't define
+% any control sequences with these ten names:
+%
+% \bibdata
+% \bibliography
+% \bibliographystyle
+% \bibstyle
+% \citation
+% \cite
+% \newcommand
+% \nocite
+% \providecommand
+% \renewcommand
+%
+% There are other commands written by one or more of the four standard
+% (plain, abbrv, alpha, unsrt) or four semistandard (acm, apalike,
+% ieeetr, siam) bibliography styles, or commonly used in .bib files.
+% These take effect only within the bibliography, and are redefinable,
+% as explained later:
+%
+% \em
+% \emph
+% \mbox
+% \newblock
+% \sc
+% \textbf
+%
+% There's one control sequence you might want to use (but not redefine)
+% in redefining \biblabelprint:
+%
+% \biblabelwidth
+%
+% There are fifteen other control sequences (explained later in more detail)
+% that the macros of this file will use if you define them---you should
+% define them after the \input btxmac command but before the \bibliography
+% command. The first six begin with `\bbl' and affect fonts, spacing,
+% perhaps other characteristics of the bibliography, and which .bbl files
+% get read; the next five begin with `\biblabel' and determine how labels
+% are formatted in the bibliography; and the last four begin with `\print'
+% and determine how the in-text citations are formatted:
+%
+% \bblem
+% \bblfilebasename
+% \bblhook
+% \bblnewblock
+% \bblrm
+% \bblsc
+% \biblabelcontents
+% \biblabelprecontents
+% \biblabelprint
+% \biblabelpostcontents
+% \biblabelextraspace
+% \printbetweencitations
+% \printcitefinish
+% \printcitenote
+% \printcitestart
+%
+% If it's defined before the \input btxmac command, the control sequence
+% below inhibits the reading and writing of the .aux file(s), and the
+% issuing of related warning messages. Any definition will do. This
+% feature might help when you're working on draft stages of a document:
+%
+% \noauxfile
+%
+%
+% Here's another control sequence (it's described later) that you
+% probably won't want to redefine unless you are writing another macro
+% package; if you do redefine it, however, do it before the \input btxmac
+% command (and notice that it has an `@' in its name):
+%
+% \@undefinedmessage
+%
+% Any other control sequence in this file that might conflict with
+% something you've defined will have an `@' in its name, so such conflicts
+% are unlikely; but if you're worried about a specific control sequence
+% name, do a text search of this file to look for it.
+%
+%
+% So to start things off we turn `@' into a letter (category code 11),
+% keeping track of the old category code for future restoration.
+% (Simply resetting it to 12 when we leave these macros is
+% insufficient.) We use `\cite' as a temporary control sequence to
+% save the current catcode of @ to avoid possibly overwriting something
+% (without an `@' in its name) that might already be defined.
+%
+\edef\cite{\the\catcode`@}%
+\catcode`@ = 11
+\let\@oldatcatcode = \cite
+\chardef\@letter = 11
+\chardef\@other = 12
+%
+%
+% Next come some things that will be useful later.
+%
+% Make an outer definition into an inner one (due to Chris Thompson).
+% The arguments should be the control sequence to be defined, and the
+% new of the \outer control sequence, as characters; the control
+% sequence #1 is defined to be just the same as \csname#2\endcsname, but
+% not \outer. For example, \@innerdef\innernewcount{newcount} would
+% define \innernewcount to be a non-outer version of \newcount.
+%
+\def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
+%
+% We use \@innerdef to make some of our allocations local, because
+% Eplain includes our code inside a conditional. We put @'s in the
+% names to minimize the (already small) chance of conflicts.
+%
+\@innerdef\@innernewcount{newcount}%
+\@innerdef\@innernewdimen{newdimen}%
+\@innerdef\@innernewif{newif}%
+\@innerdef\@innernewwrite{newwrite}%
+%
+%
+% Swallow one parameter.
+%
+\def\@gobble#1{}%
+%
+%
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\@undefined
+ \let\@linenumber = \empty % Pre-3.0.
+\else
+ \def\@linenumber{\the\inputlineno:\space}%
+\fi
+%
+%
+% The following macro \@futurenonspacelet (from the TeXbook) behaves
+% essentially like \futurelet except that it discards any implicit or
+% explicit space tokens that intervene before a nonspace is scanned:
+%
+\long\def\@futurenonspacelet#1{\def\cs{#1}%
+ \afterassignment\@stepone\let\@nexttoken=
+}%
+\begingroup % The grouping here avoids stepping on an outside use of `\\'.
+\def\\{\global\let\@stoken= }%
+\\ % now \@stoken is a space token (\\ is a control symbol, so that
+ % space after it is seen).
+\endgroup
+\def\@stepone{\expandafter\futurelet\cs\@steptwo}%
+\def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree
+ \else\let\@@next=\@nexttoken\fi \@@next}%
+\def\@stepthree{\afterassignment\@stepone\let\@@next= }%
+%
+%
+% \@getoptionalarg\CS gets an optional argument from the input, enclosed
+% in brackets, then expands \CS. We set \@optionalarg to \empty if we
+% don't find one, otherwise to the text of the argument. This assumes
+% the brackets don't have a funny category code.
+%
+\def\@getoptionalarg#1{%
+ \let\@optionalusercs = #1%
+ \let\@optionalnext = \relax
+ \@futurenonspacelet\@optionalnext\@bracketcheck
+}%
+%
+% The \expandafter's in this macro let us avoid the use of \aftergroup,
+% which is somewhat more expensive.
+%
+\def\@bracketcheck{%
+ \ifx [\@optionalnext
+ \expandafter\@@getoptionalarg % we have an optional arg
+ \else
+ \let\@optionalarg = \empty % no optional arg
+ \expandafter\@optionalusercs
+ \fi
+}%
+%
+% Get the next bracketed text.
+\def\@@getoptionalarg[#1]{%
+ \def\@optionalarg{#1}%
+ % Ignore spaces after the optional arg, too.
+ % (We don't actually need to peek ahead, but this is the easiest way
+ % to ignore the spaces.)
+ \let\@optdummy=\relax % just in case it has become \outer somehow
+ \@futurenonspacelet\@optdummy\@optionalusercs
+}%
+%
+%
+% From LaTeX.
+%
+\def\@nnil{\@nil}%
+\def\@fornoop#1\@@#2#3{}%
+%
+\def\@for#1:=#2\do#3{%
+ \edef\@fortmp{#2}%
+ \ifx\@fortmp\empty \else
+ \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}%
+ \fi
+}%
+%
+\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
+ #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi
+}%
+%
+\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
+ \let\@nextwhile=\@fornoop \else
+ #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}%
+}%
+%
+%
+% This macro tests if a file \jobname.#1 exists, and sets \if@fileexists
+% appropriately. If an optional argument is given, it is used as the
+% root part of the filename instead of \jobname.
+%
+\@innernewif\if@fileexists
+%
+\def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}%
+\def\@finishtestfileexistence#1{%
+ \begingroup
+ \def\extension{#1}%
+ \immediate\openin0 =
+ \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi
+ \ifx\extension\empty \else .#1\fi
+ \space
+ \ifeof 0
+ \global\@fileexistsfalse
+ \else
+ \global\@fileexiststrue
+ \fi
+ \immediate\closein0
+ \endgroup
+}%
+%
+%
+%% [[[start of BibTeX-specific stuff]]]
+%
+% Now come the four main LaTeX commands and their associated .aux
+% commands. Just as in LaTeX, \bibliographystyle defines the BibTeX
+% style name (.bst file, that is), and \bibliography defines the
+% database (.bib) file(s). The corresponding .aux-file commands are
+% \bibstyle and \bibdata, which are there only for BibTeX's (but not
+% LaTeX's) use.
+%
+\def\bibliographystyle#1{%
+ \@readauxfile
+ \@writeaux{\string\bibstyle{#1}}%
+}%
+\let\bibstyle = \@gobble
+%
+% As well as writing the \bibdata command to tell BibTeX which .bib
+% files to read, we read the .bbl file that BibTeX (or a person,
+% conceivably) has produced. We use \bblfilebasename as the root of the
+% filename to read; this defaults to \jobname.
+%
+\let\bblfilebasename = \jobname
+\def\bibliography#1{%
+ \@readauxfile
+ \@writeaux{\string\bibdata{#1}}%
+ \@testfileexistence[\bblfilebasename]{bbl}%
+ \if@fileexists
+ % We just output a non-discardable item (the `whatsit' with the
+ % \bibdata command). This means that the glue that will be
+ % inserted next (\parskip or \baselineskip, most likely) will be a
+ % legal breakpoint. Most likely, this is after some kind of
+ % heading, where we don't want to allow a page break. So:
+ \nobreak
+ \@readbblfile
+ \fi
+}%
+\let\bibdata = \@gobble
+%
+% The \nocite{label,label,...} command writes its argument to \@auxfile,
+% unless instructed not to, but produces no text in the document. Both
+% the \nocite and \cite commands produce \citation commands in the .aux file.
+%
+\def\nocite#1{%
+ \@readauxfile
+ \@writeaux{\string\citation{#1}}%
+}%
+%
+\@innernewif\if@notfirstcitation
+%
+% \cite[note]{label,label,...} produces the citations for the labels as
+% well. If the optional argument `note' is present, it's added after
+% the labels. Since \cite calls \nocite to do its .aux-file writing,
+% \cite doesn't need to call \@readauxfile (\nocite does).
+%
+\def\cite{\@getoptionalarg\@cite}%
+%
+% Typeset the citations for the labels in #1, followed by the note, if
+% it exists. To change the citation's format in the text, redefine one
+% or more `\print...' macros, whose defaults appear later in this file.
+%
+\def\@cite#1{%
+ % Remember the optional argument, in case one of the macros we call
+ % below ends up looking for an optional argument itself. For
+ % example, if a \cite[note] triggers reading the .aux file, then the
+ % [note] would be clobbered, since \@testfileexistence looks for an
+ % optional arg.
+ \let\@citenotetext = \@optionalarg
+ % Start printing the text, beginning with a left bracket by default.
+ \printcitestart
+ % It's complicated, but because \nocite puts a `whatsit' onto the list,
+ % \nocite should follow \printcitestart. It's conceivable, but very
+ % unlikely, that this `whatsit' will cause a problem (glue that doesn't
+ % disappear when you want it to is the most likely symptom), requiring
+ % a change either to \printcitestart or to the label that the .bst file
+ % produces.
+ \nocite{#1}%
+ \@notfirstcitationfalse
+ \@for \@citation :=#1\do
+ {%
+ \expandafter\@onecitation\@citation\@@
+ }%
+ \ifx\empty\@citenotetext\else
+ \printcitenote{\@citenotetext}%
+ \fi
+ \printcitefinish
+}%
+%
+\def\@onecitation#1\@@{%
+ \if@notfirstcitation
+ \printbetweencitations
+ \fi
+ %
+ \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
+ \if@citewarning
+ \message{\@linenumber Undefined citation `#1'.}%
+ \fi
+ % Give it a dummy definition:
+ \expandafter\gdef\csname\@citelabel{#1}\endcsname{%
+ {\tt
+ \escapechar = -1
+ \nobreak\hskip0pt
+ \expandafter\string\csname#1\endcsname
+ \nobreak\hskip0pt
+ }%
+ }%
+ \fi
+ % Now produce the text, whether it was undefined or not.
+ \printcitepreitem{#1}%
+ \csname\@citelabel{#1}\endcsname
+ \printcitepostitem
+ \@notfirstcitationtrue
+}%
+%
+% Given a label `foo', the macro `\b@foo' is supposed to
+% hold the text that should be produced.
+%
+\def\@citelabel#1{b@#1}%
+%
+% So, how does a citation label get defined? When we read the .bbl file
+% (below), a \bibitem writes out a \@citedef command. And when we read
+% the \@citedef, we define \@citelabel{#1}, where #1 is the user's
+% label.
+%
+% The group around the def will keep the save stack from overflowing:
+% We are reading the .aux file inside a group. For undefined
+% commands, \csname...\endcsname makes them equivalent to \relax
+% locally in that group; when we globally redefine them, TeX enters
+% the definitions on the save stack, once for each label. When done
+% in the topmost group, this can overflow a stack of any size, given
+% sufficient number of label definitions. So, we put these
+% \csname...\endcsname's inside another group, to pop the stack for
+% every label.
+\def\@citedef#1#2{{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}}%
+%
+%
+% Reading the .bbl file also produces the typeset bibliography. Please
+% notice, however, that we do not produce the title for the references
+% (e.g., `References'), as LaTeX does. The formatting and spacing of
+% that title, whether it should go into the headline, and so on, are all
+% things determined by your format. We cannot know those things in
+% advance. If you wish, you can define \bblhook to produce the title.
+% Or just do it before the \bibliography command.
+%
+\def\@readbblfile{%
+ % Define a counter to tell us which item number we are on, unless
+ % we've already defined it (because the document has more than one
+ % bibliography).
+ \ifx\@itemnum\@undefined
+ \@innernewcount\@itemnum
+ \fi
+ %
+ \begingroup
+ % If another package has already defined \begin, don't define our
+ % own simplistic \begin and \end; assume they want to take care of
+ % it themselves. (That way, their \begin's and \end's for other
+ % things can be used in the bib files.)
+ \ifx\begin\@undefined
+ \def\begin##1##2{%
+ % ##1 is just `thebibliography'.
+ % ##2 is the widest label.
+ % We set (new dimen) \biblabelwidth based on the widest label
+ \setbox0 = \hbox{\biblabelcontents{##2}}%
+ \biblabelwidth = \wd0
+ }%
+ \let\end = \@gobble % The arg is `thebibliography' again.
+ \fi
+ %
+ % Here we have two possibilities:
+ % \bibitem[typesetlabel]{citationlabel}
+ % \bibitem{citationlabel}
+ % If we have the second of these, the citations are numbered, starting
+ % from one; we use our own count register \@itemnum for this.
+ %
+ \@itemnum = 0
+ \def\bibitem{\@getoptionalarg\@bibitem}%
+ \def\@bibitem{%
+ \ifx\@optionalarg\empty
+ \expandafter\@numberedbibitem
+ \else
+ \expandafter\@alphabibitem
+ \fi
+ }%
+ \def\@alphabibitem##1{%
+ % Need \xdef here for various reasons.
+ \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}%
+ % Left-justify alpha labels, unless \biblabel{pre,post}contents
+ % are already defined.
+ \ifx\biblabelprecontents\@undefined
+ \let\biblabelprecontents = \relax
+ \fi
+ \ifx\biblabelpostcontents\@undefined
+ \let\biblabelpostcontents = \hss
+ \fi
+ \@finishbibitem{##1}%
+ }%
+ %
+ \def\@numberedbibitem##1{%
+ \advance\@itemnum by 1
+ \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}%
+ % Right-justify numeric labels, unless \biblabel{pre,post}contents
+ % are already defined.
+ \ifx\biblabelprecontents\@undefined
+ \let\biblabelprecontents = \hss
+ \fi
+ \ifx\biblabelpostcontents\@undefined
+ \let\biblabelpostcontents = \relax
+ \fi
+ \@finishbibitem{##1}%
+ }%
+ %
+ \def\@finishbibitem##1{%
+ \bblitemhook{##1}%
+ \biblabelprint{\csname\@citelabel{##1}\endcsname}%
+ \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
+ \ignorespaces
+ }%
+ %
+ % Do the printing (we're producing the bibliography, remember).
+ %
+ \ifx\undefined\em \let\em=\bblem \fi
+ \ifx\undefined\emph \let\emph=\bblemph \fi
+ \ifx\undefined\mbox \let\mbox=\bblmbox \fi
+ \ifx\undefined\newblock \let\newblock=\bblnewblock \fi
+ \ifx\undefined\sc \let\sc=\bblsc \fi
+ \ifx\undefined\textbf \let\textbf=\bbltextbf \fi
+ %
+ % Punctuation won't affect spacing;
+ \frenchspacing
+ % the penalties below are from LaTeX's [article,book,report].sty;
+ \clubpenalty = 4000 \widowpenalty = 4000
+ % the next two values come from LaTeX's \sloppy command;
+ \tolerance = 10000 \hfuzz = .5pt
+ \everypar = {\hangindent = \biblabelwidth
+ \advance\hangindent by \biblabelextraspace}%
+ \bblrm
+ % the \parskip is a guess at what looks good;
+ \parskip = 1.5ex plus .5ex minus .5ex
+ % and the space between label and text comes from LaTeX's \labelsep.
+ \biblabelextraspace = .5em
+ \bblhook
+ %
+ \input \bblfilebasename.bbl
+ \endgroup
+}%
+%
+% The widest label's width is useful for redefining \biblabelprint;
+% you redefine \biblabelwidth, in effect, by redefining the
+% \biblabelcontents macro that appears below. And \biblabelextraspace,
+% which is redefinable inside \bblhook, is added to \biblabelwidth to
+% determine the amount of hanging indentation.
+%
+\@innernewdimen\biblabelwidth
+\@innernewdimen\biblabelextraspace
+%
+% Now come the main macros that are related to the printing of the
+% bibliography. Since you might want to redefine them, they are given
+% default definitions outside of \@readbblfile.
+%
+% The first one controls the printing of a bibliography entry's label.
+% If you change it, make sure that it starts with something like
+% \noindent or \indent or \leavevmode that puts TeX into horizontal mode
+% (even if the label itself is empty); otherwise, the hanging
+% indentation will get messed up in certain circumstances.
+%
+\def\biblabelprint#1{%
+ \noindent
+ \hbox to \biblabelwidth{%
+ \biblabelprecontents
+ \biblabelcontents{#1}%
+ \biblabelpostcontents
+ }%
+ \kern\biblabelextraspace
+}%
+%
+% If you are using numeric labels, and you want them left-justified
+% (numeric labels by default are right-justified), do something like:
+% \def\biblabelprecontents{\relax}
+% \def\biblabelpostcontents{\hss}
+%
+% By default the labels are typeset in \bblrm, and enclosed in brackets.
+\def\biblabelcontents#1{{\bblrm [#1]}}%
+%
+% The main text, too, is typeset using \bblrm, which is \rm by default.
+\def\bblrm{\rm}%
+%
+% Emphasis for producing, e.g., titles, is done with \it by default.
+\def\bblem{\it}%
+%
+% Another way to emphasize, with built-in italic correction. (Doesn't
+% look for a following comma or period, though.)
+\def\bblemph#1{{\bblem #1\/}}
+%
+% And bold.
+\def\bbltextbf#1{{\bf #1}}
+%
+% \mbox is \hbox forcing horizontal mode.
+\def\bblmbox{\leavevmode\hbox}
+%
+% Some styles use a caps-and-small-caps font for author names. LaTeX
+% defines an \sc command but plain TeX doesn't, so we need one here.
+% The definition below doesn't load the font unless it's needed, but it
+% tries to load only the 10pt version, because it might not exist at
+% other point sizes.
+%
+\def\bblsc{\ifx\@scfont\@undefined
+ \font\@scfont = cmcsc10
+ \fi
+ \@scfont
+}%
+%
+% The major parts of an entry are separated with \bblnewblock. The
+% numbers below are taken from LaTeX's `article' style.
+%
+\def\bblnewblock{\hskip .11em plus .33em minus .07em }%
+%
+% Here's where you stick any other bibliography-formatting goodies, or
+% redefine the values above.
+%
+\let\bblhook = \empty
+%
+% And here you can add code to be executed before each item (before
+% \biblabelprint is called). The parameter is citation label for this
+% bibliography entry.
+%
+\let\bblitemhook = \@gobble
+%
+%
+% Here are the four default definitions for formatting the in-text
+% citations. These are what you redefine (after your \input btxmac but
+% before your \bibliography) to get parens instead of brackets, or
+% superscripts, or footnotes, or whatever.
+%
+\def\printcitestart{[}% left bracket
+\def\printcitefinish{]}% right bracket
+\def\printbetweencitations{, }% comma, space
+\let\printcitepreitem\@gobble % takes label
+\let\printcitepostitem\empty
+\def\printcitenote#1{, #1}% comma, space, note (if it exists)
+%
+% That scheme is pretty flexible. For example you could use
+% \def\printcitestart{\unskip $^\bgroup}
+% \def\printcitefinish{\egroup$}
+% \def\printbetweencitations{,}
+% \def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
+% \font\eighttt = cmtt8
+% \scriptfont\ttfam = \eighttt
+% to get superscripted in-text citations. (The scriptfont stuff
+% exists only to print an undefined citation; it's in cmtt8 because
+% there is no cmtt7.) To get something radically different, however,
+% you'll have to define your own \cite command.
+%
+% When we read `\citation' from the .aux file, it means nothing.
+%
+\let\citation = \@gobble
+%
+%
+% Now comes the stuff for dealing with LaTeX's \newcommand. As
+% mentioned earlier, this \newcommand will redefine a preexisting
+% command; that's different from how LaTeX's \newcommand behaves.
+%
+\@innernewcount\@btxnumparams
+%
+% \newcommand{\foo}[n]{text} defines the control sequence \foo to have n
+% parameters, and replacement text `text'. In LaTeX, this command gives
+% a warning if \foo is already defined, and allows a second
+% optional argument (which is a default value for the first optional
+% arg) but we don't bother with either of these.
+%
+\ifx\newcommand\undefined
+\long\def\newcommand#1{%
+ \def\@btxcommandname{#1}%
+ \@getoptionalarg\@btxcontinuenewcommand
+}%
+\fi
+%
+%
+% \renewcommand{\foo}[n]{text}, for our purposes, is the same as
+% \newcommand. In LaTeX, it gives a warning if \foo is not already defined.
+%
+\ifx\renewcommand\undefined
+ \let\renewcommand = \newcommand
+\fi
+%
+%
+% \providecommand{\foo}[n]{text} defines \foo as in \newcommand only if
+% \foo is not already defined.
+%
+\ifx\providecommand\undefined
+\long\def\providecommand#1{%
+ \def\@btxcommandname{#1}%
+ %
+ \expandafter\ifx\@btxcommandname \@undefined
+ \let\cs=\@btxcontinuenewcommand % undefined, so we'll define it
+ \else
+ \let\cs=\@gobble % already defined, so ignore it
+ \fi
+ \@getoptionalarg\cs
+}%
+\fi
+%
+%
+% Figure out if this definition has parameters.
+%
+\def\@btxcontinuenewcommand{%
+ % If no optional argument, we have zero parameters. Otherwise, we
+ % have that many.
+ \@btxnumparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
+ \@btxnewcommand
+}%
+%
+% \@btxnumparams is how many arguments this command has. The name of the
+% command is \@btxcommandname. The replacement text for the new macro is #1.
+%
+\def\@btxnewcommand#1{%
+ \def\@btxstartdef{\expandafter\def\@btxcommandname}%
+ \ifnum\@btxnumparams=0
+ \let\@btxparamdef = \empty
+ \else
+ \ifnum\@btxnumparams>9
+ \errmessage{\the\@btxnumparams\space is too many parameters}%
+ \else
+ \ifnum\@btxnumparams<0
+ \errmessage{\the\@btxnumparams\space is too few parameters}%
+ \else
+ \edef\@btxparamdef{%
+ % This is sad, but \loop doesn't work inside \edef,
+ % because \body isn't defined.
+ \ifcase\@btxnumparams
+ \empty No arguments.
+ \or ####1%
+ \or ####1####2%
+ \or ####1####2####3%
+ \or ####1####2####3####4%
+ \or ####1####2####3####4####5%
+ \or ####1####2####3####4####5####6%
+ \or ####1####2####3####4####5####6####7%
+ \or ####1####2####3####4####5####6####7####8%
+ \or ####1####2####3####4####5####6####7####8####9%
+ \fi
+ }%
+ \fi
+ \fi
+ \fi
+ \expandafter\@btxstartdef\@btxparamdef{#1}%
+}%
+%
+%% [[[end of BibTeX-specific stuff]]]
+%
+%
+% Names of references (arguments given in the \cite and \nocite
+% commands) and file names (arguments given in the \bibliography and
+% \bibliographystyle commands) are recorded in \jobname.aux, called the
+% \@auxfile in these macros. Here's how they get read in.
+%
+\def\@readauxfile{%
+ \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined
+ \global\@auxfiledonetrue
+ \@testfileexistence{aux}%
+ \if@fileexists
+ \begingroup
+ % Because we might be in horizontal mode when \@readauxfile
+ % is called (if it's in response to a \cite or \nocite), we
+ % want to ignore all the would-be spaces at the ends of
+ % lines in the aux file. Fortunately, it's highly unlikely
+ % an end-of-line might actually be desired.
+ % And because we don't change the category code of anything
+ % but @, primitives like \gdef can't be used to define labels
+ % in the aux file. The solution adopted by btxmac.tex is to
+ % write `\@citedef{LABEL}{DEFINITION}' to the aux file, and
+ % use \csname on LABEL.
+ \endlinechar = -1
+ \catcode`@ = 11
+ \input \jobname.aux
+ \endgroup
+ \else
+ \message{\@undefinedmessage}%
+ \global\@citewarningfalse
+ \fi
+ \immediate\openout\@auxfile = \jobname.aux
+ \fi
+}%
+%
+% The \@readauxfile macro does all that work the first time it's called.
+% Since it's called once for every \cite, \nocite, \bibliography, and
+% \bibliographystyle command that the user issues, we need to remember
+% whether the work's been done. It's considered done if we're not to do
+% it---that is, if \noauxfile is defined.
+%
+\newif\if@auxfiledone
+\ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi
+%
+% It's conceivable you'd want to change how other characters are read;
+% to do that, change their category code before doing \input btxmac.
+%
+%
+% After reading the .aux file, \@readauxfile opens it for writing.
+% The \@writeaux macro does the actual writing (as long as
+% \noauxfile is undefined).
+%
+\@innernewwrite\@auxfile
+\def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}%
+%
+%
+% A macro package that uses btxmac.tex might define
+% \@undefinedmessage (before doing an \input btxmac).
+%
+\ifx\@undefinedmessage\@undefined
+ \def\@undefinedmessage{No .aux file; I won't give you warnings about
+ undefined citations.}%
+\fi
+%
+% Even if citations are undefined, we want to complain only if
+% \@citewarningtrue. The default is to set \@citewarningtrue unless
+% \noauxfile is defined. Again, a macro package that uses
+% btxmac.tex might want to redefine this.
+%
+\@innernewif\if@citewarning
+\ifx\noauxfile\@undefined \@citewarningtrue\fi
+%
+%
+% Finally, before leaving we restore @'s old category code.
+%
+\catcode`@ = \@oldatcatcode
diff --git a/macros/eplain/tex/eplain.aux b/macros/eplain/tex/eplain.aux
new file mode 100644
index 0000000000..0efcf286dc
--- /dev/null
+++ b/macros/eplain/tex/eplain.aux
@@ -0,0 +1,3 @@
+% This eplain.aux file is installed for the sake of initex. Running
+% initex without this file would produce an eplain.fmt which never
+% issues warning messages about undefined labels.
diff --git a/macros/eplain/tex/eplain.ini b/macros/eplain/tex/eplain.ini
new file mode 100644
index 0000000000..0df42edf05
--- /dev/null
+++ b/macros/eplain/tex/eplain.ini
@@ -0,0 +1,6 @@
+% Thomas Esser, 1998. public domain.
+% hyphenation is set up in language.dat
+\input bplain
+\input eplain
+\dump
+\endinput
diff --git a/macros/eplain/tex/eplain.tex b/macros/eplain/tex/eplain.tex
new file mode 100644
index 0000000000..d4dc8e2a1c
--- /dev/null
+++ b/macros/eplain/tex/eplain.tex
@@ -0,0 +1,4135 @@
+%% @texfile{
+%% author = "Karl Berry, Steven Smith, Oleg Katsitadze, and others",
+%% version = "3.9",
+%% date = "Thu May 30 08:55:47 PDT 2019",
+%% filename = "eplain.tex",
+%% email = "bug-eplain@tug.org",
+%% checksum = "4135 9294 134244",
+%% 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. The original sources
+%% can be found in Eplain sources in your TeX
+%% distribution, on CTAN or on Eplain's home page at
+%% http://tug.org/eplain. Please base diffs or
+%% other contributions on xeplain.tex, not the
+%% stripped-down eplain.tex.",
+%% }
+\ifx\eplain\undefined
+ \let\next\relax
+\else
+ \expandafter\let\expandafter\next\csname endinput\endcsname
+\fi
+\next
+%%
+%% This is file `ifpdf.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ifpdf.dtx (with options: `package')
+%%
+%% Source File: ifpdf.dtx
+%% Copyright 2016 Heiko Oberdiek and LaTeX3 project
+%%
+%% This file may be distributed under the terms of the LPPL.
+%% See README for details.
+\ifx\ProvidesPackage\undefined
+\def\next#1#2[#3]{\wlog{#2 #3}}
+\expandafter\next\fi
+\ProvidesPackage{ifpdf}
+[2016/04/04 v3.0 Provides the ifpdf switch]
+\expandafter\ifx\csname ifpdf\endcsname\relax
+ \csname newif\expandafter\endcsname\csname ifpdf\endcsname
+\else
+ \ifx\pdftrue\undefined
+ \ifx\PackageError\undefined
+ \begingroup\def\PackageError#1#2#3{\endgroup\errmessage{#2}}
+ \fi
+ \PackageError{ifpdf}{incompatible ifpdf definition}{}
+ \expandafter\expandafter\expandafter
+ \fi
+\fi
+\let\ifpdf\iffalse
+\ifx\directlua\undefined
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdfoutput\endcsname\relax
+\else
+ \ifnum\pdfoutput>0 %
+ \pdftrue
+ \fi
+\fi
+\else
+\directlua{%
+if (tex.outputmode or tex.pdfoutput or 0) > 0 then
+ tex.print('\string\\pdftrue')
+end
+}
+\fi
+%%
+%% End of file `ifpdf.sty'.
+\def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
+\chardef\letter = 11
+\chardef\other = 12
+\def\makeatletter{%
+ \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}%
+ \catcode`\@11\relax
+}%
+\def\makeatother{%
+ \edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}%
+ \catcode`\@12\relax
+}%
+\edef\leftdisplays{\the\catcode`@}%
+\catcode`@ = \letter
+\let\@eplainoldatcode = \leftdisplays
+\toksdef\toks@ii = 2
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1 = \other}%
+ \dospecials
+}%
+{%
+ \makeactive\^^M %
+ \long\gdef\letreturn#1{\let^^M = #1}%
+}%
+\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{}%
+\def\identity#1{#1}%
+\def\@emptymarkA{\@emptymarkB}
+\def\ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
+\def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
+\def\@gobbleminus#1{\ifx-#1\else#1\fi}%
+\def\ifinteger#1{\ifcat_\ifnum9<1\@gobbleminus#1 _\else A\fi}%
+\def\isinteger{TT\fi\ifinteger}%
+\def\@gobblemeaning#1:->{}%
+\def\sanitize{\expandafter\@gobblemeaning\meaning}%
+\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}%
+\def\csn#1{\csname#1\endcsname}%
+\def\ece#1#2{\expandafter#1\csname#2\endcsname}%
+\def\expandonce{\expandafter\noexpand}%
+\let\@plainwlog = \wlog
+\let\wlog = \gobble
+\newlinechar = `^^J
+\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
+}%
+\def\tracingboxes{\showboxbreadth = \maxdimen \showboxdepth = \maxdimen}%
+\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
+}%
+\begingroup
+ \catcode`\{ = 12 \catcode`\} = 12
+ \catcode`\[ = 1 \catcode`\] = 2
+ \gdef\lbracechar[{]%
+ \gdef\rbracechar[}]%
+ \catcode`\% = \other
+ \gdef\percentchar[%]\endgroup
+\def\vpenalty{\ifhmode\par\fi \penalty}%
+\def\hpenalty{\ifvmode\leavevmode\fi \penalty}%
+\def\iterate{%
+ \let\loop@next\relax
+ \body
+ \let\loop@next\iterate
+ \fi
+ \loop@next
+}%
+\def\edefappend#1#2{%
+ \toks@ = \expandafter{#1}%
+ \edef#1{\the\toks@ #2}%
+}%
+\def\allowhyphens{\nobreak\hskip\z@skip}%
+\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
+\long\def\@hookassign#1#2#3{%
+ \expandafter\ifx\csname @#2hook\endcsname \relax
+ \toks@ = {}%
+ \else
+ \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}%
+}%
+\long\def\hookactiononce#1#2{%
+ \edefappend#2{\global\let\noexpand#2\relax}
+ \hookaction{#1}#2%
+}%
+\def\hookrun#1{%
+ \expandafter\ifx\csname @#1hook\endcsname \relax \else
+ \def\temp{\csname @#1hook\endcsname}%
+ \expandafter\temp
+ \fi
+}%
+\def\setproperty#1#2#3{\ece\edef{#1@p#2}{#3}}%
+\def\setpropertyglobal#1#2#3{\ece\xdef{#1@p#2}{#3}}%
+\def\getproperty#1#2{%
+ \expandafter\ifx\csname#1@p#2\endcsname\relax
+ \else \csname#1@p#2\endcsname
+ \fi
+}%
+\ifx\@undefinedmessage\@undefined
+ \def\@undefinedmessage
+ {No .aux file; I won't warn you about undefined labels.}%
+\fi
+%% @texfile{
+%% author = "Karl Berry and Oren Patashnik",
+%% version = "0.99p",
+%% date = "30 May 2019",
+%% filename = "btxmac.tex",
+%% address = "tex-eplain@tug.org",
+%% supported = "yes",
+%% docstring = "Defines macros that make BibTeX work with plain TeX",
+%% }
+\edef\cite{\the\catcode`@}%
+\catcode`@ = 11
+\let\@oldatcatcode = \cite
+\chardef\@letter = 11
+\chardef\@other = 12
+\def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
+\@innerdef\@innernewcount{newcount}%
+\@innerdef\@innernewdimen{newdimen}%
+\@innerdef\@innernewif{newif}%
+\@innerdef\@innernewwrite{newwrite}%
+\def\@gobble#1{}%
+\ifx\inputlineno\@undefined
+ \let\@linenumber = \empty % Pre-3.0.
+\else
+ \def\@linenumber{\the\inputlineno:\space}%
+\fi
+\long\def\@futurenonspacelet#1{\def\cs{#1}%
+ \afterassignment\@stepone\let\@nexttoken=
+}%
+\begingroup % The grouping here avoids stepping on an outside use of `\\'.
+\def\\{\global\let\@stoken= }%
+\\ % now \@stoken is a space token (\\ is a control symbol, so that
+\endgroup
+\def\@stepone{\expandafter\futurelet\cs\@steptwo}%
+\def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree
+ \else\let\@@next=\@nexttoken\fi \@@next}%
+\def\@stepthree{\afterassignment\@stepone\let\@@next= }%
+\def\@getoptionalarg#1{%
+ \let\@optionalusercs = #1%
+ \let\@optionalnext = \relax
+ \@futurenonspacelet\@optionalnext\@bracketcheck
+}%
+\def\@bracketcheck{%
+ \ifx [\@optionalnext
+ \expandafter\@@getoptionalarg % we have an optional arg
+ \else
+ \let\@optionalarg = \empty % no optional arg
+ \expandafter\@optionalusercs
+ \fi
+}%
+\def\@@getoptionalarg[#1]{%
+ \def\@optionalarg{#1}%
+ \let\@optdummy=\relax % just in case it has become \outer somehow
+ \@futurenonspacelet\@optdummy\@optionalusercs
+}%
+\def\@nnil{\@nil}%
+\def\@fornoop#1\@@#2#3{}%
+\def\@for#1:=#2\do#3{%
+ \edef\@fortmp{#2}%
+ \ifx\@fortmp\empty \else
+ \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}%
+ \fi
+}%
+\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
+ #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi
+}%
+\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
+ \let\@nextwhile=\@fornoop \else
+ #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}%
+}%
+\@innernewif\if@fileexists
+\def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}%
+\def\@finishtestfileexistence#1{%
+ \begingroup
+ \def\extension{#1}%
+ \immediate\openin0 =
+ \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi
+ \ifx\extension\empty \else .#1\fi
+ \space
+ \ifeof 0
+ \global\@fileexistsfalse
+ \else
+ \global\@fileexiststrue
+ \fi
+ \immediate\closein0
+ \endgroup
+}%
+\toks0 = {%
+\def\bibliographystyle#1{%
+ \@readauxfile
+ \@writeaux{\string\bibstyle{#1}}%
+}%
+\let\bibstyle = \@gobble
+\let\bblfilebasename = \jobname
+\def\bibliography#1{%
+ \@readauxfile
+ \@writeaux{\string\bibdata{#1}}%
+ \@testfileexistence[\bblfilebasename]{bbl}%
+ \if@fileexists
+ \nobreak
+ \@readbblfile
+ \fi
+}%
+\let\bibdata = \@gobble
+\def\nocite#1{%
+ \@readauxfile
+ \@writeaux{\string\citation{#1}}%
+}%
+\@innernewif\if@notfirstcitation
+\def\cite{\@getoptionalarg\@cite}%
+\def\@cite#1{%
+ \let\@citenotetext = \@optionalarg
+ \printcitestart
+ \nocite{#1}%
+ \@notfirstcitationfalse
+ \@for \@citation :=#1\do
+ {%
+ \expandafter\@onecitation\@citation\@@
+ }%
+ \ifx\empty\@citenotetext\else
+ \printcitenote{\@citenotetext}%
+ \fi
+ \printcitefinish
+}%
+\def\@onecitation#1\@@{%
+ \if@notfirstcitation
+ \printbetweencitations
+ \fi
+ \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
+ \if@citewarning
+ \message{\@linenumber Undefined citation `#1'.}%
+ \fi
+ \expandafter\gdef\csname\@citelabel{#1}\endcsname{%
+ {\tt
+ \escapechar = -1
+ \nobreak\hskip0pt
+ \expandafter\string\csname#1\endcsname
+ \nobreak\hskip0pt
+ }%
+ }%
+ \fi
+ \printcitepreitem{#1}%
+ \csname\@citelabel{#1}\endcsname
+ \printcitepostitem
+ \@notfirstcitationtrue
+}%
+\def\@citelabel#1{b@#1}%
+\def\@citedef#1#2{{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}}%
+\def\@readbblfile{%
+ \ifx\@itemnum\@undefined
+ \@innernewcount\@itemnum
+ \fi
+ \begingroup
+ \ifx\begin\@undefined
+ \def\begin##1##2{%
+ \setbox0 = \hbox{\biblabelcontents{##2}}%
+ \biblabelwidth = \wd0
+ }%
+ \let\end = \@gobble % The arg is `thebibliography' again.
+ \fi
+ \@itemnum = 0
+ \def\bibitem{\@getoptionalarg\@bibitem}%
+ \def\@bibitem{%
+ \ifx\@optionalarg\empty
+ \expandafter\@numberedbibitem
+ \else
+ \expandafter\@alphabibitem
+ \fi
+ }%
+ \def\@alphabibitem##1{%
+ \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}%
+ \ifx\biblabelprecontents\@undefined
+ \let\biblabelprecontents = \relax
+ \fi
+ \ifx\biblabelpostcontents\@undefined
+ \let\biblabelpostcontents = \hss
+ \fi
+ \@finishbibitem{##1}%
+ }%
+ \def\@numberedbibitem##1{%
+ \advance\@itemnum by 1
+ \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}%
+ \ifx\biblabelprecontents\@undefined
+ \let\biblabelprecontents = \hss
+ \fi
+ \ifx\biblabelpostcontents\@undefined
+ \let\biblabelpostcontents = \relax
+ \fi
+ \@finishbibitem{##1}%
+ }%
+ \def\@finishbibitem##1{%
+ \bblitemhook{##1}%
+ \biblabelprint{\csname\@citelabel{##1}\endcsname}%
+ \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
+ \ignorespaces
+ }%
+ \ifx\undefined\em \let\em=\bblem \fi
+ \ifx\undefined\emph \let\emph=\bblemph \fi
+ \ifx\undefined\mbox \let\mbox=\bblmbox \fi
+ \ifx\undefined\newblock \let\newblock=\bblnewblock \fi
+ \ifx\undefined\sc \let\sc=\bblsc \fi
+ \ifx\undefined\textbf \let\textbf=\bbltextbf \fi
+ \frenchspacing
+ \clubpenalty = 4000 \widowpenalty = 4000
+ \tolerance = 10000 \hfuzz = .5pt
+ \everypar = {\hangindent = \biblabelwidth
+ \advance\hangindent by \biblabelextraspace}%
+ \bblrm
+ \parskip = 1.5ex plus .5ex minus .5ex
+ \biblabelextraspace = .5em
+ \bblhook
+ \input \bblfilebasename.bbl
+ \endgroup
+}%
+\@innernewdimen\biblabelwidth
+\@innernewdimen\biblabelextraspace
+\def\biblabelprint#1{%
+ \noindent
+ \hbox to \biblabelwidth{%
+ \biblabelprecontents
+ \biblabelcontents{#1}%
+ \biblabelpostcontents
+ }%
+ \kern\biblabelextraspace
+}%
+\def\biblabelcontents#1{{\bblrm [#1]}}%
+\def\bblrm{\rm}%
+\def\bblem{\it}%
+\def\bblemph#1{{\bblem #1\/}}
+\def\bbltextbf#1{{\bf #1}}
+\def\bblmbox{\leavevmode\hbox}
+\def\bblsc{\ifx\@scfont\@undefined
+ \font\@scfont = cmcsc10
+ \fi
+ \@scfont
+}%
+\def\bblnewblock{\hskip .11em plus .33em minus .07em }%
+\let\bblhook = \empty
+\let\bblitemhook = \@gobble
+\def\printcitestart{[}% left bracket
+\def\printcitefinish{]}% right bracket
+\def\printbetweencitations{, }% comma, space
+\let\printcitepreitem\@gobble % takes label
+\let\printcitepostitem\empty
+\def\printcitenote#1{, #1}% comma, space, note (if it exists)
+\let\citation = \@gobble
+\@innernewcount\@btxnumparams
+\ifx\newcommand\undefined
+\long\def\newcommand#1{%
+ \def\@btxcommandname{#1}%
+ \@getoptionalarg\@btxcontinuenewcommand
+}%
+\fi
+\ifx\renewcommand\undefined
+ \let\renewcommand = \newcommand
+\fi
+\ifx\providecommand\undefined
+\long\def\providecommand#1{%
+ \def\@btxcommandname{#1}%
+ \expandafter\ifx\@btxcommandname \@undefined
+ \let\cs=\@btxcontinuenewcommand % undefined, so we'll define it
+ \else
+ \let\cs=\@gobble % already defined, so ignore it
+ \fi
+ \@getoptionalarg\cs
+}%
+\fi
+\def\@btxcontinuenewcommand{%
+ \@btxnumparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
+ \@btxnewcommand
+}%
+\def\@btxnewcommand#1{%
+ \def\@btxstartdef{\expandafter\def\@btxcommandname}%
+ \ifnum\@btxnumparams=0
+ \let\@btxparamdef = \empty
+ \else
+ \ifnum\@btxnumparams>9
+ \errmessage{\the\@btxnumparams\space is too many parameters}%
+ \else
+ \ifnum\@btxnumparams<0
+ \errmessage{\the\@btxnumparams\space is too few parameters}%
+ \else
+ \edef\@btxparamdef{%
+ \ifcase\@btxnumparams
+ \empty No arguments.
+ \or ####1%
+ \or ####1####2%
+ \or ####1####2####3%
+ \or ####1####2####3####4%
+ \or ####1####2####3####4####5%
+ \or ####1####2####3####4####5####6%
+ \or ####1####2####3####4####5####6####7%
+ \or ####1####2####3####4####5####6####7####8%
+ \or ####1####2####3####4####5####6####7####8####9%
+ \fi
+ }%
+ \fi
+ \fi
+ \fi
+ \expandafter\@btxstartdef\@btxparamdef{#1}%
+}%
+}%
+\ifx\nobibtex\@undefined \the\toks0 \fi
+\def\@readauxfile{%
+ \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined
+ \global\@auxfiledonetrue
+ \@testfileexistence{aux}%
+ \if@fileexists
+ \begingroup
+ \endlinechar = -1
+ \catcode`@ = 11
+ \input \jobname.aux
+ \endgroup
+ \else
+ \message{\@undefinedmessage}%
+ \global\@citewarningfalse
+ \fi
+ \immediate\openout\@auxfile = \jobname.aux
+ \fi
+}%
+\newif\if@auxfiledone
+\ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi
+\@innernewwrite\@auxfile
+\def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}%
+\ifx\@undefinedmessage\@undefined
+ \def\@undefinedmessage{No .aux file; I won't give you warnings about
+ undefined citations.}%
+\fi
+\@innernewif\if@citewarning
+\ifx\noauxfile\@undefined \@citewarningtrue\fi
+\catcode`@ = \@oldatcatcode
+\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
+\def\innerinnerdef#1{\expandafter\innerdef\csname inner#1\endcsname{#1}}%
+\innerinnerdef{newbox}%
+\innerinnerdef{newfam}%
+\innerinnerdef{newhelp}%
+\innerinnerdef{newinsert}%
+\innerinnerdef{newlanguage}%
+\innerinnerdef{newmuskip}%
+\innerinnerdef{newread}%
+\innerinnerdef{newskip}%
+\innerinnerdef{newtoks}%
+\def\immediatewriteaux#1{%
+ \ifx\noauxfile\@undefined
+ \immediate\write\@auxfile{#1}%
+ \fi
+}%
+\def\bblitemhook#1{\gdef\@hlbblitemlabel{#1}}%
+\def\biblabelprint#1{%
+ \noindent
+ \hbox to \biblabelwidth{%
+ \hldest@impl{bib}{\@hlbblitemlabel}%
+ \biblabelprecontents
+ \biblabelcontents{#1}%
+ \biblabelpostcontents
+ }%
+ \kern\biblabelextraspace
+}%
+\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}%
+}%
+\def\@Nnil{\@Nil}%
+\def\@Fornoop#1\@@#2#3{}%
+\def\For#1:=#2\do#3{%
+ \edef\@Fortmp{#2}%
+ \ifx\@Fortmp\empty \else
+ \expandafter\@Forloop#2,\@Nil,\@Nil\@@#1{#3}%
+ \fi
+}%
+\def\@Forloop#1,#2,#3\@@#4#5{\@Fordef#1\@@#4\ifx #4\@Nnil \else
+ #5\@Fordef#2\@@#4\ifx #4\@Nnil \else#5\@iForloop #3\@@#4{#5}\fi\fi
+}%
+\def\@iForloop#1,#2\@@#3#4{\@Fordef#1\@@#3\ifx #3\@Nnil
+ \let\@Nextwhile=\@Fornoop \else
+ #4\relax\let\@Nextwhile=\@iForloop\fi\@Nextwhile#2\@@#3{#4}%
+}%
+\def\@Forspc{ }%
+\def\@Fordef{\futurelet\@Fortmp\@@Fordef}% Peep at the next token.
+\def\@@Fordef{%
+ \expandafter\ifx\@Forspc\@Fortmp % Next token is a space.
+ \expandafter\@Fortrim
+ \else
+ \expandafter\@@@Fordef
+ \fi
+}%
+\expandafter\def\expandafter\@Fortrim\@Forspc#1\@@{\@Fordef#1\@@}%
+\def\@@@Fordef#1\@@#2{\def#2{#1}}%
+\def\tmpfileextension{.tmp}%
+\let\tmpfilebasename = \jobname
+\ifx\eTeXversion\undefined
+ \innernewwrite\eplain@tmpfile
+ \def\scantokens#1{%
+ \toks@={#1}%
+ \immediate\openout\eplain@tmpfile=\tmpfilebasename\tmpfileextension
+ \immediate\write\eplain@tmpfile{\the\toks@}%
+ \immediate\closeout\eplain@tmpfile
+ \input \tmpfilebasename\tmpfileextension\relax
+ }%
+\fi
+\begingroup
+ \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on.
+\gdef\obeywhitespace{%
+\makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}%
+\makeactive\ \let =\ %
+\aftergroup\@removebox%
+\futurelet\next\@finishobeywhitespace%
+}%
+\gdef\@finishobeywhitespace{{%
+\ifx\next %
+\aftergroup\@obeywhitespaceloop%
+\else\ifx\next^^M%
+\aftergroup\gobble%
+\fi\fi}}%
+\gdef\@finishobeyedreturn{%
+\ifx\next^^M\vskip\blanklineskipamount\fi%
+\indent%
+}%
+\endgroup
+\def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}%
+\def\@removebox{%
+ \ifhmode
+ \setbox0 = \lastbox
+ \ifdim\wd0=\parindent
+ \setbox2 = \hbox{\unhcopy0}% Preserve \box0 so we can put it back.
+ \ifdim\wd2=0pt
+ \ignorespaces
+ \else
+ \box0 % Put it back: it wasn't empty.
+ \fi
+ \else
+ \box0 % Put it back: it wasn't the right width.
+ \fi
+ \fi
+}%
+\newskip\blanklineskipamount
+\blanklineskipamount = 0pt
+\def\frac#1/#2{\leavevmode
+ \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}%
+ \kern-.1em $/$%
+ \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}%
+}%
+\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}%
+%%% ====================================================================
+%%% @TeX-style-file{
+%%% author = "Nelson H. F. Beebe",
+%%% version = "1.10",
+%%% date = "02 March 1998",
+%%% time = "08:36:13 MST",
+%%% filename = "texnames.sty",
+%%% address = "Center for Scientific Computing
+%%% Department of Mathematics
+%%% South Physics Building
+%%% University of Utah
+%%% Salt Lake City, UT 84112
+%%% USA
+%%% Tel: (801) 581-5254
+%%% FAX: (801) 581-4148",
+%%% checksum = "27723 296 1385 12423",
+%%% email = "beebe@magna.math.utah.edu (Internet)",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "TeX names",
+%%% supported = "yes",
+%%% docstring = "This style file for AmSTeX, LaTeX, and TeX
+%%% defines macros for the names of TeX
+%%% and METAFONT programs, in several
+%%% letter-case variants:
+%%%
+%%% \AMSTEX, \AMSTeX, \AmSTeX
+%%% \BIBTEX, \BIBTeX, \BibTeX
+%%% \LAMSTeX, \LAmSTeX
+%%% \LaTeX, \LATEX
+%%% \METAFONT, \MF
+%%% \SLITEX, \SLITeX, \SLiTeX, \SliTeX
+%%%
+%%% It will NOT redefine any macro that
+%%% already exists, so it can be included
+%%% harmlessly after other style files.
+%%%
+%%% In AmSTeX or Plain TeX, just do
+%%%
+%%% \input texnames.sty
+%%%
+%%% In LaTeX, do
+%%%
+%%% \documentstyle[...,texnames]{...}
+%%%
+%%% This file grew out of original work by
+%%%
+%%% Richard Furuta
+%%% Department of Computer Science
+%%% University of Maryland
+%%% College Park, MD 20742
+%%%
+%%% furuta@mimsy.umd.edu
+%%% seismo!umcp-cs!furuta
+%%%
+%%% 22 October 1986, first release (1.00)
+%%%
+%%% 1 April 1987 (1.01): Modified by William
+%%% LeFebvre, Rice University to include
+%%% definitions for BibTeX and SLiTeX, as they
+%%% appear in the LaTeX Local User's Guide
+%%% template (the file latex/local.tex in
+%%% standard distributions)
+%%%
+%%% 26 October 1991 (1.02): Modified by
+%%% Nelson H. F. Beebe <beebe@math.utah.edu> to
+%%% add several new macro names, and adapt for
+%%% use with Plain TeX and AmSTeX.
+%%%
+%%% 26 October 1991 (1.03): Add \LaTeX and
+%%% \LATEX
+%%%
+%%% 25 November 1991 (1.04): Add \LamSTeX
+%%% and \LAMSTeX
+%%%
+%%% 27 January 1991 (1.05 and 1.06): Add slanted
+%%% font support for \MF. Make several comment
+%%% changes. Add a couple of missing % at end
+%%% of line, and replace blank lines by empty
+%%% comments.
+%%%
+%%% 30 December 1992 (1.07): Use \TeX in
+%%% definitions of \BibTeX and \LaTeX. Remove
+%%% occurrences of \rm. Change \sc to use
+%%% \scriptfont instead of hardwiring cmcsc10.
+%%% Use \cal for \LAMSTeX.
+%%%
+%%% 1 March 1993 (1.08): Consolidate \ifx's onto
+%%% single lines for brevity. Add
+%%% \spacefactor1000 to definitions for \TeX and \MF.
+%%%
+%%% 16 March 1993 (1.09): Add \AmS, \AMS, \AmSLaTeX,
+%%% and \AMSLaTeX.
+%%%
+%%% 02 March 1998 (1.10): Add \LaTeXe.
+%%%
+%%% The checksum field above contains a CRC-16
+%%% checksum as the first value, followed by the
+%%% equivalent of the standard UNIX wc (word
+%%% count) utility output of lines, words, and
+%%% characters. This is produced by Robert
+%%% Solovay's checksum utility.",
+%%%
+%%% }
+%%% ====================================================================
+\ifx\sc\undefined
+ \def\sc{%
+ \expandafter\ifx\the\scriptfont\fam\nullfont
+ \font\temp = cmr7 \temp
+ \else
+ \the\scriptfont\fam
+ \fi
+ \def\uppercasesc{\char\uccode`}%
+ }%
+\fi
+\ifx\uppercasesc\undefined
+ \let\uppercasesc = \relax
+\fi
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\spacefactor1000 }%
+\ifx\AmS\undefined
+ \def\AmS{{\the\textfont2 A}\kern-.1667em\lower.5ex\hbox
+ {\the\textfont2 M}\kern-.125em{\the\textfont2 S}}
+\fi
+\ifx\AMS\undefined \let\AMS=\AmS \fi
+\ifx\AmSLaTeX\undefined
+ \def\AmSLaTeX{\AmS-\LaTeX}
+\fi
+\ifx\AMSLaTeX\undefined \let\AMSLaTeX=\AmSLaTeX \fi
+\ifx\AmSTeX\undefined
+ \def\AmSTeX{$\cal A$\kern-.1667em\lower.5ex\hbox{$\cal M$}%
+ \kern-.125em$\cal S$-\TeX}%
+\fi
+\ifx\AMSTEX\undefined \let\AMSTEX=\AmSTeX \fi
+\ifx\AMSTeX\undefined \let\AMSTeX=\AmSTeX \fi
+\ifx\BibTeX\undefined
+ \def\BibTeX{B{\sc \uppercasesc i\kern-.025em \uppercasesc b}\kern-.08em
+ \TeX}%
+\fi
+\ifx\BIBTeX\undefined \let\BIBTeX=\BibTeX \fi
+\ifx\BIBTEX\undefined \let\BIBTEX=\BibTeX \fi
+\ifx\LAMSTeX\undefined
+ \def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em\the\scriptfont2 A}%
+ \kern-.2em\lower.376ex\hbox{\the\textfont2 M}%
+ \kern-.125em {\the\textfont2 S}-\TeX}%
+\fi
+\ifx\LamSTeX\undefined \let\LamSTeX=\LAMSTeX \fi
+\ifx\LAmSTeX\undefined \let\LAmSTeX=\LAMSTeX \fi
+\ifx\LaTeX\undefined
+ \def\LaTeX{L\kern-.36em\raise.3ex\hbox{\sc \uppercasesc a}\kern-.15em\TeX}%
+\fi
+\ifx\LATEX\undefined \let\LATEX=\LaTeX \fi
+\ifx\LaTeXe\undefined
+ \def\LaTeXe{\LaTeX{}\kern.05em2$_{\textstyle\varepsilon}$}
+\fi
+\ifx\MF\undefined
+ \ifx\manfnt\undefined
+ \font\manfnt=logo10
+ \fi
+ \ifx\manfntsl\undefined
+ \font\manfntsl=logosl10
+ \fi
+ \def\MF{{\ifdim\fontdimen1\font>0pt \let\manfnt = \manfntsl \fi
+ {\manfnt META}\-{\manfnt FONT}}\spacefactor1000 }%
+\fi
+\ifx\METAFONT\undefined \let\METAFONT=\MF \fi
+\ifx\SLITEX\undefined
+ \def\SLITEX{S\kern-.065em L\kern-.18em\raise.32ex\hbox{i}\kern-.03em\TeX}%
+\fi
+\ifx\SLiTeX\undefined \let\SLiTeX=\SLITEX \fi
+\ifx\SliTeX\undefined \let\SliTeX=\SLITEX \fi
+\ifx\SLITeX\undefined \let\SLITeX=\SLITEX \fi
+%%% @TeX-style-file
+%%% {
+%%% author = "Philip Taylor",
+%%% version = "3.05",
+%%% date = "7 April 2011",
+%%% time = "15:59:31 BST",
+%%% filename = "path.sty",
+%%% license = "Unlimited copying and redistribution of this
+%%% file are permitted as long as this file is
+%%% not modified. Modifications are permitted,
+%%% but only if the resulting file is not named
+%%% path.sty regardless of case",
+%%% address = "c/o The Hellenic Institute
+%%% Royal Holloway, University of London
+%%% Egham Hull, Egham
+%%% Surrey TW20 0EX
+%%% United Kingdom",
+%%% telephone = "Tel: +44 1622 820 735",
+%%% email = "P.Taylor@Rhul.Ac.Uk",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "file name, filename, path name, pathname,
+%%% discretionary, discretionaries",
+%%% supported = "yes",
+%%% docstring = {Computer filenames, host names, and e-mail
+%%% addresses tend to be long strings that
+%%% cause line breaking problems for TeX.
+%%% Sometimes rather long strings are
+%%% encountered, such as:
+%%%
+%%% mighty-mouse-gw.scrc.symbolics.com
+%%%
+%%% This file defines a macro, \path|...|,
+%%% similar to LaTeX's \verb|...| macro, that
+%%% sets the text in the typewriter font,
+%%% allowing hyphen-less line breaks at
+%%% punctuation characters.
+%%%
+%%% The default set of punctuation characters is
+%%% defined as
+%%%
+%%% \discretionaries |~!@$%^&*()_+`-=#{"}[]:;'<>,.?\/|
+%%%
+%%% However, you can change it as needed, for
+%%% example
+%%%
+%%% \discretionaries +@%!.+
+%%%
+%%% would assign to it the set @ % ! . which
+%%% commonly occur in electronic mail addresses.
+%%%
+%%% The delimiter characters surrounding the
+%%% arguments to \discretionaries and \path
+%%% will normally be a punctuation character not
+%%% found in the argument, and not otherwise
+%%% significant to TeX. In particular, backslash
+%%% cannot be used as a delimiter. In the rare
+%%% event that this is required, set
+%%%
+%%% \specialpathdelimiterstrue
+%%%
+%%% This practice is not recommended, because TeX
+%%% then runs about four times slower while it is
+%%% typesetting \path\...\ requests.
+%%% \specialpathdelimitersfalse is the normal
+%%% setting.
+%%%
+%%% This file may be used in Plain TeX or AmSTeX
+%%% by
+%%%
+%%% \input path.sty
+%%%
+%%% and in LaTeX by
+%%%
+%%% \usepackage {path}
+%%%
+%%% The checksum field above, if present, contains
+%%% a CRC-16 checksum as the first value, followed
+%%% by the equivalent of the standard UNIX wc (word
+%%% count) utility output of lines, words, and
+%%% characters. This is produced by Robert
+%%% Solovay's checksum utility.
+%%% }
+%%% }
+%%% ====================================================================
+%%% The use of `\path' as a temporary control sequence is a kludge, but
+%%% it's a reasonably simple way to accomplish making @ a letter (to
+%%% provide ``concealed'' control sequences) without overwriting something
+%%% (without an `@' in its name) that might already be defined.
+\edef \path {\the \catcode `\@}%
+\catcode `\@ = 11
+\let \oldc@tcode = \path
+%%% Make commercial-at a letter to provide concealed control sequences
+\catcode `\@ = 11
+%%% and then declare two \count variables with concealed names
+\newcount \c@tcode
+\newcount \c@unter
+%%% and a boolean variable with an open name, to specify the nature of
+%%% the delimiters which will be associated with the \path command
+\newif \ifspecialpathdelimiters
+%%% If desired, you can define \pathafterhook to take
+\let \pathafterhook = \relax
+%%% We need to define control sequences which expand to both
+%%% active and passive spaces ...
+\begingroup
+\catcode `\ = 10
+\gdef \passivesp@ce { }
+\catcode `\ = 13\relax%
+\gdef\activesp@ce{ }%
+\endgroup
+%%% \discretionaries will define a macro \discr@ti@n@ri@s which will
+%%% make every character between the first and final <delim> a
+%%% discretionary breakpoint.
+\def \discretionaries %%% <delim> <chars> <delim>
+ {\begingroup
+ \c@tcodes = 13
+ \discr@tionaries
+ }
+%%% \discr@tionaries will receive as parameter the initial <delim>
+%%% which will delimit the set of discretionaries; this <delim>
+%%% will be active.
+\def \discr@tionaries #1%%% <delim>
+ {\def \discr@ti@naries ##1#1%%% <chars> <delim>
+ {\endgroup
+ \def \discr@ti@n@ries ####1%%% <char> or <delim>
+ {\if \noexpand ####1\noexpand #1%
+ \let \n@xt = \relax
+ \else
+ \catcode `####1 = 13
+ \def ####1{\discretionary
+ {\char `####1}{}{\char `####1}}%
+ \let \n@xt = \discr@ti@n@ries
+ \fi
+ \n@xt
+ }%
+ \def \discr@ti@n@ri@s {\discr@ti@n@ries ##1#1}%
+ }%
+ \discr@ti@naries
+ }
+%%% \path, which is the user interface to \p@th, first checks
+%%% to see whether \specialpathdelimiters is <true> or <false>;
+%%% if <true>, it needs to take special action to ensure that
+%%% \stress {all} characters (apart from <space>) are acceptable
+%%% as delimiters; this is very time-consuming, and should be
+%%% avoided if at all possible. It also defines \endp@th, to
+%%% close the appropriate number of groups, and finally transfers
+%%% control to \p@th
+\def \path
+ {\ifspecialpathdelimiters
+ \begingroup
+ \c@tcodes = 12
+ \def \endp@th {\endgroup \endgroup \pathafterhook}%
+ \else
+ \def \endp@th {\endgroup \pathafterhook}%
+ \fi
+ \p@th
+ }
+%%% \p@th, which has essentially the same syntax as \discretionaries,
+%%% expects to be followed by a <delim>, a <path>, and a second instance
+%%% of <delim>; it will typeset <path> in the \tt font with hyphenation
+%%% inhibited --- breaks (but not true hyphenation) are allowed at any
+%%% or all of the special characters which have
+%%% previously been declared as \discretionaries.
+\def \p@th #1%%% <delim>
+ {\begingroup
+ \tt
+ \c@tcode = \catcode `#1
+ \discr@ti@n@ri@s
+ \catcode `\ = \active
+ \expandafter \edef \activesp@ce {\passivesp@ce \hbox {}}%
+ \catcode `#1 = \c@tcode
+ \def \p@@th ##1#1% <chars> <delim>
+ {\leavevmode \hbox {}##1%
+ \endp@th
+ }%
+ \p@@th
+ }
+%%% \c@tcodes expects to be followed by the r-h-s of a numeric
+%%% assignment optionally including the assignment operator; it saves
+%%% the value of the r-h-s in \c@tcode, and invokes \c@tc@des.
+\def \c@tcodes {\afterassignment \c@tc@des \c@tcode}
+%%% \c@tc@des uses the value saved in \c@tcode, and assigns it to the
+%%% \catcode of all characters with the single exception of <space>,
+%%% which retains its normal catcode of 10; on exit, every single
+%%% character apart from <space> will have the catcode which followed
+%%% \c@tcodes. The code is optimised to avoid unnecessary usage of
+%%% save-stack space.
+\def \c@tc@des
+ {\c@unter = 0
+ \loop
+ \ifnum \catcode \c@unter = \c@tcode
+ \else
+ \catcode \c@unter = \c@tcode
+ \fi
+ \ifnum \c@unter < 255
+ \advance \c@unter by 1
+ \repeat
+ \catcode `\ = 10
+ }
+%%% We restore the original catcode of commercial-at
+\catcode `\@ = \oldc@tcode
+%%% Define a default set of discretionary break characters
+%%% to include all punctuation characters except vertical
+%%% bar
+\discretionaries |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/|
+\ifx\eTeX\undefined
+ \def\eTeX{\hbox{\mathsurround=0pt $\varepsilon$-\kern-.125em\TeX}}%
+\fi
+\ifx\ExTeX\undefined
+ \def\ExTeX{\hbox{\mathsurround=0pt
+ $\textstyle\varepsilon_{\kern-0.15em\cal{X}}$\kern-.2em\TeX}}%
+\fi
+\def\eplain@Xe@reflect#1{%
+ \ifx\reflectbox\undefined
+ \errmessage{A graphics package must be loaded for \string\XeTeX}%
+ \else
+ \ifdim \fontdimen1\font>0pt
+ \raise 1.75ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em
+ \else
+ \reflectbox{#1}%
+ \fi
+ \fi
+}%
+\def\eplain@Xe#1{\leavevmode
+ \smash{\hbox{X%
+ \setbox0=\hbox{\TeX}\setbox2=\hbox{E}%
+ \lower\dp0\hbox{\raise\dp2\hbox{\kern-.125em\eplain@Xe@reflect{E}}}%
+ \kern-.1667em #1}}}%
+\ifx\XeTeX\undefined
+ \def\XeTeX{\eplain@Xe\TeX}%
+\fi
+\ifx\XeLaTeX\undefined
+ \def\XeLaTeX{\eplain@Xe{\thinspace\LaTeX}}%
+\fi
+\def\blackbox{\vrule height .8ex width .6ex depth -.2ex \relax}% square bullet
+\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.}%
+\def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2}%
+\def\hidevrule#1#2{%
+ \kern-#1%
+ \dimen@=#1\advance\dimen@ by #2%
+ \vrule width\dimen@
+ \kern-#2%
+}%
+\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
+ }%
+}%
+\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
+}%
+\let\@plainnewif = \newif
+\let\@plainnewdimen = \newdimen
+\let\newif = \innernewif
+\let\newdimen = \innernewdimen
+\edef\@eplainoldandcode{\the\catcode`& }%
+\catcode`& = 11
+\toks0 = {%
+\edef\thinlines{\the\catcode`@ }%
+\catcode`@ = 11
+\let\@oldatcatcode = \thinlines
+\def\smash@@{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+\edef\@oldandcatcode{\the\catcode`& }%
+\catcode`& = 11
+\def\&whilenoop#1{}%
+\def\&whiledim#1\do #2{\ifdim #1\relax#2\&iwhiledim{#1\relax#2}\fi}%
+\def\&iwhiledim#1{\ifdim #1\let\&nextwhile=\&iwhiledim
+ \else\let\&nextwhile=\&whilenoop\fi\&nextwhile{#1}}%
+\newif\if&negarg
+\newdimen\&wholewidth
+\newdimen\&halfwidth
+\font\tenln=line10
+\def\thinlines{\let\&linefnt\tenln \let\&circlefnt\tencirc
+ \&wholewidth\fontdimen8\tenln \&halfwidth .5\&wholewidth}%
+\def\thicklines{\let\&linefnt\tenlnw \let\&circlefnt\tencircw
+ \&wholewidth\fontdimen8\tenlnw \&halfwidth .5\&wholewidth}%
+\def\drawline(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax \&linelen=#3\relax
+ \ifnum\&xarg =0 \&vline \else \ifnum\&yarg =0 \&hline \else \&sline\fi\fi}%
+\def\&sline{\leavevmode
+ \ifnum\&xarg< 0 \&negargtrue \&xarg -\&xarg \&yyarg -\&yarg
+ \else \&negargfalse \&yyarg \&yarg \fi
+ \ifnum \&yyarg >0 \&tempcnta\&yyarg \else \&tempcnta -\&yyarg \fi
+ \ifnum\&tempcnta>6 \&badlinearg \&yyarg0 \fi
+ \ifnum\&xarg>6 \&badlinearg \&xarg1 \fi
+ \setbox\&linechar\hbox{\&linefnt\&getlinechar(\&xarg,\&yyarg)}%
+ \ifnum \&yyarg >0 \let\&upordown\raise \&clnht\z@
+ \else\let\&upordown\lower \&clnht \ht\&linechar\fi
+ \&clnwd=\wd\&linechar
+ \&whiledim \&clnwd <\&linelen \do {%
+ \&upordown\&clnht\copy\&linechar
+ \advance\&clnht \ht\&linechar
+ \advance\&clnwd \wd\&linechar
+ }%
+ \advance\&clnht -\ht\&linechar
+ \advance\&clnwd -\wd\&linechar
+ \&tempdima\&linelen\advance\&tempdima -\&clnwd
+ \&tempdimb\&tempdima\advance\&tempdimb -\wd\&linechar
+ \hskip\&tempdimb \multiply\&tempdima \@m
+ \&tempcnta \&tempdima \&tempdima \wd\&linechar \divide\&tempcnta \&tempdima
+ \&tempdima \ht\&linechar \multiply\&tempdima \&tempcnta
+ \divide\&tempdima \@m
+ \advance\&clnht \&tempdima
+ \ifdim \&linelen <\wd\&linechar \hskip \wd\&linechar
+ \else\&upordown\&clnht\copy\&linechar\fi}%
+\def\&hline{\vrule height \&halfwidth depth \&halfwidth width \&linelen}%
+\def\&getlinechar(#1,#2){\&tempcnta#1\relax\multiply\&tempcnta 8
+ \advance\&tempcnta -9 \ifnum #2>0 \advance\&tempcnta #2\relax\else
+ \advance\&tempcnta -#2\relax\advance\&tempcnta 64 \fi
+ \char\&tempcnta}%
+\def\drawvector(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax
+ \&tempcnta \ifnum\&xarg<0 -\&xarg\else\&xarg\fi
+ \ifnum\&tempcnta<5\relax \&linelen=#3\relax
+ \ifnum\&xarg =0 \&vvector \else \ifnum\&yarg =0 \&hvector
+ \else \&svector\fi\fi\else\&badlinearg\fi}%
+\def\&hvector{\ifnum\&xarg<0 \rlap{\&linefnt\&getlarrow(1,0)}\fi \&hline
+ \ifnum\&xarg>0 \llap{\&linefnt\&getrarrow(1,0)}\fi}%
+\def\&vvector{\ifnum \&yarg <0 \&downvector \else \&upvector \fi}%
+\def\&svector{\&sline
+ \&tempcnta\&yarg \ifnum\&tempcnta <0 \&tempcnta=-\&tempcnta\fi
+ \ifnum\&tempcnta <5
+ \if&negarg\ifnum\&yarg>0 % 3d quadrant; dp > 0
+ \llap{\lower\ht\&linechar\hbox to\&linelen{\&linefnt
+ \&getlarrow(\&xarg,\&yyarg)\hss}}\else % 4th quadrant; ht > 0
+ \llap{\hbox to\&linelen{\&linefnt\&getlarrow(\&xarg,\&yyarg)\hss}}\fi
+ \else\ifnum\&yarg>0 % 1st quadrant; ht > 0
+ \&tempdima\&linelen \multiply\&tempdima\&yarg
+ \divide\&tempdima\&xarg \advance\&tempdima-\ht\&linechar
+ \raise\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\else
+ \&tempdima\&linelen \multiply\&tempdima-\&yarg % 2d quadrant; dp > 0
+ \divide\&tempdima\&xarg
+ \lower\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\fi\fi
+ \else\&badlinearg\fi}%
+\def\&getlarrow(#1,#2){\ifnum #2 =\z@ \&tempcnta='33\else
+\&tempcnta=#1\relax\multiply\&tempcnta \sixt@@n \advance\&tempcnta
+-9 \&tempcntb=#2\relax\multiply\&tempcntb \tw@
+\ifnum \&tempcntb >0 \advance\&tempcnta \&tempcntb\relax
+\else\advance\&tempcnta -\&tempcntb\advance\&tempcnta 64
+\fi\fi\char\&tempcnta}%
+\def\&getrarrow(#1,#2){\&tempcntb=#2\relax
+\ifnum\&tempcntb < 0 \&tempcntb=-\&tempcntb\relax\fi
+\ifcase \&tempcntb\relax \&tempcnta='55 \or
+\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
+24 \advance\&tempcnta -6 \else \ifnum #1=3 \&tempcnta=49
+\else\&tempcnta=58 \fi\fi\or
+\ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
+24 \advance\&tempcnta -3 \else \&tempcnta=51\fi\or
+\&tempcnta=#1\relax\multiply\&tempcnta
+\sixt@@n \advance\&tempcnta -\tw@ \else
+\&tempcnta=#1\relax\multiply\&tempcnta
+\sixt@@n \advance\&tempcnta 7 \fi\ifnum #2<0 \advance\&tempcnta 64 \fi
+\char\&tempcnta}%
+\def\&vline{\ifnum \&yarg <0 \&downline \else \&upline\fi}%
+\def\&upline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
+ height \&linelen depth \z@\hss}}%
+\def\&downline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
+ height \z@ depth \&linelen \hss}}%
+\def\&upvector{\&upline\setbox\&tempboxa\hbox{\&linefnt\char'66}\raise
+ \&linelen \hbox to\z@{\lower \ht\&tempboxa\box\&tempboxa\hss}}%
+\def\&downvector{\&downline\lower \&linelen
+ \hbox to \z@{\&linefnt\char'77\hss}}%
+\def\&badlinearg{\errmessage{Bad \string\arrow\space argument.}}%
+\thinlines
+\countdef\&xarg 0
+\countdef\&yarg 2
+\countdef\&yyarg 4
+\countdef\&tempcnta 6
+\countdef\&tempcntb 8
+\dimendef\&linelen 0
+\dimendef\&clnwd 2
+\dimendef\&clnht 4
+\dimendef\&tempdima 6
+\dimendef\&tempdimb 8
+\chardef\@arrbox 0
+\chardef\&linechar 2
+\chardef\&tempboxa 2 % \&linechar and \&tempboxa don't interfere.
+\let\lft^%
+\let\rt_% distinguish between \rt and \lft
+\newif\if@pslope % test for positive slope
+\def\@findslope(#1,#2){\ifnum#1>0
+ \ifnum#2>0 \@pslopetrue \else\@pslopefalse\fi \else
+ \ifnum#2>0 \@pslopefalse \else\@pslopetrue\fi\fi}%
+\def\generalsmap(#1,#2){\getm@rphposn(#1,#2)\plnmorph\futurelet\next\addm@rph}%
+\def\sline(#1,#2){\setbox\@arrbox=\hbox{\drawline(#1,#2){\sarrowlength}}%
+ \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
+\def\arrow(#1,#2){\setbox\@arrbox=\hbox{\drawvector(#1,#2){\sarrowlength}}%
+ \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
+\newif\ifd@@blearr
+\def\bisline(#1,#2){\@findslope(#1,#2)%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
+ \rlap{\drawline(#1,#2){\sarrowlength}}%
+ \hskip\@hchannel\hbox{\drawline(#1,#2){\sarrowlength}}}%
+ \d@@blearrtrue\generalsmap(#1,#2)}%
+\def\biarrow(#1,#2){\@findslope(#1,#2)%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
+ \rlap{\drawvector(#1,#2){\sarrowlength}}%
+ \hskip\@hchannel\hbox{\drawvector(#1,#2){\sarrowlength}}}%
+ \d@@blearrtrue\generalsmap(#1,#2)}%
+\def\adjarrow(#1,#2){\@findslope(#1,#2)%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
+ \rlap{\drawvector(#1,#2){\sarrowlength}}%
+ \hskip\@hchannel\hbox{\drawvector(-#1,-#2){\sarrowlength}}}%
+ \d@@blearrtrue\generalsmap(#1,#2)}%
+\newif\ifrtm@rph
+\def\@shiftmorph#1{\hbox{\setbox0=\hbox{$\scriptstyle#1$}%
+ \setbox1=\hbox{\hskip\@hm@rphshift\raise\@vm@rphshift\copy0}%
+ \wd1=\wd0 \ht1=\ht0 \dp1=\dp0 \box1}}%
+\def\@hm@rphshift{\ifrtm@rph
+ \ifdim\hmorphposnrt=\z@\hmorphposn\else\hmorphposnrt\fi \else
+ \ifdim\hmorphposnlft=\z@\hmorphposn\else\hmorphposnlft\fi \fi}%
+\def\@vm@rphshift{\ifrtm@rph
+ \ifdim\vmorphposnrt=\z@\vmorphposn\else\vmorphposnrt\fi \else
+ \ifdim\vmorphposnlft=\z@\vmorphposn\else\vmorphposnlft\fi \fi}%
+\def\addm@rph{\ifx\next\lft\let\temp=\lftmorph\else
+ \ifx\next\rt\let\temp=\rtmorph\else\let\temp\relax\fi\fi \temp}%
+\def\plnmorph{\dimen1\wd\@arrbox \ifdim\dimen1<\z@ \dimen1-\dimen1\fi
+ \vcenter{\box\@arrbox}}%
+\def\lftmorph\lft#1{\rtm@rphfalse \setbox0=\@shiftmorph{#1}%
+ \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
+ \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss % \dimen1=\wd\@arrbox
+ \llap{\box0}\hss}\hskip\@hmorphdflt}\futurelet\next\addm@rph}%
+\def\rtmorph\rt#1{\rtm@rphtrue \setbox0=\@shiftmorph{#1}%
+ \if@pslope \let\@upordown\lower \else \let\@upordown\raise\fi
+ \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss
+ \rlap{\box0}\hss}\hskip-\@hmorphdflt}\futurelet\next\addm@rph}%
+\def\getm@rphposn(#1,#2){\ifd@@blearr \dimen@\morphdist \advance\dimen@ by
+ .5\channelwidth \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\dimen@}\else
+ \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\morphdist}\fi}%
+\def\getch@nnel(#1,#2){\ifdim\hchannel=\z@ \ifdim\vchannel=\z@
+ \@getshift(#1,#2){\@hchannel}{\@vchannel}{\channelwidth}%
+ \else \@hchannel\hchannel \@vchannel\vchannel \fi
+ \else \@hchannel\hchannel \@vchannel\vchannel \fi}%
+\def\@getshift(#1,#2)#3#4#5{\dimen@ #5\relax
+ \&xarg #1\relax \&yarg #2\relax
+ \ifnum\&xarg<0 \&xarg -\&xarg \fi
+ \ifnum\&yarg<0 \&yarg -\&yarg \fi
+ \ifnum\&xarg<\&yarg \&negargtrue \&yyarg\&xarg \&xarg\&yarg \&yarg\&yyarg\fi
+ \ifcase\&xarg \or % There is no case 0
+ \ifcase\&yarg % case 1
+ \dimen@i \z@ \dimen@ii \dimen@ \or % case (1,0)
+ \dimen@i .7071\dimen@ \dimen@ii .7071\dimen@ \fi \or
+ \ifcase\&yarg % case 2
+ \or % case 0,2 wrong
+ \dimen@i .4472\dimen@ \dimen@ii .8944\dimen@ \fi \or
+ \ifcase\&yarg % case 3
+ \or % case 0,3 wrong
+ \dimen@i .3162\dimen@ \dimen@ii .9486\dimen@ \or
+ \dimen@i .5547\dimen@ \dimen@ii .8321\dimen@ \fi \or
+ \ifcase\&yarg % case 4
+ \or % case 0,2,4 wrong
+ \dimen@i .2425\dimen@ \dimen@ii .9701\dimen@ \or\or
+ \dimen@i .6\dimen@ \dimen@ii .8\dimen@ \fi \or
+ \ifcase\&yarg % case 5
+ \or % case 0,5 wrong
+ \dimen@i .1961\dimen@ \dimen@ii .9801\dimen@ \or
+ \dimen@i .3714\dimen@ \dimen@ii .9284\dimen@ \or
+ \dimen@i .5144\dimen@ \dimen@ii .8575\dimen@ \or
+ \dimen@i .6247\dimen@ \dimen@ii .7801\dimen@ \fi \or
+ \ifcase\&yarg % case 6
+ \or % case 0,2,3,4,6 wrong
+ \dimen@i .1645\dimen@ \dimen@ii .9864\dimen@ \or\or\or\or
+ \dimen@i .6402\dimen@ \dimen@ii .7682\dimen@ \fi \fi
+ \if&negarg \&tempdima\dimen@i \dimen@i\dimen@ii \dimen@ii\&tempdima\fi
+ #3\dimen@i\relax #4\dimen@ii\relax }%
+\catcode`\&=4 % Back to alignment tab
+}%
+\catcode`& = 4
+\toks2 = {%
+\catcode`\&=4 % Back to alignment tab
+\def\generalhmap{\futurelet\next\@generalhmap}%
+\def\@generalhmap{\ifx\next^ \let\temp\generalhm@rph\else
+ \ifx\next_ \let\temp\generalhm@rph\else \let\temp\m@kehmap\fi\fi \temp}%
+\def\generalhm@rph#1#2{\ifx#1^
+ \toks@=\expandafter{\the\toks@#1{\rtm@rphtrue\@shiftmorph{#2}}}\else
+ \toks@=\expandafter{\the\toks@#1{\rtm@rphfalse\@shiftmorph{#2}}}\fi
+ \generalhmap}%
+\def\m@kehmap{\mathrel{\smash@@{\the\toks@}}}%
+\def\mapright{\toks@={\mathop{\vcenter{\smash@@{\drawrightarrow}}}\limits}%
+ \generalhmap}%
+\def\mapleft{\toks@={\mathop{\vcenter{\smash@@{\drawleftarrow}}}\limits}%
+ \generalhmap}%
+\def\bimapright{\toks@={\mathop{\vcenter{\smash@@{\drawbirightarrow}}}\limits}%
+ \generalhmap}%
+\def\bimapleft{\toks@={\mathop{\vcenter{\smash@@{\drawbileftarrow}}}\limits}%
+ \generalhmap}%
+\def\adjmapright{\toks@={\mathop{\vcenter{\smash@@{\drawadjrightarrow}}}\limits}%
+ \generalhmap}%
+\def\adjmapleft{\toks@={\mathop{\vcenter{\smash@@{\drawadjleftarrow}}}\limits}%
+ \generalhmap}%
+\def\hline{\toks@={\mathop{\vcenter{\smash@@{\drawhline}}}\limits}%
+ \generalhmap}%
+\def\bihline{\toks@={\mathop{\vcenter{\smash@@{\drawbihline}}}\limits}%
+ \generalhmap}%
+\def\drawrightarrow{\hbox{\drawvector(1,0){\harrowlength}}}%
+\def\drawleftarrow{\hbox{\drawvector(-1,0){\harrowlength}}}%
+\def\drawbirightarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(1,0){\harrowlength}}}}%
+\def\drawbileftarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(-1,0){\harrowlength}}}}%
+\def\drawadjrightarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(1,0){\harrowlength}}}}%
+\def\drawadjleftarrow{\hbox{\raise.5\channelwidth
+ \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawvector(-1,0){\harrowlength}}}}%
+\def\drawhline{\hbox{\drawline(1,0){\harrowlength}}}%
+\def\drawbihline{\hbox{\raise.5\channelwidth
+ \hbox{\drawline(1,0){\harrowlength}}\lower.5\channelwidth
+ \llap{\drawline(1,0){\harrowlength}}}}%
+\def\generalvmap{\futurelet\next\@generalvmap}%
+\def\@generalvmap{\ifx\next\lft \let\temp\generalvm@rph\else
+ \ifx\next\rt \let\temp\generalvm@rph\else \let\temp\m@kevmap\fi\fi \temp}%
+\toksdef\toks@@=1
+\def\generalvm@rph#1#2{\ifx#1\rt % append
+ \toks@=\expandafter{\the\toks@
+ \rlap{$\vcenter{\rtm@rphtrue\@shiftmorph{#2}}$}}\else % prepend
+ \toks@@={\llap{$\vcenter{\rtm@rphfalse\@shiftmorph{#2}}$}}%
+ \toks@=\expandafter\expandafter\expandafter{\expandafter\the\expandafter
+ \toks@@ \the\toks@}\fi \generalvmap}%
+\def\m@kevmap{\the\toks@}%
+\def\mapdown{\toks@={\vcenter{\drawdownarrow}}\generalvmap}%
+\def\mapup{\toks@={\vcenter{\drawuparrow}}\generalvmap}%
+\def\bimapdown{\toks@={\vcenter{\drawbidownarrow}}\generalvmap}%
+\def\bimapup{\toks@={\vcenter{\drawbiuparrow}}\generalvmap}%
+\def\adjmapdown{\toks@={\vcenter{\drawadjdownarrow}}\generalvmap}%
+\def\adjmapup{\toks@={\vcenter{\drawadjuparrow}}\generalvmap}%
+\def\vline{\toks@={\vcenter{\drawvline}}\generalvmap}%
+\def\bivline{\toks@={\vcenter{\drawbivline}}\generalvmap}%
+\def\drawdownarrow{\hbox to5pt{\hss\drawvector(0,-1){\varrowlength}\hss}}%
+\def\drawuparrow{\hbox to5pt{\hss\drawvector(0,1){\varrowlength}\hss}}%
+\def\drawbidownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
+ \hskip\channelwidth\hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
+\def\drawbiuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
+ \hskip\channelwidth\hbox{\drawvector(0,1){\varrowlength}}\hss}}%
+\def\drawadjdownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
+ \hskip\channelwidth\lower\varrowlength
+ \hbox{\drawvector(0,1){\varrowlength}}\hss}}%
+\def\drawadjuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
+ \hskip\channelwidth\raise\varrowlength
+ \hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
+\def\drawvline{\hbox to5pt{\hss\drawline(0,1){\varrowlength}\hss}}%
+\def\drawbivline{\hbox to5pt{\hss\hbox{\drawline(0,1){\varrowlength}}%
+ \hskip\channelwidth\hbox{\drawline(0,1){\varrowlength}}\hss}}%
+\def\commdiag#1{\null\,
+ \vcenter{\commdiagbaselines
+ \m@th\ialign{\hfil$##$\hfil&&\hfil$\mkern4mu ##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}%
+\def\commdiagbaselines{\baselineskip15pt \lineskip3pt \lineskiplimit3pt }%
+\def\gridcommdiag#1{\null\,
+ \vcenter{\offinterlineskip
+ \m@th\ialign{&\vbox to\vgrid{\vss
+ \hbox to\hgrid{\hss\smash@@{$##$}\hss}}\crcr
+ \mathstrut\crcr\noalign{\kern-\vgrid}
+ #1\crcr\mathstrut\crcr\noalign{\kern-.5\vgrid}}}\,}%
+\newdimen\harrowlength \harrowlength=60pt
+\newdimen\varrowlength \varrowlength=.618\harrowlength
+\newdimen\sarrowlength \sarrowlength=\harrowlength
+\newdimen\hmorphposn \hmorphposn=\z@
+\newdimen\vmorphposn \vmorphposn=\z@
+\newdimen\morphdist \morphdist=4pt
+\dimendef\@hmorphdflt 0 % These two dimensions are
+\dimendef\@vmorphdflt 2 % defined by \getm@rphposn
+\newdimen\hmorphposnrt \hmorphposnrt=\z@
+\newdimen\hmorphposnlft \hmorphposnlft=\z@
+\newdimen\vmorphposnrt \vmorphposnrt=\z@
+\newdimen\vmorphposnlft \vmorphposnlft=\z@
+\let\hmorphposnup=\hmorphposnrt
+\let\hmorphposndn=\hmorphposnlft
+\let\vmorphposnup=\vmorphposnrt
+\let\vmorphposndn=\vmorphposnlft
+\newdimen\hgrid \hgrid=15pt
+\newdimen\vgrid \vgrid=15pt
+\newdimen\hchannel \hchannel=0pt
+\newdimen\vchannel \vchannel=0pt
+\newdimen\channelwidth \channelwidth=3pt
+\dimendef\@hchannel 0 % Defined via the
+\dimendef\@vchannel 2 % macro \getch@nnel
+\catcode`& = \@oldandcatcode
+\catcode`@ = \@oldatcatcode
+}%
+\let\newif = \@plainnewif
+\let\newdimen = \@plainnewdimen
+\ifx\noarrow\@undefined \the\toks0 \the\toks2 \fi
+\catcode`& = \@eplainoldandcode
+\def\environment#1{%
+ \ifx\@groupname\@undefined\else
+ \errhelp = \@unnamedendgrouphelp
+ \errmessage{`\@groupname' was not closed by \string\endenvironment}%
+ \fi
+ \edef\@groupname{#1}%
+ \begingroup
+ \let\@groupname = \@undefined
+}%
+\def\endenvironment#1{%
+ \endgroup
+ \edef\@thearg{#1}%
+ \ifx\@groupname\@thearg
+ \else
+ \ifx\@groupname\@undefined
+ \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?}%
+\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.}%
+\newtoks\previouseverydisplay
+\let\@leftleftfill\relax % as it was
+\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
+ \kern-\leftdisplayindent % I'll use just \leftdisplayindent
+ $\aftergroup\@leftleqnoend % inserted after ending $
+ }%
+ \@redefinealignmentdisplays
+ \@leftdisplaystrue
+ \fi
+}%
+\newbox\@lignbox
+\newdimen\disprevdepth
+\def\centereddisplays{%
+ \if@leftdisplays
+ \everydisplay = \previouseverydisplay
+ \let\@maybedisableeqno = \@save@maybedisableeqno
+ \let\eqno = \@saveeqno
+ \let\leqno = \@saveleqno
+ \let\eqalignno = \@saveeqalignno
+ \let\leqalignno = \@saveleqalignno
+ \@leftdisplaysfalse
+ \fi
+}%
+\def\leftdisplaysetup{%
+ \dimen@ = \leftdisplayindent
+ \advance\dimen@ by \leftskip
+ \advance\displayindent by \dimen@
+ \advance\displaywidth by -\dimen@
+ \halign\bgroup##\cr \noalign\bgroup
+ \disprevdepth = \prevdepth
+ \setbox\z@ = \hbox to\displaywidth\bgroup
+ $\displaystyle
+ \aftergroup\@lefteqend % inserted after ending $
+}
+\def\@lefteqend{% gets inserted between the ending $$
+ \hfil\egroup% end box 0
+ \@putdisplay}
+\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{&}%
+ \def\leqno{&}%
+ \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{&}%
+ \def\leqno{&}%
+ \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
+ \rlap{\kern\displayindent \kern-\leftdisplayindent$\@lign####$}%
+ \tabskip\displaywidth\crcr
+ ##1\crcr}}}%
+}%
+\let\@primitivenoalign = \noalign
+\newtoks\@everynoalign
+\def\@lefteqalignonoalign#1{%
+ \@primitivenoalign{%
+ \advance\leftskip by -\parindent
+ \advance\leftskip by -\leftdisplayindent
+ \parskip = 0pt
+ \parindent = 0pt
+ \the\@everynoalign
+ #1%
+ }%
+}%
+\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
+}%
+\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
+}%
+\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.
+ \ifnum\count4<10
+ \toks1 = {0}%
+ \else
+ \toks1 = {}%
+ \fi
+ \ifnum\count2<12
+ \toks0 = {a.m.}%
+ \else
+ \toks0 = {p.m.}%
+ \advance\count2 by -12
+ \fi
+ \ifnum\count2=0
+ \count2 = 12
+ \fi
+ \number\count2:\the\toks1 \number\count4 \thinspace \the\toks0
+\endgroup}%
+\def\timestamp{\number\day\space\monthname\space\number\year\quad\timestring}%
+\def\today{\the\day\ \fullmonthname\ \the\year}%
+\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
+\newtoks\everylist
+\def\listcompact{\interitemskipamount = 0pt \relax}%
+\newdimen\@listindent
+\def\beginlist{%
+ \abovelistskip
+ \@listindent = \parindent
+ \advance\@listindent by \listleftindent
+ \advance\leftskip by \@listindent
+ \advance\rightskip by \listrightindent
+ \itemnumber = 1
+ \the\everylist
+}%
+\def\li{\@getoptionalarg\@finli}%
+\def\@finli{%
+ \let\@lioptarg\@optionalarg
+ \ifx\@lioptarg\empty \else
+ \begingroup
+ \@@hldestoff
+ \expandafter\writeitemxref\expandafter{\@lioptarg}%
+ \endgroup
+ \fi
+ \ifnum\itemnumber=1 \else \interitemskip \fi
+ \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
+ \ignorespaces
+}%
+\def\writeitemxref#1{\definexref{#1}\marker{item}}%
+\def\printitem{%
+ \par
+ \nobreak
+ \vskip-\parskip
+ \noindent
+ \printmarker\marker
+}%
+\def\printmarker#1{\llap{\marker \enspace}}%
+\def\endlist{\belowlistskip}%
+\newcount\numberedlistdepth
+\newcount\itemnumber
+\newcount\itemletter
+\newcount\itemromannumeral
+\def\numberedmarker{%
+ \ifcase\numberedlistdepth
+ (impossible)%
+ \or \printitemnumber
+ \or \printitemletter
+ \or \printitemromannumeral
+ \else *%
+ \fi
+}%
+\def\printitemnumber{\number\itemnumber}%
+\def\printitemletter{\char\the\itemletter}%
+\def\printitemromannumeral{\romannumeral\itemromannumeral}%
+\def\numberedprintmarker#1{\llap{#1) \listmarkerspace}}%
+\def\numberedlist{\environment{@numbered-list}%
+ \advance\numberedlistdepth by 1
+ \itemletter = `a
+ \itemromannumeral = 1
+ \beginlist
+ \let\marker = \numberedmarker
+ \let\printmarker = \numberedprintmarker
+}%
+\def\endnumberedlist{%
+ \par
+ \endenvironment{@numbered-list}%
+ \endlist
+}%
+\let\orderedlist = \numberedlist
+\let\endorderedlist = \endnumberedlist
+\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
+}%
+\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}}%
+\def\nolastlinelisting{\aftergroup\@removeboxes}%
+\def\@removeboxes{%
+ \setbox0 = \lastbox
+ \ifvoid0
+ \ignorespaces % Ignore spaces after the \obeywhitespace's group.
+ \else
+ \expandafter\@removeboxes
+ \fi
+}%
+{%
+ \makeactive\^^L
+ \let^^L = \relax
+ \gdef\@setuplisting{%
+ \uncatcodespecials
+ \obeywhitespace
+ \makeactive\`
+ \makeactive\^^I
+ \makeactive\^^L
+ \def^^L{\vfill\break}%
+ \parskip = 0pt
+ \listingfont
+ }%
+}%
+\def\listingfont{\tt}%
+{%
+ \makeactive\`
+ \gdef`{\relax\lq}% Defeat ligatures.
+}%
+{%
+ \makeactive\^^I
+ \gdef^^I{\hskip8\fontdimen2\font \relax}%
+}%
+\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
+\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\def{writenumbered#1line}{\writenumberedcontentsline{#1}}%
+ \ece\innernewif{ifrewrite#1file} \csname rewrite#1filetrue\endcsname
+ \ece\def{read#1file}{\readcontentsfile{#1}}%
+}%
+\definecontentsfile{toc}%
+\def\opencontentsfile#1{%
+ \csname if@#1fileopened\endcsname \else
+ \ece{\immediate\openout}{#1file} = \csname #1filebasename\endcsname.#1
+ \ece\global{@#1fileopenedtrue}%
+ \fi
+}%
+\def\writecontentsentry#1#2#3{\writenumberedcontentsentry{#1}{#2}{#3}{}}%
+\def\writenumberedcontentsentry#1#2#3#4{%
+ \csname ifrewrite#1file\endcsname
+ \writenumberedcontents@cmdname{#1}{#2}%
+ \def\temp{#3}% the text
+ \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
+}%
+\def\writenumberedcontentsline#1#2#3#4{%
+ \csname ifrewrite#1file\endcsname
+ \writenumberedcontents@cmdname{#1}{#2}%
+ \def\temp{#4}% the text
+ \toks2 = \expandafter{#3}%
+ \edef\cs{\the\toks2}%
+ \edef\@wr{%
+ \write\csname #1file\endcsname{%
+ \the\toks0 % the \toc...entry control sequence
+ \ifx\empty\cs\else {\sanitize\cs}\fi % a secondary number, or nothing
+ {\sanitize\temp}% the text
+ {\noexpand\folio}% the page number
+ }%
+ }%
+ \@wr
+ \fi
+ \ignorespaces
+}%
+\def\writenumberedcontents@cmdname#1#2{%
+ \csname open#1file\endcsname
+ \edef\temp{#2}% Expand PART fully and see if this produced an integer.
+ \expandafter\if\expandafter\isinteger\expandafter{\temp}%
+ \toks0 = {\expandafter\noexpand \csname #1entry\endcsname}%
+ \edef\temp{\the\toks0{\temp}}%
+ \toks0 = \expandafter{\temp}%
+ \else
+ \toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}%
+ \fi
+}%
+\def\readcontentsfile#1{%
+ \edef\temp{%
+ \noexpand\testfileexistence[\csname #1filebasename\endcsname]{#1}%
+ }\temp
+ \if@fileexists
+ \input \csname #1filebasename\endcsname.#1\relax
+ \fi
+}%
+\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}}%
+\def\tocentry#1#2#3{\line{\rm\hskip#1em #2 \dotfill\ #3}}%
+\let\ifxrefwarning = \iftrue
+\def\xrefwarningtrue{\@citewarningtrue \let\ifxrefwarning = \iftrue}%
+\def\xrefwarningfalse{\@citewarningfalse \let\ifxrefwarning = \iffalse}%
+\begingroup
+ \catcode`\_ = 8
+ \gdef\xrlabel#1{#1_x}%
+\endgroup
+\def\xrdef#1{%
+ \begingroup
+ \hldest@impl{xrdef}{#1}%
+ \begingroup
+ \@@hldestoff
+ \definexref{#1}{\noexpand\folio}{page}%
+ \endgroup
+ \endgroup
+ \ignorespaces
+}%
+\def\definexref#1#2#3{%
+ \hldest@impl{definexref}{#1}%
+ \edef\temp{#1}%
+ \readauxfile
+ \edef\@wr{\noexpand\writeaux{\string\@definelabel{\temp}{#2}{#3}}}%
+ \@wr
+ \ignorespaces
+}%
+\def\@definelabel#1{% #2 and #3 will be read later.
+ \begingroup % Will be ended in \@definelabel@nocheck.
+ \expandafter\ifx\csname\xrlabel{#1}\endcsname \relax
+ \expandafter\@definelabel@nocheck
+ \else
+ \expandafter\@definelabel@warn
+ \fi
+ {#1}%
+}%
+\def\@definelabel@nocheck#1#2#3{%
+ \expandafter\gdef\csname\xrlabel{#1}\endcsname{#2}%
+ \setpropertyglobal{\xrlabel{#1}}{class}{#3}%
+ \endgroup % From \@definelabel.
+}%
+\def\@definelabel@warn#1#2#3{%
+ \message{^^J\linenumber Label `#1' multiply defined,
+ value `#2' of class `#3' overwriting value
+ `\csname\xrlabel{#1}\endcsname' of class
+ `\getproperty{\xrlabel{#1}}{class}'.}%
+ \@definelabel@nocheck{#1}{#2}{#3}%
+}%
+\def\reftie{\penalty\@M \ }% Do not rely on `~' being defined as a tie.
+\let\refspace\
+\def\xrefn{\@getoptionalarg\@finxrefn}%
+\def\@finxrefn#1{%
+ \hlstart@impl{ref}{#1}%
+ \ifx\@optionalarg\empty \else
+ \let\@xrefnoptarg\@optionalarg
+ \readauxfile
+ {\@@hloff\@xrefnoptarg}\reftie
+ \fi
+ \plain@xrefn{#1}%
+ \hlend@impl{ref}%
+}%
+\def\plain@xrefn#1{%
+ \readauxfile
+ \expandafter \ifx\csname\xrlabel{#1}\endcsname\relax
+ \if@citewarning
+ \message{\linenumber Undefined label `#1'.}%
+ \fi
+ \expandafter\def\csname\xrlabel{#1}\endcsname{%
+ `{\tt
+ \escapechar = -1
+ \expandafter\string\csname#1\endcsname
+ }'%
+ }%
+ \fi
+ \csname\xrlabel{#1}\endcsname % Always produce something.
+}%
+\let\refn = \xrefn
+\def\xrefpageword{p.\thinspace}%
+\def\xref{\@getoptionalarg\@finxref}%
+\def\@finxref#1{%
+ \hlstart@impl{xref}{#1}%
+ \ifx\@optionalarg\empty \else
+ {\@@hloff\@optionalarg}\refspace
+ \fi
+ \xrefpageword\plain@xrefn{#1}%
+ \hlend@impl{xref}%
+}%
+\def\@maybewarnref{%
+ \ifundefined{amsppt.sty}%
+ \else
+ \message{Warning: amsppt.sty and Eplain both define \string\ref. See
+ the Eplain manual.}%
+ \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}%
+\def\@generalref#1#2#3{%
+ \let\@generalrefoptarg\@optionalarg
+ \readauxfile
+ \ifcase#1 \else \hlstart@impl{ref}{#3}\fi
+ \edef\@generalref@class{\getproperty{\xrlabel{#3}}{class}}%
+ \expandafter\ifx\csname \@generalref@class word\endcsname\relax
+ \ifx\@generalrefoptarg\empty \else {\@@hloff\@generalrefoptarg\reftie}\fi
+ \else
+ \begingroup
+ \@@hloff
+ \ifx\@generalrefoptarg\empty \else \@generalrefoptarg \refspace \fi
+ \csname \@generalref@class word\endcsname
+ #2\reftie
+ \endgroup
+ \fi
+ \ifcase#1 \hlstart@impl{ref}{#3}\fi
+ \plain@xrefn{#3}%
+ \hlend@impl{ref}%
+}%
+\newcount\eqnumber
+\newcount\subeqnumber
+\def\eqdefn{\@getoptionalarg\@fineqdefn}%
+\def\@fineqdefn#1{%
+ \ifx\@optionalarg\empty
+ \global\advance\eqnumber by 1
+ \def\temp{\eqconstruct{\number\eqnumber}}%
+ \else
+ \def\temp{\@optionalarg}%
+ \fi
+ \global\subeqnumber = 0
+ \gdef\@currenteqlabel{#1}%
+ \toks0 = \expandafter{\@currenteqlabel}%
+ \begingroup
+ \def\eqrefn{\noexpand\plain@xrefn}%
+ \def\xrefn{\noexpand\plain@xrefn}%
+ \edef\temp{\noexpand\@eqdefn{\the\toks0}{\temp}}%
+ \temp
+ \endgroup
+}%
+\def\eqsubdefn#1{%
+ \global\advance\subeqnumber by 1
+ \toks0 = {#1}%
+ \toks2 = \expandafter{\@currenteqlabel}%
+ \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
+}%
+\newcount\phantomeqnumber
+\def\phantomeqlabel{PHEQ\the\phantomeqnumber}%
+\def\@eqdefn#1#2{%
+ \ifempty{#1}%
+ \global\advance\phantomeqnumber by 1
+ \edef\hl@eqlabel{\phantomeqlabel}%
+ \readauxfile
+ \else
+ \def\hl@eqlabel{#1}%
+ {\@@hldestoff \definexref{#1}{#2}{eq}}%
+ \fi
+ \hldest@impl{eq}{\hl@eqlabel}%
+ \begingroup % \@definelabel@nocheck will end this group.
+ \@definelabel@nocheck{#1}{#2}{eq}%
+}%
+\def\eqdef{\@getoptionalarg\@fineqdef}%
+\def\@fineqdef{%
+ \toks0 = \expandafter{\@optionalarg}%
+ \edef\temp{\noexpand\@eqdef{\noexpand\eqdefn[\the\toks0]}}%
+ \temp
+}%
+\def\eqsubdef{\@eqdef\eqsubdefn}%
+\def\@eqdef#1#2{%
+ \@maybedisableeqno
+ \eqnum #1{#2}% Define the label and hyperlink destination.
+ \let\@optionalarg\empty % \@fineqref will examine \@optionalarg.
+ {\@@hloff\@fineqref{#2}}% Print the text without a hyperlink.
+ \@mayberestoreeqno
+ \ignorespaces
+}%
+\let\@mayberestoreeqno = \relax
+\def\@maybedisableeqno{%
+ \ifinner
+ \global\let\eqno = \relax
+ \global\let\leqno = \relax
+ \global\let\@mayberestoreeqno = \@restoreeqno
+ \fi
+}%
+\let\@primitiveeqno = \eqno
+\let\@primitiveleqno = \leqno
+\def\@restoreeqno{%
+ \global\let\eqno = \@primitiveeqno
+ \global\let\leqno = \@primitiveleqno
+ \global\let\@mayberestoreeqno = \empty
+}%
+\def\righteqnumbers{%
+ \def\eqnum{\eqno}%
+ \def\eqalignnum{\eqalignno}%
+}%
+\def\lefteqnumbers{%
+ \def\eqnum{\leqno}%
+ \def\eqalignnum{\leqalignno}%
+}%
+\righteqnumbers
+\def\eqrefn{\@getoptionalarg\@fineqrefn}%
+\def\@fineqrefn#1{%
+ \eqref@start{#1}%
+ \plain@xrefn{#1}%
+ \hlend@impl{eq}%
+}%
+\def\eqref{\@getoptionalarg\@fineqref}%
+\def\@fineqref#1{%
+ \eqref@start{#1}%
+ \eqprint{\plain@xrefn{#1}}%
+ \hlend@impl{eq}%
+}%
+\def\eqref@start#1{%
+ \let\@eqrefoptarg\@optionalarg
+ \ifempty{#1}%
+ \hlstart@impl{eq}{\phantomeqlabel}%
+ \else
+ \hlstart@impl{eq}{#1}%
+ \fi
+ \ifx\@eqrefoptarg\empty \else
+ {\@@hloff\@eqrefoptarg\reftie}%
+ \fi
+}%
+\let\eqconstruct = \identity
+\def\eqprint#1{(#1)}%
+\def\eqsubreftext#1#2{#1.#2}%
+\let\extraidxcmdsuffixes = \empty
+\def\defineindex#1{%
+ \def\@idxprefix{#1}%
+ \expandafter\innernewif\csname if\@idxprefix dx\endcsname
+ \csname \@idxprefix dxtrue\endcsname
+ \for\@idxcmd:=,marked,submarked,name%
+ \extraidxcmdsuffixes\do
+ {%
+ \@defineindexcmd\@idxcmd
+ }%
+ \ece\innernewwrite{@#1indexfile}%
+ \ece\innernewif{if@#1indexfileopened}%
+}%
+\newif\ifsilentindexentry
+\def\@defineindexcmd#1{%
+ \@defineoneindexcmd{s}{#1}\silentindexentrytrue
+ \@defineoneindexcmd{}{#1}\silentindexentryfalse
+}%
+\def\@defineoneindexcmd#1#2#3{%
+ \toks@ = {#3}%
+ \edef\temp{%
+ \def
+ \expandonce\csname#1\@idxprefix dx#2\endcsname % e.g., \idx or \sidxname.
+ {\def\noexpand\@idxprefix{\@idxprefix}% define \@idxprefix
+ \expandonce\csname @@#1idx#2\endcsname
+ }%
+ \def
+ \expandonce\csname @@#1idx#2\endcsname{% e.g., \@@idx
+ \the\toks@
+ \noexpand\@idxgetrange\expandonce\csname @#1idx#2\endcsname
+ }%
+ }%
+ \temp
+}%
+\let\indexfilebasename = \jobname
+\def\@idxwrite#1#2{%
+ \csname if\@idxprefix dx\endcsname
+ \@openidxfile
+ \def\temp{#1}%
+ \edef\@wr{%
+ \expandafter\write\csname @\@idxprefix indexfile\endcsname{%
+ \string\indexentry
+ {\sanitize\temp}%
+ {\noexpand#2}%
+ }%
+ }%
+ \@wr
+ \else
+ \write-1{}%
+ \fi
+ \ifindexproofing
+ \def\temp{#1}%
+ \edef\temp{%
+ \insert\@indexproof{\noexpand\indexproofterm{\sanitize\temp}}%
+ }%
+ \temp
+ \ifhmode\allowhyphens\fi
+ \fi
+ \hookrun{afterindexterm}%
+ \ifsilentindexentry \expandafter\ignorespaces\fi
+}%
+\def\@openidxfile{%
+ \csname if@\@idxprefix indexfileopened\endcsname \else
+ \expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname =
+ \indexfilebasename.\@idxprefix dx
+ \expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname
+ \fi
+}%
+\newif\ifindexproofing
+\newinsert\@indexproof
+\dimen\@indexproof = \maxdimen % No limit on number of terms.
+\count\@indexproof = 0 \skip\@indexproof = 0pt % They take up no space.
+\font\indexprooffont = cmtt8
+\def\indexproofterm#1{\hbox{\strut \indexprooffont #1}}%
+\let\@plainmakeheadline = \makeheadline
+\def\makeheadline{%
+ \expandafter\ifx\csname\idxpageanchor{\folio}\endcsname\relax \else
+ {\@@hldeston \hldest@impl{idx}{\hlidxpagelabel{\folio}}}%
+ \fi
+ \indexproofunbox
+ \@plainmakeheadline
+}%
+\def\indexsetmargins{%
+ \ifx\undefined\outsidemargin
+ \dimen@ = 1truein
+ \advance\dimen@ by \hoffset
+ \edef\outsidemargin{\the\dimen@}%
+ \let\insidemargin = \outsidemargin
+ \fi
+}%
+\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
+}%
+\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%
+ \begingroup
+ \catcode\idxargopen=1
+ \@getoptionalarg\@finidxgetopt
+}%
+\def\@finidxgetopt{%
+ \global\let\@idxgetrange@arg\@optionalarg
+ \endgroup
+ \@hlidxencaptrue
+ \for\@idxarg:=\@idxgetrange@arg\do{%
+ \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
+ }%
+ \ifnum\hldest@place@idx < 0 \else
+ \if@hlidxencap
+ \ifx\@idxpagemarkup\relax
+ \let\@idxpagemarkup\empty
+ \fi
+ \ifcase\hldest@place@idx \relax
+ \edef\@idxpagemarkup{hlidxpage{\@idxpagemarkup}}%
+ \definepageanchor{\noexpand\folio}%
+ \else
+ \global\advance\hlidxlabelnumber by 1
+ \edef\@idxpagemarkup{hlidx{\hlidxlabel}{\@idxpagemarkup}}%
+ \hldest@impl{idx}{\hlidxlabel}%
+ \fi
+ \fi
+ \fi
+ \@afteridxgetrange
+}%
+\def\@idxcheckpagemarkup#1=#2,{%
+ \def\temp{#1}%
+ \ifx\temp\idxpagemarkupcmdword
+ \if ,#2, % If #2 is empty, complain.
+ \errmessage{Missing markup command to `pagemarkup'}%
+ \else
+ \def\temp##1={##1}%
+ \edef\@idxpagemarkup{\temp\string#2}%
+ \fi
+ \fi
+}%
+\def\hldest@place@idx{-1}%
+\begingroup
+ \catcode`\_ = 8
+ \gdef\idxpageanchor#1{#1_p}%
+\endgroup
+\def\definepageanchor#1{%
+ \readauxfile
+ \edef\@wr{\noexpand\writeaux{\string\@definepageanchor{#1}}}%
+ \@wr
+ \ignorespaces
+}%
+\def\@definepageanchor#1{%
+ \expandafter\gdef\csname\idxpageanchor{#1}\endcsname{}%
+}%
+\newcount\hlidxlabelnumber
+\def\hlidxlabel{IDX\the\hlidxlabelnumber}%
+\def\hlidxpagelabel#1{IDXPG#1}%
+\def\hlidx#1#2#3{%
+ \ifempty{#2}%
+ \let\@idxpageencap\relax
+ \else
+ \expandafter\let\expandafter\@idxpageencap\csname #2\endcsname
+ \fi
+ \hlstart@impl{idx}{#1}%
+ \@idxpageencap{#3}%
+ \hlend@impl{idx}%
+}%
+\def\hlidxpage#1#2{%
+ \@hlidxgetpages{#2}%
+ \ifempty{#1}%
+ \let\@idxpageencap\relax
+ \else
+ \expandafter\let\expandafter\@idxpageencap\csname #1\endcsname
+ \fi
+ \hlstart@impl{idx}{\hlidxpagelabel{\@idxpageiref}}%
+ \expandafter\@idxpageencap\expandafter{\@idxpagei}%
+ \hlend@impl{idx}%
+ \ifx\@idxpageii\empty \else
+ \@idxpagesep
+ \hlstart@impl{idx}{\hlidxpagelabel{\@idxpageiiref}}%
+ \expandafter\@idxpageencap\expandafter{\@idxpageii}%
+ \hlend@impl{idx}%
+ \fi
+}%
+\def\@hlidxgetpages#1{%
+ \idxparselist{#1}%
+ \ifx\idxpagei\empty
+ \idxparserange{#1}%
+ \ifx\idxpagei\empty
+ \def\@idxpageiref{#1}% Label for \hlstart.
+ \else
+ \let\@idxpageiref\idxpagei % Label for \hlstart.
+ \fi
+ \def\@idxpagei{#1}%
+ \let\@idxpageii\empty
+ \else
+ \let\@idxpagei\idxpagei
+ \let\@idxpageii\idxpageii
+ \let\@idxpageiref\idxpagei % Label for \hlstart.
+ \let\@idxpageiiref\idxpageii % Label for \hlstart.
+ \let\@idxpagesep\idxpagelistdelimiter
+ \fi
+}%
+\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\@@}%
+}%
+\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\@@}%
+}%
+\setidxpagelistdelimiter{, }%
+\setidxpagerangedelimiter{--}%
+\def\idxsubentryseparator{!}%
+\def\idxencapoperator{|}%
+\def\idxmaxpagenum{99999}%
+\newtoks\@idxmaintoks
+\newtoks\@idxsubtoks
+\def\@idxtokscollect{%
+ \edef\temp{\the\@idxsubtoks}%
+ \edef\@indexentry{%
+ \the\@idxmaintoks
+ \ifx\temp\empty\else \idxsubentryseparator\the\@idxsubtoks \fi
+ \@idxrangestr
+ }%
+ \if@idxsee
+ \@idxseefalse % Reset so the next term won't be a `see'.
+ \edef\temp{\noexpand\idx@getverbatimarg
+ {\noexpand\@finidxtokscollect{\idxmaxpagenum}}}%
+ \else
+ \def\temp{\@finfinidxtokscollect\folio}%
+ \fi
+ \temp
+}%
+\def\@finidxtokscollect#1#2{%
+ \def\@idxseenterm{#2}%
+ \@finfinidxtokscollect{#1}%
+}%
+\def\@finfinidxtokscollect#1{%
+ \ifx\@idxpagemarkup\relax \else
+ \toks@ = \expandafter{\@indexentry}%
+ \edef\@indexentry{%
+ \the\toks@
+ \ifx\@idxrangestr\empty \idxencapoperator \fi
+ \@idxpagemarkup
+ }%
+ \let\@idxpagemarkup = \relax
+ \fi
+ \ifx\@idxseenterm\relax \else
+ \toks@ = \expandafter{\@indexentry}%
+ \edef\@indexentry{\the\toks@{\sanitize\@idxseenterm}}%
+ \let\@idxseenterm = \relax
+ \fi
+ \expandafter\@idxwrite\expandafter{\@indexentry}{#1}%
+}%
+\def\@idxcollect#1#2{%
+ \@idxmaintoks = {#1}%
+ \@idxsubtoks = {#2}%
+ \@idxtokscollect
+}%
+\def\idxargopen{`\{}%
+\def\idxargclose{`\}}%
+\def\idx@getverbatimarg#1{%
+ \def\idx@getverbatimarg@cmd{#1}% Save the command, allowing it to be
+ \begingroup
+ \uncatcodespecials
+ \catcode\idxargopen=1
+ \catcode\idxargclose=2
+ \catcode`\ =10 % Swallow multiple consequent spaces.
+ \catcode`\^^I=10 % Just in case, to avoid dependence on
+ \catcode`\^^M=5 % current meanings of tabs and newlines.
+ \idx@fingetverbatimarg
+}%
+\def\idx@fingetverbatimarg#1{\endgroup\idx@getverbatimarg@cmd{#1}}%
+\def\idx@getverboptarg#1{%
+ \def\idx@optionaltemp{#1}% Save the command, allowing it to be more
+ \let\idx@optionalnext = \relax
+ \begingroup
+ \if@idxsee \catcode\idxargopen=1 \fi
+ \@futurenonspacelet\idx@optionalnext\idx@bracketcheck
+}%
+\def\idx@bracketcheck{%
+ \ifx [\idx@optionalnext
+ \endgroup % Cancel \catcode\idxargopen=1.
+ \expandafter\idx@finbracketcheck
+ \else
+ \endgroup % Cancel \catcode\idxargopen=1.
+ \let\@optionalarg = \empty
+ \expandafter\idx@optionaltemp
+ \fi
+}%
+\def\idx@finbracketcheck{%
+ \begingroup
+ \uncatcodespecials
+ \catcode`\ =10 % Swallow multiple consequent spaces.
+ \catcode`\^^I=10 % Just in case, to avoid dependence on
+ \catcode`\^^M=5 % current meanings of tabs and newlines.
+ \idx@@getoptionalarg
+}%
+\def\idx@@getoptionalarg[#1]{%
+ \endgroup
+ \def\@optionalarg{#1}%
+ \idx@optionaltemp
+}%
+{\catcode`\&=0
+\gdef\idx@scanterm#1{%
+ \edef\idx@scanterm@nl@catcode{\the\catcode`\^^M\relax}%
+ \catcode`\^^M=5
+ \scantokens{#1&endinput}%
+ \catcode`\^^M=\idx@scanterm@nl@catcode
+}}%
+\def\@idx{\idx@getverbatimarg\@finidx}%
+\def\@finidx#1{%
+ \idx@scanterm{#1}% Produce TERM as output.
+ \@idxcollect{#1}{}%
+}%
+\def\@sidx{\idx@getverbatimarg\@finsidx}%
+\def\@finsidx#1{\@idxmaintoks = {#1}\idx@getverboptarg\@finfinsidx}%
+\def\@finfinsidx{%
+ \@idxsubtoks = \expandafter{\@optionalarg}%
+ \@idxtokscollect
+}%
+\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.
+ \edef\temp{\the\toks2 \idxsortkeysep \the\toks@{\the\toks2}}%
+ #1 = \expandafter{\temp}%
+}%
+\def\@idxmarked#1{\idx@getverbatimarg{\@finidxmarked{#1}}}%
+\def\@finidxmarked#1#2{%
+ \idx@scanterm{#1{#2}}% Produce \CS{TERM} as output.
+ \@idxconstructmarked\@idxmaintoks{#1}{#2}%
+ \@idxsubtoks = {}%
+ \@idxtokscollect
+}%
+\def\@sidxmarked#1{\idx@getverbatimarg{\@finsidxmarked{#1}}}%
+\def\@finsidxmarked#1#2{%
+ \@idxconstructmarked\toks@{#1}{#2}%
+ \edef\temp{{\the\toks@}}%
+ \expandafter\@finsidx\temp
+}%
+\def\@idxsubmarked{%
+ \let\sidxsubmarked@print\idxsubmarked@print
+ \idx@getverbatimarg\@finsidxsubmarked
+}%
+\def\idxsubmarked@print{\expandafter\idx@scanterm\expandafter}%
+\def\@sidxsubmarked{%
+ \let\sidxsubmarked@print\gobble
+ \idx@getverbatimarg\@finsidxsubmarked
+}%
+\def\@finsidxsubmarked#1{\@idxmaintoks = {#1}\@@finsidxsubmarked}% Reads TERM.
+\def\@@finsidxsubmarked#1{\idx@getverbatimarg{\@@@finsidxsubmarked{#1}}}% Reads \CS.
+\def\@@@finsidxsubmarked#1#2{% Reads {\CS}{SUBTERM}.
+ \sidxsubmarked@print % Prints for \@idxsubmarked, gobbles for \@sidxsubmarked.
+ {\the\@idxmaintoks\space #1{#2}}% Maybe produce `TERM \CS{SUBTERM}' as output.
+ \@idxconstructmarked\@idxsubtoks{#1}{#2}%
+ \@idxtokscollect
+}%
+\def\idxnameseparator{, }% as in `Tachikawa, Elizabeth'
+\def\@idxcollectname#1#2{%
+ \def\temp{#1}%
+ \ifx\temp\empty
+ \toks@ = {}%
+ \else
+ \toks@ = \expandafter{\idxnameseparator #1}%
+ \fi
+ \toks2 = {#2}%
+ \edef\temp{\the\toks2 \the\toks@}%
+}%
+\def\@idxname{\idx@getverbatimarg\@finidxname}%
+\def\@finidxname#1{\idx@getverbatimarg{\@finfinidxname{#1}}}%
+\def\@finfinidxname#1#2{%
+ \idx@scanterm{#1 #2}% Separate the names by a space in the output.
+ \@idxcollectname{#1}{#2}%
+ \expandafter\@idxcollect\expandafter{\temp}{}%
+}%
+\def\@sidxname{\idx@getverbatimarg\@finsidxname}%
+\def\@finsidxname#1{\idx@getverbatimarg{\@finfinsidxname{#1}}}%
+\def\@finfinsidxname#1#2{%
+ \@idxcollectname{#1}{#2}%
+ \expandafter\@finsidx\expandafter{\temp}%
+}%
+\let\indexfonts = \relax
+\def\readindexfile#1{%
+ \edef\@idxprefix{#1}%
+ \testfileexistence[\indexfilebasename]{\@idxprefix nd}%
+ \iffileexists \begingroup
+ \ifx\begin\undefined
+ \def\begin##1{\@beginindex}%
+ \let\end = \@gobble
+ \fi
+ \input \indexfilebasename.\@idxprefix nd
+ \singlecolumn
+ \endgroup
+ \else
+ \message{No index file \indexfilebasename.\@idxprefix nd.}%
+ \fi
+}%
+\def\@beginindex{%
+ \let\item = \@indexitem
+ \let\subitem = \@indexsubitem
+ \let\subsubitem = \@indexsubsubitem
+ \indexfonts
+ \doublecolumns
+ \parindent = 0pt
+ \hookrun{beginindex}%
+}%
+\let\indexspace = \bigbreak
+\let\afterindexterm = \quad
+\newskip\aboveindexitemskipamount \aboveindexitemskipamount = 0pt plus2pt
+\def\aboveindexitemskip{\vskip\aboveindexitemskipamount}%
+\def\@indexitem{\begingroup
+ \@indexitemsetup
+ \leftskip = 0pt
+ \aboveindexitemskip
+ \penalty-100 % Encourage page breaks before items.
+ \def\par{\endgraf\endgroup\nobreak}%
+}%
+\def\@indexsubitem{%
+ \@indexitemsetup
+ \leftskip = 1em
+}%
+\def\@indexsubsubitem{%
+ \@indexitemsetup
+ \leftskip = 2em
+}%
+\def\@indexitemsetup{%
+ \par
+ \hangindent = 1em
+ \raggedright
+ \hyphenpenalty = 10000
+ \hookrun{indexitem}%
+}%
+\def\seevariant{\it}%
+\def\indexseeword{see}%
+\def\indexsee{\idx@getverbatimarg\@finindexsee}%
+\def\@finindexsee#1#2{{\seevariant \indexseeword\/ }\idx@scanterm{#1}}%
+\def\indexseealsowords{see also}%
+\def\indexseealso{\idx@getverbatimarg\@finindexseealso}%
+\def\@finindexseealso#1#2{{\seevariant \indexseealsowords\/ }\idx@scanterm{#1}}%
+\defineindex{i}%
+\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 %
+ }%
+ \gdef\@startjustify{%
+ \parskip = 0pt
+ \catcode`\^^M = \active %
+ \def^^M{\futurelet\next\@finjustifyreturn}%
+ \def\@eateol##1^^M{%
+ \def\temp{##1}%
+ \@firstlinejustifyaction %
+ \ifx\temp\empty\else \temp^^M\fi %
+ }%
+ \expandafter\aftergroup\@endjustifycmd %
+ \checkenv \environmenttrue %
+ \par\noindent %
+ \@eateol %
+ }%
+ \gdef\@finjustifyreturn{%
+ \@eoljustifyaction %
+ \ifx\next^^M%
+ \def\par{\endgraf\vskip\blanklineskipamount \global\let\par = \endgraf}%
+ \@endjustifycmd %
+ \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
+ {\parfillskip = 0pt \par}\ignorespaces
+}%
+\def\@endcenter{% Remove the \hfil\null\break we just put on.
+ \unskip \setbox0=\lastbox \unpenalty
+ {\parfillskip = 0pt plus1fil \par}\ignorespaces
+}%
+\ifx\@undefined\raggedleft
+\innernewskip\raggedleftskip \raggedleftskip=0pt plus2em
+\def\raggedleft{\leftskip\raggedleftskip \parindent=0pt
+ \spaceskip.3333em \xspaceskip.5em \parfillskip0pt \relax}
+\fi % \raggedleft undefined
+\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
+\def\makecolumns#1/#2: {\par \begingroup
+ \@columndepth = #1
+ \advance\@columndepth by -1
+ \divide \@columndepth by #2
+ \advance\@columndepth by 1
+ \@linestogoincolumn = \@columndepth
+ \@linestogo = #1
+ \currentcolumn = 1
+ \def\@endcolumnactions{%
+ \ifnum \@linestogo<2
+ \the\crtok \egroup \endgroup \par % End \valign and \makecolumns.
+ \else
+ \global\advance\@linestogo by -1
+ \ifnum\@linestogoincolumn<2
+ \global\advance\currentcolumn by 1
+ \global\@linestogoincolumn = \@columndepth
+ \the\crtok
+ \else
+ &\global\advance\@linestogoincolumn by -1
+ \fi
+ \fi
+ }%
+ \makeactive\^^M
+ \letreturn \@endcolumnactions
+ \@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
+}%
+\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
+\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
+ \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}$}%
+}%
+\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@
+}%
+\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@
+}%
+\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.
+}%
+\let\@plainm@g = \m@g
+\def\m@g{\@plainm@g \paperwidth = 8.5 true in \paperheight = 11 true in}%
+\newskip\abovecolumnskip \abovecolumnskip = \bigskipamount
+\newskip\belowcolumnskip \belowcolumnskip = \bigskipamount
+\newdimen\gutter \gutter = 2pc
+\newbox\@partialpage
+\newdimen\@normalhsize
+\newdimen\@normalvsize % The original (before multi-columns) \vsize.
+\newtoks\previousoutput
+\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
+\chardef\@numcolumns = 1
+\mathchardef\@ejectpartialpenalty = 10141
+\chardef\@col@minlines = 3
+\chardef\@col@extralines = 3
+\newdimen\@col@extraheight
+\def\@columns#1{%
+ \@ndcolumns
+ \global\let\@ndcolumns = \@endcolumns
+ \global\chardef\@numcolumns = #1
+ \global\previousoutput = \expandafter{\the\output}%
+ \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
+ \penalty -\@ejectpartialpenalty
+ \global\output = {\@columnoutput}%
+ \global\@normalhsize = \hsize
+ \global\@normalvsize = \vsize
+ \count@ = \@numcolumns
+ \advance\count@ by -1
+ \global\advance\hsize by -\count@\gutter
+ \global\divide\hsize by \@numcolumns
+ \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
+ \@col@extraheight=\@col@extralines\baselineskip
+ \multiply\@col@extraheight by \@numcolumns
+ \global\advance\vsize by \@col@extraheight
+}%
+\def\gutterbox{\vbox to \dimen0{\vfil\hbox{\hfil}\vfil}}%
+\def\@columnsplit{%
+ \splittopskip = \topskip
+ \splitmaxdepth = \baselineskip
+ \begingroup
+ \vbadness = 10000
+ \global\setbox1 = \vsplit255 to \dimen@ \global\wd1 = \hsize
+ \global\setbox3 = \vsplit255 to \dimen@ \global\wd3 = \hsize
+ \ifnum\@numcolumns > 2
+ \global\setbox5 = \vsplit255 to \dimen@ \global\wd5 = \hsize
+ \fi
+ \ifnum\@numcolumns > 3
+ \global\setbox7 = \vsplit255 to \dimen@ \global\wd7 = \hsize
+ \fi
+ \endgroup
+ \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
+ }%
+ \setbox\@partialpage = \box0
+}%
+\def\@columnoutput{%
+ \dimen@ = \ht255
+ \advance\dimen@ by -\@col@extraheight
+ \divide\dimen@ by \@numcolumns
+ \@columnsplit
+ \@recoverclubpenalty
+ \hsize = \@normalhsize % Local to \output's group.
+ \vsize = \@normalvsize
+ \the\previousoutput
+ \unvbox\@partialpage
+ \penalty\outputpenalty
+ \global\vsize = \@numcolumns\@normalvsize
+ \global\advance\vsize by \@col@extraheight
+}%
+\def\singlecolumn{%
+ \@ndcolumns
+ \chardef\@numcolumns = 1
+ \vskip\belowcolumnskip
+ \nointerlineskip
+}%
+\newbox\@singlecolumnbox
+\newdimen\column@pagegoal
+\newdimen\column@vsize
+\def\@endcolumns{%
+ \global\let\@ndcolumns = \relax
+ \par % Shouldn't start in horizontal mode.
+ \column@pagegoal = \pagegoal
+ \advance\column@pagegoal by-\@col@extraheight
+ \ifdim \pagetotal > \column@pagegoal
+ \column@vsize = \column@pagegoal
+ \else
+ \column@vsize = \pagetotal
+ \fi
+ \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\output = \expandafter{\the\previousoutput}%
+ \setbox\@singlecolumnbox = \box\@partialpage
+ \@balancecolumns
+}%
+\def\@balancecolumns{%
+ \global\setbox255 = \copy2 % Retrieve what the fake \output set.
+ \dimen@ = \column@vsize
+ \divide\dimen@ by \@numcolumns
+ \@columnsplit
+ \ifvoid\@partialpage
+ \global\vsize = \@normalvsize
+ \global\hsize = \@normalhsize
+ \dump@balanced@columns
+ \let\next\relax
+ \else
+ \advance \column@vsize by \@numcolumns pt
+ \test@spill@columns
+ \ifspill@columns
+ \begingroup
+ \vsize = \@normalvsize
+ \hsize = \@normalhsize
+ \dump@balanced@columns
+ \break
+ \@recoverclubpenalty
+ \endgroup
+ \unvbox\@partialpage
+ \let\next\@endcolumns
+ \else
+ \setbox0=\box\@partialpage % Merely to void \@partialpage.
+ \let\next\@balancecolumns
+ \fi
+ \fi
+ \next
+}%
+\def\dump@balanced@columns{%
+ \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
+ \unvbox\@singlecolumnbox
+ \nointerlineskip
+ \box255
+}%
+\newif\ifspill@columns
+\def\test@spill@columns{%
+ \spill@columnsfalse
+ \ifdim \column@vsize > \column@pagegoal
+ \ifvoid\footins
+ \ifvoid\topins
+ \spill@columnstrue
+ \fi
+ \fi
+ \fi
+}%
+\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 so far.
+ \temp@dimen = \vsize % = \@numcolumns * columnheight
+ \advance\temp@dimen by -\@col@extraheight
+ \divide\temp@dimen by \@numcolumns % Compute column height
+ \loop
+ \ifdim \dimen@ > \temp@dimen % more material than a column?
+ \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 % fill space with rule
+ \nointerlineskip
+ \par
+ \nointerlineskip
+ \allowbreak \vfil % To allow a page break here.
+ \relax
+}%
+\def\@hldest{%
+ \def\hl@prefix{hldest}%
+ \let\after@hl@getparam\hldest@aftergetparam
+ \begingroup
+ \hl@getparam
+}%
+\def\hldest@aftergetparam{%
+ \ifvmode
+ \hldest@driver
+ \else
+ \allowhyphens
+ \smash{\ifx\hldest@opt@raise\empty \else \raise\hldest@opt@raise\fi
+ \hbox{\hldest@driver}}%
+ \allowhyphens
+ \fi
+ \endgroup
+}%
+\def\@hlstart{%
+ \leavevmode
+ \def\hl@prefix{hl}%
+ \let\after@hl@getparam\hlstart@aftergetparam
+ \begingroup
+ \hl@getparam
+}%
+\def\hlstart@aftergetparam{%
+ \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
+ \hl@driver
+}%
+\def\hl@getparam#1#2{% We'll read #3 (LABEL) later.
+ \edef\@hltype{#1}%
+ \ifx\@hltype\empty
+ \expandafter\let\expandafter\@hltype
+ \csname \hl@prefix @type\endcsname
+ \fi
+ \expandafter\ifx\csname \hl@prefix @typeh@\@hltype\endcsname \relax
+ \errmessage{Invalid hyperlink type `\@hltype'}%
+ \fi
+ \For\hl@arg:=#2\do{%
+ \ifx\hl@arg\empty \else
+ \expandafter\hl@set@opt\hl@arg=,%
+ \fi
+ }%
+ \bgroup
+ \uncatcodespecials
+ \catcode`\{=1 \catcode`\}=2
+ \@hl@getparam
+}%
+\def\@hl@getparam#1{%
+ \egroup
+ \edef\@hllabel{#1}%
+ \after@hl@getparam
+ \ignorespaces
+}%
+\def\hl@set@opt#1=#2,{%
+ \expandafter\ifx\csname \hl@prefix @opt@#1\endcsname \relax
+ \errmessage{Invalid hyperlink option `#1'}%
+ \fi
+ \if ,#2, % if #2 is empty, complain.
+ \errmessage{Missing value for option `#1'}%
+ \else
+ \def\temp##1={##1}%
+ \expandafter\edef\csname \hl@prefix @opt@#1\endcsname{\temp#2}%
+ \fi
+}%
+\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
+ \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
+}%
+\def\hl@asterisk@word{*}%
+\def\hl@opts@word{opts}%
+\newif\if@params@override
+\def\hldest@groups{definexref,xrdef,li,eq,bib,foot,footback,idx}%
+\def\hl@groups{ref,xref,eq,cite,foot,footback,idx,url,hrefint,hrefext}%
+\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
+}%
+\def\@hl@setparam#1{%
+ \ifx\@optionalarg\empty
+ \hl@setparam@default{#1}% Set default.
+ \else
+ \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
+}%
+\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 `\hl@prefix:\hl@param:\hl@group' is not defined}%
+ \fi
+ \ifx\hl@param\hl@opts@word
+ \if@params@override
+ \expandafter\let\csname\hl@prefix @\hl@param @\hl@group\endcsname\empty
+ \fi
+ \hl@update@opts@with@list{#1}% #1 will be used in the \for
+ \else
+ \ece\def{\hl@prefix @\hl@param @\hl@group}{#1}%
+ \fi
+ \fi
+}%
+\def\hl@setparam@default#1{%
+ \ifx\hl@param\hl@opts@word
+ \For\hl@opt:=#1\do{%
+ \ifx\hl@opt\empty \else
+ \expandafter\hl@set@opt\hl@opt=,%
+ \fi
+ }%
+ \else
+ \expandafter\ifx\csname\hl@prefix @\hl@param\endcsname\relax
+ \message{Default hyperlink parameter `\hl@prefix:\hl@param' is not defined}%
+ \fi
+ \ece\def{\hl@prefix @\hl@param}{#1}%
+ \fi
+}%
+\def\hl@update@opts@with@list#1{%
+ \global\expandafter\let\expandafter\hl@update@new@list
+ \csname \hl@prefix @opts@\hl@group\endcsname
+ \begingroup
+ \For\hl@opt:=#1\do{%
+ \hl@update@opts@with@opt
+ }%
+ \endgroup
+ \ece\let{\hl@prefix @opts@\hl@group}\hl@update@new@list
+}%
+\def\hl@update@opts@with@opt{%
+ \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
+ \expandafter\hl@parse@opt@key\hl@opt=,%
+ \let\hl@update@new@key\hl@update@key
+ \global\let\hl@update@comma\empty
+ \begingroup
+ \for\hl@opt:=\hl@update@old@list\do{%
+ \ifx\hl@opt\empty \else % Skip empty `options'.
+ \expandafter\hl@parse@opt@key\hl@opt=,%
+ \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
+ \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
+}%
+\def\hl@parse@opt@key#1=#2,{\def\hl@update@key{#1}}%
+\def\hldest@opt@raise{\normalbaselineskip}%
+\def\hl@opt@colormodel{cmyk}%
+\def\hl@opt@color{0.28,1,1,0.35}%
+\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
+\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
+\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
+\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
+\def\hl@on@hrefint{0}% \href with internal #labels
+\def\hl@on@hrefext{0}% \href with external labels (URLs)
+\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
+\let\hl@type@hrefint\empty % \href with internal #labels
+\let\hl@type@hrefext\empty % \href with external labels (URLs) (this
+\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
+\let\hl@opts@hrefint\empty % \href with internal #labels
+\let\hl@opts@hrefext\empty % \href with external labels (URLs)
+\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
+ \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
+}%
+\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}%
+}%
+\def\hl@idxexact@word{idxexact}%
+\def\hl@idxpage@word{idxpage}%
+\def\hl@idxnone@word{idxnone}%
+\def\hl@raw@word{raw}%
+\def\enablehyperlinks{\@getoptionalarg\@finenablehyperlinks}%
+\def\@finenablehyperlinks{%
+ \let\hl@selecteddriver\empty
+ \def\hldest@place@idx{0}%
+ \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
+ }%
+ \ifx\hl@selecteddriver\empty
+ \ifpdf
+ \def\hl@selecteddriver{pdftex}%
+ \message{^^JEplain: using `pdftex' hyperlink driver.}%
+ \else
+ \def\hl@selecteddriver{hypertex}%
+ \message{^^JEplain: using `hypertex' hyperlink driver.}%
+ \fi
+ \else
+ \expandafter\ifx\csname hldriver@\hl@selecteddriver\endcsname \relax
+ \errmessage{No hyperlink driver `\hl@selecteddriver' available}%
+ \fi
+ \fi
+ \let\hl@setparam\@hl@setparam
+ \csname hldriver@\hl@selecteddriver\endcsname
+ \def\@finenablehyperlinks{\errmessage{Hyperlink driver `\hl@selecteddriver'
+ already selected}}%
+ \let\hldriver@nolinks\undefined
+ \let\hldriver@hypertex\undefined
+ \let\hldriver@pdftex \undefined
+ \let\hldriver@dvipdfm\undefined
+ \let\hloff\@hloff
+ \let\hlon\@hlon
+ \let\hldestoff\@hldestoff
+ \let\hldeston\@hldeston
+ \hlon[*,]\hloff[foot,footback]%
+ \hldeston[*,]\hldestoff[foot,footback]%
+}%
+\def\hldriver@nolinks{%
+ \def\@hldest##1##2##3{%
+ \edef\temp{\write-1{hldest: ##3}}%
+ \ifvmode
+ \temp
+ \else
+ \allowhyphens
+ \expandafter\smash\expandafter{\temp}%
+ \allowhyphens
+ \fi
+ \ignorespaces
+ }%
+ \def\@hlstart##1##2##3{%
+ \leavevmode
+ \begingroup % Start the color group.
+ \edef\temp{\write-1{hlstart: ##3}}%
+ \temp
+ \ignorespaces
+ }%
+ \def\@hlend{%
+ \edef\temp{\write-1{hlend}}%
+ \temp
+ \endgroup % End the color group from \@hlstart.
+ }%
+ \let\hl@setparam\gobble
+}%
+{\catcode`\#=\other
+\gdef\hlhash{#}}%
+\def\hldriver@hypertex{%
+ \def\hldest@type{xyz}%
+ \let\hldest@opt@cmd \empty
+ \def\hldest@driver{%
+ \ifx\@hltype\hl@raw@word
+ \csname \hldest@opt@cmd \endcsname
+ \else
+ \special{html:<a name="\@hllabel">}\special{html:</a>}%
+ \fi
+ }%
+ \let\hldest@typeh@raw \empty
+ \let\hldest@typeh@xyz \empty
+ \def\hl@type{name}%
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ \ifx\hl@type@hrefext\empty
+ \def\hl@type@hrefext{url}%
+ \fi
+ \let\hl@opt@cmd \empty
+ \let\hl@opt@ext \empty
+ \let\hl@opt@file \empty
+ \def\hl@driver{%
+ \ifx\@hltype\hl@raw@word
+ \csname \hl@opt@cmd \endcsname
+ \else
+ \def\hlstart@preamble{html:<a href="}%
+ \csname hl@typeh@\@hltype\endcsname
+ \fi
+ }%
+ \let\hl@typeh@raw \empty
+ \def\hl@typeh@name{\special{\hlstart@preamble \hlhash\@hllabel">}}%
+ \def\hl@typeh@filename{%
+ \special{%
+ \hlstart@preamble
+ file:\hl@opt@file\hl@opt@ext
+ \ifempty\@hllabel \else \hlhash\@hllabel\fi
+ ">%
+ }%
+ }%
+ \def\hl@typeh@url{%
+ \special{%
+ \hlstart@preamble
+ \@hllabel
+ ">%
+ }%
+ }%
+ \def\@hlend{\special{html:</a>}\endgroup}% End the group from \@hlstart.
+}%
+\def\hldriver@pdftex{%
+\ifpdf % PDF output is enabled.
+ \def\hldest@type{xyz}%
+ \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
+ \def\hldest@driver{%
+ \ifx\@hltype\hl@raw@word
+ \csname \hldest@opt@cmd \endcsname
+ \else
+ \pdfdest name{\@hllabel}\@hltype
+ \csname hldest@typeh@\@hltype\endcsname
+ \fi
+ }%
+ \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
+ }%
+ \def\hl@type{name}%
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ \ifx\hl@type@hrefext\empty
+ \def\hl@type@hrefext{url}%
+ \fi
+ \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
+ \def\hl@driver{%
+ \ifx\@hltype\hl@raw@word
+ \csname \hl@opt@cmd \endcsname
+ \else
+ \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
+ \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
+ }%
+ }%
+ \csname hl@typeh@\@hltype\endcsname
+ \fi
+ }%
+ \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{%
+ \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{%
+ \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{Eplain warning: `pdftex' hyperlink driver: PDF output is^^J
+ \space not enabled, falling back on `nolinks' driver.}%
+ \hldriver@nolinks
+\fi
+}%
+\def\hldriver@dvipdfm{%
+ \def\hldest@type{xyz}%
+ \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
+ \def\hldest@driver{%
+ \ifx\@hltype\hl@raw@word
+ \csname \hldest@opt@cmd \endcsname
+ \else
+ \def\hldest@preamble{%
+ pdf: dest (\@hllabel) [@thispage
+ }%
+ \csname hldest@typeh@\@hltype\endcsname
+ \fi
+ }%
+ \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
+ \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
+ }%
+ \def\hl@type{name}%
+ \ifx\hl@type@url\empty
+ \def\hl@type@url{url}%
+ \fi
+ \ifx\hl@type@hrefext\empty
+ \def\hl@type@hrefext{url}%
+ \fi
+ \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
+ \def\hl@driver{%
+ \ifx\@hltype\hl@raw@word
+ \csname \hl@opt@cmd \endcsname
+ \else
+ \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
+ \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
+ }%
+ \csname hl@typeh@\@hltype\endcsname
+ \fi
+ }%
+ \let\hl@typeh@raw\empty
+ \def\hl@typeh@name{\special{\hlstart@preamble /Dest(\@hllabel)>>}}%
+ \def\hl@typeh@page{%
+ \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{%
+ \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.
+}%
+\def\href{%
+ \bgroup
+ \uncatcodespecials
+ \catcode`\{=1 \catcode`\}=2
+ \@href
+}%
+\def\@href#1{% We'll read #2 (TEXT) later.
+ \egroup
+ \edef\@hreftmp{\ifempty{#1}{}\fi}% Parameter stuffing for \@@href.
+ \expandafter\@@href\@hreftmp#1\@@
+}%
+\def\href@end@int{\hlend@impl{hrefint}}%
+\def\href@end@ext{\hlend@impl{hrefext}}%
+\def\@@href#1#2\@@{%
+ \def\@hreftmp{#1}%
+ \ifx\@hreftmp\hlhash
+ \let\href@end\href@end@int
+ \hlstart@impl{hrefint}{#2}%
+ \else
+ \let\href@end\href@end@ext
+ \hlstart@impl{hrefext}{#1#2}%
+ \fi
+ \@@@href
+}%
+\def\@@@href{%
+ \futurelet\@hreftmp\href@
+}%
+\def\href@{%
+ \ifcat\bgroup\noexpand\@hreftmp
+ \let\@hreftmp\href@@
+ \else
+ \let\@hreftmp\href@@@
+ \fi
+ \@hreftmp
+}%
+\def\href@@{\bgroup\aftergroup\href@end \let\@hreftmp}%
+\def\href@@@#1{#1\href@end}%
+\def\hldeston{\errmessage{Please enable hyperlinks with
+ \string\enablehyperlinks\space before using hyperlink commands
+ (consider selecting the `nolinks' driver to ignore all hyperlink
+ commands in your document)}}%
+\let\hldestoff\hldeston \let\hlon\hldeston \let\hloff\hldeston
+\let\hlstart\hldeston \let\hlend\hldeston \let\hldest\hldeston
+\let\hl@setparam\hldeston
+\@hloff[*]\@hldestoff[*]%
+\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}%
+\long\def\beginpackages#1\endpackages{%
+ \let\usepackage\real@usepackage
+ \let\DoNotLoadEpstopdf=t
+ \let\eplaininput=\input
+ #1%
+ \usepkg@at@begin@document
+ \global\let\usepkg@at@begin@document\empty
+ \global\let\usepackage\fake@usepackage
+ \let\packageinput=\input
+ \let\input=\eplaininput
+ \ifx\resetatcatcode\@undefined \else\resetatcatcode \fi
+}%
+\def\fake@usepackage{\errmessage{You should not use \string\usepackage\space outside of^^J
+ \@spaces\string\beginpackages...\string\endpackages\space environment}%
+}%
+\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
+}%
+\let\usepackage\fake@usepackage
+\def\real@usepackage{\@getoptionalarg\@finusepackage}%
+\def\@finusepackage#1{%
+ \let\usepkg@options\@optionalarg
+ \ifempty{#1}%
+ \errmessage{No packages specified}%
+ \fi
+ \ifusepkg@miniltx@loaded \else
+ \testfileexistence[miniltx]{tex}%
+ \if@fileexists
+ \input miniltx.tex
+ \global\usepkg@miniltx@loadedtrue
+ \global\let\RequirePackage\eplain@RequirePackage
+ \global\let\DeclareOption\eplain@DeclareOption
+ \global\let\PassOptionsToPackage\eplain@PassOptionsToPackage
+ \global\let\ExecuteOptions\eplain@ExecuteOptions
+ \gdef\ProcessOptions{\@ifstar\eplain@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
+ \@ifnextchar[%]
+ {\@finfinusepackage{#1}}%
+ {\@finfinusepackage{#1}[]}%
+}%
+\def\@finfinusepackage#1[#2]{%
+ \edef\usepkg@date{#2}%
+ \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
+ \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
+ \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
+}%
+\def\usepkg@load@pkg#1{%
+ \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
+ \ifundefined{ver@\usepkg@pkg.sty}%
+ \expandafter\@finusepkg@load@pkg
+ \else
+ \immediate\write-1{^^J\linenumber Eplain: package `\usepkg@pkg' already
+ loaded, skipping reloading}%
+ \fi
+}%
+\def\@finusepkg@load@pkg{%
+ \testfileexistence[\usepkg@pkg]{sty}%
+ \if@fileexists \else
+ \errmessage{Package `\usepkg@pkg' not found}%
+ \fi
+ \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
+ \let\usepackage\eplain@RequirePackage
+ \global\let\usepkg@at@end@of@package\empty
+ \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
+ \usepkg@at@end@of@package
+ \global\let\usepkg@at@end@of@package\empty
+ \let\usepackage\real@usepackage
+ \global\ece\let{usepkg@options@\usepkg@pkg}\undefined
+ \def\Url@HyperHook##1{\hlstart@impl{url}{\Url@String}##1\hlend@impl{url}}%
+}%
+\def\eplain@DeclareOption#1#2{%
+ \toks@{#2}%
+ \expandafter\xdef\csname usepkg@option@\usepkg@pkg @#1\endcsname{\the\toks@}%
+}%
+\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
+}%
+\def\usepkg@exec@options#1{%
+ \for\CurrentOption:=#1\do{%
+ \expandafter\let\expandafter\usepkg@temp
+ \csname usepkg@option@\usepkg@pkg @\CurrentOption\endcsname
+ \ifx\usepkg@temp\relax
+ \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
+ \usepkg@temp
+ \fi
+ }%
+}%
+\let\eplain@ExecuteOptions\usepkg@exec@options
+\def\eplain@ProcessOptions{%
+ \expandafter\usepkg@exec@options\csname usepkg@options@\usepkg@pkg\endcsname
+}%
+\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}%
+\def\eplain@ProvidesPackage#1{%
+ \@ifnextchar[%]
+ {\eplain@pr@videpackage{#1.sty}}{\eplain@pr@videpackage#1[]}%
+}%
+\def\eplain@pr@videpackage#1[#2]{%
+ \wlog{#1: #2}%
+ \expandafter\xdef\csname ver@#1\endcsname{#2}%
+ \@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}%
+ \expandafter\xdef\csname ver@#1\endcsname{#2}%
+}%
+\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 }%
+\let\ttfamily\tt
+\def\strip@prefix#1>{}%
+\def\@ifpackageloaded#1{%
+ \expandafter\ifx\csname ver@#1.sty\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}%
+\long\def\g@addto@macro#1#2{%
+ \begingroup
+ \toks@\expandafter{#1#2}%
+ \xdef#1{\the\toks@}%
+ \endgroup
+}%
+\def\PackageWarning#1#2{%
+ \begingroup
+ \newlinechar=10 %
+ \def\MessageBreak{%
+ ^^J(#1)\@spaces\@spaces\@spaces\@spaces
+ }%
+ \immediate\write16{^^JPackage #1 Warning: #2\on@line.^^J}%
+ \endgroup
+}%
+\def\PackageWarningNoLine#1#2{%
+ \PackageWarning{#1}{#2\@gobble}%
+}%
+\def\on@line{ on input line \the\inputlineno}%
+\def\@spaces{\space\space\space\space}%
+\def\@inmatherr#1{%
+ \relax
+ \ifmmode
+ \errmessage{The command is invalid in math mode}%
+ \fi
+}%
+\let\protected@edef\edef
+\let\wlog = \@plainwlog
+\catcode`@ = \@eplainoldatcode
+\def\fmtname{eplain}%
+\def\eplain{t}%
+{\edef\plainversion{\fmtversion}%
+ \xdef\fmtversion{3.9: 30 May 2019 (and plain \plainversion)}%
+}%